?? 步進機控制程序.txt
字號:
步進電機控制程序步進電機正轉
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 + -