新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机定时器-遥控器解码程序分析

单片机定时器-遥控器解码程序分析

作者: 时间:2012-08-31 来源:网络 收藏

从数据可以看出每个按键按下去PC机都接收到33个数据,这33个数据仔细观察可以发现都有以下规律:

第一个数据 在2456和2460之间。

第二个数据到第九个数据 在200和210之间。

第十个数据到第十八个数据 在400和410之间。

第十九个数据到第三十二个数据在200和210之间和在400和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 0111 1010 1000 0101

好了,到了这里我们可以下结论了,因为已经有了3个对比。

我们的结论是:如上图的遥控器编码原理为每个按键都有33个编码其中第一个编码都相同时间比较长,接着16编码分别可以用我们所定义的0和1表示即前八个为0后八个为1。其实这个我们可以理解为遥控器的地址编码,就好比电话号码的区号一样的,浙江衢州的区号是0570而武汉的区号是027,在本区域里的所有的座机号码都是以这个开头固定不变的。

接着再仔细观察可以发现原来后面16个数据码也是有规律的,那就是前8个和后8个是相互取反的的编码。

好了,更多的思维留个大家,下面我们要分享程序了,希望大家下载程序以后可以得出我以上的结论,如果复制到keil上有乱码,大家可从这里下载源程序:http://www.51hei.com/f/hwykjm1.rar 哈哈,这也是学习的趣味所在哦。因为我将分享的程序涵盖了外部中断、内部、串口通讯的三个结构的应用。

四、程序分享

/*

测试方案_07

程序设计:胡琴

电话:15886684881

设计时间:2010-12-1

测试方法:用计算33位红外信号持续时间

测试原理:在测试方案_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 reg52.h>
sbit IR = P3^2; // 红外信号感应引脚
unsigned int time;
unsigned int dat[33] ={ 0 };
bit flag = 0;
void Send( void ) //将32位数据对应的时间发送到PC上显示
{
char i;
for(i = 0;i 33;i ++)
{
TI = 0;
SBUF = dat[i] / 10000 + 48;
while( !TI );
TI = 0;
SBUF = dat[i] / 1000 % 10 + 48;
while( !TI );
TI = 0;
SBUF = dat[i] / 100 % 10 + 48;
while( !TI );
TI = 0;
SBUF = dat[i] / 10 % 10 + 48;
while( !TI );
TI = 0;
SBUF = dat[i] % 10 + 48;
while( !TI );
TI = 0;
SBUF = ' ';
while( !TI );
}
}
void Init( void ) //、外部中断初始化
{
TMOD = 0x22; // 定时器0、1方式2
SCON = 0x40; // 串行口方式1,不允许接收
TH1 = TL1 = 0xfd; // 串行口方式2,Fosc=11.05926,BPS=9600
TH0 = TL0 = 0xfb; // 中断频率 0.005ms
TR1 = 1; // 开启与串行口相关的定时器1
IT0 = 1; // 边沿式触发
ET0 = 1; // 开启定时器0中断
EX0 = 1; // 外部中断0中断允许
IP = 0x02; // 定时器0优先级高
EA = 1;
}
void main( void ) //主程序
{
Init( ); //中断 定时器 初始化
while( 1 ); //等待遥控信号
}
void Xint0( void ) interrupt 0 //外部中断0复位子程序
{
char i;
for(i = 0;i 33;i ++)
{
time = 0;
TR0 = 1;
while( !IR ); // 前导信号检测
while( IR );
TR0 = 0;
dat[i] = time;
}
Send( );
flag = 1;
EX0 = 0;
}
void Timer0( void ) interrupt 1 //5us中断一次 变量加1
{
time ++;
}


五、最后的话

真正入门的学习者应该是已经掌握了单片机内部定时器、外部中断、串口通讯的工作原理及编程方法,所以对于这个程序我想很多人都可以马上体会并变为自己的程序。

希望在这个程序的引导下结合自己的C语言编程能力,可以拿起自己身边的遥控器为单片机边学边用所应用。修改程序实现每个按键按下单片机对应控制一个LED亮并且蜂鸣器报警器一次。

如今中国和日本的矛盾不断,很多技术人都在抱怨,但是我想其实我们也是可以为国家出点力的。因为我们所使用的大部分遥控器的编码与标准都是日本人技术所制定。

同学们,中国的智能电子爱好者,我们也可以制定出这个标准哦。希望更多的同仁能设计出自己的家用红外遥控器。

红外遥控器相关文章:红外遥控器原理

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