1单片机定时器遥控器解码程序分析与论证 杨荣国 唐精明Word格式文档下载.docx
- 文档编号:17001170
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:12
- 大小:1.01MB
1单片机定时器遥控器解码程序分析与论证 杨荣国 唐精明Word格式文档下载.docx
《1单片机定时器遥控器解码程序分析与论证 杨荣国 唐精明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《1单片机定时器遥控器解码程序分析与论证 杨荣国 唐精明Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
那这些数据代表什么意思呢?
单片机向PC机每发送一次都是5位数据,这5位数据是单片机内部定时器以5us循环一次对temp变量从0开始自加所得到的数据。
也就是说这些数据可以理解为一个时间值,这个时间值就是遥控器每个数据码高电平和低电平所持续时间的值。
从数据可以看出每个按键按下去PC机都接收到33个数据,这33个数据仔细观察可以发现都有以下规律:
第一个数据在2456和2460之间。
第二个数据到第九个数据在200和210之间。
第十个数据到第十八个数据在400和410之间。
第十九个数据到第三十二个数据在200和210之间和在400和410之间都有。
继续分析:
如果将在2456和2460之间的数据定义为字符‘h’,将在200和210之间的数据定义为字符‘0’,将在400和410之间的数据定义为字符‘1’。
那么以上33个数据可以表达为:
h11111111000000000011000011001111那么这个数据就是按键1按下的用0和1来表示的编码。
相同道理可以推测出数字2和数字3用0和1来表示的编码如下:
数字2:
h00000000111111110001100011100111
数字3:
h00000000111111110111101010000101
好了,到了这里我们可以下结论了,因为已经有了3个对比。
我们的结论是:
如上图的遥控器编码原理为每个按键都有33个编码其中第一个编码都相同时间比较长,接着16编码分别可以用我们所定义的0和1表示即前八个为0后八个为1。
其实这个我们可以理解为遥控器的地址编码,就好比电话号码的区号一样的,浙江衢州的区号是0570而武汉的区号是027,在本区域里的所有的座机号码都是以这个开头固定不变的。
接着再仔细观察可以发现原来后面16个数据码也是有规律的,那就是前8个和后8个是相互取反的的编码。
好了,更多的思维留个大家希望大家下载程序以后可以得出我以上的结论,哈哈,这也是学习单片机的趣味所在哦。
因为我将分享的程序涵盖了单片机外部中断、内部定时器、串口通讯的三个结构的应用。
四、红外遥控器编码及解码原理介绍
1、遥控器编码原理
遥控发射器专用芯片很多,根据编码格式可以分成两大类:
NEC码和RC5码,本课程以运用比较广泛,解码比较容易的日本NEC为例说明编码原理(遥控专用ICHT6221编码方式也采用NEC码)。
NEC码产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器在设备,防止不同机种遥控码互相干扰。
后16位为8位功能码及其反码。
NEC数据帧格式:
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms的高电平),一个结果码(4.5ms低电平),低8位地址码(9~18ms),高8位地址码(9~18ms),8位数据码(9~18ms)和这8位数据码的反码(9~18ms)组成。
其中地址码和数据码有“0”编码和“1”编码组成。
在NEC编码格式中“0”,“1”的表示方法(脉宽调制)如下:
从上图可以看出遥控发射码“0”由持续0.565ms的高电平和0.56ms的低电平组成,遥控发射码“1”由持续0.565ms的高电平和1.685ms的低电平组成,前导码由9ms的高电平和4.5ms的低电平组成。
每个按键按下先发一个前导码,接着持续发32个有“0”和“1”组成的地址码和数据码。
高电平代表有红外线,低电平代表无红外线,对于遥控发射码“0”表示红外发光二极管发射红外线0.565ms,停止发射0.56ms。
如果遥控器要对外发射01两位数据,红外二极管的工作流程是,先发红外线持续9ms接着停止发射红外线4.5ms,表示发射前导码。
接着发红外线持续0.565ms接着停止发射红外线0.56ms,表示发射码“0”。
接着发红外线持续0.565ms接着停止发射红外线1.685ms,表示发射码“1”。
如下图:
为降低功耗提高发射效率,红外二极管发射红外线时并不是一直工作的,而是按38KHZ的脉冲进行调制工作的。
也就说说红外线在工作的时候是按38KHZ的频率在闪烁,而不是一直亮。
2、遥控器解码原理
红外线遥控信号的接收,可以使用一种集红外线接收和放大于一体的VS183B来接收,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号的所有工作。
VS183B实物图如下:
器件对外只有三个引脚,从左到右分别是OUTGNDVCC,工作电压为2.7V~5V,VCC接5V电源正极,GND接电源负极,OUT引脚为信号输出引脚,可以输出TLL的高电平和低电平信号。
VS183B在空闲时输出高电平信号,在接收到38KHZ红外信号时输出低电平,根据这个特性可得出以下结论。
如果遥控器发射01两位数据,VS183B接收到遥控信号以后将输出持续9ms的低电平和4.5ms的高电平表示接收到前导码,接着输出0.565ms的低电平和0.56ms的高电平表示接收到“0”发射码,接着输出0.565ms的低电平和1.685ms的高电平表示接收到“1”发射码。
3、单片机解码编程
将VS1838B的输出引脚与单片机外部中断0引脚相连,每个被解出来的码都是以低电平开始紧接着是高电平,第二个码也同样以低电平开始紧接着高电平,启动单片机外部中断并设置为脉冲触发方式可以精确的捕获到每个码开始瞬间,这个时候启动定时器中断,等待一个低电平和一个高电平结束并关闭定时中断。
通过查看定时中断的次数可以计算出对应编码的执行时间从而推算出相应的编码。
五、程序分享
1、将每个遥控按键对应的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<
reg52.h>
sbitIR=P3^2;
//红外信号感应引脚
unsignedinttime;
unsignedintdat[33]={0};
bitflag=0;
voidSend(void)//将32位数据对应的时间发送到PC上显示
{
chari;
for(i=0;
i<
33;
i++)
{
TI=0;
SBUF=dat[i]/10000+48;
while(!
TI);
SBUF=dat[i]/1000%10+48;
SBUF=dat[i]/100%10+48;
SBUF=dat[i]/10%10+48;
SBUF=dat[i]%10+48;
SBUF='
'
;
}
}
voidInit(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;
voidmain(void)//主程序
Init();
//中断定时器初始化
while
(1);
//等待遥控信号
voidXint0(void)interrupt0//外部中断0复位子程序
time=0;
TR0=1;
IR);
//前导信号检测
while(IR);
TR0=0;
dat[i]=time;
Send();
flag=1;
EX0=0;
voidTimer0(void)interrupt1//5us中断一次变量加1
time++;
2、将每个遥控按键对应的32个遥控码转换成4个16进制数据发送到串口显示
#include<
sbitIr=P3^2;
unsignedchartemp=0,x=0,ch=0;
charDAT1[4]={0};
voidinit()//中断初始化
IE=0x83;
//启动中断总开关外部中断0定时中断0
//外部中断0下降沿触发
//串口工作方式1
//定时器0、1方式2
//定时器1,用于串口通讯
TH0=TL0=0x47;
//定时器0,用于延时计算
//设置定时器0的中断优先级最高
voidck_int()
unsignedchari;
for(i=0;
i<
4;
i++)
SBUF=DAT1[i];
while(TI==0);
TI=0;
voidmain()
init();
while
(1)
{
if(x==1)
{
ck_int();
x=0;
EX0=1;
}
voidins_0()interrupt0//整个脉冲时间
{
unsignedchari,j;
temp=0;
//从0开始计数
TR0=1;
while(!
Ir);
//前导码是高电平9MS
while(Ir)if(temp>
80)break;
//前导码是低电平4.5MS
if((temp>
60)&
&
(temp<
70))//测试前导码时间为67
for(j=0;
j<
j++)
for(i=0;
8;
{
temp=0;
while(!
//数据编码高电平时间
while(Ir)if(temp>
20)break;
//数据编码低电平时间
if(temp<
15)
{
ch=ch<
<
1;
if(temp>
8)
ch=ch|0x01;
}
else
break;
}
DAT1[j]=ch;
ch=0;
}
if(i*j==32)
x=1;
TR0=0;
EX0=0;
TR0=0;
voidTiemr0(void)interrupt1
temp++;
五、最后的话
真正入门单片机的学习者应该是已经掌握了单片机内部定时器、外部中断、串口通讯的工作原理及编程方法,所以对于这个程序我想很多人都可以马上体会并变为自己的程序。
希望在这个程序的引导下结合自己的C语言编程能力,可以拿起自己身边的遥控器为单片机边学边用所应用。
修改程序实现每个按键按下单片机对应控制一个LED亮并且蜂鸣器报警器一次。
如今中国和日本的矛盾不断,很多技术人都在抱怨,但是我想其实我们也是可以为国家出点力的。
因为我们所使用的大部分遥控器的编码与标准都是日本人技术所制定,希望更多的同仁能设计出自己的家用红外遥控器。
更多资料:
可以进入武汉三维电子工作室网址:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1单片机定时器遥控器解码程序分析与论证 杨荣国 唐精明 单片机 定时器 遥控器 解码 程序 分析 论证 精明