/*----------------------------------------------------------------------------------
==================================
基于 51 单片机的红外高级电子琴
==================================
******************************程序功能说明*******************************************
通过扫描方式读取红外遥控器按键值,根据按键值让蜂鸣器播放 1234567i 相应的音调,并在数码管
第四位和 8 个 LED 灯上显示相应的音调值。同时,可以通过红外遥控器让蜂鸣器播放出一首预置
的歌曲。
*************************************************************************************/
ORG 0000H
LJMP KEYP0
KEYP0:
MOV R1,#00H ;给寄存器 1 存储地址值
CLR TR0 ;清除定时器 0 的运行控制位
SETB P2.4 ;关闭蜂鸣器
SETB P2.3 ;关闭数码管第四位
INPSCAN:
JNB P3.2,IR ;遥控扫描,等待 P3.2 引脚红外传感器接收到的低电平
LJMP INPSCAN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环
;===================
; 红外解码程序
;===================
IR: ;以下对遥控信号 9ms 的初始低电平起始码的识别
MOV R6,#10
IR_SB:ACALL DELAY882 ;调用 0.882ms 延时子程序
JB P3.2,IR_ERROR ;P3.2 脚出现高电平则退出解码程序
DJNZ R6,IR_SB ;重复 10 次,检测 8.82ms 内如果出现高电平就退出解码程序
;识别连发码,和跳过 4.5ms 的高电平
JNB P3.2,$ ;等待高电平,避开 9ms 的低电平起始脉冲
ACALL DELAY2400 ;延时 2.4ms
JNB P3.2,IR_Rp ;此时为低电平,则认为是连发码
ACALL DELAY2400 ;避开 4.5ms 的结果码
;以下 32 数据码的读取,0 和 1 的识别
MOV R0,#1AH ;设定 1AH 为起始 RAM 区
MOV R4,#4
IR_4BYTE:
MOV R5,#8
IR_8BIT:
JNB P3.2,$ ;等待地址码第一位的高电平信号
LCALL DELAY882 ;高电平开始后用 0.882ms 的时间去判断信号此时的高低电平状态
MOV C,P3.2 ;将 P3.2 引脚此时的电平状态 0 或 1 存入 C 中