找回密码
 注册
关于网站域名变更的通知
查看: 584|回复: 3
打印 上一主题 下一主题

控制步进电机正反转的实际应用程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-8-15 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 JDISPLAYROCEDURE(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;  

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~
$ l: s& c. l7 R) B8 ~* @* V

该用户从未签到

4#
发表于 2019-1-23 15:27 | 只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-17 06:06 , Processed in 0.093750 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表