完整的单片机控制步进电机程序文档格式.doc
《完整的单片机控制步进电机程序文档格式.doc》由会员分享,可在线阅读,更多相关《完整的单片机控制步进电机程序文档格式.doc(4页珍藏版)》请在冰点文库上搜索。
/*作输入步进电机的旋转方向信号发送口*/
sbitP1_0=P1^0;
/*作串口输出信号的使能口,P1_0=0时接通串口,输出信号*/
sbitWD=P1^7;
/*看门狗*/
main()
{
P2_0=0;
P2_2=0;
/*步进电机的旋转方向待试验后确定*/
P1_0=1;
/*开机时需要关断,串口发送功能,需要时再接通*/
WD=1;
/*看门狗先为1,电平翻转为喂狗*/
i=0;
common_count=0;
cmd_in_permit=0;
input_order=0;
interval=0;
address_true=1;
speed_change=0;
start_up=0;
start_end=0;
sent_ok=0;
//允许发送
EA=1;
/*开放总中断*/
TMOD=0x21;
TH1=0xFD;
//波特率9600
TL1=0xFD;
SCON=0xd0;
//设定串行口工作方式
PCON&
=0x00;
//波特率不倍增
SM2=1;
TR1=1;
ES=1;
//启动定时器1
T2MOD=00;
T2CON=0x00;
RCAP2H=0xEE;
//赋T2的预置值0xA600,25MS,0xB800,20MS,0xCA00,15MS,0xDC00,10MS,0xEE00,5MS
RCAP2L=0x00;
TR2=1;
//启动定时器
ET2=1;
//打开定时器2中断
do
{
if(address_true==1)
{
address_true=0;
check_addr();
}
if(start_up==1&
&
start_end==0)//第一次启动
{
y1=add[common_count];
T0high=(uchar)(y1>
>
8);
/*取y1的高8位*/
T0low=(uchar)(y1&
0x00ff);
/*取y1的低8位*/
TR0=1;
ET0=1;
/*允许T/C0中断*/
start_end=1;
}
if(speed_change==1)
{
if(interval>
=0&
interval<
=0x63)
{
if(interval>
common_count)
{common_count=common_count+1;
}
if(interval<
{common_count=common_count-1;
speed_change=0;
if(sent_ok==1)
sent_ok=0;
P1_0=0;
for(i=0;
i<
=20;
i++){_nop_();
}
TI=0;
SBUF=T0high;
while(TI==0);
TI=0;
TI=0;
SBUF=T0low;
P1_0=1;
}
SM2=1;
}
while
(1);
voidtimer0(void)interrupt1using3
P2_0=~P2_0;
y1=add[common_count];
TH0=T0high;
/*高8位T0high送定时器0的TH0*/
TL0=T0low;
/*低8位T0low送定时器0的TL0*/
voidtimer2(void)interrupt5using2
{
TF2=0;
/*T2溢出中断需软件清0*/
speed_change=1;
//速度可以改变标示,以便主程序处理
WD=!
WD;
/*MAX813喂狗*/
voidinte_SERIAL()interrupt4using1/*串口0中断服务子程序*/
ucharkey_in;
key_in=0;
if(RI)
key_in=SBUF;
RI=0;
if(SM2==1)
if(key_in==slave_addr[2])
{
SM2=0;
address_true=1;
}
if((SM2==0)&
(RB8==0))
{if(key_in==0xff){SM2=1;
if(key_in==0xfe)
{/*接收主机命令引导字节,准备接收主机命令*/
cmd_in_permit=1;
}
if(cmd_in_permit==1)
{
input_order=input_order+1;
}
if(input_order==2)
{/*接收主机命令,使从机开始调节电机*/
cmd_in_permit=0;
input_order=0;
/*interval代表控制器发给电机的转速期望值*/
interval=key_in;
sent_ok=1;
if(start_up==0){start_up=1;
}
}
}
voidcheck_addr(void)
{ /*地址核对成功,发送从机地址给主机*/
TB8=1;
RB8=0;
P1_0=0;
for(i=0;
=25;
SBUF=slave_addr[2];
/*发送地址核对成功,发送从机地址给主机*/
do{}while(TI==0);
TI=0;
}
TB8=0;
4