一、简介
 
红外发射模块:电源 3.3V 或 5V,通过发射管发射 38KHz 的红外信号,高电平驱动
 
红外接收模块:电源 3.3V 或 5V,可接收红外信号,并解调成逻辑电平,低电平有效
 
二、电路图
 
红外发射电路图
 
红外接收电路图
 
三、红外发射模块代码
 
#include
 
#include
 
#define uchar unsigned char
 
#define uint unsigned int
 
// 管脚定义
 
sbit key = P2^0;
 
sbit out = P2^1;
 
// 函数声明
 
void delayms(uchar aa); // 红外发射延时
 
void khz(uchar aa); // 发射 38KHz
 
void IR_OUT(uchar num); // 红外发射
 
void keyScan(); // 读取键盘信息
 
// 变量声明
 
uchar i, a, num1;
 
//-----------------------
 
// 红外发射延时
 
//-----------------------
 
void delayms(uchar aa)
 
{
 
for(a=aa; a》0; a--)
 
{
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
_nop_();
 
}
 
}
 
//-----------------------
 
// 发射 38KHz
 
//-----------------------
 
void khz(uchar aa)
 
{
 
for(a=aa;a》0;a--) // 这个 for 语句可以得到准确的 26.3 波特率
 
{
 
out=0;
 
i=7;
 
while(i》0) i--; //38kHZ
 
out=1;
 
}
 
}
 
//-----------------------
 
// 红外发射
 
//-----------------------
 
void IR_OUT(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 keyScan()
 
{
 
if(key==0)
 
{
 
_nop_(); _nop_(); _nop_();
 
_nop_(); _nop_(); _nop_();
 
if(key==0)
 
IR_OUT(0xC0);
 
key = 1;
 
}
 
}
 
//-----------------------
 
// 主函数
 
//-----------------------
 
void main()
 
{
 
key = 1;
 
while(1)
 
{
 
keyScan();
 
}
 
}
 
四、红外接收模块代码
 
#include
 
#include
 
#define uchar unsigned char
 
#define uint unsigned int
 
// 管脚定义
 
sbit in = P3^2; // 红外中断接收
 
//P2 接静态数码管
 
// 函数声明
 
void init(); // 初始化函数
 
void delayms(uchar j); // 延时函数
 
// 变量声明
 
uchar i, num, a;
 
bit fleg;
 
//-----------------------
 
// 初始化函数
 
//-----------------------
 
void init()
 
{
 
fleg = 1; // 标志位
 
in = 1; // 红外接收
 
EA = 1; // 中断设置
 
EX0 = 1;
 
IT0 = 1;
 
}
 
//-----------------------
 
// 延时函数
 
//-----------------------
 
void delayms(uchar j)
 
{
 
for(i=j; 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);// 延时 0.5ms 判断 5 次 5*0.5=2.5ms
 
if(in) fleg=0;
 
}
 
if(fleg)
 
{
 
delayms(72);// 延时 1ms 判断是不是高电平了
 
if(in)
 
{
 
delayms(115);// 延时让它超过 2ms; 2.5+1+1.623=5.123ms 开始读数据
 
delayms(118);// 若偏移一位,可以去掉。
 
for(a=8; a》0; a--)
 
{
 
while(!in);
 
delayms(86);// 延时 1.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;
 
}