|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序 6 s! n& o# m ]3 ?, R; h
/*这是一个控制步进电机正反转的实际应用程序*/6 l( |% w6 z d+ J% v& ?! j
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
# t1 o7 O6 `/ X: q$ K) j) B9 n: ^/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
& g s- v- y" O, B1 J: g/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/* S* t; w( t: n/ \( ~# q
/*k7,k8键是设定步进电机转动速度参数的加减键*/
, }4 q- S6 p! |, d3 r, K$ }/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/
* o, |, L+ a; V9 W5 ~' V3 B$ v+ S: E/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
h1 @" U! w$ }5 C$ p% r; ]3 U; L6 `6 {/*k11是步进运行键,按一下,步进电机动一下*/7 g. [+ e4 }7 F! A- v1 v3 i
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/1 g; _" c# n4 J
/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/3 k" `7 `+ S& \
START:do; - Q7 I1 Y8 @% y# x8 X* u" o
$INCLUDE(REG51.DCL)
+ D5 v, o5 A7 r' X6 m, kDECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/$ n, @+ I; B9 M0 P
declare l(5) byte;2 w' K8 _$ Z+ ]2 X# W% h
declare (dat,data) byte at (30h);3 s3 m% w: @" z7 ?0 W7 f; L( i- _0 h, |
declare delay word;
9 X" u8 Z$ e2 p& r# m; Z! sDECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
& d' g; Q$ B h5 @/ T 41h,1fh,01h,09h,00h);' J1 m, d. [/ X! i/ k: s' m h& [
declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/
# p0 n ~" b( Y5 m C- d6 \; ^% s9 ddeclare so literally 'p22',cs literally 'p23';
- g. A6 c ^1 I, w6 `, `dog:procedure; /* 初始化看门狗x25045 */
# d* h% l& M5 v) m( T }" Lcs=1;
9 r0 G$ ^9 r5 c3 r" l; ccall time(1);
" G) `% l" D) g( E* ]4 O0 Z6 W* |cs=0;
1 K# V/ X" K% B2 X) W: L7 fcall time(1);
u8 U8 b9 F' h$ o% fcs=1;7 o. y9 Q* ?( @4 p/ `1 [
end dog;' [% Z% |/ i% q$ k2 Q M( U
! l# w( Q2 a2 ~4 j" G+ a
run:procedure; /*步进电机运行脉冲输出程序*// \3 C4 z: s3 X2 v2 b+ K$ k: t1 p1 d* P
if ok=1 then 9 J7 ?/ y2 I0 _* B
call dog;. R6 n4 f! w8 ~7 W, H
do;# C. Q3 A V" r' H$ w0 x- p" c
p14=0;3 ^; ~' y" c2 L/ M3 J7 ~' C
call time(1);1 [; V0 D: l/ e5 r, s
p14=1;
! k' |% K4 `; S& j call time(1);
/ v- M4 {1 U, { C+ P9 \* X end;
: @7 T# Y9 _# @! Mend run;1 \3 j5 m; |6 [1 ^! k
+ S1 B8 G4 n, t8 g
DISPLAY ROCEDURE(L0,L10); /*显示子程序*/4 N* D6 w9 H0 ]0 k, B) n, M$ ^
DECLARE (L0,L10) BYTE; /*定义显示二位*/* w: v# ^* p0 l% d; Y+ U
n=L10;
9 U2 z8 o7 o% V; v n=aco(n); /*十位数BCD码译成段码*/
/ |" [# J* k+ m' Z& T! B4 a sbuf=n; /*十位数送164显示*/
6 j* o" W7 ]& G: ~# `1 f do while ti=0; /*等待发送结束*/4 v) u0 {: x% s
call dog; /*看门狗定时器复位*/
" z8 X, c7 \/ C, p0 f; `2 b end; f' }' s5 k }0 F
n=L0;
4 Q! S1 G/ A/ B3 k. _+ d' y n=aco(n); 6 P) I% c. F+ {, P
sbuf=n; /*个位数送164显示*/ ]' ]& n% C4 S& [+ u
do while ti=0; . s9 A+ l( [, y$ q6 s/ E* B C
call dog;6 t$ ^4 d3 c2 Q9 g a
end;$ E. {0 e7 ^! C3 ?
end display;
0 X+ P0 T# l, k8 Z! q9 Goutbyt: procedure(da); /*向看门狗存储器写入一字节*/
! q0 @4 E: o! s) I% T" h$ ~declare (i,da) byte;1 X+ M' `0 y' g; J9 ^8 O
j=da; /*将要写入的字节赋给临时变量J */2 \0 Y- n* t4 h7 ?7 i* S" @( h
do i=0 to 7; /*左移8位,送到口线si */' A" D; H5 M5 \, j
sck=0;
. d; r6 {. U5 [ j=scl(j,1);
% {# Q: B6 a) ?7 R9 ?, J5 M. Y si=cy;% J- n% C" I& Q* k
sck=1; /*每移一位数据,跟一个时钟信号*/ 9 u6 C: r/ {' K5 [& @
end;( T: Y5 D7 U2 C% |0 I
end outbyt; ; l4 K; e5 {( P
$ L0 R4 a \0 \. }5 E5 I9 k
inbyt: procedure; /* 从看门狗存储器读出一字节 */
1 u; x3 A; Z* e' P/ g$ E2 pdeclare (i,di) byte;; J; g, g1 g% X1 }4 h! D) v
j=0;( E( C" X3 O3 P" C: i& j: i
do i=0 to 7;
1 P& E9 M8 w& V+ K5 [ sck=1;
v$ S+ t$ h6 f- g sck=0;
& u; t" @! T/ O# p$ u! U cy=so;9 H. N& q" Z2 Z' l. [
j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/% }1 n0 Y$ U6 J3 f& s7 f5 o' ?
end;" G, e1 u4 R6 s) r+ b+ Y- S
dat=j;
3 X8 ^% _. S8 _- {% ?& ?end inbyt;
# s% \ t+ v5 _' y5 { o4 g' C& B$ u8 E8 P m' m3 B! A
wrenable: procedure; /* 置看门狗写使能*/
7 X; _; B! q( Y2 e& Asck=0; + \) \4 Q, c. A
cs=0;
" R1 n; O& G9 M% b; /* write enable command */$ A7 T- Y; ]/ r+ l
call outbyt(06h); /* x25045 写使能指令06h */
/ O. U4 k0 a4 d" c+ L: ^! Vcs=1;
1 x5 z0 o+ l# p! S, ^sck=0;
/ W' Y X1 c1 `- Z! Iend wrenable;
5 L/ H( y/ \, A) R4 o3 }; R' h- b" B2 c; Y
wrdisable: procedure; /* 置看门狗写禁止 */
. h! z" |, q2 x1 | r9 Vsck=0;
( d# Z/ E3 S4 w* X. q& p1 Bcs=0;
8 ?& I4 E& z2 S; /* write disable command */
3 J) j6 Q9 g) \; Zcall outbyt(04h);* W% A8 ?0 y5 P: m7 o {/ {
sck=0;' ] w6 [, A& z
cs=1;
' H" L$ {, i- _" }end wrdisable;
- s, N$ g3 B! P
+ s7 c; k9 [6 p5 ^) w7 vwrregister: procedure; /* 写状态寄存器 */
T" C6 X4 S* X6 L$ _4 Qsck=0;9 h( X+ k7 Y% f$ p: B
cs=0;
# {4 r% b3 C! M0 P9 F6 mdat=01h; /* write register command */ $ F+ _; T* w, ]4 I% |
call outbyt(dat);
6 X* C' _+ K# n# }& U; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
' N: U: W1 n' {9 vcall outbyt(00h); /* 设定看门狗定时时间 */
S" \& z/ G, e) s! I6 b;) o* ^8 Z- x4 n e
sck=0;$ A: b! z9 [; t9 `3 w& R
cs=1;
* k# {0 S" m* l# ~) ?$ f; ecall time(200); /* wait to complete writting cycle */
8 A/ h; P9 a' r# h3 hend wrregister;! w8 B2 g& v- z% {
# J/ j% ~- l$ d( H- u
rdregister:procedure; /* 读看门狗状态寄存器 */5 C! d: [% A n
sck=0;+ I4 _6 _+ f* l* \- U
cs=0;% r! w5 j" p1 A W) N
; /* register read command */: y! o, p, Q6 d
call outbyt(05h);
( [6 m" f* E. n0 x1 ^9 b Ocall inbyt; /* status register read in <DAT> */* p! {0 d; _/ `5 \8 t
sck=0;
* v9 Y! Y' r( A |6 _" H' n$ j3 scs=1;7 e" N& ?7 `3 g8 X
end rdregister;
+ c/ @0 F8 t3 Y6 K. ?
7 L5 |' w+ l9 w/ g5 ?" i$ B( gwbyte:procedure; /* 看门狗存储器字节写入子程序 */
) U) K- ~) m9 ~8 d* K! V& f; [ declare comm byte;
; H4 v7 W6 O/ y+ {" d% Y" w7 o sck=0;
0 H2 p& I* X+ ~3 x cs=0;
/ N) Z: ~/ R9 n0 n( n+ P3 a k& f comm=02h; /* 写指令 02h */
p$ u# `$ ]1 X call outbyt(comm); S' N1 x+ S. R0 K
call outbyt(addrl);0 ~0 G6 A9 Y/ `; P& o- H
call outbyt(dat); /* send one byte data to X25043 */
, @" m- N1 \( e Q cs=1;
7 E' b. H" ^5 e8 G2 y i D2 I sck=0;
$ h3 n5 H+ W( ~ call time(150);+ r4 d1 k9 K% B3 u, ]- z6 o* _" t
end wbyte;
% }3 V8 E# h5 w% g7 Y
8 }# P* v& N5 @2 C$ d9 |% zrbyte:procedure; /*看门狗存储器字节读出子程序 */
4 `5 o1 N9 {' u' g. G% L declare comm byte;
: Q5 Y; w0 s8 `" u4 C+ T/ m3 [ sck=0;$ n s( i3 U! _
cs=0;
6 P! Y& ^5 B3 o0 ~/ R: ]: B3 x comm=03h; /* read command */. }1 i, y( X# u; m L4 E2 Z
call outbyt(comm);" w& T d4 O2 K' t+ F) p9 a
call outbyt(addrl);/ y, Y2 ^: ?& k% J& k1 N. G
call inbyt; /* read one byte to <DAT> */
u. D1 z3 U- A) h1 |6 a: ] sck=0; i7 E5 t# }2 ^" }
cs=1;
7 v7 `1 ~' [; ]' r2 R1 Wend rbyte;6 z+ v* J) f7 G. U6 E/ @
7 z& X2 M4 Y0 r! U0 |8 s9 Uincdata: procedure; /* 参数修改--"加"键处理子程序+ */3 ^5 _" G" F) S; G0 B, i
if p10=0 then /* 如果K7键按下*/9 ~) c3 k0 L+ q) l H
do;
2 P6 i/ e' E& t% ido while p10=0; /* 等待键松开有效 */
2 l+ y9 g" w1 b; h8 ?) } call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/& E6 N+ |/ v1 \4 {2 D% p# {
end;# G4 f& q# v' e4 ?; N0 ?
data=data+1; /* 设定值+1 */% @6 w# s. S4 q. p
if data>99 then data=1; /* 规定设定值的上限*/6 D( M/ i( U: C* f* R5 W+ k
L(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */8 Z# ^% p/ C9 Q3 f: K; M. g
L(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */
- `+ C6 i2 N: O8 mcall display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/* v' C' m1 M* ]% W% t
call time(200); /* 延时 */
# f$ Q2 M- m. Lcall dog;2 d" D& B- I$ ~# J+ @3 T6 C
call time(200);9 V4 s# M% z* J, k
call dog;" C$ c/ @3 w/ `9 P, ]! |
call wrenable; /* 置存储器写使能 */
- n$ Z2 @7 r2 k6 Oaddrl=00h; /* 置存储器地址 */
! `7 c2 E. t" |+ x5 k7 \# Fdat=l(1);
# b3 g, T* ^: l8 R: @call wbyte; /* 将变量L(1)的值写入存储器00h位置 */ ( m U7 T5 T) l$ z% O9 L
call wrenable;
. F+ g& a4 `+ V2 b! a7 W8 F* xaddrl=01h;0 h7 w) p. h6 o4 c
dat=l(2);
( ? ?# O% z: d/ I' {0 F% i, E `call wbyte; /* 将变量L(2)的值写入存储器01h位置 */ 7 z1 \7 Z( `2 J
end;; A0 }3 z* V4 {2 I
end incdata; ' x7 C0 c' X+ S6 p8 {, L6 U0 N2 _
decdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */
% `. B/ C; M5 _: t& N5 o0 J0 YIF p11=0 THEN /* k8 键处理子程序 */ 1 M! z: K) H# z' G
do;( E+ V3 {( |. P
do while p11=0;. E @) N- B" M
call dog;
2 e! J0 | \# l& M. l5 ]: |end;/ E' q9 G- X, ~+ Z
DATA=DATA-1; /* 设定值-1 */
* `6 J" J o8 J9 b, k1 A" aif data=0 then data=99;6 Q! P. X. |' J* L1 Y4 D
L(1)=data MOD 10; # z* W' R$ Y* f6 w3 f% {, I( N Q
L(2)=data/10; 6 ^1 _% a/ w2 @* h) l0 ]
call display(l(1),l(2));
" N" ?# Q* S4 Z; s6 }call dog;
7 A5 v3 w, l# \5 D* H) V( V' zcall time(200);
' v& a A: T3 S1 {call dog;
& S" [: m! \4 E4 f0 ocall time(200);0 Q0 n ^2 B2 i/ |- U: J' x
call dog;
7 o1 v, X' w+ D/ Y& T- Jcall wrenable;
8 r5 H' r, P |6 ]* ~2 Caddrl=00h;
. s2 ]- [6 ~9 S8 M* @dat=l(1);
5 c! C9 x5 k# h! ~call wbyte;0 j2 B% a( ]! X9 G- V) D5 L h
call wrenable;
( F; A9 v8 ]; s& G: Oaddrl=01h;
$ ^$ A+ L5 {/ w+ bdat=l(2);. M9 N2 q* z3 d/ G) X+ d4 U8 K
call wbyte;
8 [3 O8 w, a% O5 m, z, p, i5 C; v# ^ end;
6 N* v8 e) `" N3 C. Q) w/ Z6 ^* \END decdata; |
|