为实现项目开发中的远程通信,需要使用无线通信,无线遥控可分为无线电波式、声控式、超声波式和红外式。由于无线电容易干扰其他电视和无线电通信设备,系统本身的抗干扰性能也很差,动作错误,因此不能广泛使用。超声波频带窄,易受噪声干扰,系统抗干扰能力差,声控识别正确率低,难度大,不能广泛使用。红外遥控模式以红外为载体传输控制信息。同时,随着电子技术的发展,单片机的出现催生了红外遥控系统数字编码模式的快速发展。此外,红外遥控器还具有红外发光二极管等优点,容易小型化,价格低廉;数字信号编码和二次调制不仅可以控制多个信息,增加遥控功能,提高信号传输的抗干扰性,减少误动作,功耗低;红外线不会泄露到室外,不会产生信号串扰;反应速度快、传输效率高、工作稳定可靠等。所以现在很多无线遥控都采用红外遥控。所以现在很多无线遥控方法都采用红外遥控方法。在这里,我将与您分享红外发射和接收程序。

红外发射程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit LED=P1^0; ///发射指示灯
sbit out=P3^7;
uchar i,a,num1;
void init()///初始化作用
{ key1=1;
key2=1;
key3=1; }
void delay(uchar aa)
{ uchar bb,cc;
for(bb=aa;bb>0;bb--)
for(cc=200;cc>0;cc--); }
void delayms(uchar aa)//延迟程序
{
for(a=aa;a>0;a--)
{
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }
}
void khz(uchar aa)//是发射38KHZ的程序
{
for(a=aa;a>0;a--) //这个for句子可以准确获得26.3波特率
{
out=0;
i=7; //低了17us
while(i>0)i--; // 38kHZ
out=1;
//高了9us 17 9=26us 比26.3快一点点
}
}
void fashu(uchar num)
{ khz(116)//发射3ms 38khz
delayms(125);
for(num1=8;num1>0;num1--)
{
khz(40);
if(num&0x01)
delayms(93);//delay 1.5ms
else
delayms(65);//delay 1ms
num=num>>1;
}
khz(20); }
void tishi()
{
LED=0;
delay(50);
LED=1;
delay(50);
LED=0;
delay(50);
LED=1; }
void keyscan()//按键扫描
{
if(key1==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key1==0)
{
while(!key1);
fashu(0xf3);
tishi();
}
}
if(key2==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key2==0)
{
while(!key2);
fashu(0x3f);
tishi();
} }
if(key3==0)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
if(key3==0)
{
while(!key3);
fashu(0xf5);
tishi();
} } }
void main()
{
init();
while(1)
{
keyscan();
} }
红外接收程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit in=P3^2;
uchar i,a,num;
bit fleg;
void init()
{
fleg=1;
in=1;
EA=1;
EX0=1;
IT0=1; }
void delayms(uchar aa)
{
for(i=aa;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
} }
void main()
{
init();
while(1); }
void sieasdf() interrupt 0
{
EX0=0;
for(a=5;a>0;a--)
{
delayms(35).5ms 判断5次 5*0.5=2.5ms
if(in)fleg=0;
}
if(fleg)
{
delayms(72)ms 判断是否高电平
if(in)
{
delayms(115);//延时让它超过2ms; 2.5 1 1.623=5.123ms 开始读数据
delayms(118);/如果偏移一个,可以去掉。
for(a=8;a>0;a--)
{
while(!in);
delayms(86).188ms 判断IO从而得到0或1
num=num>>1;
if(in)
{
num=num|0x80;
delayms(31;//延时0.6ms 因为上面延时1.2ms+0.6 刚好跳过1.5ms
}
}
P2=num; } }
fleg=1;
EX0=1; }