步进电机的上位机控制 VB.docx
- 文档编号:11329590
- 上传时间:2023-02-27
- 格式:DOCX
- 页数:19
- 大小:42.64KB
步进电机的上位机控制 VB.docx
《步进电机的上位机控制 VB.docx》由会员分享,可在线阅读,更多相关《步进电机的上位机控制 VB.docx(19页珍藏版)》请在冰豆网上搜索。
步进电机的上位机控制VB
附录1PC机控制界面设计程序
PubliczhuanxiangAsString
PrivateSubCombo1_Change()
Combo1.ListIndex=0
EndSub
PrivateSubCommand1_Click()
IfCommand1.Caption="启动"Then
MSComm1.Settings="2400,n,8,1"
MSComm1.CommPort=Combo1.ListIndex+1
MSComm1.PortOpen=True
Command1.Caption="停止"
MSComm1.Output="F"'停机
MSComm1.InputMode=comInputModeBinary
MSComm1.InputLen=0
Else
Command1.Caption="启动"
MSComm1.Output="E"'开机
MSComm1.PortOpen=False
EndIf
EndSub
PrivateSubCommand2_Click()
End
EndSub
PrivateSubDOWN_Click()
MSComm1.Output="D"'减速
EndSub
PrivateSubLEFT_Click()
MSComm1.Output="B"'左转,left
zhuanxiang="正转"
Text3.Text=zhuanxiang
EndSub
PrivateSubRIGHT_Click()
MSComm1.Output="A"'右转,right
zhuanxiang="反转"
Text3.Text=zhuanxiang
EndSub
PrivateSubTimer1_Timer()
DimspeedAsVariant
DimindateAsByte
IfMSComm1.InBufferCount>0Then
speed=MSComm1.Input
indate=AscB(speed)
Text1.Text=indate
EndIf
EndSub
PrivateSubUP_Click()
MSComm1.Output="C"'加速
EndSub
附录2下位机控制程序
#ifndef__INIT2_H__
#define__INIT2_H__
#include
#include"design4.h"
voiddelayms(uchark);
voiddelayus(uchark);
voidDateIN595(uchardate);
voidinit_btlv();
#endif
#include
#include"design4.h"
#include"init.h"
externuintHZ;
//延时程序约为0.5ms
voiddelayms(uchark)
{
uchari,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
//延时程序约为4us
voiddelayus(uchark)
{
while(k--)
{
NOP;
NOP;
NOP;
}
}
//配置c8051寄存器,p1.2.4.5为推挽输出
//p2.4.67为推挽出
//初始化波特率发生器:
定时器1,工作在
//模式2,波特率为9600
voidinit_btlv()
{
//初始化系统时钟
//内部高频振荡器使能,系统时钟为内部高频振荡器输出(不分频)
REG0CN=0X00;
OSCICN|=0x83;//不分频,实用内部12M晶振,系统时钟为12M
OSCICL=0X00;//内部晶振工作在最高频
OSCXCN=0X00;//禁止内部L-F振荡
OSCXCN=0X00;//关闭外部振荡器
SCON0=0X50;//配置UART0控制寄存器,8位数据,允许接收
TMOD=0X21;//定时器1工作在方式2
TH1=256-(12000000/2400/24);//定时器1为12MHZ,12分频,
TI0=0;
//CKCON=0X00;//定时器1用系统时钟12分频作为它的时基
//REN=1;
TH0=(65536-HZ)/256;//定时1000um产生一次中断
TL0=(65536-HZ)%256;
//TR0=1;
ET0=1;
TR1=1;
EA=1;
ES0=1;
//初始化交叉开关,配置I/O口
P0MDOUT=0X10;//将P0.4(TX0)为推挽,P0.5(RX0)为开漏
XBR0=0X01;//将TX0,RX0连接到端口引脚
XBR1=0X40;//开交叉开关
PCA0MD&=0XBF;//关看门狗
P1MDOUT=0X34;//推挽方式。
。
设置数码管相关管脚使能,
P2MDOUT=0X03;
CKCON=0x04;//TIMER0使用系统时钟12M
}
//将数据送入595,并且高位先送入595中,SH上升沿将数据从DateIn中
//串行进入595中,等到ST的上升沿将数据并行输出
voidDateIN595(uchardate)
{
uchari;
uchartemp=date;
for(i=0;i<8;i++)
{
if(temp&0x80)
DateIn=1;
else
DateIn=0;
temp<<=1;
NOP;NOP;
SH=0;delayus
(1);
SH=1;delayus
(1);
SH=0;
}
}
#ifndef__INIT1_H__
#define__INIT1_H__
#include
#include
#defineulongunsignedlong
#defineucharunsignedchar
#defineuintunsignedint
#defineNOP_nop_()
#defineLEFT5//电机顺时针转
#defineRIGHT7//电机逆时针转
#defineUP6//电机加速
#defineDOWN8//电机减速
#defineSTOP9//电机停机
#defineSTART1//电机开始工作
sbitCK=P2^0;//产生脉冲输出,加到驱动板上
sbitCW=P2^1;//控制电机正反转
sbitkey_int=P0^7;//矩阵键盘
sbitkey_h1=P2^4;
sbitkey_h2=P2^6;
sbitkey_h3=P2^7;
sbitSH=P1^4;//74HC595芯片,串入并出,在SH上升沿时候串入
sbitST=P1^5;//74HC595芯片,在ST上升沿时候串出
sbitDateIn=P1^2;
//将键盘第一行P2.4设置为推挽方式输出1,以便读取第一行哪个键按下
#defineFIRST_LINE_SET{P2MDOUT=0X10,key_h1=1;}
//将键盘第er行P2.6设置为推挽方式输出1,以便读取第一行哪个键按下
#defineSECOND_LINE_SET{P2MDOUT=0X40,key_h2=1;}
//将键盘第san行P2.7设置为推挽方式输出1,以便读取第一行哪个键按下
#defineTHIRD_LINE_SET{P2MDOUT=0X80,key_h3=1;}
ucharkeyscanf();
voidmotor_dis();
voidround();
#endif
/*************************************************************
**************************************************************
课程设计第四次设计
采用W1-2相(011)细分法,控制步进电机正反转,加减速
,数码管前三位显示累计转的圈数,第四位显示转向,1表
示正转,0表示反转。
第五六两位显示转速,转速为五个档位
*************************************************************
**************************************************************/
#include
#include"design4.h"
#include"init.h"
ucharcodetable[]={//数码管显示数组
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90
};
ulonground_count;//电机转的总圈数
uintHZ;
ucharkey_val;
ucharcoder[6];//装转速,转的圈数,和转向
inttimee=0;
ucharreceive_data=0;//从上位机接受到的数据
bitright_flag=0;//从上位机接受到的数据,控制电机左转标志位
bitleft_flag=0;//从上位机接受到的数据,控制电机右转标志位
bitup_flag=0;//从上位机接受到的数据,控制电机加速标志位
bitdown_flag=0;//从上位机接受到的数据,控制电机减速标志位
bitstop_flag=0;//从上位机接受到的数据,控制电机停机标志位
bitstart_flag=0;//从上位机接受到的数据,控制电机开机标志位
/*/////////////////////////////////////////////////////////////////////////////
下表为3X3键盘安扫描方式时,各个按键的键值;通过判断键值可以知道是某个按
下按下FIRST_LINE_SET为第一行P2MDOUT=0X10,key_h1=1;P2^4口为1是的寄
存器配置,SECOND_LINE_SET,THIRD_LINE_SET为第二行,第三行的相关管脚的寄
存器配置
P2^4=1P2^5(h2)P2^6(h3)P0^7(int)
key1000
key4100
key7010
P2^6=1P2^4(h1)P2^7(h3)P0^7(int)
key2100
key5000
key8010
P2^7=1P2^4(h1)P2^6(h2)P0^7(int)
key3100
key6010
key9000
////////////////////////////////////////////////////////////////////////////*/
ucharkeyscanf()
{
FIRST_LINE_SET;//检测第一行键盘
delayms(15);
if((!
key_h2)&&(!
key_h3)&&(!
key_int))
return
(1);
elseif((key_h2)&&(!
key_h3)&&(!
key_int))
return(4);
elseif((!
key_h2)&&(key_h3)&&(!
key_int))
return(7);
SECOND_LINE_SET;//检测第二行键盘
delayms(15);
if((key_h1)&&(!
key_h3)&&(!
key_int))
{
delayms(10);
if((key_h1)&&(!
key_h3)&&(!
key_int))
{
while((key_h1)&&(!
key_h3)&&(!
key_int));
return
(2);
}
}
elseif((!
key_h1)&&(!
key_h3)&&(!
key_int))
{
delayms(10);
if((!
key_h1)&&(!
key_h3)&&(!
key_int))
{
while((!
key_h1)&&(!
key_h3)&&(!
key_int));
return(5);
}
}
elseif((!
key_h1)&&(key_h3)&&(!
key_int))
{
delayms(10);
if((!
key_h1)&&(key_h3)&&(!
key_int))
{
while((!
key_h1)&&(key_h3)&&(!
key_int));
return(8);
}
}
THIRD_LINE_SET;//检测第三行键盘
delayms(15);
if((key_h1)&&(!
key_h2)&&(!
key_int))
{
delayms(10);
if((key_h1)&&(!
key_h2)&&(!
key_int))
{
while((key_h1)&&(!
key_h2)&&(!
key_int));
return(3);
}
}
elseif((!
key_h1)&&(key_h2)&&(!
key_int))
{
delayms(10);
if((!
key_h1)&&(key_h2)&&(!
key_int))
{
while((!
key_h1)&&(key_h2)&&(!
key_int));
return(6);
}
}
elseif((!
key_h1)&&(!
key_h2)&&(!
key_int))
{
delayms(10);
if((!
key_h1)&&(!
key_h2)&&(!
key_int))
{
while((!
key_h1)&&(!
key_h2)&&(!
key_int));
return(9);
}
}
return(0);//没有任何键按下返回0
}
//通过判断按键值让电动机做相应
voidmotor_dis()
{
uintspeed_round;
key_val=keyscanf();
if((STOP==key_val)|(stop_flag))//按键值为9时候,电机停机
{
stop_flag=0;
key_val=0;
TR0=0;
CK=0;
}
if((START==key_val)|(start_flag))//按键值为1时候,电机kaiji
{
start_flag=0;
key_val=0;
TR0=1;
}
if((RIGHT==key_val)|(right_flag))//按键值为7时候,电机反转
{
right_flag=0;
key_val=0;
CW=0;
coder[2]=0;
}
if((LEFT==key_val)|(left_flag))//按键值为5时候,电机正转
{
left_flag=0;
key_val=0;
CW=1;
coder[2]=1;
}
if((UP==key_val)|(up_flag))//按键值为6时候,电机加速,timee为延时时间,
{
up_flag=0;
//加速时候让送脉冲的时间间隔变短
key_val=0;
timee++;
if(timee>=6)
timee=5;
switch(timee)
{
case0:
HZ=15000;break;
case1:
HZ=10000;break;
case2:
HZ=7000;break;
case3:
HZ=5000;break;
case4:
HZ=2000;break;
case5:
HZ=1000;break;
}
speed_round=50000/HZ;//转速
SBUF0=speed_round;
}
if((DOWN==key_val)|(down_flag))//按键值为8时候,电机加速,timee为延时时间
{
down_flag=0;
//加速时候让送脉冲的时间间隔变长
key_val=0;
timee--;
if(timee<=0)
timee=0;
switch(timee)
{
case0:
HZ=15000;break;
case1:
HZ=10000;break;
case2:
HZ=7000;break;
case3:
HZ=5000;break;
case4:
HZ=2000;break;
case5:
HZ=1000;break;
}
speed_round=50000/HZ;//转速
SBUF0=speed_round;
}
}
//计算转速
voidround()
{
uintaa,bb,i;
//uchar*tab;
aa=round_count/200;//转的圈数
bb=50000/HZ;//转速
//uart0_sendspeed(bb);
coder[5]=aa/100;
coder[4]=aa%100/10;
coder[3]=aa%10;
//coder[2]=0;
coder[1]=bb/10;
coder[0]=bb%10;
for(i=0;i<6;i++)
{
DateIN595(table[coder[i]]);//送给第六个数码管
}
ST=0;delayms
(1);
ST=1;delayms
(2);
ST=0;
}
voidinit_seg()
{
uchari;
for(i=0;i<6;i++)
{
DateIN595(table[coder[0]]);//送给第六个数码管
}
ST=0;delayms
(1);
ST=1;delayms
(2);
ST=0;
}
voidmain()
{
uchari;
TR0=0;//start_flag=1;电机初始状态为停止
PS0=1;//UART0中断高优先级
PT0=0;//定时器0中断低优先级
init_btlv();
CW=1;
timee=1;
init_seg();
while(!
TR0)
{
i=keyscanf();
if(i==1)
break;
}
while
(1)
{
round();
motor_dis();
}
}
//定时器0让单片机产生脉冲
voidtimer0()interrupt1
{
TH0=(65536-HZ)/256;
TL0=(65536-HZ)%256;
CK=~CK;
round_count++;
}
//串口中断,有数据接收时候进中断,
//把接收到的指令放入receive_date中
voidUart0Isr(void)interrupt4
{
TR0=0;
//coder[2]=1;
if(RI0)
{
receive_data=SBUF0;
switch(receive_data)
{
case0x41:
right_flag=1;break;
case0x42:
left_flag=1;break;
case0x43:
up_flag=1;break;
case0x44:
down_flag=1;break;
case0x45:
stop_flag=1;break;
case0x46:
start_flag=1;break;
}
/*if(receive_data==0x41)//you转A
right_flag=1;
if(receive_data==0x42)//zuo转B
left_flag=1;
if(receive_data==0x43)//加速C
up_flag=1;
if(receive_data==0x44)//减速D
down_flag=1;
if(receive_data==0x45)//停止E
stop_flag=1;
if(receive_data==0x46)//启动F
start_flag=1;*/
RI0=0;
}
else
TI0=0;
TR0=1;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进电机的上位机控制 VB 步进 电机 上位 控制