值得拥有的资料
是来自平时学习积累总结的
有问题的地方肯定有的
还请大家批评指正!
红外线信号的传输基于MCU的调制与解调的研究
摘要:本研究方案由发射和接收两大部分组成
都是基于MCU实现软件对红外线信号调制与解调
为红外线非定向应用奠定研究基础
关 键 词:uPD6121G;红外线发射/编码与接收/解码;
Research MCU-based infrared signal transmission
modulation and demodulation
LUOKai,HOUJian
Abstract:The program consists of transmitting and receiving two major components, are software-based MCU to achieve infrared signal modulation and demodulation.
Keywords:uPD6121G;Infrared remote launch/encoding/decoding and receiving
1 引 言
红外线是近距离、高速无线通信的一种手段
一直以来
红外遥控、遥测技术在玩具、家电制造及工业测控等领域得到了广泛的应用、室内通信的手段
红外线具有无线电无法比拟的优势
以前的红外线遥控系统以定向发射、接收为主流应用
因此一般为单用户系统
随着非方向性发射、接收
构成系统成为了可能
之前红外线信号都是采用固定的编码芯片和解码芯片实现对红外线的编码的调制与解调
这样的信号无法随用户的需求或构成真正意义上的系统的要求变化
因此本研究方案即是:通过基于MCU及外围器件为基础
实现用软件的方式对红外线进行调制与解调的
这样可以更好的控制红外线信号
使设计者设计出更多与红外线有关的无线段距离通信电路
2 系统研究方案
2.1系统总体方案
红外系统由发射和接收两大部分组成
应用编/解码专用集成电路芯片来进行控制操作
如图1所示
发射部分包括键盘矩阵、编码调制、红外发送器;接收部分包括光、电转换放大器、解调、解码电路
图1 红外线遥控系统结构图
2.2红外线调制与解调的介绍
红外线调制与解调原理
发射器专用芯片很多
根据编码格式可以分成两大类
这里我们以运用比较广泛
解码比较容易的一类来加以说明
现以日本NEC的uPD6121G组成发射电路为例说明编码与解码原理
当发射器按键按下后
即有遥控码发出
所按的键不同遥控编码不同
对应的解码也就不同
这种遥控码具有以下特征:
采用脉宽调制的串行码
以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1"
其波形如图2所示
图2 遥控码的"0"和"1" (注:所有波形为接收端的与发射相反)
上述"0"和"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率
达到降低电源功耗的目的
然后再通过红外发射二极管产生红外线向空间发射
如图3所示
图3 遥控信号编码波形图
UPD6121G产生的遥控编码是连续的32位二进制码组
其中前16位为用户识别码
能区别不同的电器设备
防止不同机种遥控码互相干扰
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码
UPD6121G最多额128种不同组合的编码
遥控器在按键按下后
周期性地发出同一种32位二进制码
周期约为108ms
一组码本身的持续时间随它包含的二进制"0"和"1"的个数不同而不同
大约在45~63ms之间
图4为发射波形图
图4 遥控连发信号波形
当一个键按下超过36ms
振荡器使芯片激活
将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成
如果键按下超过108ms仍未松开
接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成
图5 引导码 图6连发码
代码格式(以接收代码为准
接收代码与发射代码反向)
①位定义
②单发代码格式
③连发代码格式 注:代码宽度算法:
16位地址码的最短宽度:1.12×16=18ms
16位地址码的最长宽度:2.24ms×16=36ms
易知8位数据代码及其8位反代码的宽度和不变:
(1.12ms+2.24ms)×8=27ms
∴32位代码的宽度为(18ms+27ms)~(36ms+27ms) 1. 解码的关键是如何识别"0"和"1"
从位的定义我们可以发现"0"、"1"均以0.56ms的低电平开始
不同的是高电平的宽度不同
"0"为0.56ms,"1"为1.68ms,所以必须根据高电平的宽度区别"0"和"1"
如果从0.56ms低电平过后
开始延时
0.56ms以后
若读到的电平为低
说明该位为"0"
反之则为"1"
为了可靠起见
延时必须比0.56ms长些
但又不能超过1.12ms,否则如果该位为"0"
读到的已是下一位的高电平
因此取(1.12ms+0.56ms)/2=0.84ms最为可靠
一般取0.84ms左右均可
根据码的格式
应该等待9ms的起始码和4.5ms的结果码完成后才能读码
2.2.1红外线调制的硬件实现
发射部分包括单片机最小系统、键盘矩阵、555红外发射电路
他们一起构成了红外线独立发射电路
如图7所示
"0"和"1"组成的32位二进制码经555芯片电路产生的38kHz的载频进行二次调制以提高发射效率
达到降低电源功耗的目的
然后再通过红外发射二极管产生红外线向接收端发射信号
图7 红外线独立发射电路
2.2.2红外线调制的软件实现
通过定时器的方式对红外数据进行软件编码
再调制到载波发送出去
//本程序对应11.0592M晶振//
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IR=P1^6; //定义发射端口
sbit speak=P1^1;
bit flag,f2,f4,f8,f16,f32;
uchar irtime=0,key; //定义计时变量、键盘取值变量
void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}
/*******************定时器0方式2初始化函数***************/
void initT0()
{
TMOD=0x02; //方式2
TF0=0; //清溢出标志
ET0=1; //使能定时器0中断
TH0=0; //赋初值
TL0=0;
EA=1; //开总中断
// TR0=1; //启动定时
}
/********************定时器0中断服务函数****************/
void Timer0() interrupt 1 using 1
{
irtime++; //中断计数
switch(irtime)
{
case 2:f2=1;break; //高0.56ms标志位
case 4:f4=1;break; //低0.56ms标志位
case 8:f8=1;break; //地1.68ms标志位
case 16:f16=1;break; //高4.5ms标志位
case 32:f32=1;break; //低4.5ms标志位
}
}
/*********************键盘扫描函数*********************/
//uchar void keyscan(void) //键盘扫描函数
使用行列反转扫描法
void keyscan()
{
/*
uchar cord_h,cord_l; //行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(400); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l); //键盘最后组合码值
}
}return(0xff); //返回该值 */
key=0xeb;
flag=1; //得到按键值就置标志位
}
/*********************引导码发送函数*******************/
void sendstart()
{
IR=1;
while(!f16);IR=0;f16=0; //高电平4.5ms
while(!f32);IR=1;irtime=0;f32=0; //低电平4.5ms
f2=0; //清零标志位
f4=0;
f8=0;
}
/*******************8位数据发送函数********************/
void sendnum(uchar t)
{
uchar b=0,i;
// t=key;
for(i=0;i<8;i++) //发送8位数据
{
b=t&0x01; //取出地i位
t=t>>1;
if(b==0) //为1时发送
{
IR=1;
while(!f2);IR=0;f2=0; //等待时间 完成 0.56ms
while(!f4);IR=1;irtime=0;f4=0; //0.56ms
}
else //为0时发送
{
IR=1;
while(!f2);IR=0;f2=0; //等待时间完成0.56ms
while(!f8);irtime=0;IR=1;f8=0; //1.68ms
f4=0; //清标志
}
}
}
/*********************终止码发送函数*******************/
/*void sendend() //终止码自由定义
{
sendnum(0x0f);
} */
/*******************16位客户地址码发送函数********************/
void sendadd() //客户地址码自由定义
{
sendnum(0xfb);
sendnum(0xed);
}
/*********************编码发送函数********************/
void send()
{
TR0=1; //启动定时
while(flag)
{
sendstart(); //发送起始码
sendadd(); //发送客户地址码
sendnum(key); //发送数据码
sendnum(~key); //发送数据反码
//sendend(); //发送终止码
irtime=0;
flag=!flag;
}
TR0=0; //关闭定时
}
/*********************主函数**********************/
void main()
{
IR=0;
// P1=0; //复位后赋初值
initT0(); //调用定时器0初始化函数
while(1) //进入循环
实时监控
{
keyscan(); //调用键盘扫描函数
send(); //调用编码发射函数
}
}
2..2.3红外线解调的硬件实现
一体化红外线接收器是一种集红外线接收和放大于一体
不需要任何外接元件
就能完成从红外线接收到输出与TTL电平信号兼容的所有工作
而体积和普通的塑封三极管大小一样
它适合于各种红外线遥控和红外线数据传输
它主要包括了收部分包括光、电转换放大器、解调、解码电路
如图8所示
图8 红外线接收电路
2.2.4红外线解调的软件实现
这是一个用红外线控制数码管显示的样例 (部分C程序)
.
void Ir_work(void)//红外键值散转程序
{
switch(IRcord[2])//判断第三个数码值
{
case fe:P1=0xfe;break;//1 显示相应的按键值
case fd:P1=0xfd;break;//2
case fb:P1=0xfb;break;//3
case f7:P1=0xf7;break;//4
case ef:P1=0xef;break;//5
case df:P1=0xdf;break;//6
case bf:P1=0xbf;break;//7
case 7f:P1=0x7f;break;//8
}
irpro_ok=0;//处理完成标志
}
/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord=value;
value=0;
} irpro_ok=1;//处理完毕标志位置1
}
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();//初始化定时器0
P2=0x00;//1位数码管全部显示
while(1)//主循环
{
if(irok)
{
Ircordpro();//码值处理
irok=0;
}
if(irpro_ok)//step press key
{
Ir_work();//码值识别散转
}
}
}
3 总结
单片机控制的红外线通信系统具有硬件简单、成本低廉、编程方便、通信可靠性高的特点
实现了通信双方非接触式的数据传送
这种方案也可用于其它遥控、遥测应用场合
实际应用证明,该系统具有很好的适用性、扩展性与灵活性,能满足大部分红外传输系统的要求
参 考 文 献
[1]张毅刚.单片机原理与应用设计.电子工业出版社,2008:32-42
[2]郭天祥.新编51单片机C语言教程.电子工业出版社,2009.56-78
[3]张天凡.51单片机C语言开发详解.电子工业出版社,2008.112-148
|