;遙控電機(jī)程序, 按遙控器0-9步進(jìn)電機(jī)正轉(zhuǎn)0-9步,按遙控器11-19步進(jìn)電器分別反轉(zhuǎn) ;0-9步,同時(shí)數(shù)碼管分別顯示當(dāng)前的數(shù)字!
;*************************************************************************** org 00h JMP MAIN ORG 30H MAIN: MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH START: JB P3.7,$ ;等待遙控信號出現(xiàn) SB: MOV R4,#8 ;8毫秒為高電平錯(cuò)誤 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內(nèi)不為高電平錯(cuò)誤(監(jiān)測9MS的低電平引導(dǎo)碼) DJNZ R5,SB1 DJNZ R4,SBC JMP START SB2: ;去掉20US募夥甯扇判藕?BR>MOV R5,#5 SB2_A: JNB P3.7,SB1 DJNZ R5,SB2_A MOV R4,#3 SB2_1: MOV R5,#250 SB3: ;監(jiān)測4.5MS高電平,如3MS內(nèi)出現(xiàn)低電平錯(cuò)誤 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: ;監(jiān)測4.5MS高電平,如5MS內(nèi)不為低電平錯(cuò)誤 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 ;設(shè)定1AH為起始RAM區(qū) MOV R2,#4 PP: MOV R3,#8 JJJJ: MOV R5,#250 JJJJ2: ;1MS內(nèi)不為低電平錯(cuò)誤 JB P3.7,JJJJ3 DJNZ R5,JJJJ2 JMP START JJJJ3: LCALL YS1 ;高電平開始后用882微秒的時(shí)間尺去判斷信號此時(shí)的高低電平狀態(tài) MOV C,P3.7 ;將P3.7引腳此時(shí)的電平狀態(tài)0或1存入C中 JNC UUU ;如果為0就跳轉(zhuǎn)到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中的數(shù)暫時(shí)存放在R1中 DJNZ R3,JJJJ ;接收地址碼的高8位 INC R1 ;對R1中的值加1,換成下一個(gè)RAM DJNZ R2,PP ;接收完16位地址碼和8位數(shù)據(jù)碼和8位數(shù)據(jù)反碼,存放在1AH/1BH/1CH/1DH的RAM中 ;以下對代碼是否正確和定義進(jìn)行識別 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 ;比較數(shù)據(jù)碼和數(shù)據(jù)反碼是否正確? CPL A XRL A,1DH ;將1CH的值取反后和1DH比較 不同則無效丟棄,核對數(shù)據(jù)是否準(zhǔn)確 JNZ EXIT ;如果不相等說明解碼失敗退出解碼程序 LCALL YS3 CLR P2.6 ;選中數(shù)碼管 CLR P3.3 ;解碼成功喇叭響? AJMP BIJIAO ;判斷在118毫秒內(nèi)是否有連發(fā)碼 AA: MOV R1,#25 XX: ACALL YS2 JNB P3.7,HH ;跳轉(zhuǎn)到判斷連發(fā)代碼是否正確的程序段 DJNZ R1,XX EXIT: ;對所有端口清零
AJMP START ;連發(fā)碼判斷程序段----------- HH: MOV R6,#4 S: ACALL YS1 ;調(diào)用882微秒延時(shí)子程序 JB P3.7,EXIT ;延時(shí)882微秒后判斷P3.7腳是否出現(xiàn)高電平如果有就退出解碼程序 DJNZ R6, S ;重復(fù)4次,目的是確認(rèn)連發(fā)碼的低電平信號波形 JNB P3.7, $ ;等待高電? LCALL YS3 AJMP AA
BIJIAO: MOV R0,#18 ;一共18個(gè)按鍵 MOV DPTR,#TAB_REM ;遙控鍵值查表 LOOKUP_1: MOV A,R0 ;查表偏移量 MOVC A,@A+DPTR XRL A,1cH ;比較鍵值 JZ REM_BAK0 ;相等轉(zhuǎn)移 DJNZ R0,LOOKUP_1 ;直到18個(gè)健比較完畢 JMP EXIT ;都不對退出 REM_BAK0: ;鍵值處理 MOV A,R0 ;R0 MOV R1,A ; SUBB A,#9 ;如果大于9則反轉(zhuǎn)并將值減去9 JC REM_BAK1 ;小余或等于9到正轉(zhuǎn) INC A ;加1 MOV R1,A ; 查顯示碼表 MOV DPTR,#TABLE1 ; MOVC A,@A+DPTR MOV P0,A ;送顯示 CLR P2.6 ;開顯示
REM_REV: ;反轉(zhuǎn)程序 CALL REV CALL delay ;轉(zhuǎn)速 DJNZ R1,REM_REV ;轉(zhuǎn)動的步數(shù)到了停止 JMP AA REM_BAK1: ;正轉(zhuǎn)程序 NOP MOV A,R1 ;按鍵數(shù)值判斷執(zhí) MOV DPTR,#TABLE1 ; 查顯示碼表 MOVC A,@A+DPTR MOV P0,A ;送顯示 CLR P2.6 ;開顯示
REM_FOR: ;正轉(zhuǎn) CALL FOR CALL DELAY DJNZ R1,REM_FOR JMP AA for: MOV r0,#00h ;正轉(zhuǎn)到tab取碼指針初值 for1:MOV a,r0 ;取碼 MOV dptr,#table ; MOVc a,@a+dptr jz FOREXT ;是否到了結(jié)束碼00h cpl a ;把a(bǔ)cc反向 MOV p1,a ;輸出到p1開始正轉(zhuǎn) call delay ;轉(zhuǎn)動的速度 inc r0 ;取下一個(gè)碼 jmp for1 ;繼續(xù)正轉(zhuǎn) rev:MOV r0,#05h ;反轉(zhuǎn)到tab取碼指針初值 rev1:MOV a,r0 MOV dptr,#table ;取碼 MOVc a,@a+table jz FOREXT ;是否到了結(jié)束碼00h cpl a ;把a(bǔ)cc反向 MOV p1,a ;輸出到p1開始反轉(zhuǎn) call delay ;轉(zhuǎn)動的速度 inc r0 ;取下一個(gè)碼 jmp rev1 ;繼續(xù)反轉(zhuǎn) FOREXT: RET
YS1: MOV R4,#20 ;延時(shí)子程序1,精確延時(shí)882微秒 D1: MOV R5,#20 DJNZ R5,$ DJNZ R4,D1 RET YS2: MOV R4,#10 ;延時(shí)子程序2,精確延時(shí)4740微秒 D2: MOV R5,#235 DJNZ R5,$ DJNZ R4,D2 RET YS3: MOV R4,#2 ;延時(shí)程序3,精確延時(shí)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 ;步進(jìn)電機(jī)的轉(zhuǎn)速20ms m3: MOV r2,#248 djnz r2,$ djnz r3,m3 ret TABLE1:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h;數(shù)碼管的碼表 ;0 1 2 3 4 5 6 7 8 9 table: db 03h,09h,0ch,06h ;正轉(zhuǎn)表 db 00 ;正轉(zhuǎn)結(jié)束 db 03h,06h,0ch,09h ;反轉(zhuǎn) db 00 ;反轉(zhuǎn)結(jié)束 end
| |