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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
控制步进电机正反转的实际应用程序 * a7 S& @# W; \( [5 Y' F$ V
/*这是一个控制步进电机正反转的实际应用程序*/& _- l' D. l: A$ x
/*选用的是三相步进电机驱动器,p14口线用做步进电机的脉冲控制*/. [$ Y/ Q1 s7 d
/*p13口线用做步进电机的方向控制。p15,p16,p17是光耦开关量输入*/' L( n5 A$ y6 h/ A9 N: d
/*信号端,p20,p21,p22,p23与x25045看门狗存储器相连*/% Z7 n6 G2 s4 e
/*k7,k8键是设定步进电机转动速度参数的加减键*/
. O# ~+ f1 k2 \+ C  e4 N$ G/ `/*k9是启动运行键,按一下k9,步进电机开始运行,直到p17口线有信号输入才停止*/. d, E6 [5 y8 D! N/ V3 |9 u
/*k10是停止键,任何时候按下k10都将停止步进电机当前的运行*/% h5 a1 F8 }; `9 ^  M- I  k, Q
/*k11是步进运行键,按一下,步进电机动一下*/7 ]* ?; e" C* t. ^- W
/*k12键是反向运行键,按一下,步进电机开始反向运行,知道p15口线有信号才停止*/: [! x& ?" f* d. ^
/*如果p16口线有信号输入,则只有k12键才起作用,其它键都没反应。*/
+ j. U5 X/ r. j+ E' X; ]START:do;       7 G+ J. x1 \! e# K( j
$INCLUDE(REG51.DCL)% l3 J- p: y" c: j' v
DECLARE (addrl,n,I,j,ok,ds) byte; /*定义变量*/
' f; O5 b1 M0 ~* x* D3 H6 @declare l(5) byte;
* S" y$ p; a% A7 f* r8 B8 \6 J3 Ydeclare (dat,data) byte at (30h);
" }; ~% Q3 E) U% U; v1 Adeclare delay word;+ |" X, _3 o- D( V. m
DECLARE ACO(11) BYTE CONSTANT (05h,9fh,23h,0bh,99h,49h,/*定义LED段码表*/  v1 t  ], `0 y% d! x
  41h,1fh,01h,09h,00h);! R% A$ D! y  w- b6 `
declare si literally 'p21',sck literally 'p20';  /*X25045囗线定义*/
$ D9 V- @4 [) v5 Kdeclare so literally 'p22',cs literally 'p23';0 N3 {$ l5 A8 u% K& c
dog:procedure;  /* 初始化看门狗x25045 */
- ^/ n8 N2 {4 _cs=1;
  l( D& V/ I- {7 t$ b( k) Pcall time(1);
" j2 t8 k* F% l$ k7 H6 i8 Tcs=0;; Z+ v' L" l/ q0 W3 b1 [8 `4 I9 F
call time(1);* G2 D+ ]. t; R
cs=1;
2 J" t. A0 b7 _! D* j1 mend dog;
' \6 m7 C5 M  |+ H' C" U- v* X
6 L$ L2 f% y) U3 U% a( u' Y/ Frun:procedure;  /*步进电机运行脉冲输出程序*/8 g: m" K1 B, b1 @, a' j
  if ok=1 then  - R3 I+ v3 c" t3 ^6 k: {. M
  call dog;
# ]; v/ C6 g9 u1 a% h5 Q- x  do;
5 |% Z, z7 u/ c: W4 x% O    p14=0;( |" i" I: _  _0 l5 c
     call time(1);* R& ]0 @( a8 u* \3 b& ^
    p14=1;
7 Q6 _8 [0 e) s# h     call time(1);
, `+ F5 Z7 d% X' }  end;
& e8 z2 v; \' X6 E3 c' l; ?* C8 Mend run;+ H5 P( d% R1 a/ o. F. v( a  t  J
4 X3 M; c( x/ p
DISPLAYROCEDURE(L0,L10); /*显示子程序*/
, z1 V9 o9 C2 p) kDECLARE (L0,L10) BYTE; /*定义显示二位*/
: |" }$ ]3 \) O5 g  u3 P6 h) cn=L10;                 ; n9 W& T9 z  P! X
  n=aco(n);           /*十位数BCD码译成段码*/0 ^9 e3 k# r% o+ C
  sbuf=n;             /*十位数送164显示*/0 ]0 @3 S' X4 ]( [* C: C
  do while ti=0;      /*等待发送结束*/' r/ a6 v2 N& d  \
     call dog;        /*看门狗定时器复位*/  : B6 V) ]& S2 d9 Z/ @2 b% h
  end;
/ l3 j( e, J+ s, Z; s: H. {n=L0;               
/ D$ r9 S0 s; j8 D$ T0 I/ d7 D( l   n=aco(n);          1 v+ W, J2 N  q0 O3 n4 Y
   sbuf=n;           /*个位数送164显示*/
; r+ a0 O& t& p: l! f: o; l   do while ti=0;     
7 b% D6 t% a- F" Y    call dog;0 h1 {4 p% D3 D( z+ i- X/ \
   end;+ n' z0 v' d  f- w
end display;      
8 g1 T5 t% |- Z+ n' T' r  Soutbyt:  procedure(da);       /*向看门狗存储器写入一字节*/
' c5 ^5 e! P$ n$ ndeclare (i,da) byte;
/ K& n: O6 F. n: N- _% \2 G6 }j=da;                 /*将要写入的字节赋给临时变量J */
/ [4 \5 n- f$ a  s  K' `8 rdo i=0 to 7;          /*左移8位,送到口线si */
! [$ Z! o* T( P. W; D7 q' c   sck=0;
6 v3 b% |: w" y, Z: V2 Y1 F   j=scl(j,1);
( i4 _3 j$ l) p- \$ ?" X" ^   si=cy;& U1 u5 e- f/ R* R
   sck=1;            /*每移一位数据,跟一个时钟信号*/ * |, e6 L" x  k% ~2 V
end;
0 e3 @" x& J. X% send outbyt;  ! V( C2 O% n: P2 H: @# |8 h* a
" ^' _6 R* V6 {9 e4 P" ~1 a+ l
inbyt:  procedure;   /* 从看门狗存储器读出一字节 */
( ~, C3 P9 P* t! [4 v, ]3 Fdeclare (i,di) byte;
# {8 l) _7 _( q$ s# E2 V8 @j=0;
0 T* w& _: d' x7 Z( Zdo i=0 to 7;   8 M; b* b7 B# q
   sck=1;9 Y  m+ X3 T7 ^- I
   sck=0;3 y7 w$ G* Y$ Z* {. @% y
   cy=so;- _$ o' G/ n' F, t  u3 e- f
   j=scl(j,1);  /*从看门狗存储器读出一字节送入临时变量j*/2 Q/ Q; L, i. `- m$ G3 V- u' e
end;8 F  k: E7 m; i& w1 B( \
dat=j;
- w) w5 N. b7 \9 I1 bend inbyt;
* A$ K4 e4 Z9 n4 f9 \; k% c, I, m7 T# [! G; ^! \" X, G
wrenable: procedure;   /* 置看门狗写使能*/
; p6 y" ^; q/ ]2 Ysck=0;
) A. Y; V5 I3 l) P  g$ `( b6 wcs=0;( P2 Q& O- l) t# g: H3 b3 a
;  /* write enable command */
% N! V4 u+ y4 G1 T- Fcall outbyt(06h); /* x25045 写使能指令06h */
0 Y, O$ N1 H, y  N8 q& {cs=1;
5 R  N% l& _; b/ ?! @' }  |sck=0;
' n" T, E4 U2 e) ]# fend wrenable;1 x, Z8 ^" M: \: O3 V$ ?$ T
0 j7 Y4 e7 e1 x+ R, `' y
wrdisable: procedure;  /* 置看门狗写禁止 */
+ p, ~) d, B8 |, P$ x) R5 n! Tsck=0;8 z1 f% m8 i" y# r( Q4 T( K& x. Y
cs=0;) u' L/ s9 C# O* ]! M# e, V- U: B
; /* write disable command */
- Y) [2 X# m  lcall outbyt(04h);: ^, V* k, C* M& X$ r/ B5 p1 N- {
sck=0;
( \$ Q4 E# n7 @$ Y0 @9 ?; Wcs=1;7 V# \7 x4 J' p8 |* y! q1 P' D
end wrdisable;
, z& ^- ?% q9 q
! U5 V" p: \8 Y9 e9 q3 w/ Lwrregister: procedure;   /* 写状态寄存器 */* y& _, P! v- R3 g* @+ ^$ E
sck=0;. u, A4 l/ V( e9 w
cs=0;
" S! J. f! W& ?dat=01h;      /* write register command */
) \* c$ p* Y( Y' b$ p$ d/ O0 A6 l  j4 ~call outbyt(dat);9 Z7 k$ n  A9 Z4 L
;     /* 00h--1.4S, 20h--200MS, 10h--600MS, 30h--disable Wdog */6 m' @% v, s4 a
call outbyt(00h); /* 设定看门狗定时时间 */% H0 Z8 G7 |! L* R1 f
;. k2 l" ^: N6 v7 \3 L
sck=0;) P/ Q9 z0 l" `
cs=1;3 \4 M) X$ q( T7 f4 u6 A* ~
call time(200); /* wait to complete writting cycle */, V. B! z8 S( t+ h% G4 t( H
end wrregister;4 x6 w  g" U7 D0 K/ \3 t+ a4 b

: _9 I2 ^0 n4 }* _" R1 Z- Hrdregister:procedure;  /*  读看门狗状态寄存器 */: [" q- v- U. {2 v7 f) K
sck=0;- E4 M; F( a* P5 G6 p8 ?7 K; ]
cs=0;/ @# h4 Z- a) Q4 F- ^, f% ^; ^
;   /* register read command */
& D% ~( k3 k4 g* v! Jcall outbyt(05h);
) T2 p4 r0 t; U' Y2 W  [4 M" ~1 qcall inbyt; /* status register read in <DAT> */2 Y2 Y! W6 C+ h; F/ N
sck=0;
$ u# M8 ~: M- _5 ?$ P! _cs=1;0 ~& D2 o8 ^& i: k
end rdregister;
4 v: K/ J# [/ E/ L6 ?$ L' y( N7 r9 y3 n* ~8 d
wbyte:procedure;   /*  看门狗存储器字节写入子程序 */2 k+ W5 |% x% u7 p4 c
  declare comm byte;
# C( c+ s* u& N" [) s$ t9 `  sck=0;* z$ J$ x" a/ d3 |" T; C- }, _% R5 D
  cs=0;. F+ a1 R0 Z: O4 E$ k; f
  comm=02h;  /*  写指令 02h */: _' |6 c$ p: |# V  A$ N, B
  call outbyt(comm);
+ r9 d3 z, l6 y) z' a& n  call outbyt(addrl);
3 F" v+ b' Z/ n  call outbyt(dat);  /*  send one byte data to X25043 */% S/ u; |; b/ ^  N- [) Y
  cs=1;
. }# U2 i; s4 t+ p3 ?" V  sck=0;4 u4 C" g; _$ P0 y8 C
  call time(150);
  v$ X  @  M9 L" C' f4 |/ tend wbyte;. K$ d6 ]0 ?5 D

8 Z* e$ r; h6 U  ?8 R; irbyte:procedure;  /*看门狗存储器字节读出子程序  */
" o1 ~; M9 F; u$ M! t  declare comm byte;" W/ c( s. ]2 f) }% a
  sck=0;
8 f5 o, q8 T$ |  w; B7 F  cs=0;
8 K8 p: R6 x1 a$ t: ^# e" n+ P  comm=03h;     /* read command */
/ g6 I# v) y5 f0 ]& ~! w. O9 F  call outbyt(comm);& r; @# V# s0 Z3 |! `/ g6 u/ R' y0 ^
  call outbyt(addrl);
4 v+ D. R5 Y* q9 J; U$ E& V9 r  call inbyt;   /* read one byte to <DAT>  */& \% ^7 P; w; E
  sck=0;0 h0 u+ k7 _5 ?7 c- ?$ b9 \$ @
  cs=1;
5 k9 f% |! S0 D* R. `) ^end rbyte;
% U$ A9 \" O. t, R# [  w' S) T- B
! F$ @3 ^1 e  f, U* ~incdata:   procedure;          /* 参数修改--"加"键处理子程序+ */
! `3 z6 ]) X. e1 G/ s% v7 Zif p10=0 then         /* 如果K7键按下*/" c' b+ _$ ]8 m9 W. \) Z) @& M9 I
    do;
* T/ O# W( Z+ I- k; T9 Ydo while p10=0;       /* 等待键松开有效 */
. V5 B4 u9 X6 o  call dog;           /* 此处必需调用看门狗复位子程序("喂狗"),否则程序将被看门狗复位*/
( C( w- V, o! F4 e0 hend;8 [& q- g4 h1 {0 A
data=data+1;          /* 设定值+1 */
8 @! G( Z) B' x9 K7 ]if data>99 then data=1;  /* 规定设定值的上限*/
. X% I1 V2 z8 h0 `L(1)=data MOD 10;       /*将设定值的十位数拆出来送给十位数显示变量L(1) */
1 z/ L0 e. i6 ?' I7 PL(2)=data/10;           /*将设定值的个位数拆出来送给个位数显示变量L(2) */
/ ]7 k, w0 z( F$ a1 c. Q: [3 D1 pcall display(L(1),L(2)); /* 将改变后的设定值送164显示出来*/
2 n/ k# i- c% B9 `# e6 rcall time(200);         /* 延时 *// q% G5 q# ^% V# B1 v% ^8 B- k6 p
call dog;' _" f5 `" h9 _* \9 M# B
call time(200);
5 U( j' s( k. ^call dog;
2 v6 |! o$ K$ }4 }' r" Icall wrenable;           /* 置存储器写使能 */
  _# J9 a' v* j( c9 }4 ~. xaddrl=00h;               /* 置存储器地址 */" {6 _8 I7 A' N; @
dat=l(1);                 . W% u1 [5 K, T0 e9 K7 \: B( d
call wbyte;              /* 将变量L(1)的值写入存储器00h位置 */  ' D* w" M1 s0 ~2 k0 K) p, O' {
call wrenable;
9 o# `  ^; b5 J% n6 @addrl=01h;' \& S- Z' Q# y8 Y5 x
dat=l(2);
# Q* E& x0 n* T4 {call wbyte;              /* 将变量L(2)的值写入存储器01h位置 */  % h; M+ \* v! p7 ]+ q5 B$ |1 e/ C7 Q+ A
      end;5 }& e/ A% n0 o
end incdata;               
9 r( d) |1 ?# `; U, B' Ydecdata:   PROCEDURE;         /* 参数修改---"减"键处理子程序- */    , F2 `8 \' f- S
IF p11=0 THEN         /* k8 键处理子程序 */  
. F! p# X+ ?' G- p, E) w     do;: u  z, a% K; Q( W) k5 M
do while p11=0;
. e5 D6 M  r& }% N$ `* j   call dog;
6 t, F( T6 }0 dend;! ]) V& t9 g; P! p0 L% ]7 j( b
DATA=DATA-1;             /* 设定值-1 */
  b/ ?6 ]$ V+ ~4 Pif data=0 then data=99;
+ {% o- s3 u( z, X% G& k  A/ HL(1)=data MOD 10;      
# U* `2 e/ e5 o* q" `6 nL(2)=data/10;           
! ], \$ n0 X, ]$ A& ]9 \( ycall display(l(1),l(2));
0 R3 j' _- u- F4 }call dog;
; l" B, ^" B7 T/ E7 jcall time(200);  
% L2 s! R- ^0 C) q& ^* ~call dog;
# |6 C9 N4 z6 A% y, U+ ?6 h6 o5 l5 Ucall time(200);9 C' y  i. v0 {: r" h
call dog;
4 v* X; K5 C! ~4 r2 h+ G# Kcall wrenable;
% S" z4 B$ @0 l: p) t, G3 w( z. uaddrl=00h;           9 Q" [2 ]7 Q: k- S; Z$ Z
dat=l(1);: P0 [- k: ^( g4 c$ i) |
call wbyte;
  u) u# r8 d5 Y4 zcall wrenable;
' e! X7 t, u2 G  R. g% m3 oaddrl=01h;           ( z6 K6 _& N  f+ ?/ H/ ^
dat=l(2);
5 P1 D+ @7 ]. k  Ycall wbyte;) k' b  s7 c8 m/ B
   end;: M% O. S% d: g1 G' ^
END decdata;  

该用户从未签到

3#
发表于 2016-8-15 15:55 | 只看该作者
谢谢分享,必须赞一个~- y9 X0 |0 s" w4 r

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 07:47 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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