⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepmotordriver.txt

📁 步进电机的单片机程序开发
💻 TXT
字号:
步进电机控制类程序 

--------------------------------------------------------------------------------

发表于:2006-06-18 23:00:21 阅读:1579  
 
 
      
;步进电机正转
loop:mov R3,#0FFh          ;30h送ff即-1
main:INC R3
        mov a,R3
tt:     MOV DPTR,#TAB
        MOVC A,@A+DPTR
     MOV P1,A         ;送显示
         mov r7,#5
dec r7
        lcall delay          ;延时一段时间
        cjne a,#06H,main     ;如果是最后一个数据重新开始
        ljmp loop    ;    否则R3 清除
        ret
TAB: DB 03H,09H,0CH,06H ;步进电机正转表

 DELAY: ; 延时程序

MOV  R5,#255
D3:MOV R2,#25
D4: DJNZ R2,D4
DJNZ R5,D3
RET


;步进电机控制程序p3.2正转,p3.3反转,p3.4停止  步进电机接p1.0p1.1p1.2p1.3
         org 00h
stop: orl p1,#0ffh             ;  步进电机停止
loop:jnb p3.2,for2             ; 如果p3.2按下正转
         jnb p3.3,rev2         ; 如果p3.3按下反转
         jnb p3.4,stop1        ; 如果p3.4按下停止
         jmp loop              ;反复监测键盘
for: mov r0,#00h               ;正转到tab取码指针初值
for1:mov a,r0                  ;取码
         mov dptr,#table        ;
         movc a,@a+dptr
         jz for                 ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始正转
         jnb p3.4,stop1         ;  如果p3.4按下停止
         jnb p3.3,rev2          ;  如果p3.3按下反转
         call delay             ;转动的速度
         inc r0                 ;取下一个码
         jmp for1               ;继续正转
rev:mov r0,#05h                 ;反转到tab取码指针初值
rev1:mov a,r0
         mov dptr,#table           ;取码
         movc a,@a+table
         jz rev                 ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始反转
         jnb p3.4,stop1         ;  如果p3.4按下停止
         jnb p3.3,rev2          ;  如果p3.3按下反转
         call delay            ;转动的速度
         inc r0                 ;取下一个码
         jmp rev1               ;继续反转
stop1:call delay                ;  按p3.4的消除抖动
           jnb p3.4,$           ; p3.4放开否?
           call delay           ;放开消除抖动
           jmp stop

for2:call delay                 ;  按p3.2的消除抖动
          jnb p3.2,$            ; p3.2放开否?
          call delay            ;放开消除抖动
          jmp for

rev2:call delay                 ;  按p3.3的消除抖动
          jnb p3.3,$           ; p3.3放开否?
          call delay           ;放开消除抖动
          jmp rev

delay:mov r1,#40               ;步进电机的转速20ms
          d1:mov r2,#248
          djnz r2,$
          djnz r1,d1
          ret
table:
      db 03h,09h,0ch,06h    ;正转表
      db 00                  ;正转结束
      db 03h,06h,0ch,09h    ;反转
      db 00                  ;反转结束
      end
;步进电机正转,反转各3圈
org 00h
x1:mov r3,#250
start:mov r0,#00h
start1:
mov p1,#0ffh
mov a,r0
mov dptr,#table
movc a,@a+dptr
jz start
cpl a
mov p1,a
call delay
inc r0
djnz r3,start1
mov r3,#250
start2:
mov p1,#0ffh
 mov r0,#05
start3:mov a,r0
mov dptr,#table
movc a,@a+dptr

jz start2
cpl a
mov p1,a
call delay
inc r0
djnz r3,start3
jmp x1
delay: mov r5,#40;延时。
d1:  mov r6,#10
d2: mov r7,#18
 djnz r7,$
 djnz r6,d2
 djnz r5,d1
 ret
table:
db 03h,09h,0ch,06h
db 00
db 06h,0ch,09h,03h
db 00
end


;步进电机正反快慢程序
org 00h
x1:mov r3,#48   ;一圈48步
start:mov r0,#00h   ;正转取码初值
start1:
mov p1,#0ffh    ;先停止
mov a,r0
mov dptr,#table
movc a,@a+dptr
jz start       ;是否到了结束码00?
cpl a
mov p1,a           ;输出运转
call delay          ;调用慢速的延时转动
inc r0              ;取码指针加1取下一个码
djnz r3,start1    ;是否走了48步?
mov r3,#48         ;是则重新设定48步
start2:
mov p1,#0ffh
 mov r0,#05       ;逆转的取码初值
