一、前言
利用STC公司1T内核的STC12C08S2 单片机对一款遥控器进行解码,将解码的数据转换为以us为单位的时间通过单片机串口通讯发送到STC下载软件自带的串口调试工具接收框进行显示。
本文主要对测试结果进行展示与分析并对单片机控制程序进行分析,以此起到抛砖引玉的作用,希望读者理解程序以后可以利用单片机对身边的任意一款遥控器进行解码并将遥控器与单片机的实际应用联系在一起。
二、测试结果展示
1、实验材料介绍
实验材料硬件部分 软件部分 为KEIL V2 编程软件 和 单片机程序下载软件STC_ISP_V479
为了高效率学习程序编写,本实验平台采用单片机教程网的51hei-5单片机开发板。控制芯片为 STC12C08S2,红外通讯传感器为sm0038与单片机的P3.2引脚连接。大家用一根杜邦线将j7的3脚 连到顶部的p3.2口的排针处即可。程序下载器采用usb转串口线。遥控器采用如上图(对于NEC标准的遥控器都适用,比如电视遥控器等)。
2、遥控器按下数字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
3、遥控器按下数字2,PC所接收的数据码
数字2:2456 00206 00200 00206 00206 00202 00205 00206 00202 00412 00407 00410 00410 00407 00408 00412 00407 00206 00205 00202 00410 00410 00203 00204 00205 00408 00409 00410 00205 00202 00408 00412 00407
4、遥控器按下数字3,PC所接收的数据码
数字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 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
那这些数据代表什么意思呢?
单片机向PC机每发送一次都是5位数据,这5位数据是单片机内部定时器以5us循环一次对temp变量从0开始自加所得到的数据。也就是说这些数据可以理解为一个时间值,这个时间值就是遥控器每个数据码高电平和低电平所持续时间的值。[page]
从数据可以看出每个按键按下去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
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亮并且蜂鸣器报警器一次。
如今中国和日本的矛盾不断,很多技术人都在抱怨,但是我想其实我们也是可以为国家出点力的。因为我们所使用的大部分遥控器的编码与标准都是日本人技术所制定。
同学们,中国的智能电子爱好者,我们也可以制定出这个标准哦。希望更多的同仁能设计出自己的家用红外遥控器。
上一篇:c语言数据运算超范围要注意
下一篇:在远程通信中实现89LPC932的ISP功能
推荐阅读最新更新时间:2024-03-16 13:07