单片机控制步进电机正反转的实际应用程序

  • 格式:doc
  • 大小:54.00 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;