基于51单片机控制红外通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红外通信原理
红外遥控有发送和接收两个组成部分。发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,周期约26μs) 接收红外信号,它同时对信号进行放大、检波、整形得到TTL 电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。具体实现过程如下:
(在这里特别强调:编码与解码是一对逆过程,不仅在原理上是一对逆过程,在码的发收过程也是互反的,即以前发射端原始信号是高电平,那接收头输出的就是低电平,反之亦然。因此为了保证解码过程简单方便,在编码时应该直接换算成其反码。)
1.红外发射部分:
下图为红外发射部分的电路拟图:
编码过程:
(1) 二进制信号的调制
二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成频率为38kHz的间断脉冲串(用定时器来完成),相当于用二进制信号的编码乘以频率为38kHz的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。
(2)PPM编码
这种遥控编码具有以下特征:
○1遥控编码脉冲由前导码、16 位地址码(8位地址码、8 位地址码的反码)和16 位操作码(8 位操作码、8 位操作码的反码)组成。前导码:是一个遥控码的起始部分,由一个9ms的高电平( 起始码) 和一个4. 5ms的低电平( 结果码)组成,作为接受数据的准备脉冲。16位地址码:能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
16 位操作码:用来执行不同的操作。
○2采用脉宽调制的串行码,以脉宽为0.56ms、间隔0.56ms、周期为1.12ms的组合表示二进制的“0”;以脉宽为1.68ms、间隔0.56ms、周期为2.24ms的组合表示二进制的“1”。
(3)发送程序
#include
static bit OP; //红外发射管的亮灭控制位static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
sbit P3_4=P3^4;
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);//发送子函数
void delay();
void main(void)
{
count = 0;
flag = 0; //无载波
OP = 0; //不亮
P3_4 = 0; //在后面会发现用OP赋值的
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次 TR0 = 1;//开始计数
iraddr1=3;//自定义的一个地址
iraddr2=252;//地址反码
do{
delay();
SendIRdata(12);
}while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{OP=~OP; }//如果是待发送的有效数据flag=1,就在此产生载波(亮灭交变)else
{OP = 0; }
P3_4 = OP;
}
void SendIRdata(char p_irdata) //发送数据子函数
{
int i;
char irdata=p_irdata;
/***************************************************************/
//发送9ms的起始码,并是载波模式有效
endcount=223;
flag=1;
count=0;
while(count //发送4.5ms的结果码,并是载波模式无效 endcount=117 flag=0; count=0; do{}while(count /***************************************************************/ //发送十六位地址的前八位 irdata=iraddr1; for(i=0;i<8;i++) {//一个周期里规定先以高电平开始,在以低电平结束。先发送0.56ms的38KHZ“1”的红外波(即编码中0.56ms的高电平) endcount=10; flag=1; count=0; do{}while(count //停止发送红外信号(即编码中的低电平) if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0 {endcount=41; } //1为宽的高电平1.68ms else {endcount=15; } //0为窄的高电平0.56ms