|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序 _' e. Z' n6 W5 v' |5 D3 ~
/*这是一个控制步进电机正反转的实际应用程序*/8 B1 R' ~9 e2 G( ^& W
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/" R. R/ ?# n( P0 [
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/! d; Y( h/ }7 e; [* G
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
7 X* R# ?. | b: j5 w$ n/*k7,k8键是设定步进电机转动速度参数的加减键*/
! T9 t# P- e& n& s/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/
* }5 [: A+ e3 i, [% k4 o/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
+ y. L2 }: H9 G2 Q. ]/*k11是步进运行键,按一下,步进电机动一下*// O/ u6 U( j; r
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
" s( ` ~4 B) S& I/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/9 K3 h& Q* X0 @8 M/ _5 q% o
START:do;
# i! D8 }3 ~: k9 W$INCLUDE(REG51.DCL)- P4 ?2 U7 P e4 g8 T! m' |8 x
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/% ~ T; U+ T' T$ ]* D9 G, y
declare l(5) byte;
7 y3 ?* E4 p& y7 I* a9 _declare (dat,data) byte at (30h);
! X2 U2 D ~- ndeclare delay word;1 i+ S; M, A* i6 `" j0 K: @& c
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
& @1 }1 q' e' _7 ^8 @$ d) p& t 41h,1fh,01h,09h,00h);
. V3 y7 t# d; D! q! P' X- A# A$ d- Kdeclare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/
l% r. Y: r: S& Udeclare so literally 'p22',cs literally 'p23';
1 W" X4 D) q0 n( h9 }dog:procedure; /* 初始化看门狗x25045 *// H/ _3 L0 ^/ k9 B* v7 W
cs=1;" `: I5 k6 ~' a6 N( J! G1 i
call time(1); i2 }& f4 t W. C
cs=0;) r. m/ u! R$ m4 [. C
call time(1);
+ d p. P3 z% K. T9 O" X( U0 L! tcs=1;
# W+ i6 ]7 O6 d6 M3 j+ x5 iend dog;- i/ S x' f& g+ l0 S& B0 k
9 j5 s! ?# m6 z# J; Y
run:procedure; /*步进电机运行脉冲输出程序*/. H3 a: |8 z: H- F/ v2 ]: J6 s7 i
if ok=1 then
: a& Z: ^ @& _* u" j- J& u& M: ] call dog;4 T6 v+ a1 K# |& q9 o0 e+ B
do;
# I2 W" L$ I3 F2 V( w p14=0;7 L- W0 X' N4 @: {) k9 h
call time(1);# {& |6 \3 ~6 n6 V" W
p14=1;0 B. @9 b$ `! e- i/ \; L1 I
call time(1);& c6 a/ a# H& f+ D6 S2 e5 O2 S4 U
end;
$ O7 _+ ?7 c4 I* Fend run;" ~9 @" X6 C* X" y' x* p. e% z& c
4 Y6 }& U: E+ z8 ?* a1 j
DISPLAY ROCEDURE(L0,L10); /*显示子程序*/5 f' n) W+ X6 y4 x; ~3 A
DECLARE (L0,L10) BYTE; /*定义显示二位*/
" x( P% D1 x2 g7 E% K% p. ?& hn=L10;
6 n! d8 t- S. a9 W9 q W n=aco(n); /*十位数BCD码译成段码*/
* E/ b2 E6 _# F/ `' N" o. @3 |5 w5 B2 } sbuf=n; /*十位数送164显示*/. M7 o2 S& ?# U
do while ti=0; /*等待发送结束*/5 ]# k/ e; z+ v \8 H
call dog; /*看门狗定时器复位*/ 2 D! t, x/ f8 M* h/ d
end;. e& @6 @/ u- s V! D2 B
n=L0;
( E3 J }7 D: [ Z4 U0 A n=aco(n);
% _* m6 p. d F# |6 Z sbuf=n; /*个位数送164显示*/ : H% C5 j- L+ _' P* u2 Q" o$ ?9 U
do while ti=0;
, D$ ^5 h& b D" g1 z( G call dog;
7 N* I7 l. n) H3 |5 c, p# X end;, F0 K g6 q" ]" F5 |! ^
end display;
% W- q: `( J. x5 T8 Aoutbyt: procedure(da); /*向看门狗存储器写入一字节*/6 V, E8 _) ~2 P. g _
declare (i,da) byte; e$ A) c, j! q# ^) ?4 R0 }: u! ~! P
j=da; /*将要写入的字节赋给临时变量J */
$ g* V+ v& v, m* l( O6 Odo i=0 to 7; /*左移8位,送到口线si */
- N+ t; _& |0 S, S* H% y* i8 C sck=0;
; t9 h( Z! t, k3 A5 q6 W$ b! P j=scl(j,1);
# n; U$ S- F, P si=cy;
, T3 E3 |8 X V- Y% T4 g2 d \ sck=1; /*每移一位数据,跟一个时钟信号*/
5 Q9 B* X5 X" m0 Bend;
' ?3 O1 t$ a* H9 K; j- Y* f$ cend outbyt; d. W; t* j0 w
t7 d! |4 y L5 q# F7 S) m) Yinbyt: procedure; /* 从看门狗存储器读出一字节 */
" D5 V9 ^. l. t$ Gdeclare (i,di) byte;
1 ^. D2 x" V( c7 w {& { g, u% ej=0;
: j% l2 L% Z! n$ Ndo i=0 to 7;
9 n \8 \$ A& u; Q g sck=1;2 F5 y) O: S- Y
sck=0;
" \0 v( {, |, ]1 U+ h cy=so;; w7 ]( x' @; v7 ^. T- g3 m# H
j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/" o8 k$ }7 i# E
end;% D: a; U& G: [8 D: K. ~
dat=j;
! J9 L7 Q1 m q- i8 y5 E* v' Jend inbyt;
' f: r1 U6 N/ Y, P3 s- H5 ]# v/ J5 R: o" u7 ]
wrenable: procedure; /* 置看门狗写使能*// Y' H3 h! P4 ~7 P* U* H% A
sck=0;
c. ]1 P! C0 n6 ^cs=0;
/ k& {' f7 L1 ]( g1 l; /* write enable command */
" w8 }- W3 }4 m" M: Bcall outbyt(06h); /* x25045 写使能指令06h */
+ `. {& y" `5 Ics=1;0 w7 z1 I+ P0 j' f' `
sck=0;/ W' b! s5 [3 I S* [* r8 U( E, c
end wrenable;
2 j) n8 ~6 |( d8 H- [2 ^! \8 Z0 l& f# H% q, G: l
wrdisable: procedure; /* 置看门狗写禁止 */# x% Y& S# m) {" r% y7 L1 l
sck=0;1 T G$ u3 |9 T% `; x+ V
cs=0;: H a* r/ J& U7 Q5 ]+ n
; /* write disable command */, S6 W! R/ r& C
call outbyt(04h);
/ B: H8 n7 J9 K$ u0 f: fsck=0;5 @( C: ^/ f0 J! q; v# ?
cs=1;0 T; H* |2 G3 Q8 A# a9 @1 T5 N
end wrdisable; d7 [2 ]/ h. u8 m, M2 d
- ^" V2 i- B$ W$ j& Jwrregister: procedure; /* 写状态寄存器 */" A& M& N$ V5 d9 j7 z8 p
sck=0;
: w" y; w; Q) M" S- Z p5 ycs=0;
7 c5 @; q4 G6 {4 O1 Ndat=01h; /* write register command */
8 R4 |* r2 C0 x- a$ O- C8 Fcall outbyt(dat);
1 I# z0 P: j3 p% U+ k; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
# I' V* Z4 e# M8 K8 Pcall outbyt(00h); /* 设定看门狗定时时间 */
$ i: |1 i1 D( z+ q3 W+ ^;/ d K3 _9 B' [2 a' c1 G4 D# c; U
sck=0;
; [& p) q5 ~7 F N; E' rcs=1;
- b) `3 t# t; v6 f, R8 `call time(200); /* wait to complete writting cycle */
. l* `5 O' t% E9 u3 f# m3 Hend wrregister;
2 A t4 x& d4 f* O/ q# D& ?; U: c4 k: ^* U; k8 T
rdregister:procedure; /* 读看门狗状态寄存器 */* @& t- a. F# u. T
sck=0;
@5 @3 U; k* E- Z3 z+ ]8 r- Tcs=0;: J1 G) O2 n$ }) b1 ^0 r2 E: B3 T
; /* register read command */
; E4 Z. ~6 [& c% o6 s) pcall outbyt(05h); h* C% W3 ^- A) y, F
call inbyt; /* status register read in <DAT> */
( O! B* a& p7 k* g5 a+ Rsck=0;
7 ?( b$ z: V7 j6 J4 ^' H/ zcs=1;- ~' Z) ~' ?. |0 x. z8 s
end rdregister;
+ K) Z& D2 X' O: u) q s R4 i n7 r' G( B+ I( q+ }6 F
wbyte:procedure; /* 看门狗存储器字节写入子程序 */( P) I z5 _1 j1 ^( j
declare comm byte;
. V; A$ W8 U' i- k2 c sck=0;
4 Y' h1 h% ?/ p# S l cs=0;- C- m l4 w& n8 e7 w5 G
comm=02h; /* 写指令 02h */9 |$ u* X3 I8 S) A# X, a
call outbyt(comm);
3 X1 @+ ^8 U! H7 N. B call outbyt(addrl);
. }' Q' a& G" t/ k call outbyt(dat); /* send one byte data to X25043 */1 |( M" g9 M5 h' U& [
cs=1;- [! b3 D& \7 n$ L5 w! X- o4 V
sck=0;
; k/ m, o# M- ]) `4 t call time(150);
: e K9 S3 [- \0 Jend wbyte;
* N' X( N6 H% J) q$ w3 Z/ ^( [) V) z0 m4 m$ c' _* P
rbyte:procedure; /*看门狗存储器字节读出子程序 *// R. W! h: @3 ]
declare comm byte;
2 ?" E1 j9 T( b) F( S7 ? sck=0;7 Z) }- l+ ~7 N- \6 V% J5 n6 P- W
cs=0;* \' g% U: v& d. R \1 P8 a5 |
comm=03h; /* read command */
, i& u( X6 S C+ ~4 F# s8 f, C call outbyt(comm);& E& E6 d8 m; Y
call outbyt(addrl);) A" S* c/ I3 s" i& H3 ?
call inbyt; /* read one byte to <DAT> */ G2 P2 u2 s6 H' E5 U/ b
sck=0;# d: G3 Q; S+ P1 d5 w. Y8 ] O
cs=1;
5 \5 L: G/ s% y- w, Qend rbyte;( f8 ?, R! |2 d t
$ D/ a' D3 }) Lincdata: procedure; /* 参数修改--"加"键处理子程序+ */
2 U2 y# d; Q6 v% N7 Zif p10=0 then /* 如果K7键按下*/
# w4 `. X5 t V' V C( G& \/ u do;$ b! c+ m" [0 B! P- A- g: g
do while p10=0; /* 等待键松开有效 */
Q* S: j" ?) h3 m" r7 k \; O6 o5 F call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/; g$ I( e( H) u- U; r
end;
) y D7 M, Y* n5 ]0 r& h5 ydata=data+1; /* 设定值+1 */
$ b! d" E B2 b c/ {% p+ ]if data>99 then data=1; /* 规定设定值的上限*/
. u2 I) T- T& WL(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) *// A2 r* }9 p# N! F& \3 l
L(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */4 `. i9 P8 t2 @/ D; c1 T7 D
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/- u, x, p, c, H" ~% }3 b, Y7 B+ h
call time(200); /* 延时 */
* K4 z" k6 m% fcall dog;
C- y2 L' U5 O1 wcall time(200);+ T4 `- i8 m1 n k' F' v0 K
call dog;0 R- u' P+ _& S" q, \2 C4 ~% A; \
call wrenable; /* 置存储器写使能 */
# ?" b! Q0 o% `0 O! \& q! maddrl=00h; /* 置存储器地址 */, v' D7 C/ L, K* n+ K- I
dat=l(1);
% j# f$ N5 P4 k2 Xcall wbyte; /* 将变量L(1)的值写入存储器00h位置 */ * x H( N9 D4 F+ B! V6 {8 {
call wrenable;6 M$ p+ p+ }1 C7 d
addrl=01h;, ?" b+ Z7 t2 c4 N! _ q
dat=l(2);
8 \4 X/ m6 H+ W! Icall wbyte; /* 将变量L(2)的值写入存储器01h位置 */ 4 Q# f. r" |$ a0 G* W
end;; g! F/ X7 ]! `- X6 i8 P$ o
end incdata; 5 C1 z2 v5 [. o2 ]& _1 s0 d- Q
decdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */
8 R+ H5 E9 K! S; SIF p11=0 THEN /* k8 键处理子程序 */ 6 x6 G! Q! {2 y5 Y2 G D/ D2 z
do; K& R" @; B9 H8 u
do while p11=0;( l; i; x) k7 q+ c& ?9 |8 X
call dog;
' z" Z8 M4 _+ e p. Xend;
+ ^4 A* c2 u! T/ ^7 LDATA=DATA-1; /* 设定值-1 */
( A$ o; Z+ E8 s. G9 G( `% [8 k) Mif data=0 then data=99;1 U& J1 L& v$ x J1 @
L(1)=data MOD 10;
) A+ ^- V; g, ^7 X" k. fL(2)=data/10;
2 h. R8 X) c- C* Scall display(l(1),l(2));
9 ?6 v( {& H7 r2 c8 r* x! h+ [/ [call dog; G. a b9 b+ D
call time(200);
6 b4 H3 l: i& m: lcall dog; 1 [" x6 y) ~; y/ h4 ?$ {7 U
call time(200);; {2 L n* X, E' o% C" {4 N# Z
call dog;3 F B; B+ _& c7 ^5 q
call wrenable;% ?# C/ }6 T6 B/ f
addrl=00h;
S4 b( o9 _% _' ~0 J9 rdat=l(1);
) u/ k9 n& ^3 z* }5 x/ Ucall wbyte;# v( u" ~8 ?2 k; L4 e) [4 a
call wrenable;8 o0 W% E) X4 W9 o, j5 C
addrl=01h;
% V3 W8 \9 r7 tdat=l(2);
3 ?! |( f3 b) v9 R9 n2 hcall wbyte;" z, b7 a5 v/ V; ^' {9 G* o
end;
8 w5 J* v v; c. A- ]" ~2 SEND decdata; |
|