|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序
/ {' u! M9 K3 Y/*这是一个控制步进电机正反转的实际应用程序*/
2 P4 U3 I( V: J, {$ V/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
, n1 E8 I+ d$ u+ _4 W2 e6 V- J% ^/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/6 g u$ k% Z* d
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
( G! l6 t; d/ B" Q/*k7,k8键是设定步进电机转动速度参数的加减键*/
5 X& f: q0 G2 I/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/) Q: n- J4 F. v( ^8 X# T
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/7 x* J2 x: [* Q: t4 Y
/*k11是步进运行键,按一下,步进电机动一下*/! K4 e) }( ?2 `; u
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
. j+ X, H! s" i( O0 Y! u/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
( I$ g% S' g& n' ~START:do;
, u+ D/ J- a2 R$INCLUDE(REG51.DCL)9 y8 c9 m' d' I4 L# v6 _4 A: _
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/9 [ ^% ], o' ^0 `5 p
declare l(5) byte;
4 g0 h7 T* C A7 M9 xdeclare (dat,data) byte at (30h);0 |/ ^7 e. n, M7 _! p5 z
declare delay word;
& B: ^- m5 [' U6 R# z) Y( rDECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
' I, `/ Q( |% Q9 s4 q+ |8 @& @ 41h,1fh,01h,09h,00h);
6 Z& `9 Z) [9 b+ Y1 l' wdeclare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/, H* u9 a+ @! v/ p5 m
declare so literally 'p22',cs literally 'p23';
0 D& T4 I" S2 [& @4 N* {dog:procedure; /* 初始化看门狗x25045 */
/ t; d! y* z; G3 U7 w5 ^8 h& scs=1;
. s c8 N4 L$ `% r6 R% @5 N3 lcall time(1);
6 g9 w4 W1 J4 K c0 lcs=0;
. }. c3 t& E' U, A5 ?& B, [2 q2 m( ucall time(1); j2 n( c* V w8 w8 J6 v. P/ |! U
cs=1;
" [6 x/ V2 @$ V x" ^- @end dog;3 d1 A2 l! B* B b
; H3 B/ F, P) W
run:procedure; /*步进电机运行脉冲输出程序*/, \6 f# V' M; y( G. s; d# F) D. Y3 a
if ok=1 then
7 i! Z5 N+ l$ ?8 Z! K call dog;4 S/ Y }# V7 @- H+ M. n" K
do;
- k$ ]" {" M$ l; Q; V p14=0;
2 p0 E W1 n% ~0 h6 n' t2 z call time(1);
4 M+ K0 V& p1 K p14=1;
5 p9 b- r6 B. D- {& `& q call time(1);
6 D5 @% b- }: y8 e: ? end;* T8 p6 F) E0 q% V. W( Z
end run;' V3 V8 M5 H8 ~; D
0 D, a# _2 \% p0 F
DISPLAY ROCEDURE(L0,L10); /*显示子程序*/
4 Z0 h9 c; n& A7 R9 ODECLARE (L0,L10) BYTE; /*定义显示二位*/' k' ?2 C+ H3 u& f" [0 T0 B
n=L10;
5 j$ r% y" x5 t7 W% R8 Q n=aco(n); /*十位数BCD码译成段码*/: z$ Y; Z9 ?, D7 K6 T
sbuf=n; /*十位数送164显示*/
5 a+ T. ]2 q' e6 W. ~ do while ti=0; /*等待发送结束*/9 X# i" }4 a1 }9 ^2 U" ?
call dog; /*看门狗定时器复位*/ 0 M8 p9 y# L% H# d0 c& v8 n
end;- c; F! e( L1 ^. M5 R
n=L0; * Q: V9 p' t7 q+ c: q
n=aco(n); 5 _* L7 f/ ]$ [+ u- o+ b
sbuf=n; /*个位数送164显示*/ 0 i2 R4 Q% Q: v
do while ti=0; J2 R4 ]6 a' ]) m o1 J( q
call dog;3 p; j" p- i4 X& l7 f7 g9 S; M
end;
5 R" @5 \& T v$ D! j/ R! Eend display; ' _. U# ~. e& n
outbyt: procedure(da); /*向看门狗存储器写入一字节*/
' i# q$ y% u: z+ Kdeclare (i,da) byte;5 A }* z b) ^. B5 Q
j=da; /*将要写入的字节赋给临时变量J */
. T; s; f8 g# R! \do i=0 to 7; /*左移8位,送到口线si */
" \0 z2 u2 A# n/ t. q. L sck=0;6 a& T4 I: M0 a
j=scl(j,1);+ A' N/ f* Y2 s( H( M# j
si=cy;; L, C# a' r# v$ d3 _' t
sck=1; /*每移一位数据,跟一个时钟信号*/
3 |* t4 K0 D8 t* l G1 k0 \( J5 bend;- e1 S7 d' J/ D$ L( x
end outbyt; ! S8 M3 b) J7 _) N
* E/ P- Q" H( ]" V7 N- t$ E
inbyt: procedure; /* 从看门狗存储器读出一字节 */2 n/ x7 {( o. G. C1 @2 l$ I
declare (i,di) byte;3 N! x4 N6 |" r2 I) \4 g2 c* G b
j=0;5 G/ i1 Y z- A' T: M
do i=0 to 7; . \* R& u8 }( }* O9 F4 {9 R
sck=1;% g( r( O4 t/ _2 u& m# X# S( }- C, m
sck=0;. l9 h0 L) j8 d3 o8 m
cy=so;
q3 _7 r& f- \. ]& ]: X j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/
7 s& J0 p' V* send;0 ~' S" e5 Z, g# \# Y
dat=j;# k! K! A7 O8 s# L
end inbyt;
C1 x$ \/ O# d
$ c) n4 M9 K% v4 v' F- mwrenable: procedure; /* 置看门狗写使能*/# u& w" f$ i2 e( O
sck=0;
. w! Z2 u% p+ Mcs=0;/ H2 c/ N+ s& g7 i/ f
; /* write enable command */6 P/ e7 O+ v- s. ]* f2 i
call outbyt(06h); /* x25045 写使能指令06h */
, w2 P; M8 n9 `% Z k/ v D/ a7 R* X$ {cs=1;0 Y& V% n b7 x- ^( q+ @( D7 ^; J
sck=0;$ |$ L; t- O3 d
end wrenable; [6 X0 q$ Y6 e
& a5 R' o" b9 H, ]8 wwrdisable: procedure; /* 置看门狗写禁止 *// `5 ? P# E8 R0 v1 M* V4 V; ^
sck=0;
9 u( V3 b% U) j6 l8 Hcs=0;0 {. V! J9 \- ~1 ?8 u. A5 E J" a3 N' T
; /* write disable command */
3 J! ^0 ]3 N9 Z$ l7 F; ecall outbyt(04h);
- A4 P: \9 R# R" s, z- d# l" ksck=0;0 h7 Q5 B* t& l- @) [" Z$ i: }
cs=1;
: \% X: r% t1 P) [end wrdisable;
7 e* w# [+ g t! a4 p- I3 u8 d* S
wrregister: procedure; /* 写状态寄存器 */5 ^2 u, e/ C* `1 j
sck=0;
2 p" D `5 u; M0 d. t8 `cs=0;
1 y3 A2 _; e7 ]dat=01h; /* write register command */ 5 ^( P: x* @- ~7 H) y- ]* d# ?
call outbyt(dat);! }6 [- N4 x O( P- ?
; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
: g i( m& c1 e' V4 B0 t, Wcall outbyt(00h); /* 设定看门狗定时时间 */
) e$ i) ]- {% }( z. c;8 r5 Z+ y* k/ m. x! p5 f6 i
sck=0;$ q. Q* i9 x! H, |( W
cs=1;
7 ~% L: N* e/ rcall time(200); /* wait to complete writting cycle */ r2 I ^5 K4 c6 t8 F
end wrregister;
: A0 t4 J, G6 k3 `
7 T. W: S, Y7 J3 @1 X& c& @rdregister:procedure; /* 读看门狗状态寄存器 */
! n1 n( X2 A3 U5 J" w9 }3 w9 vsck=0;
. M: B" u$ a* S7 O; g7 hcs=0;6 s2 M& ]7 E: ?9 @5 p4 y
; /* register read command */
7 v7 T: |; p9 a a, j) Wcall outbyt(05h);4 c, A# P3 e: B
call inbyt; /* status register read in <DAT> *// T# `; Q, [) F* l& _! u. K
sck=0;5 h6 N: U, _2 T5 {; S
cs=1;
. h1 [ p$ U% m" e fend rdregister;8 }& v/ J6 k+ H9 k7 p- \
8 o" Z3 s& s; F2 K, w
wbyte:procedure; /* 看门狗存储器字节写入子程序 */" V# N2 P8 A' c9 z% ^2 G; }
declare comm byte;# J7 ?0 b" w7 Z: ^" H
sck=0;
9 p0 f% c( O4 z) [% p% Y cs=0;0 G4 Z- ^/ n+ O# _3 t/ d, H c
comm=02h; /* 写指令 02h */
% u4 Z, o; n/ e! ]4 Y# m' U call outbyt(comm);( v7 ~/ z2 E! J0 N
call outbyt(addrl);
+ O) f3 a/ `; y$ W0 u& O Y call outbyt(dat); /* send one byte data to X25043 */
0 o3 e" B( }8 r# m# I6 { cs=1;
6 ^& [ F! s' k; \ @. b1 O sck=0;
/ r' X7 t9 U3 \! M7 y' A# m! V call time(150);4 T' Z4 R k& y* X
end wbyte;% a. l' Q6 D; @9 A4 ?( h! Q
1 }) v p) X1 M4 ?rbyte:procedure; /*看门狗存储器字节读出子程序 */
* ~; J. Q. b9 \0 b* N9 R. H+ Q declare comm byte;
+ x1 \0 \% o0 z; _ n& H! w sck=0;& w" q; E# a1 ^4 p; ~: @" E, v
cs=0;2 ? J, k ]- C
comm=03h; /* read command */
% L5 {; a: w4 o3 K5 `6 W6 V call outbyt(comm);
7 m( R O) m9 {' S call outbyt(addrl);- c1 v! l7 u# L7 n% [: [
call inbyt; /* read one byte to <DAT> */) r: U8 X0 ?! }
sck=0;1 y& {1 z5 m6 T s5 h, I* f I
cs=1;
0 [: A% c3 m9 |, q/ ^end rbyte;5 }% h7 X3 q, ]
7 w0 F' t7 \7 G9 f! a/ g& Q& U; Cincdata: procedure; /* 参数修改--"加"键处理子程序+ */( m# A& V/ K0 B# V5 O( K/ x4 d
if p10=0 then /* 如果K7键按下*/% f* _* `4 s) M/ w% W
do;
, z5 X$ E0 a- K5 b+ m5 jdo while p10=0; /* 等待键松开有效 */) a1 Z1 L: W9 H
call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/6 I/ {, Z8 Y( T& ]
end;9 A# C: R) D0 G( L
data=data+1; /* 设定值+1 */
U5 H- [$ o6 T$ ^) Y' Wif data>99 then data=1; /* 规定设定值的上限*/% J, u/ {$ z1 d1 V
L(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */
/ u$ t4 H v5 o/ dL(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */
$ a5 q" _- l3 K5 P% kcall display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
/ A7 s F* P3 vcall time(200); /* 延时 */$ [# l% h! v1 V' m
call dog;( |: \7 p8 s& P
call time(200);
8 x/ }- B( f4 u! d- L- r/ |call dog;
6 I/ M! G) U( ~3 W1 R4 z8 e7 Qcall wrenable; /* 置存储器写使能 */
3 O. @% @& L* P8 V" }; m) L3 Daddrl=00h; /* 置存储器地址 */
0 ?& U, W# J1 f3 O$ Rdat=l(1); 4 i% ]/ C- P" H$ w
call wbyte; /* 将变量L(1)的值写入存储器00h位置 */ % _& k4 C1 Q0 @& g6 y8 |- E K
call wrenable;
4 a# m5 ~7 t# F/ p9 oaddrl=01h;
- Q% e+ N: h4 @2 O% U* E- odat=l(2);
. R T. g5 R. \9 h* ^call wbyte; /* 将变量L(2)的值写入存储器01h位置 */ + }2 K4 U; u+ r* u+ J/ g
end;
. }9 M" H( p8 s; M. ^: oend incdata;
( G( b* @0 \/ L) I& ?+ ddecdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */ ( G! Y: Z8 |3 g7 G7 [" Z
IF p11=0 THEN /* k8 键处理子程序 */ 3 z3 U8 q: R0 a0 f
do;2 |3 s* k: }* z2 C- \
do while p11=0;8 q. Y3 p+ H6 j# F; a: q
call dog;
* M* \- }1 a( [7 U$ u0 o _6 i) Aend;- F1 ~* E+ b9 N. L* _
DATA=DATA-1; /* 设定值-1 */7 `- ~! s6 Z0 T, m0 Y7 \
if data=0 then data=99;1 ~% D. W a6 o) v
L(1)=data MOD 10;
- |+ ]: p1 j4 z2 lL(2)=data/10;
! q' r2 G- T5 F: V( Y7 g0 f7 qcall display(l(1),l(2));
; {( e( o9 M6 B$ R6 Qcall dog;
, [4 m: |- \: d0 Rcall time(200);
$ r/ M8 C5 _* R4 Xcall dog;
5 l: d& `* ~' w5 I4 y& _5 J& ?call time(200);
" h. ?6 X" l2 s4 R& j3 ]5 ~8 ~; ocall dog;6 U$ n# w- O4 A! [5 A6 ?8 {
call wrenable;
4 ` a5 ]! e) [9 e, ~8 e y+ q/ {addrl=00h; 4 C0 s$ Z7 C+ f8 O+ L8 C
dat=l(1);
. e4 s1 d; W, b9 Q0 o/ i. Ocall wbyte;& h9 @8 E( B; Z( ^
call wrenable;( U' O$ K# i% V, g8 Z. |
addrl=01h; ) Y, L2 ^$ {) ]( X5 I4 K' e6 L
dat=l(2); r* @) a* W! n; M
call wbyte;
7 V$ C) p5 X0 t* u+ y end;
3 R9 F, {& M) R! H7 j+ iEND decdata; |
|