步进电机的控制程序.docx
- 文档编号:30225928
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:11
- 大小:18.07KB
步进电机的控制程序.docx
《步进电机的控制程序.docx》由会员分享,可在线阅读,更多相关《步进电机的控制程序.docx(11页珍藏版)》请在冰豆网上搜索。
步进电机的控制程序
;步进电机正转
loop:
movR3,#0FFh ;30h送ff即-1
main:
INCR3
mova,R3
tt:
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A ;送显示
movr7,#5
decr7
lcalldelay ;延时一段时间
cjnea,#06H,main ;如果是最后一个数据重新开始
ljmploop ; 否则R3清除
ret
TAB:
DB03H,09H,0CH,06H;步进电机正转表
DELAY:
;延时程序
MOV R5,#255
D3:
MOVR2,#25
D4:
DJNZR2,D4
DJNZR5,D3
RET
;步进电机控制程序p3.2正转,p3.3反转,p3.4停止 步进电机接p1.0p1.1p1.2p1.3
org00h
stop:
orlp1,#0ffh ; 步进电机停止
loop:
jnbp3.2,for2 ;如果p3.2按下正转
jnbp3.3,rev2 ;如果p3.3按下反转
jnbp3.4,stop1 ;如果p3.4按下停止
jmploop ;反复监测键盘
for:
movr0,#00h ;正转到tab取码指针初值
for1:
mova,r0 ;取码
movdptr,#table ;
movca,@a+dptr
jzfor ;是否到了结束码00h
cpla ;把acc反向
movp1,a ;输出到p1开始正转
jnbp3.4,stop1 ; 如果p3.4按下停止
jnbp3.3,rev2 ; 如果p3.3按下反转
calldelay ;转动的速度
incr0 ;取下一个码
jmpfor1 ;继续正转
rev:
movr0,#05h ;反转到tab取码指针初值
rev1:
mova,r0
movdptr,#table ;取码
movca,@a+table
jzrev ;是否到了结束码00h
cpla ;把acc反向
movp1,a ;输出到p1开始反转
jnbp3.4,stop1 ; 如果p3.4按下停止
jnbp3.3,rev2 ; 如果p3.3按下反转
calldelay ;转动的速度
incr0 ;取下一个码
jmprev1 ;继续反转
stop1:
calldelay ; 按p3.4的消除抖动
jnbp3.4,$ ;p3.4放开否?
calldelay ;放开消除抖动
jmpstop
for2:
calldelay ; 按p3.2的消除抖动
jnbp3.2,$ ;p3.2放开否?
calldelay ;放开消除抖动
jmpfor
rev2:
calldelay ; 按p3.3的消除抖动
jnbp3.3,$ ;p3.3放开否?
calldelay ;放开消除抖动
jmprev
delay:
movr1,#40 ;步进电机的转速20ms
d1:
movr2,#248
djnzr2,$
djnzr1,d1
ret
table:
db03h,09h,0ch,06h ;正转表
db00 ;正转结束
db03h,06h,0ch,09h ;反转
db00 ;反转结束
end
;步进电机正转,反转各3圈
org00h
x1:
movr3,#250
start:
movr0,#00h
start1:
movp1,#0ffh
mova,r0
movdptr,#table
movca,@a+dptr
jzstart
cpla
movp1,a
calldelay
incr0
djnzr3,start1
movr3,#250
start2:
movp1,#0ffh
movr0,#05
start3:
mova,r0
movdptr,#table
movca,@a+dptr
jzstart2
cpla
movp1,a
calldelay
incr0
djnzr3,start3
jmpx1
delay:
movr5,#40;延时。
d1:
movr6,#10
d2:
movr7,#18
djnzr7,$
djnzr6,d2
djnzr5,d1
ret
table:
db03h,09h,0ch,06h
db00
db06h,0ch,09h,03h
db00
end
;步进电机正反快慢程序
org00h
x1:
movr3,#48 ;一圈48步
start:
movr0,#00h ;正转取码初值
start1:
movp1,#0ffh ;先停止
mova,r0
movdptr,#table
movca,@a+dptr
jzstart ;是否到了结束码00?
cpla
movp1,a ;输出运转
calldelay ;调用慢速的延时转动
incr0 ;取码指针加1取下一个码
djnzr3,start1 ;是否走了48步?
movr3,#48 ;是则重新设定48步
start2:
movp1,#0ffh
movr0,#05 ;逆转的取码初值
start3:
mova,r0
movdptr,#table
movca,@a+dptr
jzstart2
cpla
movp1,a
calldelay2
incr0
djnzr3,start3
jmpx1 ;重复开始
DELAY:
;延时程序 (慢速)
MOV R7,#255
D1:
MOVR6,#50
D2:
DJNZR6,D2
DJNZR7,D1
RET
DELAY2:
;延时程序 (快速)
MOV R5,#255
D3:
MOVR2,#25
D4:
DJNZR2,D4
DJNZR5,D3
RET
table:
db03h,09h,0ch,06h ;正转表
db00
db06h,0ch,09h,03h ;反转表
db00
end
;遥控电机程序,按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转
;0-9步,同时数码管分别显示当前的数字!
org00h
JMPMAIN
ORG30H
MAIN:
MOVP1,#0FFH
MOVP2,#0FFH
MOVP3,#0FFH
START:
JBP3.7,$ ;等待遥控信号出现
SB:
MOVR4,#8 ;8毫秒为高电平错误
SBA:
MOVR5,#250
SBB:
JBP3.7,SXB1
DJNZR5,SBB
DJNZR4,SBA
MOVR4,#2
JMPSBC
SXB1:
MOVR5,#5
SXB2:
;去掉20US的尖峰干扰信号
JNBP3.7,SBB
DJNZR5,SXB2
JMPSTART
SBC:
MOVR5,#250
SB1:
JBP3.7,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)
DJNZR5,SB1
DJNZR4,SBC
JMPSTART
SB2:
;去掉20US的尖峰干扰信号
MOVR5,#5
SB2_A:
JNBP3.7,SB1
DJNZR5,SB2_A
MOVR4,#3
SB2_1:
MOVR5,#250
SB3:
;监测4.5MS高电平,如3MS内出现低电平错误
JNBP3.7,SXC
DJNZR5,SB3
DJNZR4,SB2_1
MOVR4,#2
JMPSB3_1
SXC:
;去掉20US的尖峰干扰信号
MOVR5,#5
SXC1:
JBP3.7,SB3
DJNZR5,SXC1
JMPSTART
SB3_1:
;监测4.5MS高电平,如5MS内不为低电平错误
MOVR5,#250
SB3_2:
JNBP3.7,SB4
DJNZR5,SB3_2
DJNZR4,SB3_1
JMPSTART
SB4:
;去掉20US的尖峰干扰信号
MOVR5,#5
SB4_1:
JBP3.7,SB3_2
DJNZR5,SB4_1
MOVR1,#1AH ;设定1AH为起始RAM区
MOVR2,#4
PP:
MOVR3,#8
JJJJ:
MOVR5,#250
JJJJ2:
;1MS内不为低电平错误
JBP3.7,JJJJ3
DJNZR5,JJJJ2
JMPSTART
JJJJ3:
LCALLYS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOVC,P3.7 ;将P3.7引脚此时的电平状态0或1存入C中
JNCUUU ;如果为0就跳转到UUU
MOVR5,#250
JJJJ4:
JNBP3.7,UUU
NOP
DJNZR5,JJJJ4
JMPSTART
UUU:
MOVA,@R1 ;将R1中地址的给A
RRCA ;将C中的值0或1移入A中的最低位
MOV@R1,A ;将A中的数暂时存放在R1中
DJNZR3,JJJJ ;接收地址码的高8位
INCR1 ;对R1中的值加1,换成下一个RAM
DJNZR2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;以下对代码是否正确和定义进行识别
MOVA,1AH ;比较高8位地址码
XRLA,#00000000B;判断1AH的值是否等于00000000,相等的话A为0
JNZEXIT ;如果不相等说明解码失败退出解码程序
MOVA,1BH ;比较低8位地址
XRLA,#11111111B;再判断高8位地址是否正确
JNZEXIT ;如果不相等说明解码失败退出解码程序
LCALLYS3
MOVA,1CH ;比较数据码和数据反码是否正确?
CPLA
XRLA,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确
JNZEXIT ;如果不相等说明解码失败退出解码程序
LCALLYS3
CLRP2.6 ;选中数码管
CLRP3.3 ;解码成功喇叭响?
AJMPBIJIAO
;判断在118毫秒内是否有连发码
AA:
MOVR1,#25
XX:
ACALLYS2
JNBP3.7,HH ;跳转到判断连发代码是否正确的程序段
DJNZR1,XX
EXIT:
;对所有端口清零
AJMPSTART
;连发码判断程序段-----------
HH:
MOVR6,#4
S:
ACALLYS1 ;调用882微秒延时子程序
JBP3.7,EXIT ;延时882微秒后判断P3.7脚是否出现高电平如果有就退出解码程序
DJNZR6,S ;重复4次,目的是确认连发码的低电平信号波形
JNBP3.7,$ ;等待高电?
LCALLYS3
AJMPAA
BIJIAO:
MOVR0,#18;一共18个按键
MOVDPTR,#TAB_REM;遥控键值查表
LOOKUP_1:
MOVA,R0 ;查表偏移量
MOVCA,@A+DPTR
XRLA,1cH ;比较键值
JZREM_BAK0 ;相等转移
DJNZR0,LOOKUP_1 ;直到18个健比较完毕
JMPEXIT ;都不对退出
REM_BAK0:
;键值处理
MOVA,R0 ;R0
MOVR1,A ;
SUBBA,#9 ;如果大于9则反转并将值减去9
JCREM_BAK1 ;小余或等于9到正转
INCA ;加1
MOVR1,A ;查显示码表
MOVDPTR,#TABLE1 ;
MOVCA,@A+DPTR
MOVP0,A ;送显示
CLRP2.6 ;开显示
REM_REV:
;反转程序
CALLREV
CALLdelay ;转速
DJNZR1,REM_REV ;转动的步数到了停止
JMPAA
REM_BAK1:
;正转程序
NOP
MOVA,R1 ;按键数值判断执
MOVDPTR,#TABLE1 ;查显示码表
MOVCA,@A+DPTR
MOVP0,A ;送显示
CLRP2.6 ;开显示
REM_FOR:
;正转
CALLFOR
CALLDELAY
DJNZR1,REM_FOR
JMPAA
for:
movr0,#00h ;正转到tab取码指针初值
for1:
mova,r0 ;取码
movdptr,#table ;
movca,@a+dptr
jzFOREXT ;是否到了结束码00h
cpla ;把acc反向
movp1,a ;输出到p1开始正转
calldelay ;转动的速度
incr0 ;取下一个码
jmpfor1 ;继续正转
rev:
movr0,#05h ;反转到tab取码指针初值
rev1:
mova,r0
movdptr,#table ;取码
movca,@a+table
jzFOREXT ;是否到了结束码00h
cpla ;把acc反向
movp1,a ;输出到p1开始反转
calldelay ;转动的速度
incr0 ;取下一个码
jmprev1 ;继续反转
FOREXT:
RET
YS1:
MOVR4,#20 ;延时子程序1,精确延时882微秒
D1:
MOVR5,#20
DJNZR5,$
DJNZR4,D1
RET
YS2:
MOVR4,#10 ;延时子程序2,精确延时4740微秒
D2:
MOVR5,#235
DJNZR5,$
DJNZR4,D2
RET
YS3:
MOVR4,#2 ;延时程序3,精确延时1000微秒
D3:
MOVR5,#248
DJNZR5,$
DJNZR4,D3
RET
TAB_REM:
;遥控的键值
DB00H
DB10H,03H,01H,06H,09H,1DH,1FH,0DH,19H
DB11H,15H,17H,12H,16H,4CH,40H,48H,04H
delay:
movr3,#40 ;步进电机的转速20ms
m3:
movr2,#248
djnzr2,$
djnzr3,m3
ret
TABLE1:
db28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h;数码管的码表
;0123456789
table:
db03h,09h,0ch,06h ;正转表
db00 ;正转结束
db03h,06h,0ch,09h ;反转
db00 ;反转结束
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 控制程序