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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~" _" a0 V; H! F( U

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 09:16 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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