找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 55|回复: 2
打印 上一主题 下一主题

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

[复制链接]

165

主题

600

帖子

1289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
控制步进电机正反转的实际应用程序   _' e. Z' n6 W5 v' |5 D3 ~
/*这是一个控制步进电机正反转的实际应用程序*/8 B1 R' ~9 e2 G( ^& W
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/" R. R/ ?# n( P0 [
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/! d; Y( h/ }7 e; [* G
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
7 X* R# ?. |  b: j5 w$ n/*k7,k8键是设定步进电机转动速度参数的加减键*/
! T9 t# P- e& n& s/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/
* }5 [: A+ e3 i, [% k4 o/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
+ y. L2 }: H9 G2 Q. ]/*k11是步进运行键,按一下,步进电机动一下*// O/ u6 U( j; r
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
" s( `  ~4 B) S& I/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/9 K3 h& Q* X0 @8 M/ _5 q% o
START:do;      
# i! D8 }3 ~: k9 W$INCLUDE(REG51.DCL)- P4 ?2 U7 P  e4 g8 T! m' |8 x
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/% ~  T; U+ T' T$ ]* D9 G, y
declare l(5) byte;
7 y3 ?* E4 p& y7 I* a9 _declare (dat,data) byte at (30h);
! X2 U2 D  ~- ndeclare delay word;1 i+ S; M, A* i6 `" j0 K: @& c
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
& @1 }1 q' e' _7 ^8 @$ d) p& t  41h,1fh,01h,09h,00h);
. V3 y7 t# d; D! q! P' X- A# A$ d- Kdeclare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/
  l% r. Y: r: S& Udeclare so literally 'p22',cs literally 'p23';
1 W" X4 D) q0 n( h9 }dog:procedure;  /* 初始化看门狗x25045 *// H/ _3 L0 ^/ k9 B* v7 W
cs=1;" `: I5 k6 ~' a6 N( J! G1 i
call time(1);  i2 }& f4 t  W. C
cs=0;) r. m/ u! R$ m4 [. C
call time(1);
+ d  p. P3 z% K. T9 O" X( U0 L! tcs=1;
# W+ i6 ]7 O6 d6 M3 j+ x5 iend dog;- i/ S  x' f& g+ l0 S& B0 k
9 j5 s! ?# m6 z# J; Y
run:procedure;  /*步进电机运行脉冲输出程序*/. H3 a: |8 z: H- F/ v2 ]: J6 s7 i
  if ok=1 then  
: a& Z: ^  @& _* u" j- J& u& M: ]  call dog;4 T6 v+ a1 K# |& q9 o0 e+ B
  do;
# I2 W" L$ I3 F2 V( w    p14=0;7 L- W0 X' N4 @: {) k9 h
     call time(1);# {& |6 \3 ~6 n6 V" W
    p14=1;0 B. @9 b$ `! e- i/ \; L1 I
     call time(1);& c6 a/ a# H& f+ D6 S2 e5 O2 S4 U
  end;
$ O7 _+ ?7 c4 I* Fend run;" ~9 @" X6 C* X" y' x* p. e% z& c
4 Y6 }& U: E+ z8 ?* a1 j
DISPLAYROCEDURE(L0,L10); /*显示子程序*/5 f' n) W+ X6 y4 x; ~3 A
DECLARE (L0,L10) BYTE; /*定义显示二位*/
" x( P% D1 x2 g7 E% K% p. ?& hn=L10;                 
6 n! d8 t- S. a9 W9 q  W  n=aco(n);           /*十位数BCD码译成段码*/
* E/ b2 E6 _# F/ `' N" o. @3 |5 w5 B2 }  sbuf=n;             /*十位数送164显示*/. M7 o2 S& ?# U
  do while ti=0;      /*等待发送结束*/5 ]# k/ e; z+ v  \8 H
     call dog;        /*看门狗定时器复位*/  2 D! t, x/ f8 M* h/ d
  end;. e& @6 @/ u- s  V! D2 B
