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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
控制步进电机正反转的实际应用程序 4 k* P! ]) X) J2 P- x( m
/*这是一个控制步进电机正反转的实际应用程序*/# I' W* f5 b- n% g
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/
! ]6 Q6 f! K( l/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/
. l' g6 m$ T0 K" T# Q) V  |3 T/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/
: c+ ^! R# X7 O6 N6 _/*k7,k8键是设定步进电机转动速度参数的加减键*/
* W: r$ M3 c' A/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/4 b7 N# r9 _) [6 k
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/
! p4 X9 ~% H1 V" g1 Q# w& R/*k11是步进运行键,按一下,步进电机动一下*/$ ^- y3 l; ^8 y( G, D
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/
5 H, U4 P3 y7 a7 [3 C5 `/ F% h, u/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
8 e3 ^5 [, H1 `7 @START:do;      
7 O9 p( Y( `* F# o$ l' s$INCLUDE(REG51.DCL)
3 `3 c/ [+ s" L' e% \DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/5 y3 X7 X* ~% L3 R
declare l(5) byte;9 Z" {0 ^4 G. f. w3 A0 ~
declare (dat,data) byte at (30h);# |9 F# N$ ?! R( d, Q# V
declare delay word;3 b+ w- z) J7 x2 E7 n) S0 j
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/% x$ j6 V- k5 N2 K
  41h,1fh,01h,09h,00h);1 m# o/ }5 e( w2 w7 T, Z
declare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/. Y9 U$ e) V5 N: C1 E0 A/ Z
declare so literally 'p22',cs literally 'p23';# ^8 i+ w/ P; b& V. x
dog:procedure;  /* 初始化看门狗x25045 */6 v/ I0 p. G8 p( T: j
cs=1;' ]+ L" o! ^3 r% b
call time(1);
- \7 y) U/ r- t* P( g/ Ecs=0;  V: q) [8 }1 @2 F1 |. r
call time(1);
4 A. y" e  P  ~cs=1;
0 w/ ?; [' Z( P# W* gend dog;+ J& A  r: E7 p

5 n4 ~, j' K* `# D$ Irun:procedure;  /*步进电机运行脉冲输出程序*/
' F/ o: _  a* i3 r  if ok=1 then  & I* q9 U6 e' R9 f- h3 b1 s
  call dog;! G& w# l' N( u  F" P  [# t9 [
  do;5 p, _& i2 C3 n9 Q! x! R, m
    p14=0;
- Q" ?1 x# d& W# ?6 n     call time(1);0 b8 z7 Y% V6 D3 C3 |
    p14=1;9 i. C/ d1 M& L0 U. z2 n! L
     call time(1);* _) w+ v% L* e3 r1 m: c
  end;
- d% w3 }$ G  [5 q$ d8 Wend run;
0 }+ {; K) H* u. `/ s0 b( [1 y: e  Z/ j# U" B. @
DISPLAYROCEDURE(L0,L10); /*显示子程序*/. W$ b/ U. ]( _% P' r
DECLARE (L0,L10) BYTE; /*定义显示二位*/
1 a; D8 z$ ]" x% o3 o+ W/ Y; X, Wn=L10;                 ; O5 x, {3 {2 z0 G
  n=aco(n);           /*十位数BCD码译成段码*/
, I) B& X9 d' _4 i7 t* j  sbuf=n;             /*十位数送164显示*/7 m$ L8 v8 v, O
  do while ti=0;      /*等待发送结束*/# r5 x9 |& j# L
     call dog;        /*看门狗定时器复位*/  1 h& x  G) m9 }% }- M" c
  end;4 |6 f& q9 M& D- v1 ]/ |/ G
n=L0;                : {! x* P6 s. j4 `2 x: E
   n=aco(n);            U# N) ]: ]$ d$ ?1 j5 V5 @# j# M
   sbuf=n;           /*个位数送164显示*/ , b5 `; ^* m- x  e7 X) P+ |( U
   do while ti=0;     + L3 a6 U5 f" P# U6 l
    call dog;1 ^) V- W0 `. J2 d
   end;
