一、簡(jiǎn)介
紅外發(fā)射模塊:電源3.3V或5V,通過(guò)發(fā)射管發(fā)射38KHz的紅外信號(hào),高電平驅(qū)動(dòng)
紅外接收模塊:電源3.3V或5V,可接收紅外信號(hào),并解調(diào)成邏輯電平,低電平有效
二、電路圖
紅外發(fā)射電路圖
紅外接收電路圖
三、紅外發(fā)射模塊代碼
#include
#include
#define uchar unsigned char
#define uint unsigned int
//管腳定義
sbit key = P2^0;
sbit out = P2^1;
//函數(shù)聲明
void delayms(uchar aa); //紅外發(fā)射延時(shí)
void khz(uchar aa); //發(fā)射38KHz
void IR_OUT(uchar num); //紅外發(fā)射
//變量聲明
uchar i, a, num1;
//-----------------------
//紅外發(fā)射延時(shí)
//-----------------------
void delayms(uchar aa)
{
for(a=aa; a》0; a--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//-----------------------
//發(fā)射38KHz
//-----------------------
void khz(uchar aa)
{
for(a=aa;a》0;a--) //這個(gè)for語(yǔ)句可以得到準(zhǔn)確的26.3波特率
{
out=0;
i=7;
while(i》0) i--; //38kHZ
out=1;
}
}
//-----------------------
//紅外發(fā)射
//-----------------------
void IR_OUT(uchar num)
{
khz(116); //發(fā)射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);
}
//-----------------------
//讀取鍵盤(pán)信息
//-----------------------
void keyScan()
{
if(key==0)
{
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
if(key==0)
IR_OUT(0xC0);
key = 1;
}
}
//-----------------------
//主函數(shù)
//-----------------------
void main()
{
key = 1;
while(1)
{
keyScan();
}
}
四、紅外接收模塊代碼
#include
#include
#define uchar unsigned char
#define uint unsigned int
//管腳定義
sbit in = P3^2; //紅外中斷接收
//P2接靜態(tài)數(shù)碼管
//函數(shù)聲明
void init(); //初始化函數(shù)
void delayms(uchar j); //延時(shí)函數(shù)
//變量聲明
uchar i, num, a;
bit fleg;
//-----------------------
//初始化函數(shù)
//-----------------------
void init()
{
fleg = 1; //標(biāo)志位
in = 1; //紅外接收
EA = 1; //中斷設(shè)置
EX0 = 1;
IT0 = 1;
}
//-----------------------
//延時(shí)函數(shù)
//-----------------------
void delayms(uchar j)
{
for(i=j; i》0; i--)
{
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
}
}//-----------------------
//主函數(shù)
//-----------------------
void main()
{
init();
while(1);
}
//-----------------------
//接收中斷
//-----------------------
void sieasdf() interrupt 0
{
EX0 = 0;
for(a=5; a》0; a--)
{
delayms(35);//延時(shí)0.5ms 判斷5次 5*0.5=2.5ms
if(in) fleg=0;
}
if(fleg)
{
delayms(72);//延時(shí)1ms 判斷是不是高電平了
if(in)
{
delayms(115);//延時(shí)讓它超過(guò)2ms; 2.5+1+1.623=5.123ms 開(kāi)始讀數(shù)據(jù)
delayms(118);//若偏移一位,可以去掉。
for(a=8; a》0; a--)
{
while(!in);
delayms(86);//延時(shí)1.188ms 判斷IO高低,從而得0或1
num = num》》1;
if(in)
{
num = num|0x80;
delayms(31);//延時(shí)0.6ms 因?yàn)樯厦嫜訒r(shí)1.2ms+0.6 剛好跳過(guò)1.5ms
}
}
P2 = num;
}
}
fleg = 1;
EX0 = 1;
}
評(píng)論