控制步进电机正反转的实际应用程序
/*这是一个控制步进电机正反转的实际应用程序*/
/*选用的是三相步进电机驱动器,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;/*定义变量*/
declarel(5)byte;
declare(dat,data)byteat(30h);
declaredelayword;
DECLAREACO(11)BYTECONSTANT(05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
41h,1fh,01h,09h,00h);
declaresiliterally'p21',sckliterally'p20';/*X25045囗线定义*/
declaresoliterally'p22',csliterally'p23';
dog:procedure;/*初始化看门狗x25045*/
cs=1;
calltime(1);
cs=0;
calltime(1);
cs=1;
enddog;
run:procedure;/*步进电机运行脉冲输出程序*/
ifok=1then
calldog;
do;
p14=0;
calltime(1);
p14=1;
calltime(1);
end;
endrun;
DISPLAY:PROCEDURE(L0,L10);/*显示子程序*/
DECLARE(L0,L10)BYTE;/*定义显示二位*/
n=L10;
n=aco(n);/*十位数BCD码译成段码*/
sbuf=n;/*十位数送164显示*/
dowhileti=0;/*等待发送结束*/
calldog;/*看门狗定时器复位*/
end;
n=L0;
n=aco(n);
sbuf=n;/*个位数送164显示*/
dowhileti=0;
calldog;
end;
enddisplay;
outbyt:procedure(da);/*向看门狗存储器写入一字节*/
declare(i,da)byte;
j=da;/*将要写入的字节赋给临时变量J*/
doi=0to7;/*左移8位,送到口线si*/
sck=0;
j=scl(j,1);
si=cy;
sck=1;/*每移一位数据,跟一个时钟信号*/
end;
endoutbyt;
inbyt:procedure;/*从看门狗存储器读出一字节*/
declare(i,di)byte;
j=0;
doi=0to7;
sck=1;
sck=0;
cy=so;
j=scl(j,1);/*从看门狗存储器读出一字节送入临时变量j*/
end;
dat=j;
endinbyt;
wrenable:procedure;/*置看门狗写使能*/
sck=0;
cs=0;
;/*writeenablecommand*/
calloutbyt(06h);/*x25045写使能指令06h*/
cs=1;
sck=0;
endwrenable;
wrdisable:procedure;/*置看门狗写禁止*/
sck=0;
cs=0;
;/*writedisablecommand*/
calloutbyt(04h);
sck=0;
cs=1;
endwrdisable;
wrregister:procedure;/*写状态寄存器*/
sck=0;
cs=0;
dat=01h;/*writeregistercommand*/
calloutbyt(dat);
;/*00h--1.4S,20h--200MS,10h--600MS,30h--disableWdog*/
calloutbyt(00h);/*设定看门狗定时时间*/
;
sck=0;
cs=1;
calltime(200);/*waittocompletewrittingcycle*/
endwrregister;
rdregister:procedure;/*读看门狗状态寄存器*/
sck=0;
cs=0;
;/*registerreadcommand*/
calloutbyt(05h);
callinbyt;/*statusregisterreadinDAT>*/
sck=0;
cs=1;
endrdregister;
wbyte:procedure;/*看门狗存储器字节写入子程序*/
declarecommbyte;
sck=0;
cs=0;
comm=02h;/*写指令02h*/
calloutbyt(comm);
calloutbyt(addrl);
calloutbyt(dat);/*sendonebytedatatoX25043*/
cs=1;
sck=0;
calltime(150);
endwbyte;
rbyte:procedure;/*看门狗存储器字节读出子程序*/
declarecommbyte;
sck=0;
cs=0;
comm=03h;/*readcommand*/
calloutbyt(comm);
calloutbyt(addrl);
callinbyt;/*readonebytetoDAT>*/
sck=0;
cs=1;
endrbyte;
incdata:procedure;/*参数修改--"加"键处理子程序+*/
ifp10=0then/*如果K7键按下*/
do;
dowhilep10=0;/*等待键松开有效*/
calldog;/*此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
end;
data=data+1;/*设定值+1*/
ifdata>99thendata=1;/*规定设定值的上限*/
L(1)=dataMOD10;/*将设定值的十位数拆出来送给十位数显示变量L(1)*/
L(2)=data/10;/*将设定值的个位数拆出来送给个位数显示变量L(2)*/
calldisplay(L(1),L(2));/*将改变后的设定值送164显示出来*/
calltime(200);/*延时*/
calldog;
calltime(200);
calldog;
callwrenable;/*置存储器写使能*/
addrl=00h;/*置存储器地址*/
dat=l(1);
callwbyte;/*将变量L(1)的值写入存储器00h位置*/
callwrenable;
addrl=01h;
dat=l(2);
callwbyte;/*将变量L(2)的值写入存储器01h位置*/
end;
endincdata;
decdata:PROCEDURE;/*参数修改---"减"键处理子程序-*/
IFp11=0THEN/*k8键处理子程序*/
do;
dowhilep11=0;
calldog;
end;
DATA=DATA-1;/*设定值-1*/
ifdata=0thendata=99;
L(1)=dataMOD10;
L(2)=data/10;
calldisplay(l(1),l(2));
calldog;
calltime(200);
calldog;
calltime(200);
calldog;
callwrenable;
addrl=00h;
dat=l(1);
callwbyte;
callwrenable;
addrl=01h;
dat=l(2);
callwbyte;
end;
ENDdecdata;
starton:PROCEDURE;/*start*/
declaresdbyte;
ifp12=0THEN/*K9键处理子程序*/
do;
dowhilep12=0;
calldog;
end;
ifp17=0thenok=0;/*如果p17口线上有信号输入,则运行标志置0(停止运行)*/
p13=1;/*置步进电机正向运转*/
calltime(200);
calldog;
dowhileok=1;/*当运行标志为1时,执行速度延时操作*/
dosd=0todata;/*根据设定值data的数值延时来确定步进电机运行时的脉冲给定速度*/
calldog;
end;
end;
ENDstarton;
step:PROCEDURE;/*step*/
declaresdbyte;
p13=1;/*置步进电机正向运转*/
calltime(200);
calldog;
IFp33=0THEN/*k11键处理子程序*/
do;
ifp17=0thenok=0;/*如果p17上有信号输入,则停止运行*/
dowhilep33=0;
dosd=0todata;/*调用延时,调整步进电机的运行速度*/
calldog;
calltime(2);
end;
callrun;
calldog;
end;
end;
ok=0;
ENDstep;
back:PROCEDURE;/*反向运行处理子程序*/
declaresdbyte;
IFp34=0THEN
do;
dowhilep34=0;
calldog;
end;
ifp15=0thenok=0;/*反向运行时,如果遇到p15上有信号输入,则停止步进电机运行*/
p13=0;/*置步进电机反向运行*/
calltime(200);
calldog;
dowhileok=1;
dosd=0todata;/*根据设定值调节步进电机的运行速度*/
calldog;
calltime(2);
end;
callrun;
if(p15=0orp32=0)thenok=0;/*p15或p32口线任意一个有信号输入,停止运行*/
end;
end;
ENDback;
MAIN$PROGRAM:/*初始化主程序*/
ea=0;/*关中断*/
SCON=00h;/*置串口方式0,串行数据输出模式*/
PCON=00h;
tmod=11h;
et0=1;
enable;/*开中断(ea=1)*/
SCK=0;cs=1;/*定义存储器口线初始状态*/
callwrenable;
callwrregister;/*看门狗存储器初始化*/
callwrenable;
calldog;
p2=0ffh;/*初始化各个口线的状态*/
p1=0ffh;ok=0;
p14=1;p32=1;p33=1;p34=1;
p13=1;
ADDRL=00h;/*上电复位后从存储器中读出设定的速度值*/
CALLrbyte;
l(1)=dat;
addrl=01h;
callrbyte;
l(2)=dat;
DATA=L(1)+L(2)*10;/*将读出的值合并成十进制,存入变量data中*/
/*以下是主循环程序*/
LOOP:
IFp10=0THENCALLincdata;/*检测各个按键是否有按下*/
IFp11=0THENCALLdecdata;
ifp12=0then
do;
ok=1;
callstarton;
end;
ifp34=0then
do;
ok=1;
callback;
end;
ifp33=0then
do;
ok=1;
callstep;
end;
calldog;
CALLDISPLAY(L(1),L(2));/*将设定值送164显示*/
calldog;
CALLTIME(100);
calldog;
GOTOLOOP;
ENDSTART;
- DSP和PBL3717A构成的步进电机的控制系统(04-01)
- 基于TMS320F240控制步进电机的调焦系统设计(10-20)
- 基于嵌入式Linux的步进电机驱动程序设计(08-08)
- 基于TMS320F240的步进电机的调焦系统设计(03-10)
- DMC130A控制器在双液定量灌注机系统中的应用(06-06)
- 步进电机定位控制系统的VHDL程序设计(06-05)