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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
控制步进电机正反转的实际应用程序
( H# G/ K8 d. O: @' Y5 j/*这是一个控制步进电机正反转的实际应用程序*/
$ J1 W4 Z% x, k' l. P* G* ^" z/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/" \7 A$ \1 f: a! M
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
: ?: V7 y- x1 L) u" A8 q/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
. S/ @; h4 f" p4 l* E6 ~, ~1 K/*k7,k8键是设定步进电机转动速度参数的加减键*/* R& ~0 z8 k8 \% _( T
/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*// \, w7 C$ N" v3 \3 A5 K0 E
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/: V& H4 E/ a; O& U) h' a% W* U' T1 y
/*k11是步进运行键,按一下,步进电机动一下*/
  Y, L8 |/ }" V/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
0 [2 s( L! m4 [9 m3 K& j/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
4 Y! X+ {% l3 s/ F  bSTART:do;       - I  ~# r& p7 K! K  N0 ~/ g6 O
$INCLUDE(REG51.DCL)
0 N  G! l+ U. v5 T/ TDECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/0 o, F/ o) a$ V) K7 C5 H& w1 G
declare l(5) byte;
9 W1 ]6 v. C8 F6 Odeclare (dat,data) byte at (30h);
3 b) B) ?9 P+ M( gdeclare delay word;1 {' e2 J7 q" U' N
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
$ ?* t9 S1 Y# ?  41h,1fh,01h,09h,00h);: K5 E- D  B6 W
declare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/
* C- Y- u4 k+ n$ g1 R5 J" s9 q2 K( ddeclare so literally 'p22',cs literally 'p23';! C  U& _/ {0 u5 L, h$ P8 H
dog:procedure;  /* 初始化看门狗x25045 */% k: @0 Y# M) M" W2 I7 Y
cs=1;+ H+ B- a1 [' q- G7 j
call time(1);) D7 c: ]1 ^6 M2 T5 t
cs=0;
% p% X- X/ O3 N$ N( a% X0 Icall time(1);
' ]9 \- [. V8 s4 Ycs=1;6 x& K8 N- b, r7 ]7 L
end dog;+ j  A, _' v8 h+ p$ f6 c) Z

* U$ [) X" _8 Grun:procedure;  /*步进电机运行脉冲输出程序*/
# Z$ k" o; i5 J  if ok=1 then  0 Z8 p- L: x" S( o
  call dog;( w+ }2 K8 i- ]' ~
  do;
% i( w& y4 x5 g& p( w9 Q    p14=0;
+ n' t' C2 O# ~, L( s     call time(1);) m+ `( n2 v& O% }) P
    p14=1;
# |& i5 B: ^! w+ F9 G  C     call time(1);
$ y  e% G3 w$ h  M, ?  end;
, X' B) f. f$ F) r- X9 G5 eend run;
, e& V. N" p( ], S4 u9 f4 ^5 ~& F& ^5 B7 s# a! x0 W& q
DISPLAYROCEDURE(L0,L10); /*显示子程序*/
: A$ F: X- }! t0 G" c1 ^! F1 KDECLARE (L0,L10) BYTE; /*定义显示二位*/" C: x8 R. C9 ?, a( X
n=L10;                 2 W, M! p5 h- R6 R6 n) I
  n=aco(n);           /*十位数BCD码译成段码*/
( C' g( G, ]. V. E. f! ]# @' y  sbuf=n;             /*十位数送164显示*/3 k1 ^9 p( i+ }9 X  G  \# h
  do while ti=0;      /*等待发送结束*/" w: Y( |) v$ H2 p$ w6 g1 {
     call dog;        /*看门狗定时器复位*/  
! t, }: O' v$ X, `$ V+ U* V  end;4 L0 I2 r0 Q, g9 m. J2 _0 ^
n=L0;                , l1 p4 M5 p! s/ P" |
   n=aco(n);         
* H  {' ~0 R( x7 Q1 |2 G   sbuf=n;           /*个位数送164显示*/ ) V+ d" Q) y0 s% E7 W' V  v' s5 m, p7 z
   do while ti=0;     
( w0 ~" ]$ X9 ]  o; `. \    call dog;6 w: ^! S! N' L& H0 U2 X- S8 ~
   end;
; h/ V8 u6 @" z' Xend display;       . h) h8 X& v! z: U
outbyt:  procedure(da);       /*向看门狗存储器写入一字节*/* a. A  e1 H/ K9 q2 g
declare (i,da) byte;
, q( q1 d8 j# V! h( {( Oj=da;                 /*将要写入的字节赋给临时变量J */9 _, O7 \/ F5 Y. i  h$ A+ a
do i=0 to 7;          /*左移8位,送到口线si *// _+ e! V4 D) q$ b4 U" D
   sck=0;, E* k7 p( t' |. m* F- _9 C
   j=scl(j,1);
8 G5 d' @6 j1 G( h% L2 _7 F   si=cy;
( |+ s/ U" d9 L+ y- k  n   sck=1;            /*每移一位数据,跟一个时钟信号*/ : M; j* G' A! c; C% h- ]
end;; z: p: Q7 p6 I( k+ z' t4 @6 b& f
end outbyt;  
% Z& k/ W9 E8 h/ \3 q
- b6 _  Q, i0 v2 Rinbyt:  procedure;   /* 从看门狗存储器读出一字节 */2 P' y  `3 W. G0 a3 ~2 ?: O
declare (i,di) byte;9 |6 U/ [- ~. y8 l3 t" j0 F
j=0;( ^* ?: c3 b$ T  c/ ~- v( Z
do i=0 to 7;   & R! T5 g0 L8 B1 n/ W* v* G
   sck=1;
5 U' W8 _9 q9 N7 }. f   sck=0;8 Q- k9 K* u2 \
   cy=so;
8 i* ~, \, W7 w0 x8 g( V   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/& x, D: r3 B# s3 n
end;
* O. O8 r) s/ M0 [dat=j;! i! w" G4 j, z2 G% S( v2 h! G
end inbyt;1 @( u+ K- O+ j! [  B% `& c) k
( M9 R+ ?4 ?; \8 x( {. _
wrenable: procedure;   /* 置看门狗写使能*/
- A7 e# x8 X9 B2 P( k: Vsck=0;
) L8 c# C5 X$ T) e2 l. ]5 kcs=0;# Q6 ~8 `( Z/ E$ r4 F5 k. E7 |9 s
;  /* write enable command */. R: v; Y; m1 u0 v
call outbyt(06h); /* x25045 写使能指令06h */6 |- g7 I. y+ l8 {/ s; T
cs=1;
4 J* B+ \) [, Msck=0;
" p$ C( r6 Q8 o# W5 uend wrenable;5 L  [3 L: _- m$ D# Q' t. `
% o$ L, J) C6 O; r; T) A
wrdisable: procedure;  /* 置看门狗写禁止 */) P/ Y' z' j' Q# u
sck=0;
2 I4 [/ ?0 a/ V4 v; k: Kcs=0;1 A8 f. \% p! b/ V
; /* write disable command */
) Y1 [- n" e) m- ncall outbyt(04h);! E+ \4 B$ C; n, A# ~
sck=0;
6 P# D: B- o5 i; W# Kcs=1;/ u: }# q) o* N) C5 x, G# m
end wrdisable;
* {" N4 u( `! ?
6 Y  j( L2 e8 P. Jwrregister: procedure;   /* 写状态寄存器 */
* c+ m( g6 p; D2 ~sck=0;: W+ y5 E; x' T8 ]
cs=0;
" y5 b! E- X+ [- Rdat=01h;      /* write register command */
1 ?4 @1 Z% w" v) z3 J% {7 Tcall outbyt(dat);7 H& g% ~+ ~9 b9 b$ M
;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
- @% Z' I9 o, Tcall outbyt(00h); /* 设定看门狗定时时间 */
6 E9 \+ v. i. E4 V. ?: ^;
2 n! R: V7 k4 ~9 g' usck=0;
" }8 r+ m- N; ^9 scs=1;
4 X) `0 `8 v* {0 E& Lcall time(200); /* wait to complete writting cycle */
7 `7 Y* C% c# X8 H" R6 Aend wrregister;
- N8 p% V8 S- @3 Z+ o) j% s8 W7 |" s1 E1 a0 K, G
rdregister:procedure;  /*  读看门狗状态寄存器 */7 C* C; q' V( X  g2 L. C
sck=0;4 T( N% x7 G# Y  L3 j& T
cs=0;
/ E9 u0 [" o0 X4 e, O! p- o;   /* register read command */+ g3 [0 ]! L+ R7 |: y" q9 h- @
call outbyt(05h);' q' u8 A  }/ f
call inbyt; /* status register read in <DAT> */
) F2 k' i- {* z, j% @. osck=0;
/ m3 T( J  v4 f+ u4 a( Jcs=1;" {" B" C- w# ?0 o
end rdregister;1 ^; M( V- J0 w# W& r  j- L
" N) O( `" I/ |' t1 s& i+ i" c
wbyte:procedure;   /*  看门狗存储器字节写入子程序 */
! ^" F: @: O1 m/ ?. j  declare comm byte;
; E/ ^, C& a7 v. \; R7 M  sck=0;9 j6 `$ C: N; Z* m3 `. _
  cs=0;& q( A/ |! t) h' j& b5 r, Z4 v
  comm=02h;  /*  写指令 02h */
* c$ E8 {7 l' X# ~  n! F  call outbyt(comm);. e0 @  B) o. L& u: o$ @  P
  call outbyt(addrl);& y( `) v8 L9 O: D5 [( O  @
  call outbyt(dat);  /*  send one byte data to X25043 */
4 C$ Q. M& [+ H& R& K  cs=1;" ~9 i8 [5 B& W+ r8 l- t0 n/ S2 x
  sck=0;
% Q& g; n' D  |- |  call time(150);
6 j) z! H; f9 r9 S! a& jend wbyte;
, |3 _. ^4 G0 o3 a& g7 o/ i6 i
' {  ]( Y9 O0 Orbyte:procedure;  /*看门狗存储器字节读出子程序  */
; X7 F4 _( u: J. [" w8 }7 V" J1 d  declare comm byte;, ?4 T8 Y  D" H. {9 H0 L" Z' `* H
  sck=0;. s% L; u! b' J
  cs=0;
" h' C1 g4 A$ ]: r5 ?7 t4 T  comm=03h;     /* read command */; O( K3 C# V3 q( e
  call outbyt(comm);
( f2 q% y: r" Y  call outbyt(addrl);7 R3 H$ S# O1 f) p
  call inbyt;   /* read one byte to <DAT>  */
. }  Y. a1 [2 N4 K  g  sck=0;
8 G$ w& H8 n; F7 v# ^# t3 Q  cs=1;
( E  c' P$ g1 z1 A3 u/ nend rbyte;! R; C: k6 c$ j

7 P: c! q1 E: s7 ^incdata:   procedure;          /* 参数修改--"加"键处理子程序+ */
2 I( ~7 V! [& P: Wif p10=0 then         /* 如果K7键按下*/( @9 n: Z' M# x% A; C% N. g# Y
    do;
( t6 e2 j, P" p7 u  j$ W/ C5 W) gdo while p10=0;       /* 等待键松开有效 */
3 A/ o* L+ w+ _# l  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
+ o9 X0 A- x# Z  g0 qend;( ~$ r% ?( k, s
data=data+1;          /* 设定值+1 */2 n" V4 k( L) h0 y" V$ y
if data>99 then data=1;  /* 规定设定值的上限*/
+ a8 X+ e2 a- R7 ], P* wL(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) */3 y# N6 I9 h2 G7 @! ?) x! {, S
L(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */5 A$ S2 f# Z0 k$ x/ F
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/4 s& T; l, _) t9 C& s2 c
call time(200);         /* 延时 */  ~/ e3 F  H8 i5 ]0 z
call dog;9 @; \* a2 a8 n# K1 _0 Q2 U) c3 `! O2 }
call time(200);
0 @8 G! |# }+ @" b* R* C) s& zcall dog;4 M$ X# j5 Y/ B+ k
call wrenable;           /* 置存储器写使能 */; y- Q: k( s+ q
addrl=00h;               /* 置存储器地址 */! |* k$ L& S: C; B, m8 ~% F) m) F
dat=l(1);                 
) Q- s7 f5 a, F+ o) ~- lcall wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  5 Z, J% Q# {$ C& u4 G
call wrenable;
" k  R: v( \" e2 d4 l9 Daddrl=01h;
! x+ ~# J0 n/ ^/ o4 udat=l(2);
6 F# X+ u! S) Ycall wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  
) c; [- B( V1 g$ m      end;
* n0 P) h( M, Q5 c  s* B& e& u6 v8 {end incdata;               " {" _+ n' Y: h2 C* f# r
decdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */   
$ Z" q, g+ m. j( m% EIF p11=0 THEN         /* k8 键处理子程序 */  ) X; m' Z6 S% ?$ W. e  ?
     do;
- i/ a- Y# w$ Udo while p11=0;3 G2 e, ?; L4 U; R) y
   call dog;
$ q8 o. ]" X8 c6 J, J- Dend;, w, Y7 K7 \% H; Z
DATA=DATA-1;             /* 设定值-1 */; p% _( }1 K" c8 _
if data=0 then data=99;
2 _- L; m( w; GL(1)=data MOD 10;       & i: G! M: d9 S
L(2)=data/10;           
% P% s0 Q3 C: Q7 @! D. Icall display(l(1),l(2));
% p9 Y$ O  {. N/ v4 v1 |2 Fcall dog;
; ^1 b1 V' p) ^3 r7 acall time(200);  
+ T+ Y" _# O3 e" L1 Gcall dog;
$ Y; h- d3 j* i0 mcall time(200);' _! X  d) ?/ G( A/ s/ _1 [+ }
call dog;
: f9 s1 B0 |; v, @/ k+ Ucall wrenable;
" F$ E7 ^. D- I8 ]addrl=00h;           7 T: B3 G7 j" F, P  N/ ^2 X8 C
dat=l(1);
$ C* ?8 l" D6 R+ Hcall wbyte;
- A' ~" w* V0 H" Bcall wrenable;
7 g2 U5 t, H, |' Xaddrl=01h;           
  [( Q1 v+ _" G# Edat=l(2);
4 [- H' N! z4 I& scall wbyte;
( N( F8 E; w4 y) M! w0 n   end;1 p- F  N% L7 {" }6 r7 [
END decdata;  

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~
6 [7 q, W2 U/ f

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-11 12:29 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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