一、簡介
紅外發射模塊:電源3.3V或5V,通過發射管發射38KHz的紅外信號,高電平驅動
紅外接收模塊:電源3.3V或5V,可接收紅外信號,並解調成邏輯電平,低電平有效
二、電路圖

紅外發射電路圖

紅外接收電路圖
三、紅外發射模塊代碼
#include<reg51.h> #include<intrins.h> #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<reg51.h> #include<intrins.h> #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; }
