「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);                //發射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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM