/***************************程序功能說明******************************
掃描方式,讀取紅外遙控器鍵值,并把獲得的鍵值顯示于8個LED,同時蜂鳴器響.
當所按鍵是0~9時,1個七段顯示器顯示對應的數字。液晶屏顯示相應的數字
當所按鍵是1~8時,蜂鳴器發出音調1、2、3、4、5、6、7、i。
按下CH+時,8個LED呈跑馬燈閃爍三個循環。
當所按鍵是0時,播放音樂1
當所按鍵是9時,播放音樂2
******************************************************************/
ORG 0000H
LJMP MAIN
ORG 30H
MAIN:
JNB P3.2,IR ;遙控掃描
LJMP MAIN ;在正常無遙控信號時,一體化紅外接收頭輸出是高電平,程序一直在循環。
;=================================================
; 解碼程序
IR:
;以下對遙控信號的9000微秒的初始低電平信號的識別
MOV R6,#10
IR_SB:
ACALL DELAY882 ;調用882微秒延時子程序
JB P3.2,IR_ERROR ;延時882微秒后判斷P2.2腳是否出現高電平如果有就退出解碼程序
DJNZ R6,IR_SB ;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序
;識別連發碼,和跳過4.5ma的高電平。
JNB P3.2, $ ;等待高電平避開9毫秒低電平引導脈沖
ACALL DELAY2400
JNB P3.2,IR_Rp ;這里為低電平,認為是連發碼信號。
ACALL DELAY2400 ;延時4.74毫秒避開4.5毫秒的結果碼
;以下32數據碼的讀取 ,0和1的識別
MOV R1,#1AH ;設定1AH為起始RAM區
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P3.2,$ ;等待地址碼第一位的高電平信號
LCALL DELAY882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態
MOV C,P3.2 ;將P2.2引腳此時的電平狀態0或1存入C中
JNC IR_8BIT_0 ;如果為0就跳轉到IR_8BIT_0
LCALL DELAY1000
IR_8BIT_0:
MOV A,@R1 ;將R1中地址的給A
RRC A ;將C中的值0或1移入A中的最低位
MOV @R1,A ;將A中的數暫時存放在R1中
DJNZ R3,IR_8BIT ;接收地址碼的高8位
INC R1 ;對R1中的值加1,換下一個RAM
DJNZ R2,IR_4BYTE ;接收完16位地址碼和8位數據碼和8位數據,
;存放在1AH/1BH/1CH/1DH的RAM中
;解碼成功
JMP IR_GOTO
IR_Rp:
;這里為重復碼執行處
;按住遙控按鍵時,每過108ms就到這里來
JMP IR_GOTO
IR_ERROR:
;錯語退出
LJMP MAIN ;退出解碼子程序
;=================================================
;遙控執行部份
IR_GOTO:
;判斷兩個數據碼是否相反
MOV A,1CH
CPL A
CJNE A,1DH,IR_ERROR ;兩個數據碼不相反則退出
MOV P1,1DH ;將按鍵的鍵值通過P1口的8個LED顯示出來!
CLR P2.4 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功
LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
SETB P2.4 ;蜂鳴器停止
LCALL JZPD
;清除遙控值使連按失效
MOV 1AH,#00H
MOV 1BH,#00H
MOV 1CH,#00H
MOV 1DH,#00H
LJMP MAIN
;=================================================
;鍵值判斷
JZPD: MOV A,1DH
IRD0: CJNE A,#0E9H,IRD1 ;按鍵"0"判斷顯示,若為"0"則繼續執行程序,不為零則繼續判斷是否為"1"
MOV R3,#200
MAIN0:MOV TMOD,#01H ;初始化,工作方式1
MOV TL0,#21H ;寫入計數初值
MOV TH0,#0F9H
SETB TR0 ;啟動計數
WAIT0:JNB TF0,WAIT0
CLR TF0
CLR P2.1
;數碼管顯示0
MOV A,#0C0H
MOV P0,A
DJNZ R3,MAIN0
LJMP MUSTART1 ;跳轉到音樂1的執行程序
RET
IRD1: CJNE A,#0F3H,IRD2 ;按鍵"1"判斷顯示
MOV R3,#200
MAIN01:MOV TMOD,#01H ;初始化,工作方式1
MOV TL0,#0E1H ;寫入計數初值
MOV TH0,#0F9H
SETB TR0 ;啟動計數
WAIT1:JNB TF0,WAIT1
CLR TF0
CPL P2.4 ;蜂鳴器響
CLR P2.0 ;數碼管顯示1
CLR P1.0;
MOV A,#0F9H
MOV P0,A
DJNZ R3,MAIN01
LCALL DELAY2400
CPL P1.0;
CPL P2.0
RET
IRD2: CJNE A,#0E7H,IRD3 ;按鍵"2"判斷顯示
MOV R3,#200
MAIN02:MOV TMOD,#01H
MOV TL0,#021H ;寫入計數初值
MOV TH0,#0F9H
SETB TR0
WAIT2:JNB TF0,WAIT2
CLR TF0
CPL P2.4 ;蜂鳴器響
CLR P2.1 ;數碼管顯示2
CLR P1.1;
MOV A,#0A4H
MOV P0,A
DJNZ R3,MAIN02
LCALL DELAY2400
CPL P1.1;
CPL P2.1;
RET
IRD3: CJNE A,#0A1H,IRD4 ;按鍵"3"判斷顯示
MOV R3,#200
MAIN03:MOV TMOD,#01H
MOV TL0,#08CH
MOV TH0,#0FAH
SETB TR0
WAIT3:JNB TF0,WAIT3
CLR TF0
CPL P2.4
CLR P2.2
CLR P1.2;
MOV A,#0B0H
MOV P0,A
DJNZ R3,MAIN03
LCALL DELAY2400
CPL P1.2
CPL P2.2
RET
IRD4: CJNE A,#0F7H,IRD5 ;按鍵"4"判斷顯示
MOV R3,#200
MAIN04:MOV TMOD,#01H
MOV TL0,#0D8H
MOV TH0,#0FAH
SETB TR0
WAIT4:JNB TF0,WAIT4
CLR TF0
CPL P2.4
CLR P2.3
CLR P1.3
MOV A,#099H
MOV P0,A
DJNZ R3,MAIN04
LCALL DELAY2400
CPL P1.3;
CPL P2.3
RET
IRD5: CJNE A,#0E3H,IRD6 ;按鍵"5"判斷顯示
MOV R3,#200
MAIN05:MOV TMOD,#01H
MOV TL0,#068H
MOV TH0,#0FBH
SETB TR0
WAIT5:JNB TF0,WAIT5
CLR TF0
CPL P2.4
CLR P2.1
CLR P1.4
MOV A,#092H
MOV P0,A
DJNZ R3,MAIN05
LCALL DELAY2400
CPL P1.4;
RET
IRD6: CJNE A,#0A5H,IRD7 ;按鍵"6"判斷顯示
MOV R3,#200
MAIN06:MOV TMOD,#01H
MOV TL0,#0E9H
MOV TH0,#0FBH
SETB TR0
WAIT6:JNB TF0,WAIT6
CLR TF0
CPL P2.4
CLR P2.1
CLR P1.5
MOV A,#082H
MOV P0,A
DJNZ R3,MAIN06
LCALL DELAY2400
CPL P1.5;
RET
IRD7: CJNE A,#0BDH,IRD8 ;按鍵"7"判斷顯示
MOV R3,#200
MAIN07:MOV TMOD,#01H
MOV TL0,#05BH
MOV TH0,#0FCH
SETB TR0
WAIT7:JNB TF0,WAIT7
CLR TF0
CPL P2.4
CLR P2.1
CLR P1.6
MOV A,#0F8H
MOV P0,A
DJNZ R3,MAIN07
LCALL DELAY2400
CPL P1.6;
RET
IRD8: CJNE A,#0ADH,IRD9 ;按鍵"8"判斷顯示
MOV R3,#200
MAIN08:MOV TMOD,#01H
MOV TL0,#08FH
MOV TH0,#0FCH
SETB TR0
WAIT8:JNB TF0,WAIT8
CLR TF0
CPL P2.4
CLR P2.1
CLR P1.7
MOV A,#080H
MOV P0,A
DJNZ R3,MAIN08
LCALL DELAY2400
CPL P1.7;
RET
IRD9: CJNE A,#0B5H,IRDp ;按鍵"9"判斷顯示
MOV R3,#200
MAIN09:MOV TMOD,#01H ;初始化,工作方式1
MOV TL0,#21H ;寫入計數初值
MOV TH0,#0F9H
SETB TR0 ;啟動計數
WAIT9:JNB TF0,WAIT9
CLR TF0
CLR P2.1 ;數碼管顯示9
CLR P1.0
CLR P1.1
CLR P1.2
CLR P1.3
CLR P1.4
CLR P1.5
CLR P1.6
CLR P1.7
MOV A,#090H
MOV P0,A
DJNZ R3,MAIN09
LJMP MUSTART2 ;跳轉到音樂2的執行程序
RET
IRDp: CJNE A,#0B8H,IRDEND ;按鍵"PLAY"判斷顯示
MOV A,#0FEH ;給A賦值成11111110
MOV R0,#24
LOOP:MOV P1,A ;點亮LED1
MOV R3,#150
MAIN10:MOV TMOD,#01H ;初始化,工作方式1
MOV TL0,#21H ;寫入計數初值
MOV TH0,#0F9H
SETB TR0 ;啟動計數
WAIT10:JNB TF0,WAIT10
CLR TF0
DJNZ R3,MAIN10
RL A ;A的值循環左移一位
DJNZ R0,LOOP
MOV 1AH,#00H
MOV 1BH,#00H
MOV 1CH,#00H
MOV 1DH,#00H
LJMP MAIN
IRDEND:RET
;=================================================
; 延時子程序
;=============================882
;1.085x ((202x4)+5)=882
DELAY882:
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
;1.085x ((229x4)+5)=999.285
DELAY1000:
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
;1.085x ((245x9)+5)=2397.85
DELAY2400:
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
;=================================================
; 延時子程序TAO
;=============================882
;1.085x ((202x4)+5)=882
MUSTART1: ;歌曲1的播放程序
MOV R0,#00H ;節拍表指針置零
MOV R1,#00H ;音符表指針置零
RTAB:MOV A,R0
MOV DPTR,#RYTH
MOVC A,@A+DPTR ;查表法將一個節拍數據取出放R2計數器中
MOV R2,A
TTAB:MOV A,R1
MOV DPTR,#TONE
MOVC A,@A+DPTR
MOV R3,A ;取出音符表高8位
INC R1 ;指針加1
MOV A,R1
MOV DPTR,#TONE
MOVC A,@A+DPTR
MOV R4,A ;取出低8位
SETB P2.4 ;輸出相應音調的方波
LOOP1:MOV R5,#3BH
BBB:MOV TMOD,#01H
MOV TL0,R4
MOV TH0,R3
SETB TR0
WAIT:JNB TF0,WAIT
CLR TF0
CPL P2.4
RA: DJNZ R5,BBB ;無打斷則繼續放第一首歌
DJNZ R2,LOOP1
INC R0 ;兩個表的指針都加1
INC R1
CJNE R1,#88,RTAB ;判斷是否取完
LJMP IRD0
TONE:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
RYTH:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04
MUSTART2: ;歌曲2的播放程序
MOV R0,#00H ;節拍表指針置0
MOV R1,#00H ;音符表指針置0
RTAB2:
MOV A,R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV R2,A
TTAB2: MOV A,R1
MOV DPTR,#TONE2
MOVC A,@A+DPTR
MOV R3,A
INC R1
MOV A,R1
MOV DPTR,#TONE2
MOVC A,@A+DPTR
MOV R4,A
SETB P2.4
LOOP2: MOV R5,#9BH
MAIN2:
MOV TMOD,#01H
MOV TL0,R4
MOV TH0,R3
SETB TR0
WAITR:JNB TF0,WAITR
CLR TF0
CPL P2.4
RB: DJNZ R5,MAIN2
DJNZ R2,LOOP2
INC R0
INC R1
CJNE R1,#64,RTAB2
LJMP IRD9
TONE2:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
TABLE1:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04
END
|