首页 > 代码库 > 「51单片机」红外接收、发射模块代码

「51单片机」红外接收、发射模块代码

一、简介

红外发射模块:电源3.3V5V,通过发射管发射38KHz的红外信号,高电平驱动

红外接收模块:电源3.3V5V,可接收红外信号,并解调成逻辑电平,低电平有效

 

二、电路图

                                 红外发射电路图

 

                                    红外接收电路图

 

三、红外发射模块代码

#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);                //发射38KHzvoid 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;}

 

「51单片机」红外接收、发射模块代码