4 V1 v0 R% H2 s# z  iend display;       7 q: J+ K% s: P! F+ T1 b3 M3 [
outbyt:  procedure(da);       /*向看门狗存储器写入一字节*/. E$ |4 [2 ]2 B0 f
declare (i,da) byte;
9 f; f) d! o' ^; }2 W" Uj=da;                 /*将要写入的字节赋给临时变量J */
& m. i/ p& d: b' B+ }' ]do i=0 to 7;          /*左移8位,送到口线si */
; R4 g6 o* z) d- q% i- \   sck=0;
- y4 T7 B7 p7 F; {3 ]2 P   j=scl(j,1);
8 d/ [/ ~3 x6 T. V' Y: U1 N   si=cy;
& m( ^( |1 w7 f' A8 w6 M$ \' j' ]   sck=1;            /*每移一位数据,跟一个时钟信号*/ 5 _6 ?. `8 v) j; h* j, g" d4 T
end;
! h1 |8 t* ?" B" N8 ~2 Lend outbyt;  
7 N1 _. X" @: ]5 {
9 y" |; z! v3 W4 P+ [5 V% finbyt:  procedure;   /* 从看门狗存储器读出一字节 */5 v# U/ E, i9 Z, O# G
declare (i,di) byte;
4 B( H6 t; U5 R* S$ A- pj=0;, y' n) g, a; A- M$ ], i
do i=0 to 7;   
' O9 c* e) d9 ]1 p7 ^+ B6 L  e   sck=1;
' ~' v8 f* k9 i$ ~* _( @   sck=0;- I$ ]7 P% c6 U/ C
   cy=so;
% [; |- T( L6 Z9 p1 }   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/% O" s' K1 `2 l7 i/ M
end;. L% `; B' `' M1 F: [" p
dat=j;0 w+ P$ n, G5 q' G" q
end inbyt;
/ W& k/ M. P* m! ~# o' [4 c: {5 Y9 ?5 Q7 h7 s( e# X& v
wrenable: procedure;   /* 置看门狗写使能*/: ]* ~: g' `+ L: f4 G1 S
sck=0; % g% v  a# b* N/ U6 K
cs=0;
; g3 Q$ N- N- _/ y( ]# h( d: Q;  /* write enable command */. t! I6 W9 S- c( q; P- g7 B$ p
call outbyt(06h); /* x25045 写使能指令06h */
3 L  b5 e; y' `cs=1;
& a; F/ C: m+ Jsck=0;
3 `8 d" }/ K3 e* t/ Gend wrenable;( W! s0 |: [& j- M1 U# E/ {

, X* t; p- g& N; R1 ywrdisable: procedure;  /* 置看门狗写禁止 */# Q& }. }; C) l7 V9 Q5 j  E2 `
sck=0;% Z7 _+ {: |0 ]# v
cs=0;9 u# {; s2 m6 ?( c* j$ N5 I  W& u
; /* write disable command */& r( A. ~; Q- n/ O- `, U0 Q/ O3 A% N
call outbyt(04h);
! n- a, z$ g2 L0 [0 ^sck=0;1 }4 b0 }' j( D  S! C4 y5 U# V- p( v
cs=1;6 S; h  M! h4 H* m
end wrdisable;/ o5 R! E/ j* |* H
% c$ O+ n$ G+ R# C9 ^3 K9 }# X
wrregister: procedure;   /* 写状态寄存器 */$ `  O1 f) h  A
sck=0;5 ?* A+ @2 q" H5 g8 w/ o
cs=0;
3 i9 z' R( k( ^+ v9 ~$ [3 Odat=01h;      /* write register command */
) q; t. ~# o: s% @call outbyt(dat);8 {6 R, u; o) j8 H, P
;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */" d1 a# K. b3 c- z0 N8 k* B
call outbyt(00h); /* 设定看门狗定时时间 */2 e! f( B5 J' }5 G7 m
;
$ ~# \( {2 B/ O& U0 y) {2 h5 ysck=0;
' l% e+ W5 q* acs=1;* a. ~2 m: T) V6 H5 x' f& r8 z: w' x
call time(200); /* wait to complete writting cycle */
* ~  G' o- ?8 `  \" y5 eend wrregister;7 |+ I( d$ y4 i2 d9 g: @
7 r# Q* y9 y9 a, i0 {3 R& r
rdregister:procedure;  /*  读看门狗状态寄存器 */; g1 }+ H' A' t' E8 d
sck=0;
+ |. g% Z0 v* H8 [cs=0;
  k) C8 v5 w" c( P2 O;   /* register read command */# N: i7 R/ u  ~1 X1 s& V$ U9 h
