单片机控制步进电机正反转的实际应用程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机控制步进电机正反转的实际应用程序
/*这是一个控制步进电机正反转的实际应用程序*/
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
/*k7,k8键是设定步进电机转动速度参数的加减键*/
/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/ /*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
/*k11是步进运行键,按一下,步进电机动一下*/
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/ /*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
START:do;
$INCLUDE(REG51.DCL)
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
declare l(5) byte;
declare (dat,data) byte at (30h);
declare delay word;
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/ 41h,1fh,01h,09h,00h);
declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/
declare so literally 'p22',cs literally 'p23';
dog:procedure; /* 初始化看门狗x25045 */
cs=1;
call time(1);
cs=0;
call time(1);
cs=1;
end dog;
run:procedure; /*步进电机运行脉冲输出程序*/
if ok=1 then
call dog;
do;
p14=0;
call time(1);
p14=1;
call time(1);
end;
end run;
DISPLAY:PROCEDURE(L0,L10); /*显示子程序*/
DECLARE (L0,L10) BYTE; /*定义显示二位*/
n=L10;
n=aco(n); /*十位数BCD码译成段码*/
sbuf=n; /*十位数送164显示*/
do while ti=0; /*等待发送结束*/
call dog; /*看门狗定时器复位*/
end;
n=L0;
n=aco(n);
sbuf=n; /*个位数送164显示*/
do while ti=0;
call dog;
end;
end display;
outbyt: procedure(da); /*向看门狗存储器写入一字节*/ declare (i,da) byte;
j=da; /*将要写入的字节赋给临时变量J */
do i=0 to 7; /*左移8位,送到口线si */
sck=0;
j=scl(j,1);
si=cy;
sck=1; /*每移一位数据,跟一个时钟信号*/
end;
end outbyt;
inbyt: procedure; /* 从看门狗存储器读出一字节*/ declare (i,di) byte;
j=0;
do i=0 to 7;
sck=1;
sck=0;
cy=so;
j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/ end;
dat=j;
end inbyt;
wrenable: procedure; /* 置看门狗写使能*/
sck=0;
cs=0;
; /* write enable command */
call outbyt(06h); /* x25045 写使能指令06h */
cs=1;
sck=0;
end wrenable;
wrdisable: procedure; /* 置看门狗写禁止*/
sck=0;
cs=0;
; /* write disable command */
call outbyt(04h);
sck=0;
cs=1;
end wrdisable;
wrregister: procedure; /* 写状态寄存器*/
sck=0;
cs=0;
dat=01h; /* write register command */
call outbyt(dat);
; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */ call outbyt(00h); /* 设定看门狗定时时间*/
;
sck=0;
cs=1;
call time(200); /* wait to complete writting cycle */
end wrregister;
rdregister:procedure; /* 读看门狗状态寄存器*/
sck=0;
cs=0;
; /* register read command */
call outbyt(05h);
call inbyt; /* status register read in
sck=0;
cs=1;
end rdregister;
wbyte:procedure; /* 看门狗存储器字节写入子程序*/ declare comm byte;
sck=0;
cs=0;
comm=02h; /* 写指令02h */
call outbyt(comm);
call outbyt(addrl);
call outbyt(dat); /* send one byte data to X25043 */
cs=1;
sck=0;
call time(150);
end wbyte;