start3:mov a,r0
mov dptr,#table
movc a,@a+dptr

jz start2
cpl a
mov p1,a
call delay2
inc r0
djnz r3,start3
jmp x1         ; 重复开始


  DELAY: ; 延时程序    (慢速)
MOV  R7,#255
D1:MOV R6,#50
D2: DJNZ R6,D2
DJNZ R7,D1
RET

 DELAY2: ; 延时程序   (快速)
MOV  R5,#255
D3:MOV R2,#25
D4: DJNZ R2,D4
DJNZ R5,D3
RET

 

table:
db 03h,09h,0ch,06h   ;正转表
db 00
db 06h,0ch,09h,03h   ;反转表
db 00
end


;遥控电机程序, 按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转
;0-9步,同时数码管分别显示当前的数字!
 org 00h
    JMP MAIN
 ORG 30H
MAIN:
    MOV P1,#0FFH
 MOV P2,#0FFH
 MOV P3,#0FFH
START:
    JB P3.7,$ ;等待遥控信号出现
SB:
    MOV R4,#8   ;8毫秒为高电平错误
SBA:
    MOV R5,#250
SBB:
    JB P3.7,SXB1
    DJNZ R5,SBB
    DJNZ R4,SBA
    MOV R4,#2
    JMP SBC
SXB1:
    MOV R5,#5
SXB2:             ;去掉20US的尖峰干扰信号
    JNB P3.7,SBB
    DJNZ R5,SXB2
    JMP START
SBC:
    MOV R5,#250
SB1:
 JB P3.7,SB2  ;2MS内不为高电平错误(监测9MS的低电平引导码)
    DJNZ R5,SB1
    DJNZ R4,SBC
    JMP START
SB2:                ;去掉20US的尖峰干扰信号
    MOV R5,#5
SB2_A:
    JNB P3.7,SB1
    DJNZ R5,SB2_A
    MOV R4,#3
SB2_1:
    MOV R5,#250
SB3:                 ;监测4.5MS高电平,如3MS内出现低电平错误
    JNB P3.7,SXC
    DJNZ R5,SB3
    DJNZ R4,SB2_1
    MOV R4,#2
    JMP SB3_1
SXC:                 ;去掉20US的尖峰干扰信号
    MOV R5,#5
SXC1:
    JB P3.7,SB3
    DJNZ R5,SXC1
    JMP START
SB3_1:                ;监测4.5MS高电平,如5MS内不为低电平错误
    MOV R5,#250
SB3_2:
    JNB P3.7,SB4
    DJNZ R5,SB3_2
    DJNZ R4,SB3_1
    JMP START
SB4:                   ;去掉20US的尖峰干扰信号
    MOV R5,#5
SB4_1:
    JB P3.7,SB3_2
    DJNZ R5,SB4_1
 MOV R1,#1AH  ;设定1AH为起始RAM区
 MOV R2,#4
PP: MOV R3,#8
JJJJ:
    MOV R5,#250
JJJJ2:               ;1MS内不为低电平错误
    JB P3.7,JJJJ3
    DJNZ R5,JJJJ2
    JMP START
JJJJ3:
 LCALL YS1  ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
 MOV C,P3.7   ;将P3.7引脚此时的电平状态0或1存入C中
 JNC UUU      ;如果为0就跳转到UUU
    MOV R5,#250
JJJJ4:
    JNB P3.7,UUU
    NOP
    DJNZ R5,JJJJ4
    JMP START
UUU: MOV A,@R1  ;将R1中地址的给A
 RRC A            ;将C中的值0或1移入A中的最低位
 MOV @R1,A       ;将A中的数暂时存放在R1中
 DJNZ R3,JJJJ    ;接收地址码的高8位
 INC R1       ;对R1中的值加1,换成下一个RAM
 DJNZ R2,PP   ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;以下对代码是否正确和定义进行识别
 MOV A,1AH ;比较高8位地址码
 XRL A,#00000000B ;判断1AH的值是否等于00000000,相等的话A为0
 JNZ EXIT ;如果不相等说明解码失败退出解码程序
 MOV A,1BH ;比较低8位地址
 XRL A,#11111111B ;再判断高8位地址是否正确
 JNZ EXIT ;如果不相等说明解码失败退出解码程序
 LCALL YS3
 MOV A,1CH ;比较数据码和数据反码是否正确?
 CPL A
 XRL A,1DH  ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
 JNZ EXIT ;如果不相等说明解码失败退出解码程序
 LCALL YS3
 CLR P2.6  ;选中数码管
 CLR P3.3 ;解码成功喇叭响?
 AJMP BIJIAO