call outbyt(05h);
5 q" k1 W' E: R% C, ?call inbyt; /* status register read in <DAT> */  o+ W4 c) l) T' z
sck=0;- r( \7 M4 j/ n6 R
cs=1;
7 N5 ~* [3 n! C- [3 Dend rdregister;
' |6 c4 d9 X; e5 g; u. o4 U6 j
- Y( y, x0 l2 n/ }7 F/ z& G$ kwbyte:procedure;   /*  看门狗存储器字节写入子程序 */7 p4 a$ O! K) k) m8 I
  declare comm byte;- n0 R& ~! Z4 G  Z
  sck=0;) @2 b( P- M" z0 H
  cs=0;
9 P& v9 m( O1 K1 T/ H  comm=02h;  /*  写指令 02h */
' F1 u" U0 n0 D- l  call outbyt(comm);
  ]# g( N: r; x6 V- q7 O6 J5 e3 T  call outbyt(addrl);9 w3 j: J) G) W: S9 `& f! s
  call outbyt(dat);  /*  send one byte data to X25043 */
# {$ u6 P% q% E8 h) O  cs=1;9 A4 ^+ @+ Y$ L- k& @% V  T
  sck=0;" F8 x3 A; _9 S' u6 s
  call time(150);
8 V- M2 e: J5 U  Z8 [end wbyte;& [- k6 ~/ Y: }! k; r$ N# \
: J& N6 m) n7 X9 z2 Y" i5 k% {1 {
rbyte:procedure;  /*看门狗存储器字节读出子程序  */, F( @  V! n4 K) d; k3 q% V
  declare comm byte;
- H# ]. u" p& l- ?( X6 H6 C' K, ~! V  sck=0;' T4 K; @& p9 M, v$ Q7 s
  cs=0;
5 O  x) t/ {5 t+ R9 @, V  comm=03h;     /* read command */
1 U$ `6 G9 R% L  p" `/ h  call outbyt(comm);( a) r; X8 G2 X: z7 [
  call outbyt(addrl);
( F; G  y5 t) Z9 \3 d! W) Z  call inbyt;   /* read one byte to <DAT>  */
4 `# E0 }" ^0 f) d0 D8 L+ ^  sck=0;  g! v- ~  W0 _4 G( z8 j% d
  cs=1;
$ T. j2 M5 b! o0 z8 @  B+ D  {6 Lend rbyte;
3 y8 S4 D5 E. n$ q9 k/ N- T/ M/ X
incdata:   procedure;          /* 参数修改--"加"键处理子程序+ */
9 R" g2 x3 x  s0 hif p10=0 then         /* 如果K7键按下*// h. a6 v$ g7 s# t
    do;* ^# i( [8 b8 _+ r
do while p10=0;       /* 等待键松开有效 */, N0 q. r5 B1 |7 Q
  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
: C* z* M. f7 m7 w. Z9 N6 Pend;$ g) A4 {$ p* R; q4 g
data=data+1;          /* 设定值+1 */
! M6 \1 Y: A3 R0 ]/ g" x# P5 fif data>99 then data=1;  /* 规定设定值的上限*/
& m' v$ T) `- Z7 u- }# XL(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) */
  w' e; J* V/ V7 u1 WL(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */4 U7 y1 D( i) x" Y
call display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
* c! E/ M' u' Q- ycall time(200);         /* 延时 */
; P5 C5 A/ G* C4 s; y1 |& Kcall dog;0 m8 C* l# E+ i9 R( }; A7 F
call time(200);
) k9 h( k0 N7 a- Acall dog;" m$ |6 b  r: |3 p1 `2 P* |
call wrenable;           /* 置存储器写使能 */1 ^. u9 t1 b8 `" l8 o
addrl=00h;               /* 置存储器地址 */9 G* ?: p; }7 X9 h; W9 K$ V: {3 H: L3 N1 Q
dat=l(1);                 
' O# L8 |6 U  D- D, M: y6 }call wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  
6 r- {/ r3 z6 O# _2 ucall wrenable;
9 X* y# v+ C5 C8 `addrl=01h;
* a2 t' C! [6 {* p6 @6 J( Ydat=l(2);% F& \* }/ E' H4 g; I% u
call wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  
) q/ k9 P4 z0 b; M$ x9 Y      end;
( b& ^# u/ F8 F% n# X* ]4 c' gend incdata;               3 m& _9 Q0 E1 _, P
decdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */   
2 d2 i8 X; G6 _$ C) s8 }0 W; yIF p11=0 THEN         /* k8 键处理子程序 */  
5 I! V3 l3 x# I0 H0 p     do;8 {1 O0 w% g' `: k& d
do while p11=0;% o) L( d8 c& A0 v: F/ g
   call dog;( S! C. x" N, a2 C$ M4 j
end;4 L7 ^$ |& V4 |* h
DATA=DATA-1;             /* 设定值-1 */
: a6 d* P9 l; s( c, I9 Sif data=0 then data=99;4 |. W) Y, _7 |( @: Y; Q
L(1)=data MOD 10;      
( U& T, ~1 ^1 ?( `" q, g9 h3 @. bL(2)=data/10;           2 O# e: Z+ G8 V7 [9 W
call display(l(1),l(2));8 l; H& D- J/ T- x" _* Z* t
call dog;
2 q: ?2 p+ L, N6 Xcall time(200);  5 D) o0 Z, e# ?* b* F: j! [
call dog;
' |4 E* ~) ~) y6 a: H9 r& kcall time(200);
( a2 R- ~7 m1 t' Q8 Wcall dog;
% l5 w7 K5 K6 @  T$ [- [call wrenable;
2 Y4 ^# V$ o' v! t& kaddrl=00h;           
3 C# J2 y- k" g* o  |* H/ Jdat=l(1);+ M/ K3 ~' v$ R
call wbyte;- T+ k& T$ u. p4 o
call wrenable;
' a! z3 n$ S/ U+ M: iaddrl=01h;           
" d+ `% _; }7 ]5 g: \1 H5 a: Edat=l(2);$ Q$ x8 I# T+ ?9 N0 G) r& a
call wbyte;7 t( c! t) H5 n$ ?2 V5 a
   end;
/ {% s3 u/ @5 y" n) c' d. _  oEND decdata;  

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~
2 ~8 M" D( r8 ]  E4 g, p

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-15 01:28 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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