电视遥控器的单片机译码程序
《电子报》2000年第50期第十三版《彩电红外遥控器在仪表中的应用》一文,介绍了使用M50462AP的遥控器的工作原理和应用。笔者也曾将此遥控器用于电子日历和银行利率屏等,今把遥控器的译码介绍给读者,供参考。 笔者使用众合牌H-106A型彩电遥控器(熊猫牌、SR5417型电视遥控器均可),并为遥控器定做了PVC贴模,将遥控器上的文字改成电子日历、利率屏中的功能键。上述遥控器使用的都是M50462AP或它的可互换集成电路,其C4、C5脚悬空,发送的前8位识别码,固定为11100010(E2H),后8位是键功能操作码。 遥控器发送的编码顺序,笔者认为是按D7~D0顺序发送出的*。例如:数字4的操作码是00011000,串行发出的完整指令代码依次是11100010 00011000(E218H)。 这一点和某些资料介绍的不同,但无关紧要,比如识别码E2,我们是把8位码依次左移;如果把8位码依次右移,识别码就变成了47H,相当于按D0~D7的顺序发送了。 CPU的型号为AT89C51,红外接收器外形和接收电路如图1所示。接收头的输出接89C51的INT1。 按一次电视遥控器,一般要发送几组代码,传送一组指令码的时间是44ms。键一按下,传送指令码按44ms的重复周期持续发送,直至手松开为止。笔者在89C51的RAM区开辟了6个字节的数据缓冲区(2AH~2FH),存储48位脉冲数据(如图2所示),以便找到两组相同的16位数据。 在主程序中设INT1为负跳变触发。定时器T1工作在方式2,中断禁止。用6MHz晶振时机器周期为2μs。脉冲宽度为1ms的代码0和脉冲宽度为2ms的代码1的计数值△T0和△T1分别为 :△T0=1ms/2μs=500=1FAH,△T1=2ms/2μs=1000=03E8H 在INT1中断服务程序中,读T1的计数值,计数值等于△T0计为0,计数值等于△T1计为1,同时将TH1、TL1清0。存储的位置从2AH的最高位开始,直至2FH的最低位(存满48位)为止。 因为遥控器、单片机频率误差、T0计数误差等原因,△T0、△T1很难保证正好等于算式中的值。为此,给“0”、“1”读数规定了0.1ms的误差范围,对应的计数值是32H,即:“0”的范围为:01F4H±32H=01C2H~0226H,“1”的范围为:03E8H±32H=03B6H~041AH。 范围选大了,抗阳光的干扰性能差,特别是下午的阳光容易造成误动作;范围选小了,又很不容易接收到信号。对于不同厂家的遥控器,因其所用的陶瓷振子不同,基准频率的差异,范围也略有不同。经过一段时间的实验,确定“0”的范围为△T0-~△T0+=0190H~0200H;“1”的范围为△T1-~△T1+=0390H~0400H。 中断服务程序中判断数据是“0”还是“1”的程序框图如图3所示。将TH1、TL1中的数据K送R2、R3,调用子程序判断K的大小。K值在△T0-~△T0之间计为“0”,K值在△T1-~△T1+之间计为“1”,将判断结果送到暂存字节U0_X1。暂存字节够8位后送入数据缓冲区,计数值够48位后判断键值。 当(2AH)=(2CH)=OE2H,且(2BH)=(2DH)时,2BH中的内容即是键值。否则,就将2AH~2FH中的内容带进位位左移一位后,再判是否满足上述条件。满足,则2BH中的内容为键值,不满足再左移、判断。若左移16次仍不满足条件,则判数据无效。若数据有效,将键值送键值存储单元NO_M(1EH),主程序按键定义转相应的处理程序,并向1EH送无效码FFH。 遥控器的调试 1. 键值的确定 不同厂家的遥控器对应的键值编码有些不同。调试时可以在本文程序标号为“X1S_0”处设断点,读取NU_M单元的数值,即键值。当然,前提是硬件要先调试好。也可以使用稳定性较好的示波器,当接收头收到信号时仔细观察接收头输出的波形,每两个负脉冲之间距离长的为1,距离短的为0,然后根据二进制码去判断键值。 2. 遥控器接收头的引脚 接收头外形多数如图1所示。如果对引脚接线还有怀疑,可以用《电子报》2000年第48期第十一版《速判红外接收头引脚的方法》一文进行判断。 目前市面上还有一种接收头外形如图4所示,厚度只有几毫米,类似7805,面对遥控器开孔一面时,从左向右数,引脚依次为GND、+5V、OUT。此遥控器较便宜,但质量不如图1所示的遥控器。 3. 其他 有的红外接收头的GND脚未接外壳,使用时应将GND脚接外壳,以增强抗干扰能力。用示波器可以很清楚地看到,GND脚未接外壳时,不按遥控器,接收头也有许多杂波。 在单片机控制的电子日历和利率屏中,用上述遥控器修改数据,取得了较好效果。
编者注:由于篇幅关系,遥控译码部分的程序清单无法刊出,需要的读者可发E-mail到《电子报》单片机公共实验室(sys@netdzb)免费索取。
|