n=L0;               
( E3 J  }7 D: [  Z4 U0 A   n=aco(n);         
% _* m6 p. d  F# |6 Z   sbuf=n;           /*个位数送164显示*/ : H% C5 j- L+ _' P* u2 Q" o$ ?9 U
   do while ti=0;     
, D$ ^5 h& b  D" g1 z( G    call dog;
7 N* I7 l. n) H3 |5 c, p# X   end;, F0 K  g6 q" ]" F5 |! ^
end display;      
% W- q: `( J. x5 T8 Aoutbyt:  procedure(da);       /*向看门狗存储器写入一字节*/6 V, E8 _) ~2 P. g  _
declare (i,da) byte;  e$ A) c, j! q# ^) ?4 R0 }: u! ~! P
j=da;                 /*将要写入的字节赋给临时变量J */
$ g* V+ v& v, m* l( O6 Odo i=0 to 7;          /*左移8位,送到口线si */
- N+ t; _& |0 S, S* H% y* i8 C   sck=0;
; t9 h( Z! t, k3 A5 q6 W$ b! P   j=scl(j,1);
# n; U$ S- F, P   si=cy;
, T3 E3 |8 X  V- Y% T4 g2 d  \   sck=1;            /*每移一位数据,跟一个时钟信号*/
5 Q9 B* X5 X" m0 Bend;
' ?3 O1 t$ a* H9 K; j- Y* f$ cend outbyt;    d. W; t* j0 w

  t7 d! |4 y  L5 q# F7 S) m) Yinbyt:  procedure;   /* 从看门狗存储器读出一字节 */
" D5 V9 ^. l. t$ Gdeclare (i,di) byte;
1 ^. D2 x" V( c7 w  {& {  g, u% ej=0;
: j% l2 L% Z! n$ Ndo i=0 to 7;   
9 n  \8 \$ A& u; Q  g   sck=1;2 F5 y) O: S- Y
   sck=0;
" \0 v( {, |, ]1 U+ h   cy=so;; w7 ]( x' @; v7 ^. T- g3 m# H
   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/" o8 k$ }7 i# E
end;% D: a; U& G: [8 D: K. ~
dat=j;
! J9 L7 Q1 m  q- i8 y5 E* v' Jend inbyt;
' f: r1 U6 N/ Y, P3 s- H5 ]# v/ J5 R: o" u7 ]
wrenable: procedure;   /* 置看门狗写使能*// Y' H3 h! P4 ~7 P* U* H% A
sck=0;
  c. ]1 P! C0 n6 ^cs=0;
/ k& {' f7 L1 ]( g1 l;  /* write enable command */
" w8 }- W3 }4 m" M: Bcall outbyt(06h); /* x25045 写使能指令06h */
+ `. {& y" `5 Ics=1;0 w7 z1 I+ P0 j' f' `
sck=0;/ W' b! s5 [3 I  S* [* r8 U( E, c
end wrenable;
2 j) n8 ~6 |( d8 H- [2 ^! \8 Z0 l& f# H% q, G: l
wrdisable: procedure;  /* 置看门狗写禁止 */# x% Y& S# m) {" r% y7 L1 l
sck=0;1 T  G$ u3 |9 T% `; x+ V
cs=0;: H  a* r/ J& U7 Q5 ]+ n
; /* write disable command */, S6 W! R/ r& C
call outbyt(04h);
/ B: H8 n7 J9 K$ u0 f: fsck=0;5 @( C: ^/ f0 J! q; v# ?
cs=1;0 T; H* |2 G3 Q8 A# a9 @1 T5 N
end wrdisable;  d7 [2 ]/ h. u8 m, M2 d

- ^" V2 i- B$ W$ j& Jwrregister: procedure;   /* 写状态寄存器 */" A& M& N$ V5 d9 j7 z8 p
sck=0;
: w" y; w; Q) M" S- Z  p5 ycs=0;
7 c5 @; q4 G6 {4 O1 Ndat=01h;      /* write register command */
8 R4 |* r2 C0 x- a$ O- C8 Fcall outbyt(dat);
1 I# z0 P: j3 p% U+ k;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
# I' V* Z4 e# M8 K8 Pcall outbyt(00h); /* 设定看门狗定时时间 */
$ i: |1 i1 D( z+ q3 W+ ^;/ d  K3 _9 B' [2 a' c1 G4 D# c; U
sck=0;
; [& p) q5 ~7 F  N; E' rcs=1;
- b) `3 t# t; v6 f, R8 `call time(200); /* wait to complete writting cycle */
. l* `5 O' t% E9 u3 f# m3 Hend wrregister;
2 A  t4 x& d4 f* O/ q# D& ?; U: c4 k: ^* U; k8 T
rdregister:procedure;  /*  读看门狗状态寄存器 */* @& t- a. F# u. T
sck=0;
  @5 @3 U; k* E- Z3 z+ ]8 r- Tcs=0;: J1 G) O2 n$ }) b1 ^0 r2 E: B3 T
;   /* register read command */
; E4 Z. ~6 [& c% o6 s) pcall outbyt(05h);  h* C% W3 ^- A) y, F
call inbyt; /* status register read in <DAT> */
( O! B* a& p7 k* g5 a+ Rsck=0;
7 ?( b$ z: V7 j6 J4 ^' H/ zcs=1;- ~' Z) ~' ?. |0 x. z8 s
end rdregister;
+ K) Z& D2 X' O: u) q  s  R4 i  n7 r' G( B+ I( q+ }6 F
wbyte:procedure;   /*  看门狗存储器字节写入子程序 */( P) I  z5 _1 j1 ^( j
  declare comm byte;
. V; A$ W8 U' i- k2 c  sck=0;
4 Y' h1 h% ?/ p# S  l  cs=0;- C- m  l4 w& n8 e7 w5 G
  comm=02h;  /*  写指令 02h */9 |$ u* X3 I8 S) A# X, a
  call outbyt(comm);
3 X1 @+ ^8 U! H7 N. B  call outbyt(addrl);
. }' Q' a& G" t/ k  call outbyt(dat);  /*  send one byte data to X25043 */1 |( M" g9 M5 h' U& [
  cs=1;- [! b3 D& \7 n$ L5 w! X- o4 V
  sck=0;
; k/ m, o# M- ]) `4 t  call time(150);
: e  K9 S3 [- \0 Jend wbyte;
* N' X( N6 H% J) q$ w3 Z/ ^( [) V) z0 m4 m$ c' _* P
rbyte:procedure;  /*看门狗存储器字节读出子程序  *// R. W! h: @3 ]
  declare comm byte;
2 ?" E1 j9 T( b) F( S7 ?  sck=0;7 Z) }- l+ ~7 N- \6 V% J5 n6 P- W
  cs=0;* \' g% U: v& d. R  \1 P8 a5 |
  comm=03h;     /* read command */
, i& u( X6 S  C+ ~4 F# s8 f, C  call outbyt(comm);& E& E6 d8 m; Y
  call outbyt(addrl);) A" S* c/ I3 s" i& H3 ?
  call inbyt;   /* read one byte to <DAT>  */  G2 P2 u2 s6 H' E5 U/ b
  sck=0;# d: G3 Q; S+ P1 d5 w. Y8 ]  O
  cs=1;
5 \5 L: G/ s% y- w, Qend rbyte;( f8 ?, R! |2 d  t

$ D/ a' D3 }) Lincdata:   procedure;          /* 参数修改--"加"键处理子程序+ */
2 U2 y# d; Q6 v% N7 Zif p10=0 then         /* 如果K7键按下*/
# w4 `. X5 t  V' V  C( G& \/ u    do;$ b! c+ m" [0 B! P- A- g: g
do while p10=0;       /* 等待键松开有效 */
  Q* S: j" ?) h3 m" r7 k  \; O6 o5 F  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/; g$ I( e( H) u- U; r
end;
) y  D7 M, Y* n5 ]0 r& h5 ydata=data+1;          /* 设定值+1 */
$ b! d" E  B2 b  c/ {% p+ ]if data>99 then data=1;  /* 规定设定值的上限*/
. u2 I) T- T& WL(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) *// A2 r* }9 p# N! F& \3 l
L(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */4 `. i9 P8 t2 @/ D; c1 T7 D
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/- u, x, p, c, H" ~% }3 b, Y7 B+ h
call time(200);         /* 延时 */
* K4 z" k6 m% fcall dog;
  C- y2 L' U5 O1 wcall time(200);+ T4 `- i8 m1 n  k' F' v0 K
call dog;0 R- u' P+ _& S" q, \2 C4 ~% A; \
call wrenable;           /* 置存储器写使能 */
# ?" b! Q0 o% `0 O! \& q! maddrl=00h;               /* 置存储器地址 */, v' D7 C/ L, K* n+ K- I
dat=l(1);                 
% j# f$ N5 P4 k2 Xcall wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  * x  H( N9 D4 F+ B! V6 {8 {
call wrenable;6 M$ p+ p+ }1 C7 d
addrl=01h;, ?" b+ Z7 t2 c4 N! _  q
dat=l(2);
8 \4 X/ m6 H+ W! Icall wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  4 Q# f. r" |$ a0 G* W
      end;; g! F/ X7 ]! `- X6 i8 P$ o
end incdata;               5 C1 z2 v5 [. o2 ]& _1 s0 d- Q
decdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */   
8 R+ H5 E9 K! S; SIF p11=0 THEN         /* k8 键处理子程序 */  6 x6 G! Q! {2 y5 Y2 G  D/ D2 z
     do;  K& R" @; B9 H8 u
do while p11=0;( l; i; x) k7 q+ c& ?9 |8 X
   call dog;
' z" Z8 M4 _+ e  p. Xend;
+ ^4 A* c2 u! T/ ^7 LDATA=DATA-1;             /* 设定值-1 */
( A$ o; Z+ E8 s. G9 G( `% [8 k) Mif data=0 then data=99;1 U& J1 L& v$ x  J1 @
L(1)=data MOD 10;      
) A+ ^- V; g, ^7 X" k. fL(2)=data/10;           
2 h. R8 X) c- C* Scall display(l(1),l(2));
9 ?6 v( {& H7 r2 c8 r* x! h+ [/ [call dog;  G. a  b9 b+ D
call time(200);  
6 b4 H3 l: i& m: lcall dog; 1 [" x6 y) ~; y/ h4 ?$ {7 U
call time(200);; {2 L  n* X, E' o% C" {4 N# Z
call dog;3 F  B; B+ _& c7 ^5 q
call wrenable;% ?# C/ }6 T6 B/ f
addrl=00h;           
  S4 b( o9 _% _' ~0 J9 rdat=l(1);
) u/ k9 n& ^3 z* }5 x/ Ucall wbyte;# v( u" ~8 ?2 k; L4 e) [4 a
call wrenable;8 o0 W% E) X4 W9 o, j5 C
addrl=01h;           
% V3 W8 \9 r7 tdat=l(2);
3 ?! |( f3 b) v9 R9 n2 hcall wbyte;" z, b7 a5 v/ V; ^' {9 G* o
   end;
8 w5 J* v  v; c. A- ]" ~2 SEND decdata;  
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

165

主题

600

帖子

1289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1289
2#
 楼主| 发表于 2016-8-15 11:43 | 只看该作者

163

主题

525

帖子

1236

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1236
3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~$ r) \$ F8 ?2 a2 Y8 J7 _
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-6-4 04:28 , Processed in 0.056631 second(s), 31 queries , Gzip On.

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

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

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