1、武汉三维电子网络学院 作者 杨荣国 唐精明第 1 页 共 10 页单片机定时器-遥控器解码程序分析武汉三维电子工作室 杨荣国 唐精明 2010 年 12 月 6日一、前言利用 STC 公司 1T 内核的 STC12C08S2 单片机对一款遥控器进行解码,将解码的数据转换为以 us 为单位的时间通过单片机串口通讯发送到 STC 下载软件自带的串口调试工具接收框进行显示。本文主要对测试结果进行展示与分析并对单片机控制程序进行分析,以此起到抛砖引玉的作用,希望读者理解程序以后可以利用单片机对身边的任意一款遥控器进行解码并将遥控器与单片机的实际应用联系在一起。二、测试结果展示1、实验材料介绍实验材料硬
2、件部分 软件部分 为 KEIL V2 编程软件 和 单片机程序下载软件STC_ISP_V479为了高效率学习程序编写,本实验平台采用三维电子 SFC51-V3。控制芯片为 武汉三维电子网络学院 作者 杨荣国 唐精明第 2 页 共 10 页STC12C08S2,红外通讯传感器为 VS1838 与单片机的 P3.2 引脚连接。程序下载器采用三维电子程序下载及串口通讯模块 SFCSTC-USB-V1。遥控器采用如上图(对于 NEC 标准的遥控器都适用,比如电视遥控器等) 。2、遥控器按下数字 1,PC 所接收的数据码显示的数据:数字 1: 02456 00206 00205 00202 00204
3、00207 00202 00206 00206 00407 00408 00412 00407 00408 00412 00407 00408 00206 00206 00407 00408 00206 00205 00203 00204 00409 00411 00202 00204 00410 00410 00407 004103、遥控器按下数字 2,PC 所接收的数据码数字 2:2456 00206 00200 00206 00206 00202 00205 00206 00202 00412 00407 00410 00410 00407 00408 00412 00407 00206
4、 00205 00202 00410 00410 00203 00204 00205 00408 00409 00410 00205 00202 00408 00412 004074、遥控器按下数字 3,PC 所接收的数据码武汉三维电子网络学院 作者 杨荣国 唐精明第 3 页 共 10 页数字 3:02457 00206 00198 00208 00206 00198 00209 00206 00200 00413 00407 00406 00414 00407 00405 00415 00408 00206 00410 00405 00417 00407 00206 00407 00206
5、00408 00206 00200 00208 00208 00407 00206 00408三、测试数据分析下载程序在硬件电路正常的情况下,遥控器按下数字 1,PC 机可以接收到以下数据数字1: 02456 00206 00205 00202 00204 00207 00202 00206 00206 00407 00408 00412 00407 00408 00412 00407 00408 00206 00206 00407 00408 00206 00205 00203 00204 00409 00411 00202 00204 00410 00410 00407 00410那这些数
6、据代表什么意思呢?单片机向 PC 机每发送一次都是 5 位数据,这 5 位数据是单片机内部定时器以 5us 循环一次对 temp 变量从 0 开始自加所得到的数据。也就是说这些数据可以理解为一个时间值,这个时间值就是遥控器每个数据码高电平和低电平所持续时间的值。从数据可以看出每个按键按下去 PC 机都接收到 33 个数据,这 33 个数据仔细观察可以发现都有以下规律:第一个数据 在 2456 和 2460 之间。第二个数据到第九个数据 在 200 和 210 之间。第十个数据到第十八个数据 在 400 和 410 之间。第十九个数据到第三十二个数据在 200 和 210 之间和在 400 和
7、410 之间都有。继续分析:如果将在 2456 和 2460 之间的数据定义为字符h ,将在 200 和 210 之间的数据定义为字符0 ,将在 400 和 410 之间的数据定义为字符1 。那么以上 33 个数据可以表达为:h 1111 1111 0000 0000 0011 0000 1100 1111 那么这个数据就是按键 1 按下的用 0和 1 来表示的编码。相同道理可以推测出数字 2 和数字 3 用 0 和 1 来表示的编码如下:数字 2 : h 0000 0000 1111 1111 0001 1000 1110 0111数字 3 : h 0000 0000 1111 1111 0
8、111 1010 1000 0101好了,到了这里我们可以下结论了,因为已经有了 3 个对比。我们的结论是:如上图的遥控器编码原理为每个按键都有 33 个编码其中第一个编码都相同武汉三维电子网络学院 作者 杨荣国 唐精明第 4 页 共 10 页时间比较长,接着 16 编码分别可以用我们所定义的 0 和 1 表示即前八个为 0 后八个为 1。其实这个我们可以理解为遥控器的地址编码,就好比电话号码的区号一样的,浙江衢州的区号是 0570 而武汉的区号是 027,在本区域里的所有的座机号码都是以这个开头固定不变的。接着再仔细观察可以发现原来后面 16 个数据码也是有规律的,那就是前 8 个和后 8
9、个是相互取反的的编码。好了,更多的思维留个大家希望大家下载程序以后可以得出我以上的结论,哈哈,这也是学习单片机的趣味所在哦。因为我将分享的程序涵盖了单片机外部中断、内部定时器、串口通讯的三个结构的应用。四、红外遥控器编码及解码原理介绍1、遥控器编码原理遥控发射器专用芯片很多,根据编码格式可以分成两大类:NEC 码和 RC5 码,本课程以运用比较广泛,解码比较容易的日本 NEC 为例说明编码原理(遥控专用 IC HT6221 编码方式也采用 NEC 码)。NEC 码产生的遥控编码是连续的 32 位二进制码组,其中前 16 位为用户识别码,能区别不同的电器在设备,防止不同机种遥控码互相干扰。后 1
10、6 位为 8 位功能码及其反码。NEC 数据帧格式:当一个键按下超过 36ms,振荡器使芯片激活,将发射一组 108ms 的编码脉冲,这 108ms发射代码由一个起始码(9ms 的高电平),一个结果码(4.5ms 低电平),低 8 位地址码(918ms),高 8 位地址码( 918ms),8 位数据码(918ms)和这 8 位数据码的反码(918ms)组成。其中地址码和数据码有 “0”编码和“ 1”编码组成。在 NEC 编码格式中“0”,“1”的表示方法(脉宽调制)如下: 0.56ms1.25ms0.56ms遥 控 发 射 码 “0”0 . 5 6 5 m s2 . 2 5 m s1 . 6
11、8 5 m s遥控发射码 “ 1 ”武汉三维电子网络学院 作者 杨荣国 唐精明第 5 页 共 10 页起始码 ( 9 m s )结果码 ( 4 . 5 m s )前导电平信号从上图可以看出遥控发射码“0”由持续 0.565ms 的高电平和 0.56ms 的低电平组成,遥控发射码“1”由持续 0.565ms 的高电平和 1.685ms 的低电平组成,前导码由 9ms 的高电平和4.5ms 的低电平组成。每个按键按下先发一个前导码,接着持续发 32 个有“0”和“1”组成的地址码和数据码。高电平代表有红外线,低电平代表无红外线,对于遥控发射码“0”表示红外发光二极管发射红外线 0.565ms,停止
12、发射 0.56ms。如果遥控器要对外发射 01 两位数据,红外二极管的工作流程是,先发红外线持续 9ms 接着停止发射红外线 4.5ms,表示发射前导码。接着发红外线持续 0.565ms 接着停止发射红外线 0.56ms,表示发射码“0” 。接着发红外线持续 0.565ms 接着停止发射红外线 1.685ms,表示发射码“1” 。如下图:为降低功耗提高发射效率,红外二极管发射红外线时并不是一直工作的,而是按 38KHZ的脉冲进行调制工作的。也就说说红外线在工作的时候是按 38KHZ 的频率在闪烁,而不是一直亮。2、遥控器解码原理红外线遥控信号的接收,可以使用一种集红外线接收和放大于一体的 VS
13、183B 来接收,不需要任何外接元件,就能完成从红外线接收到输出与 TTL 电平信号的所有工作。VS183B实物图如下:器件对外只有三个引脚,从左到右分别是 OUT GND VCC,工作电压为 2.7V5V, VCC接 5V 电源正极,GND 接电源负极,OUT 引脚为信号输出引脚,可以输出 TLL 的高电平和低电平信号。VS183B 在空闲时输出高电平信号,在接收到 38KHZ 红外信号时输出低电平,根据这个特性可得出以下结论。如果遥控器发射 01 两位数据,VS183B 接收到遥控信号以后将输出持续 9ms 的低电平和4.5ms 的高电平表示接收到前导码,接着输出 0.565ms 的低电平
14、和 0.56ms 的高电平表示接收到“0”发射码,接着输出 0.565ms 的低电平和 1.685ms 的高电平表示接收到“1”发射码。3、单片机解码编程将 VS1838B 的输出引脚与单片机外部中断 0 引脚相连,每个被解出来的码都是以低电平开武汉三维电子网络学院 作者 杨荣国 唐精明第 6 页 共 10 页始紧接着是高电平,第二个码也同样以低电平开始紧接着高电平,启动单片机外部中断并设置为脉冲触发方式可以精确的捕获到每个码开始瞬间,这个时候启动定时器中断,等待一个低电平和一个高电平结束并关闭定时中断。通过查看定时中断的次数可以计算出对应编码的执行时间从而推算出相应的编码。五、程序分享1、将
15、每个遥控按键对应的 32 个码的延时时间发送到串口显示/*测试原理:在测试方案_01 的结论上,记录一组红外信号 33 位中各编码持续时间测试结果:前导码:约 2457,持续时间为 2457 * 0.005 = 12.285ms (NEC 标准为 13.5)编码 0:约 206, 持续时间为 206 * 0.005 = 1.03ms (NEC 标准为 1.125)编码 1:约 408, 持续时间为 408 * 0.005 = 2.04ms (NEC 标准为 2.25)*/#include sbit IR = P32; / 红外信号感应引脚unsigned int time;unsigned i
16、nt dat33 = 0 ;bit flag = 0;void Send( void ) /将 32 位数据对应的时间发送到 PC 上显示char i;for(i = 0;i sbit Ir = P32; 武汉三维电子网络学院 作者 杨荣国 唐精明第 8 页 共 10 页unsigned char temp = 0,x = 0,ch=0;char DAT14= 0 ;void init( ) /中断初始化IE = 0x83; /启动中断总开关 外部中断 0 定时中断 0IT0 = 1; /外部中断 0 下降沿触发SCON = 0x40; /串口工作方式 1TMOD = 0x22; /定时器 0
17、、1 方式 2 TH1 = TL1 = 0xfd;/ 定时器 1,用于串口通讯TR1 = 1;TH0 = TL0 = 0x47;/ 定时器 0,用于延时计算IP = 0x02; /设置定时器 0 的中断优先级最高void ck_int()unsigned char i;for(i=0;i80) break; /前导码是低电平 4.5MSif(temp 60 ) / 数据编码低电平时间if(temp 8) ch=ch|0x01;elsebreak; DAT1j=ch;ch=0;if(i*j = 32) x = 1;TR0 = 0;EX0 = 0;TR0 = 0;void Tiemr0( void
18、 ) interrupt 1temp +;五、最后的话武汉三维电子网络学院 作者 杨荣国 唐精明第 10 页 共 10 页真正入门单片机的学习者应该是已经掌握了单片机内部定时器、外部中断、串口通讯的工作原理及编程方法,所以对于这个程序我想很多人都可以马上体会并变为自己的程序。希望在这个程序的引导下结合自己的 C 语言编程能力,可以拿起自己身边的遥控器为单片机边学边用所应用。修改程序实现每个按键按下单片机对应控制一个 LED 亮并且蜂鸣器报警器一次。如今中国和日本的矛盾不断,很多技术人都在抱怨,但是我想其实我们也是可以为国家出点力的。因为我们所使用的大部分遥控器的编码与标准都是日本人技术所制定,希望更多的同仁能设计出自己的家用红外遥控器。更多资料:可以进入 武汉三维电子工作室 网址: