?? 11紅外遙控讀碼器-定時中斷數碼管顯示加遙控.asm
字號:
;=================================================
; 紅外遙控讀碼器-定時中斷數碼管顯示加遙控
;=================================================
; 可用來測試常用家電遙控器的碼
;=================================================
;
; zsMCU51實驗板配套學習例程
;
; 中山單片機學習網 智佳科技
;
; 作者:逸風 QQ:105558851
;
; http://www.zsmcu.com
; E-mail:info@zsmcu.com
;=================================================
LED1 EQU 10H
LED2 EQU 11H
LED3 EQU 12H
LED4 EQU 13H
LED5 EQU 14H
LED6 EQU 15H
LED7 EQU 16H
LED8 EQU 17H
LED9 EQU 18H
LED10 EQU 19H
IrDataA EQU 1AH
IrDataB EQU 1BH
IrDataC EQU 1CH
IrDataD EQU 1DH
LedT0 EQU 1EH
LedJS EQU 1FH
ORG 0000H
LJMP START;轉入主程序
ORG 000BH ;定時器0中斷入口
INT_TO:
PUSH ACC
PUSH PSW
SETB RS0
CLR TF0 ;清定時0中斷標?
MOV TH0,#0F6H ;2.5MS
MOV TL0,#03DH ;
INC LedJS
MOV A,LedJS
CJNE A,#200,INT_TO_JS ;500MS
MOV LedJS,#00H
MOV R0,#LED1
MOV R1,#9
INT_T0_DDD:
INC R0
MOV A,@R0
DEC R0
XCH A,@R0
INC R0
MOV @R0,A
DJNZ R1,INT_T0_DDD
INT_TO_JS:
MOV A,#11110000B ;關數碼管
ORL P2,A
MOV A,LedT0
CJNE A,#0,INT_T0_1
MOV A,LED1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV LedT0,#1
LJMP INT_T0_END
INT_T0_1:
MOV A,LedT0
CJNE A,#1,INT_T0_2
MOV A,LED2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
MOV LedT0,#2
LJMP INT_T0_END
INT_T0_2:
MOV A,LedT0
CJNE A,#2,INT_T0_3
MOV A,LED3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV LedT0,#3
LJMP INT_T0_END
INT_T0_3:
MOV A,LED4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV LedT0,#0
LJMP INT_T0_END
INT_T0_END:
POP PSW
POP ACC
RETI
START:
MOV SP,#60H
MOV TMOD,#01H ;設定T0為十六位定時模式。
MOV TH0,#0F6H ;2MS
MOV TL0,#03DH ;
SETB TR0 ;開定時器0
SETB ET0 ;致能定時0中斷
CLR TF0 ;清定時0中斷標志
SETB EA ;開總中斷
MOV LedT0,#00H
MOV LedJS,#00H
MOV DPTR,#TABLE
MOV LED1,#0EH
MOV LED2,#0EH
MOV LED3,#5H
MOV LED4,#1H
MOV LED5,#10H
MOV LED6,#08H
MOV LED7,#08H
MOV LED8,#08H
MOV LED9,#08H
MOV LED10,#11H
MAIN:
JNB P2.2,IR
LJMP MAIN
;以下為進入P3.2腳外部中斷子程序,也就是解碼程序
IR:
MOV R6,#9
SB:
ACALL DELAY882 ;調用882微秒延時子程序
JB P2.2,EXIT ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序
DJNZ R6, SB ;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
;以上完成對遙控信號的9000微秒的初始低電平信號的識別。
JNB P2.2, $ ;等待高電平避開9毫秒低電平引導脈沖
ACALL DELAY2400
JNB P2.2,IR_Rp ;
ACALL DELAY2400 ;延時4.74毫秒避開4.5毫秒的結果碼
MOV R1,#IrDataA ;設定1AH為起始RAM區
MOV R2,#4
PP:
MOV R3,#8
JJJJ:
JNB P2.2,$ ;等待地址碼第一位的高電平信號
LCALL DELAY882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P2.2 ;將P3.2引腳此時的電平狀態0或1存入C中
JNC UUU ;如果為0就跳轉到UUU
LCALL DELAY1000
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的RA中
CLR P2.3 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
SETB P2.3;蜂鳴器停止
MOV A,IrDataA
ANL A,#11110000B
SWAP A
MOV LED1,A
MOV A,IrDataA
ANL A,#00001111B
MOV LED2,A
MOV A,IrDataB
ANL A,#11110000B
SWAP A
MOV LED3,A
MOV A,IrDataB
ANL A,#00001111B
MOV LED4,A
MOV A,IrDataC
ANL A,#11110000B
SWAP A
MOV LED6,A
MOV A,IrDataC
ANL A,#00001111B
MOV LED7,A
MOV A,IrDataD
ANL A,#11110000B
SWAP A
MOV LED8,A
MOV A,IrDataD
ANL A,#00001111B
MOV LED9,A
MOV LED5,#10H
MOV LED10,#11H
MOV LedJS,#201
LJMP MAIN
IR_Rp:
LJMP MAIN
EXIT:
LJMP MAIN ;退出解碼子程序
;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
TABLE:
DB 00101000B ;0
DB 11101011B ;1
DB 00110010B ;2
DB 10100010B ;3
DB 11100001B ;4
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
DB 00110100B ;E
DB 01110100B ;F
DB 11110111B ;-
DB 11111111B ;
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -