|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序
6 r% i7 b1 D+ {/*这是一个控制步进电机正反转的实际应用程序*/
# L/ Y+ Z/ w5 r& Q5 `/ \5 V# A/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/5 U6 Q$ o& S. K' A( Z
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
9 S" h% D3 u, x/ s- r/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
8 W: ]# `" O, ?/*k7,k8键是设定步进电机转动速度参数的加减键*/) v k- H- h! l" ?
/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/" u: h7 Y! X" Z
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/& F, Q0 w8 ]! b" t
/*k11是步进运行键,按一下,步进电机动一下*/
U. T; ~; z9 r4 |' o/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
8 E2 _/ r! N4 A7 S$ o/ t/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/4 G) k# J( H, y, o
START:do; ; _8 q' a( }% k/ g
$INCLUDE(REG51.DCL)2 P8 j0 \) E1 D6 s$ G8 Q! q
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
) \. j4 e6 S! Edeclare l(5) byte;
O/ B2 K* S$ H% hdeclare (dat,data) byte at (30h);: ~, b1 {$ D! c* l" q. H6 P- I
declare delay word;! R, O. w6 C9 }7 v
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/ A7 O! {: `, }- A, E2 L
41h,1fh,01h,09h,00h);/ U! z- @! h: D# S( ]( t- O
declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/
# U& `. F- h7 P/ B& Hdeclare so literally 'p22',cs literally 'p23';
6 N! L, X; y! x' Y8 bdog:procedure; /* 初始化看门狗x25045 */
1 O& q7 _, h# D' @cs=1;# t& Q. l6 [: \; j3 q" Z* O6 e
call time(1);4 ~: W" Z4 Y7 b2 u
cs=0;
/ s+ h: I& d9 ~6 t0 _call time(1);: o& w9 v" S: K/ B* q( y- X# ?! B
cs=1;
' d0 s& q$ v8 {end dog;- s9 \1 K* l2 \ a
- m) q8 U K1 Q& ^- R b( rrun:procedure; /*步进电机运行脉冲输出程序*/
& x5 R# T$ e+ g1 [ X if ok=1 then
- w+ E4 o6 S# A4 U1 ?1 C4 j( \ call dog;* q( ^: l7 u, i2 O. \; u
do;( V- C; t$ O0 H' R, q' r% L' J
p14=0;
: M% R9 o* y, ]5 ?4 E call time(1);* W7 n) Z! W' r6 K4 T
p14=1;$ M; o/ \/ C$ Y0 s
call time(1);
& M$ f p) h0 B# u end;
2 O, |& W& F B0 D5 kend run;. D/ q+ o8 u) c7 w; n# Z
" X9 V' a4 F; a+ c
DISPLAY ROCEDURE(L0,L10); /*显示子程序*/
# N }- g# a/ C1 oDECLARE (L0,L10) BYTE; /*定义显示二位*/6 j+ R+ V: S4 X( p2 {
n=L10;
+ V) @$ e6 x6 H2 p& V1 h. S n=aco(n); /*十位数BCD码译成段码*/
6 A6 \; \ x0 R; t4 c sbuf=n; /*十位数送164显示*/% u7 X; w. i; T7 k" ]6 H3 t& w' |
do while ti=0; /*等待发送结束*/
$ T- w7 H+ P1 W0 [* U& U7 Q1 h6 b call dog; /*看门狗定时器复位*/ 7 r6 }' K+ ]2 j" f$ Y0 E/ X; s4 h
end;2 j1 z& {$ y' Q. p9 F, u" K5 V+ ?
n=L0;
/ m. U0 h: O- i& j n=aco(n);
9 v4 V* B$ c* X# F sbuf=n; /*个位数送164显示*/
+ N3 @% b: o+ M1 L5 E do while ti=0;
: R) _6 B: u/ |0 { call dog;
4 f% \9 @7 k# N! m% m end;# n& Q6 ~4 t; j5 I- \* ?7 Y
end display;
+ m1 D+ M4 m% w D' c. n% s' Z1 Eoutbyt: procedure(da); /*向看门狗存储器写入一字节*/
" ~% s( {- t; X1 Q# h. b7 Mdeclare (i,da) byte;
, L% ?: |0 ~# [0 nj=da; /*将要写入的字节赋给临时变量J */
. f* E1 W3 s. W4 \. ^6 f" f" ^do i=0 to 7; /*左移8位,送到口线si *// B, D7 `3 p' m
sck=0;9 H6 b, v# ^. ]- @; j
j=scl(j,1);, ?8 M7 U; \! t5 Y; N# b9 o
si=cy;
) @+ r& r# {' G9 z sck=1; /*每移一位数据,跟一个时钟信号*/
- B8 m* {) j9 R7 ? E4 m. nend;
3 S0 [; D8 r7 i! e1 W/ Kend outbyt;
4 a S- T+ x( {8 S: m. c% X
3 N9 Z. g- l( c9 |0 ~$ m+ @inbyt: procedure; /* 从看门狗存储器读出一字节 */
+ y" c5 j8 ^& @, qdeclare (i,di) byte;
/ w- y) ]; f& E, n5 C' b1 aj=0;/ P8 Z5 ?$ P, T7 O8 V r
do i=0 to 7;
7 {. n' i! g7 }: P sck=1;
% t3 R5 a, W' i7 f sck=0;
6 [ u, i& j |5 T cy=so;
9 N# K0 e" }6 R4 [% W4 v; D j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/1 z* k0 M( @' u- b
end;
1 V' X" y: k- k4 m$ e, ndat=j;0 J, q( \$ ]- F- }/ Q
end inbyt;
, u% _1 C. u1 K4 k* s p$ A2 r' l4 \* J9 s1 L
wrenable: procedure; /* 置看门狗写使能*// Y, f, A+ _" ^* s4 O
sck=0; ; q" P! \' K7 v
cs=0;
3 d; H8 F0 {5 J* N* f% A& v, b; /* write enable command */+ t4 X3 O. A: K$ V
call outbyt(06h); /* x25045 写使能指令06h */
" F7 ~6 z" u: {cs=1;
, a& d: b: I, x4 m2 fsck=0;
+ M2 C! w: `9 C/ J/ s( Iend wrenable; d" \7 j& [/ u0 J8 K' Z; W
* Y6 V W0 _+ \( `wrdisable: procedure; /* 置看门狗写禁止 */5 S( u; o) u. Y c- j. I! P [- W
sck=0;
8 g% @, A& `6 I$ b$ Ucs=0;3 H+ P; ?8 W1 p5 M( [, G+ V
; /* write disable command */
4 K0 e4 T) g! [8 K" mcall outbyt(04h);- a( n, b4 s7 Q. P7 w
sck=0;
g/ o# \- X0 Ecs=1;
6 T; C) {9 @. ?( l0 e4 Gend wrdisable;3 D, o4 q" Z4 }
2 k: K' b& h; s+ q0 E uwrregister: procedure; /* 写状态寄存器 */
( {, H& Q9 m" ^) I; U7 a9 l) wsck=0;
4 f3 X: L$ G# L8 I5 Ycs=0;
: r, @# q! L$ j1 ^ Ddat=01h; /* write register command */ + }2 b" {2 I8 m% t% ]
call outbyt(dat);/ x% ?" o0 p. M" e
; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */: I$ }9 p8 t0 L; [0 F
call outbyt(00h); /* 设定看门狗定时时间 */, ]* |" Y# } F. C( r/ ]
;
+ o' v" r: G p2 ssck=0;3 o7 K" Q; `8 {
cs=1;
2 w: B! W8 F' B$ O9 Scall time(200); /* wait to complete writting cycle */
V; z, s5 O$ {. Z g/ oend wrregister;
+ U, t# o4 g U4 N1 g k
) _7 l0 U3 e6 p+ k9 drdregister:procedure; /* 读看门狗状态寄存器 */
, c5 i5 L) f! b4 N" }* j' osck=0;
; a! a- N4 S) ^! F2 d7 `cs=0;
2 ^! _/ m) F6 t3 A. O# Y; /* register read command */
u1 \9 q" X: W3 ]call outbyt(05h);3 x* c' P) l! Y9 } C
call inbyt; /* status register read in <DAT> */
5 c3 }9 L0 u! N# n1 C- ?. N" k0 fsck=0;
9 y# c# a6 X$ U" o8 j9 z2 H& s* ]cs=1;, }/ K8 C$ x& f- e& i0 O; o
end rdregister;+ N/ I4 T. t& e$ P( b
! N$ b0 s" K% x8 Wwbyte:procedure; /* 看门狗存储器字节写入子程序 */- s' t0 F: L. ?
declare comm byte;5 L* | y4 G/ A6 _
sck=0;
8 H2 m: N: `- ?8 N cs=0;$ O/ L$ L* U# J. U6 V# z3 y$ w
comm=02h; /* 写指令 02h */ P* ?$ i2 n8 I, r9 L! a
call outbyt(comm);
7 X# l& g, Q, k) s call outbyt(addrl);
% r9 U- Z' |1 i6 N4 h" `& b, x call outbyt(dat); /* send one byte data to X25043 */
/ R8 V# h) K. z& [ cs=1;+ D3 ~2 a* Y- i; a. p! l
sck=0;; S; D0 b- l& a) w
call time(150);
! p$ m# d9 z; tend wbyte;
, N0 z7 M0 j$ K2 ?. F6 v5 {+ L# r: z( R7 t2 U, u% O
rbyte:procedure; /*看门狗存储器字节读出子程序 */
3 h9 @+ R3 B" }# Q- I declare comm byte;
# f- D8 [& d3 }8 y6 H7 o: Z# t sck=0;
! j! O) q- ~' D* b5 ^ cs=0;
6 z2 L$ K+ H) h9 W comm=03h; /* read command */
& U8 n( r9 n1 n call outbyt(comm);& X( e, @/ e. u% z* B& I/ w+ A
call outbyt(addrl);. j. X) t! ^8 J' N& P& v& r4 d
call inbyt; /* read one byte to <DAT> *// n6 h% j: m8 t m- h" U) M
sck=0;
& a9 _+ B0 K' S3 h6 m$ Y: ]. q2 \( l* P cs=1;
- x$ \: G. w; |# xend rbyte;* a! i4 `/ e* F( q" y5 z
# b, d/ Z8 _% v# J5 n2 Qincdata: procedure; /* 参数修改--"加"键处理子程序+ */6 U1 f# q7 C! r* ?9 B3 Q8 L
if p10=0 then /* 如果K7键按下*/. c' { b# g# E/ s4 ?. ]7 }$ P, T1 {& H
do;) M) L+ ^" f+ Q+ s) A7 i' e. r* L
do while p10=0; /* 等待键松开有效 */7 L* \$ G$ F' Q+ n% f m
call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
- @ k8 q( A- v4 Rend;# r3 o; t* x/ k& Q2 o) t
data=data+1; /* 设定值+1 */2 K5 S" M: ^9 F. e
if data>99 then data=1; /* 规定设定值的上限*/
: y) Y$ ~! Q: E1 WL(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */' h$ M( h" T6 e. Z1 j: F2 q1 k, S$ _
L(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */7 ?* ?2 [; I S% V
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
7 C- G" Z7 {- Y4 k3 p7 Kcall time(200); /* 延时 */: M; V/ _5 a- e: b; \
call dog;2 e$ U5 M( [' \% [ K) ]+ F- E `( ~
call time(200);, x* N L5 ]6 d
call dog;
( q8 D5 d5 d0 scall wrenable; /* 置存储器写使能 */
$ |! z3 D6 ^6 M, H& \addrl=00h; /* 置存储器地址 */1 n4 J0 H0 i' e& D0 U
dat=l(1);
9 x0 q* h; D; w/ i, Gcall wbyte; /* 将变量L(1)的值写入存储器00h位置 */ 1 d. T/ D" r+ D z1 I+ |
call wrenable;0 T1 V& N( ^; K) L0 i% u' Z
addrl=01h;8 `# B9 x2 g, _+ Q
dat=l(2);' W2 D' g* @) X, I; f
call wbyte; /* 将变量L(2)的值写入存储器01h位置 */
) X% h/ M7 _( z4 [; y; } end;
) p4 R; Z& G2 A( J8 @& g9 vend incdata;
/ ^9 Z- N. ] t1 N0 S7 Kdecdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */ 1 J% J) M/ i4 `4 g/ {
IF p11=0 THEN /* k8 键处理子程序 */ : c2 E( \5 z$ |
do;) _4 b4 R, F. H! s( Z' p
do while p11=0;
0 ^, T. C V& _0 T# B/ T$ _) N call dog;
0 G' h1 n( E2 g7 }( ^7 `end;
* U: z/ E" [8 @1 x/ GDATA=DATA-1; /* 设定值-1 */
% f3 L0 W$ |3 t) F/ A' hif data=0 then data=99;
9 q# ]$ Z: {4 w3 |4 IL(1)=data MOD 10;
, Y1 c5 D! c- l) ~3 F+ WL(2)=data/10;
. Y. q6 S3 B+ i3 b( Lcall display(l(1),l(2));) q4 j4 e, ?0 |- _7 @; `
call dog;, L. b9 b' ~& u' }4 L
call time(200); - y" c7 z9 L6 Y
call dog;
/ h; k1 f3 w) v* I5 kcall time(200);
) P: h7 Y2 K% p) B" H; Qcall dog;
( h% q# ^$ }& ?+ R' K0 H6 q# r, Scall wrenable;) `7 p3 p6 a' r1 e' E8 s
addrl=00h;
7 s! `+ w) c( c' t( f& Qdat=l(1);
l& D5 k- z) o5 h4 t+ `$ tcall wbyte;
0 V& P2 v, |7 i6 n& A) N: ycall wrenable;3 U9 B; O7 x! H) D) n: l! D( u
addrl=01h; 5 D8 ] w0 s2 ^' F& Y3 p1 P
dat=l(2);! E3 E' a' s3 @8 Y" r. H
call wbyte;
2 z: d# W4 |" x* ~- ?) m/ [ end;
2 q/ v" ^4 P& J* ]1 o& |; V, jEND decdata; |
|