基于51单片机控制红外通信Word格式.docx
- 文档编号:22309066
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:254.78KB
基于51单片机控制红外通信Word格式.docx
《基于51单片机控制红外通信Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制红外通信Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
以脉宽为1.68ms、间隔0.56ms、周期为2.24ms的组合表示二进制的“1”。
(3)发送程序
#include<
AT89X51.h>
staticbitOP;
//红外发射管的亮灭控制位
staticunsignedintcount;
//延时计数器
staticunsignedintendcount;
//终止延时计数
staticunsignedcharflag;
//红外发送标志
sbitP3_4=P3^4;
chariraddr1;
//十六位地址的第一个字节
chariraddr2;
//十六位地址的第二个字节
voidSendIRdata(charp_irdata);
//发送子函数
voiddelay();
voidmain(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中断处理
voidtimeint(void)interrupt1
{
TH0=0xFF;
TL0=0xE6;
//设定时值为38K也就是每隔26us中断一次
count++;
if(flag==1)
{OP=~OP;
}//如果是待发送的有效数据flag=1,就在此产生载波(亮灭交变)
else
{OP=0;
}
P3_4=OP;
voidSendIRdata(charp_irdata)//发送数据子函数
inti;
charirdata=p_irdata;
/***************************************************************/
//发送9ms的起始码,并是载波模式有效
endcount=223;
flag=1;
count=0;
while(count<
endcount);
//等待中断,控制亮灭交变的总时间为9ms
//发送4.5ms的结果码,并是载波模式无效
endcount=117
flag=0;
do{}while(count<
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;
i<
8;
i++)
{//一个周期里规定先以高电平开始,在以低电平结束。
先发送0.56ms的38KHZ“1”的红外波(即编码中0.56ms的高电平)
endcount=10;
//停止发送红外信号(即编码中的低电平)
if(irdata-(irdata/2)*2)
//判断二进制数个位为1还是0
{endcount=41;
}
//1为宽的高电平1.68ms
{endcount=15;
}
//0为窄的高电平0.56ms
flag=0;
count=0;
irdata=irdata>
>
1;
//依次取位
//发送十六位地址的后八位
irdata=iraddr2;
//此处已经是地址的反码
{
endcount=10;
flag=1;
while(count<
if(irdata-(irdata/2)*2)
}
//发送八位数据
irdata=p_irdata;
{endcount=41;
{endcount=15;
do{}while(count<
irdata=irdata>
//发送八位数据的反码
irdata=~p_irdata;
//要将数据位取反
{endcount=41;
else
voiddelay()
inti,j;
400;
for(j=0;
j<
100;
j++)
一串完整的编码如下图所示
前导码地址码地址反码操作码操作反码
2.红外接收部分:
为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,周期约26us)接收红外信号,它同时对信号进行放大、检波、整形得到TTL电平的编码信号,再送给单片机,经单片机解码并执行去控制相关对象。
接收部分的电路拟图为:
HS0038的典型应用电路为:
其应用程序为:
#include"
reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharram[4]={0,0,0,0};
//存放接受到的4个数据地址码16位+按键码8位+按键码取反的8位
voiddelaytime(uinttime)//延迟90uS
{uchara,b;
for(a=time;
a>
0;
a--)
{for(b=40;
b>
b--);
}
voidrem()interrupt0//中断函数
ucharramc=0;
//定义接收了4个字节的变量
ucharcount=0;
//定义现在接收第几位变量
uinti=0;
//此处变量用来在下面配合连续监测9MS内是否有高电平
prem=1;
1100;
i++)//以下FOR语句执行时间为8MS左右
{
if(prem)//进入遥控接收程序首先进入引导码的前半部判断,即:
是否有9MS左右的低电平
return;
//引导码错误则退出,注意与break语句的区别
while(prem!
=1);
//等待引导码的后半部4.5MS高电平开始的到来。
delaytime(50);
//延时大于4.5MS时间,跨过引导码的后半部分,来到真正遥控数据32位中
//第一位数据的0.56MS开始脉冲
for(ramc=0;
ramc<
4;
ramc++)//循环4次接收4个字节
{for(count=0;
count<
count++)//循环8次接收8位(一个字节)
while(prem!
//开始判断现在接收到的数据是0或者1,首先在这行本句话时,
//保已经进入数据的0.56MS低电平阶段
//等待本次接受数据的高电平的到来。
delaytime(9);
//高电平到来后,数据0高电平最多延续0.56MS,而数据1,高电平可延续1.66MS大于0.8MS后我们可以再判断遥控接收脚的电平。
if(prem)//如果这时高电平仍然在继续那么接收到的数据是1的编码
{ram[ramc]=(ram[ramc]<
<
1)+1;
//将目前接收到的数据位1放到对应的字节中
delaytime(11);
//如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨
//下个位编码的低电平中(即是开始的0.56MS中)
else//否则目前接收到的是数据0的编码
ram[ramc]=ram[ramc]<
//将目前接收到的数据位0放到对应的字节中
}//本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收
if(ram[2]!
=(~(ram[3]&
0x7f)))//本次接收码的判断
{for(i=0;
i++)//没有此对应关系则表明接收失败,清除接受到的数据
ram[i]=0;
returned;
}
main()
IT0=1;
//设定INT0为边沿触发
EX0=1;
//打开外部中断0
EA=1;
//全局中断开关打开
while
(1)
switch(dis_num)
case0x81:
num=0;
break;
case0xcf:
num=1;
case0x92:
num=2;
case0x86:
num=3;
case0xcc:
num=4;
case0xa4:
num=5;
case0xa0:
num=6;
case0x8f:
num=7;
case0x80:
num=8;
case0x84:
num=9;
case0x88:
num=10;
break;
case0xe0:
num=11;
case0xb1:
num=12;
case0xc2:
num=13;
case0xb0:
num=14;
case0xb8:
num=15;
P2=table[num];
P1=0x01;
delaytime(5);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 控制 红外 通信