附 录 一
附录一 电路图
-30-
附 录 二 附录二 单片机程序
#include
//接受传感器信号 //手动、自动切换 //开门 //关门
//运行标志位 //中断标志位
//正转 //反转 //存储开门信号 //存储关门信号
bit K1; bit G1;
sbit LED=P1^6; //指示灯
unsigned long beats = 0; void delay(unsigned int cnt); void Delay_1ms(unsigned int);
//0.01ms延时
//1ms延时函数 //正转程序
快速-慢速
void qudong1(unsigned long angle) {
unsigned char buf; unsigned char step = 0;
unsigned char code RUN2[8] = { 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08 };
//步进电机节拍对应 正转
beats = (angle * 4076) / 360; //计算需要的节拍数,4096拍对应一圈 while (beats--) {
if(beats>509&&S==1)
{
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零 buf |= RUN2[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(150); //延时2ms,即2ms执行一拍
-31-
附 录 二
}
if(beats<=509&&S==1) {
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零
buf |= RUN2[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(250); //延时2ms,即2ms执行一
}
}
P2 |= 0x0F; //关闭电机所有的相 }
void qudong2(unsigned long angle) //反转程序 快速-慢速 {
unsigned char buf; unsigned char step = 0;
unsigned char code RUN1[8] = { 0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09 };
//步进电机节拍对应 反转
beats = (angle * 4076) / 360; //计算需要的节拍数,4096拍对应一圈 Flag1=1;
while (beats--)
if(beats>509&&S==1) {
{
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零 buf |= RUN1[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(150); //延时2ms,即2ms执行一拍
}
if(beats<=509&&S==1)
{
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零
-32-
附 录 二 buf |= RUN1[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零
beat=beats;
delay(250); //延时2ms,即2ms执行一拍
} }
P2 |= 0x0F; //关闭电机所有的相 }
void qudong3(unsigned long angle) {
unsigned char buf; unsigned char step = 0;
unsigned char code RUN2[8] = { 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08 };
//步进电机节拍对应 正转
//半正转程序
快速-慢速
while (beats<=3057) {
if(beats>509&&S==1)
{
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零 buf |= RUN2[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(150); //延时2ms,即2ms执行一拍
}
if(beats<=509&&S==1) {
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零
buf |= RUN2[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(250); //延时2ms,即2ms执行一
-33-
附 录 二
} beats++;
}
P2 |= 0x0F; //关闭电机所有的相 }
void qudong4(unsigned long angle) {
unsigned char buf; unsigned char step = 0; unsigned long bs = 0;
unsigned char code RUN2[8] = { 0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08 };
//步进电机节拍对应 正转
//手动正转程序
bs = (angle * 4076) / 360; //计算需要的节拍数,4096拍对应一圈 while (bs--) {
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零 buf |= RUN2[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零 delay(150); //延时2ms,即2ms执行一拍 }
P2 |= 0x0F; //关闭电机所有的相 }
void qudong5(unsigned long angle) //手动反转程序 {
unsigned char buf; unsigned char step = 0; unsigned long bs = 0;
unsigned char code RUN1[8] = { 0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09 };
//步进电机节拍对应 反转
bs = (angle * 4076) / 360; //计算需要的节拍数,4096拍对应一圈 while (bs--)
-34-