|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序
( @) Y) M, _/ E0 N# \/*这是一个控制步进电机正反转的实际应用程序*/
" W, y7 S* X! l7 H7 P* m: @/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
) d# L! c9 U# N1 H/ c: N/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/+ p9 O6 G: P; \) R$ P, I5 w5 z
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
1 Y; }+ |9 f7 z3 S. }" h U/*k7,k8键是设定步进电机转动速度参数的加减键*/
8 _( ~; | o- v. e8 _0 L/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/0 S* z% _- d# J3 J
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
: A2 W6 T. Y. S/ a# u/*k11是步进运行键,按一下,步进电机动一下*/
$ L5 _' l2 G7 h4 U4 q: w! O/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/( E1 z* s+ z! N/ ]- g9 v7 s* F
/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
5 ^. I' {$ d( C4 T1 [& i7 v YSTART:do; . S- U, z& D% {8 r
$INCLUDE(REG51.DCL)
' i# E; R# M2 H7 E& l- ]0 iDECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
8 m7 c! C: U# ]declare l(5) byte;
: N% g1 ?( U2 {# @7 ] B( A U8 I4 n" }declare (dat,data) byte at (30h);/ g9 k$ p4 s5 y2 s
declare delay word;
$ V% Y5 H" @0 ^3 h7 q# M E5 }DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/2 M# r8 T, Y/ Z0 ~! n
41h,1fh,01h,09h,00h);
6 A& x' X' W2 x% u, u: S+ t5 Rdeclare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/8 t8 N* N: P% @" f$ P
declare so literally 'p22',cs literally 'p23';: R9 j5 D: `* Y% c W' T
dog:procedure; /* 初始化看门狗x25045 */) M! @1 X* n2 I2 p' F6 b
cs=1;
* @4 {/ h: {# q* Q: _) _call time(1);5 |3 h: o3 s* X2 I# _5 `- b
cs=0;$ l# f1 ~& k; G. {
call time(1);
6 y1 @2 X" j8 ~' H: h% dcs=1;+ `6 W$ _: z& ~; h' l
end dog;0 M) _- C6 {( L7 \8 D6 D5 r
1 L; L; T; N2 [0 p% m ^
run:procedure; /*步进电机运行脉冲输出程序*/
, l* F7 ^4 ~; `8 P2 H0 `% b- h if ok=1 then
: b3 P6 \5 w5 e; U! {, O. K call dog;3 f, y3 I4 E5 @7 W) M' S1 y {
do;
' V* |$ m+ s, {4 R8 t8 B7 i% q p14=0;
5 J% T. O# ]! b# I+ f! s1 f4 Y" b call time(1);
9 t4 B4 G" _4 V; U k' J- h$ K) r p14=1;
5 W# ]8 I# W/ y- s call time(1);/ y* N h6 x$ O( f* P
end;, ^# y2 o0 m6 I3 |
end run;1 k |: ?/ P; T Z! T$ ^; @
, e, @8 k' e+ L) p% `" R3 JDISPLAY ROCEDURE(L0,L10); /*显示子程序*/9 Y3 M$ A3 j8 R/ r& ^& g
DECLARE (L0,L10) BYTE; /*定义显示二位*/
' \# X2 J' l0 T4 `3 V. f+ z4 un=L10;
9 m" |$ l4 E5 D n=aco(n); /*十位数BCD码译成段码*/
: \! f# H: w. ^- { z O sbuf=n; /*十位数送164显示*/
7 M* @* P) \# d. K, u do while ti=0; /*等待发送结束*/+ y/ H, c% m& N7 B4 K& J o/ s. v
call dog; /*看门狗定时器复位*/ * h0 `3 A2 C% N2 y1 y ^
end;
; g' ^' J$ W1 J* i" An=L0;
0 Y4 Y$ e) \: Z n=aco(n);
+ j, T- e# p6 z! h. X, w/ y) d) U sbuf=n; /*个位数送164显示*/
% o0 Q3 [! y2 r# _ do while ti=0;
! w0 l( z5 |3 j- U8 a3 [! x6 ] call dog;; R. t$ `3 e" f: Z/ _$ }* V
end;
& N$ e. ?; M4 t& k6 W: iend display; : j! j3 m) R5 ^' Y. b. O
outbyt: procedure(da); /*向看门狗存储器写入一字节*/: E& f" Y( K' ~* c! r% I: E/ r
declare (i,da) byte;
+ ?- j0 h0 _* ^9 O0 P) l2 x- vj=da; /*将要写入的字节赋给临时变量J */
) e: \- X7 N$ X- Ddo i=0 to 7; /*左移8位,送到口线si */
$ ]) F" i. ]8 y3 W1 } sck=0;. h% {* n3 |& Z' r& @+ s
j=scl(j,1);% e/ q: @* [& W7 H4 l
si=cy;
1 @2 z, O$ {. c% V sck=1; /*每移一位数据,跟一个时钟信号*/ - R2 ^6 V, `# G% }
end;
1 Z( a8 |0 }2 ^1 Cend outbyt; ' K+ U* t+ ] n, h% V
: @0 }5 |- K" E# `- a
inbyt: procedure; /* 从看门狗存储器读出一字节 */
0 G% c' a" T* D% {8 \ x4 `/ jdeclare (i,di) byte;
! B/ J2 C; W4 R3 |# cj=0;
1 g0 _9 n1 u5 J- I* K1 p$ wdo i=0 to 7;
) ~. v6 h, |8 @. l$ T2 b sck=1;" b) X. k* f2 T3 @; F3 @8 \
sck=0;0 T0 }, S& [& a `3 f
cy=so;
. @ q P6 ]0 ^3 S. E8 [ j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/3 Z+ g+ B" `3 B! P( f( o, V
end;, f) A, b+ o4 p( a. z
dat=j;# S9 ]& f3 t# A5 o* D
end inbyt;
/ v5 u& \/ y5 C% z
" N7 r( V6 d; V- a- T dwrenable: procedure; /* 置看门狗写使能*/
2 V! W1 {' f9 \! U8 J& h0 g6 qsck=0;
U6 G2 r! F) Zcs=0;
$ L* O% q8 {# T H& N) Z m; /* write enable command */# H. k4 k! Z1 q
call outbyt(06h); /* x25045 写使能指令06h */1 V- j4 f: Q1 K! P8 c" p
cs=1;
( W& {( P0 m0 I/ C3 n/ wsck=0;- }* N9 c8 V6 y+ X
end wrenable;, w2 v9 i6 J- a
5 L& w k% k( T' g; M9 W
wrdisable: procedure; /* 置看门狗写禁止 */
@3 ^& q. ?& h. ~" u% [# a }# Csck=0;& E+ y" ~/ B: ]& n
cs=0;4 I0 H5 m9 b" O. S( z
; /* write disable command */7 J2 ]3 Z) ^9 z
call outbyt(04h);
# i( U1 r( p! dsck=0;6 [5 f+ e: W7 a, b3 x
cs=1;
: t9 ~& N; ?! V, K) e& Kend wrdisable;4 E2 p# O( W1 ], U
) q; G0 d# I/ ]% y; A& Awrregister: procedure; /* 写状态寄存器 */) F" F; ?6 ^" F' K) U; w0 l
sck=0;, q; D' V2 W4 a3 J) }0 W2 F/ z
cs=0;0 d" g g3 H+ @+ [! y3 e
dat=01h; /* write register command */ 8 D8 x' R5 ?) s. {+ j1 o# P
call outbyt(dat);
, f. x; ?, C. l6 [9 c& S; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
" }/ Y" Z3 D, U5 N2 s1 Wcall outbyt(00h); /* 设定看门狗定时时间 *// s% ]0 f! z# ]$ E$ x3 }! r
;/ Q/ @. o# _$ z" Q
sck=0;1 P9 M2 q! d8 Q+ R) n, e
cs=1;; G U+ b% x+ Z: k
call time(200); /* wait to complete writting cycle */- V6 h/ k7 Z" O9 t( @- T' H8 g
end wrregister;
( r% e7 S5 D. N2 U- f Y( D7 {4 W+ B! T3 H6 i- r7 V" D4 U
rdregister:procedure; /* 读看门狗状态寄存器 */7 P( P ^: v& x$ j2 d; q. \
sck=0;
* z5 o8 Y9 J* e1 g5 n4 \cs=0;
5 o' p8 A1 a' P0 ?2 D. ?" u; /* register read command */
7 t' ]. y4 M( r3 N& A" E2 ]; Ecall outbyt(05h);
" {2 l" ]) `; \# e5 Rcall inbyt; /* status register read in <DAT> */$ o0 y6 x: g+ b( d' h+ ] m9 ]
sck=0;
2 p0 U! n% X* Ycs=1;$ o( N2 @8 J2 R# y
end rdregister;3 a" D" y5 D+ O. s4 c
/ S; ^! ?( L4 A0 y3 J- ~6 zwbyte:procedure; /* 看门狗存储器字节写入子程序 */7 L) e5 |! }9 Q6 P& E- m! F' L
declare comm byte;( u4 v+ f6 V" U5 j( D7 T8 ?5 S- f
sck=0; Y' ^6 N& @) z% E4 k" }
cs=0;
: [6 Z1 D' T B# N comm=02h; /* 写指令 02h */& W; n/ j0 d3 \0 F% t
call outbyt(comm);
( g! e I, L" V9 z0 m call outbyt(addrl);6 Z; Y" k% H H8 p) _
call outbyt(dat); /* send one byte data to X25043 */
" ?6 n/ M) D( d5 a cs=1;3 G+ `* |3 m) T) p9 Y ]: N k
sck=0;# e& S1 A% L; X) b, v2 t |
call time(150); C3 v2 R+ s* v# u
end wbyte;
7 J0 {6 m& F; g- g
h$ V8 ]8 \3 K7 S- y: [rbyte:procedure; /*看门狗存储器字节读出子程序 */+ d+ O+ }. d- ]4 O0 q
declare comm byte;* Z) o: H# a2 b$ Q
sck=0;
; E6 Y) c) E0 T cs=0;
$ v3 p5 Y; `5 O& C7 {/ e# { comm=03h; /* read command */: _: E0 L c' }# u! q( [
call outbyt(comm);
6 J: [* T9 _* n- @' l7 x call outbyt(addrl);( l% W2 B$ Z% B4 R5 u7 k+ `9 c8 X
call inbyt; /* read one byte to <DAT> */% k' [" S9 ~" b3 ?( \
sck=0;; H" ?# V: p3 k% x2 I: N
cs=1;
$ ]7 ~$ a @8 |" Nend rbyte;3 b" O; z+ N0 G% V# p( t: O
" X0 d8 H, x8 l. C* wincdata: procedure; /* 参数修改--"加"键处理子程序+ */% ^9 J( K) G* o0 R3 |# g
if p10=0 then /* 如果K7键按下*/
2 e: ]+ X' k8 x do;
8 g0 A w4 B/ S1 P, ddo while p10=0; /* 等待键松开有效 */
6 q E; V& a- a* V call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
3 m4 e c( m0 r! |+ I9 C2 yend;6 r" k# s* q5 e: h1 P. q3 Z
data=data+1; /* 设定值+1 */
f1 E) }4 l' q- aif data>99 then data=1; /* 规定设定值的上限*/
* d% d4 x4 k6 E* d) K3 v+ kL(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */
4 c' I0 Z9 D l4 Q3 DL(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */) V$ W7 g: m- j& h
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
' z; z) `5 d- k/ m. J: l& mcall time(200); /* 延时 */
3 I/ N4 ]# x( s/ f1 I s$ Ecall dog;4 @- W: G4 g3 Q7 S% ?
call time(200);
]5 G# N4 G4 b9 ~3 Lcall dog;! r- d: Z6 i, O7 P3 _4 X* I
call wrenable; /* 置存储器写使能 */: p$ d3 Y# l- m3 M; W$ N
addrl=00h; /* 置存储器地址 */
* e4 e0 ?$ p6 G" fdat=l(1); & V. M5 |+ s: m
call wbyte; /* 将变量L(1)的值写入存储器00h位置 */ 6 N) f+ {9 k6 s% B" ~: Y
call wrenable;3 B8 U2 h t5 c7 P
addrl=01h;
* w4 W+ w$ P0 g: K3 sdat=l(2);
; a# ^$ Q, d9 ~, `3 Y- {$ h3 Scall wbyte; /* 将变量L(2)的值写入存储器01h位置 */
, Y/ n5 |6 U5 e) }6 {6 ?+ u end;
, k$ g5 L" N2 m% e# r2 ]' {end incdata; " @- e( X& I0 t% E
decdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */
1 r9 m2 u) c& V2 a% Q# L4 gIF p11=0 THEN /* k8 键处理子程序 */ % g5 L! | }5 _( @/ [3 j. C- J* w4 }
do;
: R4 k0 J+ g( @do while p11=0;. F* e" P- t+ L# X
call dog;
0 C9 `. @, K/ y; t1 oend;6 r/ U+ V# v; Z% P* ]0 Q0 m
DATA=DATA-1; /* 设定值-1 */
" R( N, F1 i2 L, D7 B; v' Uif data=0 then data=99;
8 {4 J" O6 b qL(1)=data MOD 10; $ o5 m1 A( ~" |* {9 g6 d
L(2)=data/10;
; P* t1 t( q9 Mcall display(l(1),l(2));
+ R+ A" O) O6 L: R* lcall dog;) b3 ?3 q# f! H$ M/ @
call time(200); 5 x7 n; M8 `8 p' i! q! Z
call dog; % H8 X; y, W! E% o2 q& h1 _
call time(200);& W8 u# H3 x; i
call dog;
& n6 R! n& T+ rcall wrenable;
" \6 D/ _+ T; Kaddrl=00h; 9 h6 D. ?- R, M
dat=l(1);; A% M; ~+ I/ s/ p' k w
call wbyte; a# q5 H6 a9 v6 k" a4 m
call wrenable; G1 l- t' _& ]+ g
addrl=01h; % n: @- R4 `) B3 t/ [1 J& D
dat=l(2);
$ s' Y+ p0 h( @, h8 w' O* ?0 acall wbyte;7 h8 I" C+ m# P! J" m
end;* n1 E9 L Q1 C. |
END decdata; |
|