|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
控制步进电机正反转的实际应用程序 * a7 S& @# W; \( [5 Y' F$ V
/*这是一个控制步进电机正反转的实际应用程序*/& _- l' D. l: A$ x
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/. [$ Y/ Q1 s7 d
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/' L( n5 A$ y6 h/ A9 N: d
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/% Z7 n6 G2 s4 e
/*k7,k8键是设定步进电机转动速度参数的加减键*/
. O# ~+ f1 k2 \+ C e4 N$ G/ `/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/. d, E6 [5 y8 D! N/ V3 |9 u
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/% h5 a1 F8 }; `9 ^ M- I k, Q
/*k11是步进运行键,按一下,步进电机动一下*/7 ]* ?; e" C* t. ^- W
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/: [! x& ?" f* d. ^
/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
+ j. U5 X/ r. j+ E' X; ]START:do; 7 G+ J. x1 \! e# K( j
$INCLUDE(REG51.DCL)% l3 J- p: y" c: j' v
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
' f; O5 b1 M0 ~* x* D3 H6 @declare l(5) byte;
* S" y$ p; a% A7 f* r8 B8 \6 J3 Ydeclare (dat,data) byte at (30h);
" }; ~% Q3 E) U% U; v1 Adeclare delay word;+ |" X, _3 o- D( V. m
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/ v1 t ], `0 y% d! x
41h,1fh,01h,09h,00h);! R% A$ D! y w- b6 `
declare si literally 'p21',sck literally 'p20'; /*X25045囗线定义*/
$ D9 V- @4 [) v5 Kdeclare so literally 'p22',cs literally 'p23';0 N3 {$ l5 A8 u% K& c
dog:procedure; /* 初始化看门狗x25045 */
- ^/ n8 N2 {4 _cs=1;
l( D& V/ I- {7 t$ b( k) Pcall time(1);
" j2 t8 k* F% l$ k7 H6 i8 Tcs=0;; Z+ v' L" l/ q0 W3 b1 [8 `4 I9 F
call time(1);* G2 D+ ]. t; R
cs=1;
2 J" t. A0 b7 _! D* j1 mend dog;
' \6 m7 C5 M |+ H' C" U- v* X
6 L$ L2 f% y) U3 U% a( u' Y/ Frun:procedure; /*步进电机运行脉冲输出程序*/8 g: m" K1 B, b1 @, a' j
if ok=1 then - R3 I+ v3 c" t3 ^6 k: {. M
call dog;
# ]; v/ C6 g9 u1 a% h5 Q- x do;
5 |% Z, z7 u/ c: W4 x% O p14=0;( |" i" I: _ _0 l5 c
call time(1);* R& ]0 @( a8 u* \3 b& ^
p14=1;
7 Q6 _8 [0 e) s# h call time(1);
, `+ F5 Z7 d% X' } end;
& e8 z2 v; \' X6 E3 c' l; ?* C8 Mend run;+ H5 P( d% R1 a/ o. F. v( a t J
4 X3 M; c( x/ p
DISPLAY ROCEDURE(L0,L10); /*显示子程序*/
, z1 V9 o9 C2 p) kDECLARE (L0,L10) BYTE; /*定义显示二位*/
: |" }$ ]3 \) O5 g u3 P6 h) cn=L10; ; n9 W& T9 z P! X
n=aco(n); /*十位数BCD码译成段码*/0 ^9 e3 k# r% o+ C
sbuf=n; /*十位数送164显示*/0 ]0 @3 S' X4 ]( [* C: C
do while ti=0; /*等待发送结束*/' r/ a6 v2 N& d \
call dog; /*看门狗定时器复位*/ : B6 V) ]& S2 d9 Z/ @2 b% h
end;
/ l3 j( e, J+ s, Z; s: H. {n=L0;
/ D$ r9 S0 s; j8 D$ T0 I/ d7 D( l n=aco(n); 1 v+ W, J2 N q0 O3 n4 Y
sbuf=n; /*个位数送164显示*/
; r+ a0 O& t& p: l! f: o; l do while ti=0;
7 b% D6 t% a- F" Y call dog;0 h1 {4 p% D3 D( z+ i- X/ \
end;+ n' z0 v' d f- w
end display;
8 g1 T5 t% |- Z+ n' T' r Soutbyt: procedure(da); /*向看门狗存储器写入一字节*/
' c5 ^5 e! P$ n$ ndeclare (i,da) byte;
/ K& n: O6 F. n: N- _% \2 G6 }j=da; /*将要写入的字节赋给临时变量J */
/ [4 \5 n- f$ a s K' `8 rdo i=0 to 7; /*左移8位,送到口线si */
! [$ Z! o* T( P. W; D7 q' c sck=0;
6 v3 b% |: w" y, Z: V2 Y1 F j=scl(j,1);
( i4 _3 j$ l) p- \$ ?" X" ^ si=cy;& U1 u5 e- f/ R* R
sck=1; /*每移一位数据,跟一个时钟信号*/ * |, e6 L" x k% ~2 V
end;
0 e3 @" x& J. X% send outbyt; ! V( C2 O% n: P2 H: @# |8 h* a
" ^' _6 R* V6 {9 e4 P" ~1 a+ l
inbyt: procedure; /* 从看门狗存储器读出一字节 */
( ~, C3 P9 P* t! [4 v, ]3 Fdeclare (i,di) byte;
# {8 l) _7 _( q$ s# E2 V8 @j=0;
0 T* w& _: d' x7 Z( Zdo i=0 to 7; 8 M; b* b7 B# q
sck=1;9 Y m+ X3 T7 ^- I
sck=0;3 y7 w$ G* Y$ Z* {. @% y
cy=so;- _$ o' G/ n' F, t u3 e- f
j=scl(j,1); /*从看门狗存储器读出一字节送入临时变量j*/2 Q/ Q; L, i. `- m$ G3 V- u' e
end;8 F k: E7 m; i& w1 B( \
dat=j;
- w) w5 N. b7 \9 I1 bend inbyt;
* A$ K4 e4 Z9 n4 f9 \; k% c, I, m7 T# [! G; ^! \" X, G
wrenable: procedure; /* 置看门狗写使能*/
; p6 y" ^; q/ ]2 Ysck=0;
) A. Y; V5 I3 l) P g$ `( b6 wcs=0;( P2 Q& O- l) t# g: H3 b3 a
; /* write enable command */
% N! V4 u+ y4 G1 T- Fcall outbyt(06h); /* x25045 写使能指令06h */
0 Y, O$ N1 H, y N8 q& {cs=1;
5 R N% l& _; b/ ?! @' } |sck=0;
' n" T, E4 U2 e) ]# fend wrenable;1 x, Z8 ^" M: \: O3 V$ ?$ T
0 j7 Y4 e7 e1 x+ R, `' y
wrdisable: procedure; /* 置看门狗写禁止 */
+ p, ~) d, B8 |, P$ x) R5 n! Tsck=0;8 z1 f% m8 i" y# r( Q4 T( K& x. Y
cs=0;) u' L/ s9 C# O* ]! M# e, V- U: B
; /* write disable command */
- Y) [2 X# m lcall outbyt(04h);: ^, V* k, C* M& X$ r/ B5 p1 N- {
sck=0;
( \$ Q4 E# n7 @$ Y0 @9 ?; Wcs=1;7 V# \7 x4 J' p8 |* y! q1 P' D
end wrdisable;
, z& ^- ?% q9 q
! U5 V" p: \8 Y9 e9 q3 w/ Lwrregister: procedure; /* 写状态寄存器 */* y& _, P! v- R3 g* @+ ^$ E
sck=0;. u, A4 l/ V( e9 w
cs=0;
" S! J. f! W& ?dat=01h; /* write register command */
) \* c$ p* Y( Y' b$ p$ d/ O0 A6 l j4 ~call outbyt(dat);9 Z7 k$ n A9 Z4 L
; /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */6 m' @% v, s4 a
call outbyt(00h); /* 设定看门狗定时时间 */% H0 Z8 G7 |! L* R1 f
;. k2 l" ^: N6 v7 \3 L
sck=0;) P/ Q9 z0 l" `
cs=1;3 \4 M) X$ q( T7 f4 u6 A* ~
call time(200); /* wait to complete writting cycle */, V. B! z8 S( t+ h% G4 t( H
end wrregister;4 x6 w g" U7 D0 K/ \3 t+ a4 b
: _9 I2 ^0 n4 }* _" R1 Z- Hrdregister:procedure; /* 读看门狗状态寄存器 */: [" q- v- U. {2 v7 f) K
sck=0;- E4 M; F( a* P5 G6 p8 ?7 K; ]
cs=0;/ @# h4 Z- a) Q4 F- ^, f% ^; ^
; /* register read command */
& D% ~( k3 k4 g* v! Jcall outbyt(05h);
) T2 p4 r0 t; U' Y2 W [4 M" ~1 qcall inbyt; /* status register read in <DAT> */2 Y2 Y! W6 C+ h; F/ N
sck=0;
$ u# M8 ~: M- _5 ?$ P! _cs=1;0 ~& D2 o8 ^& i: k
end rdregister;
4 v: K/ J# [/ E/ L6 ?$ L' y( N7 r9 y3 n* ~8 d
wbyte:procedure; /* 看门狗存储器字节写入子程序 */2 k+ W5 |% x% u7 p4 c
declare comm byte;
# C( c+ s* u& N" [) s$ t9 ` sck=0;* z$ J$ x" a/ d3 |" T; C- }, _% R5 D
cs=0;. F+ a1 R0 Z: O4 E$ k; f
comm=02h; /* 写指令 02h */: _' |6 c$ p: |# V A$ N, B
call outbyt(comm);
+ r9 d3 z, l6 y) z' a& n call outbyt(addrl);
3 F" v+ b' Z/ n call outbyt(dat); /* send one byte data to X25043 */% S/ u; |; b/ ^ N- [) Y
cs=1;
. }# U2 i; s4 t+ p3 ?" V sck=0;4 u4 C" g; _$ P0 y8 C
call time(150);
v$ X @ M9 L" C' f4 |/ tend wbyte;. K$ d6 ]0 ?5 D
8 Z* e$ r; h6 U ?8 R; irbyte:procedure; /*看门狗存储器字节读出子程序 */
" o1 ~; M9 F; u$ M! t declare comm byte;" W/ c( s. ]2 f) }% a
sck=0;
8 f5 o, q8 T$ | w; B7 F cs=0;
8 K8 p: R6 x1 a$ t: ^# e" n+ P comm=03h; /* read command */
/ g6 I# v) y5 f0 ]& ~! w. O9 F call outbyt(comm);& r; @# V# s0 Z3 |! `/ g6 u/ R' y0 ^
call outbyt(addrl);
4 v+ D. R5 Y* q9 J; U$ E& V9 r call inbyt; /* read one byte to <DAT> */& \% ^7 P; w; E
sck=0;0 h0 u+ k7 _5 ?7 c- ?$ b9 \$ @
cs=1;
5 k9 f% |! S0 D* R. `) ^end rbyte;
% U$ A9 \" O. t, R# [ w' S) T- B
! F$ @3 ^1 e f, U* ~incdata: procedure; /* 参数修改--"加"键处理子程序+ */
! `3 z6 ]) X. e1 G/ s% v7 Zif p10=0 then /* 如果K7键按下*/" c' b+ _$ ]8 m9 W. \) Z) @& M9 I
do;
* T/ O# W( Z+ I- k; T9 Ydo while p10=0; /* 等待键松开有效 */
. V5 B4 u9 X6 o call dog; /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
( C( w- V, o! F4 e0 hend;8 [& q- g4 h1 {0 A
data=data+1; /* 设定值+1 */
8 @! G( Z) B' x9 K7 ]if data>99 then data=1; /* 规定设定值的上限*/
. X% I1 V2 z8 h0 `L(1)=data MOD 10; /*将设定值的十位数拆出来送给十位数显示变量L(1) */
1 z/ L0 e. i6 ?' I7 PL(2)=data/10; /*将设定值的个位数拆出来送给个位数显示变量L(2) */
/ ]7 k, w0 z( F$ a1 c. Q: [3 D1 pcall display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
2 n/ k# i- c% B9 `# e6 rcall time(200); /* 延时 *// q% G5 q# ^% V# B1 v% ^8 B- k6 p
call dog;' _" f5 `" h9 _* \9 M# B
call time(200);
5 U( j' s( k. ^call dog;
2 v6 |! o$ K$ }4 }' r" Icall wrenable; /* 置存储器写使能 */
_# J9 a' v* j( c9 }4 ~. xaddrl=00h; /* 置存储器地址 */" {6 _8 I7 A' N; @
dat=l(1); . W% u1 [5 K, T0 e9 K7 \: B( d
call wbyte; /* 将变量L(1)的值写入存储器00h位置 */ ' D* w" M1 s0 ~2 k0 K) p, O' {
call wrenable;
9 o# ` ^; b5 J% n6 @addrl=01h;' \& S- Z' Q# y8 Y5 x
dat=l(2);
# Q* E& x0 n* T4 {call wbyte; /* 将变量L(2)的值写入存储器01h位置 */ % h; M+ \* v! p7 ]+ q5 B$ |1 e/ C7 Q+ A
end;5 }& e/ A% n0 o
end incdata;
9 r( d) |1 ?# `; U, B' Ydecdata: PROCEDURE; /* 参数修改---"减"键处理子程序- */ , F2 `8 \' f- S
IF p11=0 THEN /* k8 键处理子程序 */
. F! p# X+ ?' G- p, E) w do;: u z, a% K; Q( W) k5 M
do while p11=0;
. e5 D6 M r& }% N$ `* j call dog;
6 t, F( T6 }0 dend;! ]) V& t9 g; P! p0 L% ]7 j( b
DATA=DATA-1; /* 设定值-1 */
b/ ?6 ]$ V+ ~4 Pif data=0 then data=99;
+ {% o- s3 u( z, X% G& k A/ HL(1)=data MOD 10;
# U* `2 e/ e5 o* q" `6 nL(2)=data/10;
! ], \$ n0 X, ]$ A& ]9 \( ycall display(l(1),l(2));
0 R3 j' _- u- F4 }call dog;
; l" B, ^" B7 T/ E7 jcall time(200);
% L2 s! R- ^0 C) q& ^* ~call dog;
# |6 C9 N4 z6 A% y, U+ ?6 h6 o5 l5 Ucall time(200);9 C' y i. v0 {: r" h
call dog;
4 v* X; K5 C! ~4 r2 h+ G# Kcall wrenable;
% S" z4 B$ @0 l: p) t, G3 w( z. uaddrl=00h; 9 Q" [2 ]7 Q: k- S; Z$ Z
dat=l(1);: P0 [- k: ^( g4 c$ i) |
call wbyte;
u) u# r8 d5 Y4 zcall wrenable;
' e! X7 t, u2 G R. g% m3 oaddrl=01h; ( z6 K6 _& N f+ ?/ H/ ^
dat=l(2);
5 P1 D+ @7 ]. k Ycall wbyte;) k' b s7 c8 m/ B
end;: M% O. S% d: g1 G' ^
END decdata; |
|