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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
控制步进电机正反转的实际应用程序
/ {' u! M9 K3 Y/*这是一个控制步进电机正反转的实际应用程序*/
2 P4 U3 I( V: J, {$ V/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
, n1 E8 I+ d$ u+ _4 W2 e6 V- J% ^/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/6 g  u$ k% Z* d
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
( G! l6 t; d/ B" Q/*k7,k8键是设定步进电机转动速度参数的加减键*/
5 X& f: q0 G2 I/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/) Q: n- J4 F. v( ^8 X# T
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/7 x* J2 x: [* Q: t4 Y
/*k11是步进运行键,按一下,步进电机动一下*/! K4 e) }( ?2 `; u
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
. j+ X, H! s" i( O0 Y! u/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
( I$ g% S' g& n' ~START:do;      
, u+ D/ J- a2 R$INCLUDE(REG51.DCL)9 y8 c9 m' d' I4 L# v6 _4 A: _
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/9 [  ^% ], o' ^0 `5 p
declare l(5) byte;
4 g0 h7 T* C  A7 M9 xdeclare (dat,data) byte at (30h);0 |/ ^7 e. n, M7 _! p5 z
declare delay word;
& B: ^- m5 [' U6 R# z) Y( rDECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/
' I, `/ Q( |% Q9 s4 q+ |8 @& @  41h,1fh,01h,09h,00h);
6 Z& `9 Z) [9 b+ Y1 l' wdeclare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/, H* u9 a+ @! v/ p5 m
declare so literally 'p22',cs literally 'p23';
0 D& T4 I" S2 [& @4 N* {dog:procedure;  /* 初始化看门狗x25045 */
/ t; d! y* z; G3 U7 w5 ^8 h& scs=1;
. s  c8 N4 L$ `% r6 R% @5 N3 lcall time(1);
6 g9 w4 W1 J4 K  c0 lcs=0;
. }. c3 t& E' U, A5 ?& B, [2 q2 m( ucall time(1);  j2 n( c* V  w8 w8 J6 v. P/ |! U
cs=1;
" [6 x/ V2 @$ V  x" ^- @end dog;3 d1 A2 l! B* B  b
; H3 B/ F, P) W
run:procedure;  /*步进电机运行脉冲输出程序*/, \6 f# V' M; y( G. s; d# F) D. Y3 a
  if ok=1 then  
7 i! Z5 N+ l$ ?8 Z! K  call dog;4 S/ Y  }# V7 @- H+ M. n" K
  do;
- k$ ]" {" M$ l; Q; V    p14=0;
2 p0 E  W1 n% ~0 h6 n' t2 z     call time(1);
4 M+ K0 V& p1 K    p14=1;
5 p9 b- r6 B. D- {& `& q     call time(1);
6 D5 @% b- }: y8 e: ?  end;* T8 p6 F) E0 q% V. W( Z
end run;' V3 V8 M5 H8 ~; D
0 D, a# _2 \% p0 F
DISPLAYROCEDURE(L0,L10); /*显示子程序*/
4 Z0 h9 c; n& A7 R9 ODECLARE (L0,L10) BYTE; /*定义显示二位*/' k' ?2 C+ H3 u& f" [0 T0 B
n=L10;                 
5 j$ r% y" x5 t7 W% R8 Q  n=aco(n);           /*十位数BCD码译成段码*/: z$ Y; Z9 ?, D7 K6 T
  sbuf=n;             /*十位数送164显示*/
5 a+ T. ]2 q' e6 W. ~  do while ti=0;      /*等待发送结束*/9 X# i" }4 a1 }9 ^2 U" ?
     call dog;        /*看门狗定时器复位*/  0 M8 p9 y# L% H# d0 c& v8 n
  end;- c; F! e( L1 ^. M5 R
n=L0;                * Q: V9 p' t7 q+ c: q
   n=aco(n);          5 _* L7 f/ ]$ [+ u- o+ b
   sbuf=n;           /*个位数送164显示*/ 0 i2 R4 Q% Q: v
   do while ti=0;       J2 R4 ]6 a' ]) m  o1 J( q
    call dog;3 p; j" p- i4 X& l7 f7 g9 S; M
   end;
5 R" @5 \& T  v$ D! j/ R! Eend display;       ' _. U# ~. e& n
outbyt:  procedure(da);       /*向看门狗存储器写入一字节*/
' i# q$ y% u: z+ Kdeclare (i,da) byte;5 A  }* z  b) ^. B5 Q
j=da;                 /*将要写入的字节赋给临时变量J */
. T; s; f8 g# R! \do i=0 to 7;          /*左移8位,送到口线si */
" \0 z2 u2 A# n/ t. q. L   sck=0;6 a& T4 I: M0 a
   j=scl(j,1);+ A' N/ f* Y2 s( H( M# j
   si=cy;; L, C# a' r# v$ d3 _' t
   sck=1;            /*每移一位数据,跟一个时钟信号*/
3 |* t4 K0 D8 t* l  G1 k0 \( J5 bend;- e1 S7 d' J/ D$ L( x
end outbyt;  ! S8 M3 b) J7 _) N
* E/ P- Q" H( ]" V7 N- t$ E
inbyt:  procedure;   /* 从看门狗存储器读出一字节 */2 n/ x7 {( o. G. C1 @2 l$ I
declare (i,di) byte;3 N! x4 N6 |" r2 I) \4 g2 c* G  b
j=0;5 G/ i1 Y  z- A' T: M
do i=0 to 7;   . \* R& u8 }( }* O9 F4 {9 R
   sck=1;% g( r( O4 t/ _2 u& m# X# S( }- C, m
   sck=0;. l9 h0 L) j8 d3 o8 m
   cy=so;
  q3 _7 r& f- \. ]& ]: X   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/
7 s& J0 p' V* send;0 ~' S" e5 Z, g# \# Y
dat=j;# k! K! A7 O8 s# L
end inbyt;
  C1 x$ \/ O# d
$ c) n4 M9 K% v4 v' F- mwrenable: procedure;   /* 置看门狗写使能*/# u& w" f$ i2 e( O
sck=0;
. w! Z2 u% p+ Mcs=0;/ H2 c/ N+ s& g7 i/ f
;  /* write enable command */6 P/ e7 O+ v- s. ]* f2 i
call outbyt(06h); /* x25045 写使能指令06h */
, w2 P; M8 n9 `% Z  k/ v  D/ a7 R* X$ {cs=1;0 Y& V% n  b7 x- ^( q+ @( D7 ^; J
sck=0;$ |$ L; t- O3 d
end wrenable;  [6 X0 q$ Y6 e

& a5 R' o" b9 H, ]8 wwrdisable: procedure;  /* 置看门狗写禁止 *// `5 ?  P# E8 R0 v1 M* V4 V; ^
sck=0;
9 u( V3 b% U) j6 l8 Hcs=0;0 {. V! J9 \- ~1 ?8 u. A5 E  J" a3 N' T
; /* write disable command */
3 J! ^0 ]3 N9 Z$ l7 F; ecall outbyt(04h);
- A4 P: \9 R# R" s, z- d# l" ksck=0;0 h7 Q5 B* t& l- @) [" Z$ i: }
cs=1;
: \% X: r% t1 P) [end wrdisable;
7 e* w# [+ g  t! a4 p- I3 u8 d* S
wrregister: procedure;   /* 写状态寄存器 */5 ^2 u, e/ C* `1 j
sck=0;
2 p" D  `5 u; M0 d. t8 `cs=0;
1 y3 A2 _; e7 ]dat=01h;      /* write register command */ 5 ^( P: x* @- ~7 H) y- ]* d# ?
call outbyt(dat);! }6 [- N4 x  O( P- ?
;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */
: g  i( m& c1 e' V4 B0 t, Wcall outbyt(00h); /* 设定看门狗定时时间 */
) e$ i) ]- {% }( z. c;8 r5 Z+ y* k/ m. x! p5 f6 i
sck=0;$ q. Q* i9 x! H, |( W
cs=1;
7 ~% L: N* e/ rcall time(200); /* wait to complete writting cycle */  r2 I  ^5 K4 c6 t8 F
end wrregister;
: A0 t4 J, G6 k3 `
7 T. W: S, Y7 J3 @1 X& c& @rdregister:procedure;  /*  读看门狗状态寄存器 */
! n1 n( X2 A3 U5 J" w9 }3 w9 vsck=0;
. M: B" u$ a* S7 O; g7 hcs=0;6 s2 M& ]7 E: ?9 @5 p4 y
;   /* register read command */
7 v7 T: |; p9 a  a, j) Wcall outbyt(05h);4 c, A# P3 e: B
call inbyt; /* status register read in <DAT> *// T# `; Q, [) F* l& _! u. K
sck=0;5 h6 N: U, _2 T5 {; S
cs=1;
. h1 [  p$ U% m" e  fend rdregister;8 }& v/ J6 k+ H9 k7 p- \
8 o" Z3 s& s; F2 K, w
wbyte:procedure;   /*  看门狗存储器字节写入子程序 */" V# N2 P8 A' c9 z% ^2 G; }
  declare comm byte;# J7 ?0 b" w7 Z: ^" H
  sck=0;
9 p0 f% c( O4 z) [% p% Y  cs=0;0 G4 Z- ^/ n+ O# _3 t/ d, H  c
  comm=02h;  /*  写指令 02h */
% u4 Z, o; n/ e! ]4 Y# m' U  call outbyt(comm);( v7 ~/ z2 E! J0 N
  call outbyt(addrl);
+ O) f3 a/ `; y$ W0 u& O  Y  call outbyt(dat);  /*  send one byte data to X25043 */
0 o3 e" B( }8 r# m# I6 {  cs=1;
6 ^& [  F! s' k; \  @. b1 O  sck=0;
/ r' X7 t9 U3 \! M7 y' A# m! V  call time(150);4 T' Z4 R  k& y* X
end wbyte;% a. l' Q6 D; @9 A4 ?( h! Q

1 }) v  p) X1 M4 ?rbyte:procedure;  /*看门狗存储器字节读出子程序  */
* ~; J. Q. b9 \0 b* N9 R. H+ Q  declare comm byte;
+ x1 \0 \% o0 z; _  n& H! w  sck=0;& w" q; E# a1 ^4 p; ~: @" E, v
  cs=0;2 ?  J, k  ]- C
  comm=03h;     /* read command */
% L5 {; a: w4 o3 K5 `6 W6 V  call outbyt(comm);
7 m( R  O) m9 {' S  call outbyt(addrl);- c1 v! l7 u# L7 n% [: [
  call inbyt;   /* read one byte to <DAT>  */) r: U8 X0 ?! }
  sck=0;1 y& {1 z5 m6 T  s5 h, I* f  I
  cs=1;
0 [: A% c3 m9 |, q/ ^end rbyte;5 }% h7 X3 q, ]

7 w0 F' t7 \7 G9 f! a/ g& Q& U; Cincdata:   procedure;          /* 参数修改--"加"键处理子程序+ */( m# A& V/ K0 B# V5 O( K/ x4 d
if p10=0 then         /* 如果K7键按下*/% f* _* `4 s) M/ w% W
    do;
, z5 X$ E0 a- K5 b+ m5 jdo while p10=0;       /* 等待键松开有效 */) a1 Z1 L: W9 H
  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/6 I/ {, Z8 Y( T& ]
end;9 A# C: R) D0 G( L
data=data+1;          /* 设定值+1 */
  U5 H- [$ o6 T$ ^) Y' Wif data>99 then data=1;  /* 规定设定值的上限*/% J, u/ {$ z1 d1 V
L(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) */
/ u$ t4 H  v5 o/ dL(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */
$ a5 q" _- l3 K5 P% kcall display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
/ A7 s  F* P3 vcall time(200);         /* 延时 */$ [# l% h! v1 V' m
call dog;( |: \7 p8 s& P
call time(200);
8 x/ }- B( f4 u! d- L- r/ |call dog;
6 I/ M! G) U( ~3 W1 R4 z8 e7 Qcall wrenable;           /* 置存储器写使能 */
3 O. @% @& L* P8 V" }; m) L3 Daddrl=00h;               /* 置存储器地址 */
0 ?& U, W# J1 f3 O$ Rdat=l(1);                 4 i% ]/ C- P" H$ w
call wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  % _& k4 C1 Q0 @& g6 y8 |- E  K
call wrenable;
4 a# m5 ~7 t# F/ p9 oaddrl=01h;
- Q% e+ N: h4 @2 O% U* E- odat=l(2);
. R  T. g5 R. \9 h* ^call wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  + }2 K4 U; u+ r* u+ J/ g
      end;
. }9 M" H( p8 s; M. ^: oend incdata;               
( G( b* @0 \/ L) I& ?+ ddecdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */    ( G! Y: Z8 |3 g7 G7 [" Z
IF p11=0 THEN         /* k8 键处理子程序 */  3 z3 U8 q: R0 a0 f
     do;2 |3 s* k: }* z2 C- \
do while p11=0;8 q. Y3 p+ H6 j# F; a: q
   call dog;
* M* \- }1 a( [7 U$ u0 o  _6 i) Aend;- F1 ~* E+ b9 N. L* _
DATA=DATA-1;             /* 设定值-1 */7 `- ~! s6 Z0 T, m0 Y7 \
if data=0 then data=99;1 ~% D. W  a6 o) v
L(1)=data MOD 10;      
- |+ ]: p1 j4 z2 lL(2)=data/10;           
! q' r2 G- T5 F: V( Y7 g0 f7 qcall display(l(1),l(2));
; {( e( o9 M6 B$ R6 Qcall dog;
, [4 m: |- \: d0 Rcall time(200);  
$ r/ M8 C5 _* R4 Xcall dog;
5 l: d& `* ~' w5 I4 y& _5 J& ?call time(200);
" h. ?6 X" l2 s4 R& j3 ]5 ~8 ~; ocall dog;6 U$ n# w- O4 A! [5 A6 ?8 {
call wrenable;
4 `  a5 ]! e) [9 e, ~8 e  y+ q/ {addrl=00h;           4 C0 s$ Z7 C+ f8 O+ L8 C
dat=l(1);
. e4 s1 d; W, b9 Q0 o/ i. Ocall wbyte;& h9 @8 E( B; Z( ^
call wrenable;( U' O$ K# i% V, g8 Z. |
addrl=01h;           ) Y, L2 ^$ {) ]( X5 I4 K' e6 L
dat=l(2);  r* @) a* W! n; M
call wbyte;
7 V$ C) p5 X0 t* u+ y   end;
3 R9 F, {& M) R! H7 j+ iEND decdata;  

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~1 Z8 V' m  p2 @/ g2 @* i( P

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-14 19:25 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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