;判断在118毫秒内是否有连发码
AA: MOV R1,#25
XX: ACALL YS2
 JNB P3.7,HH ;跳转到判断连发代码是否正确的程序段
 DJNZ R1,XX
EXIT:  ;对所有端口清零

 AJMP START
;连发码判断程序段-----------
HH: MOV R6,#4
S:  ACALL YS1 ;调用882微秒延时子程序
 JB P3.7,EXIT ;延时882微秒后判断P3.7脚是否出现高电平如果有就退出解码程序
 DJNZ R6, S ;重复4次,目的是确认连发码的低电平信号波形
 JNB P3.7, $  ;等待高电?
 LCALL YS3
 AJMP AA

BIJIAO:
    MOV R0,#18 ;一共18个按键
    MOV DPTR,#TAB_REM ;遥控键值查表
LOOKUP_1:
    MOV A,R0         ;查表偏移量
    MOVC A,@A+DPTR
    XRL A,1cH        ;比较键值
    JZ REM_BAK0       ;相等转移
    DJNZ R0,LOOKUP_1   ;直到18个健比较完毕
    JMP EXIT         ;都不对退出
REM_BAK0:               ;键值处理
    MOV A,R0            ;R0
    MOV R1,A             ;
    SUBB A,#9            ;如果大于9则反转并将值减去9
    JC REM_BAK1           ;小余或等于9到正转
    INC A                 ;加1
    MOV R1,A               ; 查显示码表
    MOV DPTR,#TABLE1      ;
    MOVC A,@A+DPTR
    MOV P0,A              ;送显示
    CLR P2.6               ;开显示

REM_REV:                   ;反转程序
    CALL REV
    CALL delay             ;转速
    DJNZ R1,REM_REV         ;转动的步数到了停止
    JMP AA
REM_BAK1:                   ;正转程序
    NOP
    MOV A,R1   ;按键数值判断执
    MOV DPTR,#TABLE1     ; 查显示码表
    MOVC A,@A+DPTR
    MOV P0,A                  ;送显示
    CLR P2.6                    ;开显示

REM_FOR:                      ;正转
    CALL FOR
    CALL DELAY
    DJNZ R1,REM_FOR
    JMP AA
for: mov r0,#00h               ;正转到tab取码指针初值
for1:mov a,r0                  ;取码
         mov dptr,#table        ;
         movc a,@a+dptr
         jz FOREXT              ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始正转
         call delay             ;转动的速度
         inc r0                 ;取下一个码
         jmp for1               ;继续正转
rev:mov r0,#05h                 ;反转到tab取码指针初值
rev1:mov a,r0
         mov dptr,#table           ;取码
         movc a,@a+table
         jz FOREXT                 ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始反转
         call delay            ;转动的速度
         inc r0                 ;取下一个码
         jmp rev1               ;继续反转
FOREXT:
         RET
          
YS1:  MOV R4,#20  ;延时子程序1,精确延时882微秒
 D1: MOV R5,#20
 DJNZ R5,$
 DJNZ R4,D1
 RET
YS2: MOV R4,#10  ;延时子程序2,精确延时4740微秒
 D2: MOV R5,#235
 DJNZ R5,$
 DJNZ R4,D2
 RET
YS3: MOV R4,#2 ;延时程序3,精确延时1000微秒
 D3:MOV R5,#248
 DJNZ R5,$
 DJNZ R4,D3
 RET
 
TAB_REM:   ;遥控的键值
    DB 00H
    DB 10H,03H,01H,06H,09H,1DH,1FH,0DH,19H
    DB 11H,15H,17H,12H,16H,4CH,40H,48H,04H
    
delay:   mov r3,#40               ;步进电机的转速20ms
m3:      mov r2,#248
          djnz r2,$
          djnz r3,m3
          ret
TABLE1:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h;数码管的码表
        ;0 1 2 3 4 5 6 7 8 9
table:
      db 03h,09h,0ch,06h    ;正转表
      db 00                  ;正转结束
      db 03h,06h,0ch,09h    ;反转
      db 00                  ;反转结束
      end

 
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -