第4 章 软件设计
4.2 功能模块程序
4.2.1 定义变量及主程序
#include
//接受传感器信号 //手动、自动切换 //开门 //关门
//运行标志位 //中断标志位
//正转 //反转 //存储开门信号 //存储关门信号
bit K1; bit G1;
sbit LED=P1^6; //指示灯
unsigned long beats = 0; void main() {
TMOD=0x01;
L=R=D=S=K=K1=G=G1=0; LED=1; Delay_1ms(2000);
//延时,减少传感器误差;
TH0=(65536-10000)/256; TL0=(65536-10000)%6;
//主函数
L=R=D=S=K=K1=G=G1=0; LED=0; P2 |= 0x0F; L=1; Flag=Flag1=0; ET0=1;
TR0=1; {
while(1)
K1=K;
G1=G;
-15-
华北理工大学轻工学院
}
LED=0; Scan();
LED=0; }
4.2.2 驱动子程序
正转子程序
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执行一拍
}
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执行一
-16-
第4 章 软件设计
}
}
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位清零
buf |= RUN1[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零
beat=beats;
delay(250); //延时2ms,即2ms执行一拍
} }
-17-
华北理工大学轻工学院
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执行一
} beats++;
}
P2 |= 0x0F; //关闭电机所有的相 }
手动正转程序
-18-
第4 章 软件设计
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--) {
buf = P2 & 0xF0; //用buf暂存P1口的高4位,而低4位清零 buf |= RUN1[step]; //buf低4位改为相应的节拍代码值 P2 = buf; //修改后完毕后的值送回到P1口 step++; //步进节拍递增
step &= 0x07; //用“与”方式实现到8归零
-19-