• 「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;
    }
  • 相关阅读:
    java 小数点取2位并且四舍五入
    批处理(.bat脚本)基本命令语法
    vue-webpack项目本地开发环境设置代理解决跨域问题
    vue项目引入FastClick组件解决IOS系统下h5页面中的按钮点击延迟,连续点击无反应的问题
    用vue构建多页面应用
    单页面应用和多页面应用对比分析
    html5文件读取+按钮样式重置+文件内容预览
    FileReader读取文件详解
    vue的双向数据绑定实现原理
    译:9.使用Redis进行消息传递
  • 原文地址:https://www.cnblogs.com/Donut/p/4026914.html
Copyright © 2020-2023  润新知