/***************************程序功能说明******************************
扫描方式,读取红外遥控器键值,并把获得的键值显示于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
|