原创 基于51单片机的两相四线步进电机控制系统(汇编版)

2009-7-21 16:55 4331 3 3 分类: MCU/ 嵌入式

     关于步进电机的工作原理大家可以在网上查查,这里主要介绍的是两相四线的步进电机控制,采用的是四拍方式。


    要求如下:


    1、有开机停止键。按第奇数次时为开机,第偶数次为停止。此例选择P3.3口。


   2、有加速键。加速范围为1~9档。


   3、有减速键。减速范围为1~9档。


 


具体实施方案:


    采用L298N驱动板驱动步进电机,采用如下相序:


1:正转环形脉冲分配表




步数


P0.0


P0.1


P0.2


P0.3


A


B


/A


/B


1


1


1


0


0


2


0


1


1


0


3


0


0


1


1


4


1


0


0


1


  


    源程序如下:


  ENA   EQU   P1.0
     ENB   EQU   P1.1
     IN1   EQU   P1.2
     IN2   EQU   P1.3
     IN3   EQU   P1.4
     IN4   EQU   P1.5
     SWITCH  EQU   P3.3
     FAST  EQU   P3.6
     SLOW  EQU   P3.5
     CYCLENUM  EQU  50H     ;存放对应定时循环次数
     TEMP   EQU  53H        ;存放按键次数。初值为5,每按加速叠加1,按减速递减
     MARK   EQU  56H        ;启动停止标识
     LEDBUF EQU  57H


     ORG    0
     AJMP  START


;*****************检测是否开启启动电机键***************************
START:
     MOV   P0,#0             ;清显示
     SETB  MARK           ;预启动电机工作,标识为1
     MOV   TEMP,#5        ;开始工作于5Hz
     MOV   CYCLENUM,#01H   ;循环1次
     JNB   SWITCH,NEXT     ;按键按下?
     SJMP  START           ;没有返回继续检测
NEXT:
     CALL  DELAY          ;消抖确认
     JNB   SWITCH,MAIN    ;再次确认按键,不为1说明按键按下
     SJMP  START          ;没有按下,继续检测


;*****************开始运行电机***************************************
MAIN:
     MOV   A,TEMP
     MOV   DPTR,#TAB4
     MOVC  A,@A+DPTR
     MOV   LEDBUF,A       ;送显示
     CALL  DISPLAY
LOOP:
     JB    MARK,WORK      ;检测运行标识是否为1,为1则继续运行,为0则停止运行
NOTWORK:
     CLR   ENA
     CLR   ENB
     SJMP  START
WORK:
     MOV    P1,#000010111B          ;步进电机运行方式为两相四拍
     CALL  TIMER
     CALL  TESTSTOP


     MOV    P1,#000011011B          ;第二拍
     CALL  TIMER
     CALL  TESTSTOP


     MOV    P1,#000101011B          ;第三拍
     CALL  TIMER
     CALL  TESTSTOP


     MOV    P1,#000100111B          ;第四拍
     CALL  TIMER
     CALL  TESTSTOP
     CALL  TESTKEY
     SJMP  MAIN
;***************************检测是否有按键按下************************
TESTKEY:
     SETB  FAST
     SETB  SLOW


NEXT1:
     JNB   FAST,YES2
NEXT2:
     JNB   SLOW,YES3
     SJMP  RETURN                      ;都没有键按下,则返回


YES2:
     MOV   A,TEMP             ;FAST按下,若此时temp等于9,则保持速度不变,若小于则加1
     CJNE  A,#9,CANFAST
     DEC   A


CANFAST:
     INC   A
     MOV   TEMP,A
     SJMP  RETURN


YES3:
     MOV   A,TEMP
     CJNE  A,#1,CANSLOW
     INC   A
CANSLOW:
     DEC   A
     MOV   TEMP,A


RETURN:
     RET


TESTSTOP:
     SETB   SWITCH
     JNB    SWITCH,GO
     SJMP   ENND
GO:
     CALL   DELAY
     JNB    SWITCH,YESSTOP
     SJMP   ENND
YESSTOP:
      CPL   MARK


ENND:
     RET
;***********************定时器设置*******************
TIMER:
     MOV   TMOD,#10H      ;T1工作于定时方式1
     CALL  TIMERSET
     SETB  TR1
     SETB  EA
     SETB  ET1            ;启动定时器工作
WAIT:
     JBC   TF1,HERE
     SJMP  WAIT            ;定时未到继续等待
HERE:
     DJNZ  CYCLENUM,TIMER    ;循环次数未满继续定时
     MOV  A,TEMP
     MOV  DPTR,#TAB3
     MOVC  A,@A+DPTR
     MOV  CYCLENUM,A
     RET


TIMERSET:
     MOV  A,TEMP
     MOV  DPTR,#TAB1       ;获取定时器高位
     MOVC  A,@A+DPTR
     MOV  TH1,A            ;存放至定时器高位


     MOV  A,TEMP
     MOV  DPTR,#TAB2
     MOVC  A,@A+DPTR       ;获取定时器定位
     MOV  TL1,A            ;存放至定时器低位



     RET
;***********************50ms延时**********************
DELAY:
     MOV  R0,#100
 DL1:
     MOV  R1,#10
     DJNZ R1,$
     DJNZ R0,DL1
     RET



;************显示子程序****************************
DISPLAY:
     CLR   P2.7
     CLR   P2.6
     CLR   P2.5
     SETB  P2.4            ;关闭高三位,保留个位
     MOV   P0,LEDBUF
     RET


    TAB1:  DB  15H,0AH,07H,05H,04H,03H,03H,02H,02H        ;定时器高位TH1
    TAB2:  DB   0B3H,0D9H,3BH,6CH,57H,0A5H,19H,0B6H,69H      ;定时器地位TL1
    TAB3:  DB   01H,01H,01H,01H,01H,01H,01H,01H,01H        ;循环次数CYCLENUM
    TAB4:  DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH     ;数码显示0~9

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条