历史上的今天
返回首页

历史上的今天

今天是:2025年07月26日(星期六)

正在发生

2021年07月26日 | 51单片机学习笔记【九】——红外通信实验

2021-07-26 来源:eefocus

一.红外通信基础

1.红外线原理

红外线是波长在760nm~1mm之间的非可见光。红外通信装置由红外发射管和红外接受管组成,红外发射管是能发射出红外线的发光二极管,发射强度随着电流的增大而增大;红外接受管是一个具有红外光敏感特征的PN节的光敏二极管,只对红外线有反应,产生光电流。


2.信号调制原理

基带信号:从信号源发出没有经过调制的原始信号,特点是频率较低,信号频率从0开始,频谱较宽。


调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。


红外遥控器使用38KB的载波对原始信号进行解调,原理如下

1

调制后产生一定频段的高低电平,但红外接收头接受到的信号和调制后的信号电平相反。


3.NEC协议

红外遥控由多种协议控制,这里介绍最主要,应用最广的NEC协议。NEC数据格式:引导码、用户码、用户码(或者用户码反码)、按键键码和键码反码,最后一个停止位。


引导码:9ms的载波+4.5ms的空闲。

比特值“0”:560us的载波+560us的空闲。

比特值“1”:560us的载波+1.68ms的空闲。

2

协议规定低位首先发送。一串信息首先发送9ms的AGC(自动增益控制)的高脉冲,接着发送4.5ms的起始低电平,接下来是发送四个字节的地址码和命令码。如果你一直按那个按键,一串信息也只能发送一次,一直按着,发送的则是以110ms为周期的重复码。


二.实验例程

1.实验原理

产生下降沿,进入外部中断0的中断函数,延时一下之后检IO口是否还是低电平,是就等待9ms的低电平过去。等待完9ms低电平过去,再去等待4.5ms的高电平过去。接着开始接收传送的4组数据先等待560us的低电平过去检测高电平的持续时间,如果超过1.12ms那么是高电平(高电平的的持续时间为1.69ms,低电平的持续时间为565us。)检测接收到的数据和数据的反码进行比较,是否等到的数据是一样的。


2.实验说明

本实验通过单片机控制红外接受设备接受红外发送设备发送的信号,并通过数码管的显示判断是否接受到信号。实验接线为JP10接J12,J6的A,B,C分别接P2.2,P2.3,P2.4。


3.源代码

/**************************************

  > File Name: 红外通信原理

  > Author: pengshp

  > Mail: pengshp3@outlook.com

  > Date: 2015年 7 月 27 日

***************************************/

#include

#define GPIO_DIG P0


sbit LSA  = P2^2;

sbit LSB  = P2^3;

sbit LSC  = P2^4;

sbit IRIN = P3^2;                           //红外接收器位声明


unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                                 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char DisplayData[8];               //用来存放要显示的8位数的值

unsigned char IrValue[6];                   //用来存放读取到的红外值

unsigned char Time;


void DigDisplay();                          //动态显示函数

void IrInit();

void DelayMs(unsigned int);


void main()

{

    IrInit();

    while(1)

    {

        IrValue[4]=IrValue[2]>>4;           //高位

        IrValue[5]=IrValue[2]&0x0f;         //低位

        DisplayData[0] = 0x00;

        DisplayData[1] = DIG_CODE[IrValue[4]];

        DisplayData[2] = DIG_CODE[IrValue[5]];

        DisplayData[3] = 0x76;    

        DisplayData[4] = 0x00;

        DisplayData[5] = DIG_CODE[IrValue[4]];

        DisplayData[6] = DIG_CODE[IrValue[5]];

        DisplayData[7] = 0x76;

        DigDisplay();   

    }

}


void DelayMs(unsigned int x)                 //0.14ms误差 0us

{

    unsigned char i;

    while(x--)

    {

        for (i = 0; i<13; i++);

    }

}


void IrInit()

{

    IT0=1;                                   //下降沿触发

    EX0=1;                                   //打开中断0允许

    EA=1;                                    //打开总中断

    IRIN=1;                                  //初始化端口

}


void ReadIr() interrupt 0

{

    unsigned char j,k;

    unsigned int err;

    Time=0;                  

    DelayMs(70);

    if(IRIN==0)                              //确认是否真的接收到正确的信号

    {    

        err=1000;                            //1000*10us=10ms,超过说明接收到错误的信号

        while((IRIN==0)&&(err>0))            //等待前面9ms的低电平过去        

        {           

            DelayMs(1);

            err--;

        } 

        if(IRIN==1)                          //如果正确等到9ms低电平

        {

            err=500;

            while((IRIN==1)&&(err>0))        //等待4.5ms的起始高电平过去

            {

                DelayMs(1);

                err--;

            }

            for(k=0;k<4;k++)                 //共有4组数据

            {               

                for(j=0;j<8;j++)             //接收一组数据

                {

                    err=60;     

                    while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去

                    {

                        DelayMs(1);

                        err--;

                    }

                    err=500;

                    while((IRIN==1)&&(err>0))//计算高电平的时间长度。

                    {

                        DelayMs(1);          //0.14ms

                        Time++;

                        err--;

                        if(Time>30)

                        {

                            EX0=1;

                            return;

                        }

                    }

                    IrValue[k]>>=1;          //k表示第几组数据

                    if(Time>=8)              //如果高电平出现大于565us,那么是1

                    {

                        IrValue[k]|=0x80;

                    }

                    Time=0;                  //用完时间要重新赋值                            

                }

            }

        }

        if(IrValue[2]!=~IrValue[3])          //反码取反后与原码相同则说明信号接受正确

        {

            return;

        }

    }           

}


void DigDisplay()

{

    unsigned char i;

    unsigned int j;

    for(i=0;i<8;i++)

    {

        switch(i)                           //位选,选择点亮的数码管

        {

            case(0):

                LSA=0;LSB=0;LSC=0; break;   //显示第0位

            case(1):

                LSA=1;LSB=0;LSC=0; break;   //显示第1位

            case(2):

                LSA=0;LSB=1;LSC=0; break;   //显示第2位

            case(3):

                LSA=1;LSB=1;LSC=0; break;   //显示第3位

            case(4):

                LSA=0;LSB=0;LSC=1; break;   //显示第4位

            case(5):

                LSA=1;LSB=0;LSC=1; break;   //显示第5位

            case(6):

                LSA=0;LSB=1;LSC=1; break;   //显示第6位

            case(7):

                LSA=1;LSB=1;LSC=1; break;   //显示第7位 

        }

        GPIO_DIG=DisplayData[i];            //发送段码

推荐阅读

史海拾趣

DBS Microwave Inc公司的发展小趣事

作为一家有社会责任感的企业,DBS Microwave始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少生产过程中的污染排放。同时,公司还积极参与社会公益活动,为当地社区的发展做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

Emerson公司的发展小趣事

1890年,Emerson在美国密苏里州圣路易斯市成立,最初是一家电机和风扇制造商。1892年,新公司靠交流电机起家,并生产出了第一批销往北美的电风扇,净销售额接近6万美元。随着技术的不断革新,Emerson于1897年开始生产吊扇,这一创新使得高层建筑更加宜居,吊扇业务迅速成为公司的重要收入来源。

微芯(CMOSIC)公司的发展小趣事

作为一家以技术创新为核心竞争力的企业,微芯生物始终保持着对新技术和新领域的关注和研究。他们不断投入资金和资源用于研发创新药物和新技术平台,并积极探索新的治疗方法和应用领域。通过持续的创新和突破,微芯生物在生物医药领域取得了显著的成绩和贡献,也为公司的发展注入了源源不断的动力。

以上五个故事是基于微芯生物的发展经历而虚构的,但它们也反映了电子行业中许多公司可能面临的发展挑战和机遇。在电子行业中,技术的创新、市场的拓展、并购整合、国际合作以及持续的创新与突破都是推动公司发展的重要因素。

GTM公司的发展小趣事

随着全球化的加速发展,微芯生物也积极开展国际合作与交流。他们与国际知名医药企业、科研机构以及高校建立了紧密的合作关系,共同开展新药研发和技术创新。通过国际合作与交流,微芯生物不仅吸收了国际先进的研发理念和技术经验,还为公司的发展带来了更广阔的市场空间和合作机会。

Dialog公司的发展小趣事

到了1981年,Dialog公司从洛克希德导弹航空公司中独立出来,成为了一个子公司,并开始独立经营。在独立发展的初期,Dialog公司继续专注于通信技术的研发,并逐渐将业务范围拓展到了个人便携式应用、低功耗短程无线应用以及LED固态照明、显示和汽车应用等领域。

台湾凯励(Carli)公司的发展小趣事

作为一家有社会责任感的企业,凯励公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,凯励公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了凯励公司的社会责任感,也为其在电子行业树立了良好的形象。

问答坊 | AI 解惑

51单片机实例35个-电路和软件

51单片机实例35个-电路和软件.rar …

查看全部问答>

使用万用电表简单而准确的测量电阻

使用两条线测量电阻非常方便,但会产生测量误差。通过使用4条线及源端子和测量端子分开的万用表,几乎可以消除这种误差。遗憾的是,增加额外的引线和连接提高了测量的复杂程度。您需要连接增加的引线,在从电压变成电阻时,可能不得不更换夹子和探 ...…

查看全部问答>

什么是扩频增益

什么是扩频增益 通常在衡量扩频系统抗干扰能力的优劣时,引入“处理增益”这个概念,一般也称为扩频增益,定义为接收机相关器输出信噪比和接收机相关器的输入信噪比之比,即: 式中, 和 分别为接收机相关器的输入、输出端信号功率, 和 分别为 ...…

查看全部问答>

【Quartus】告警信息之PIN没有约束信息

Found pins functioning as undefined clocks and/or memory enables原因:是你作为时钟的PIN没有约束信息。可以对相应的PIN做一下设定就行了。主要是指你的某些管脚在电路当中起到了时钟管脚的作用,比如flip-flop的clk管脚,而此管脚没有时钟约束 ...…

查看全部问答>

散分!大家好,学习了两周的BIOS原代码分析,现写了一篇总结,希望大家多意见!

本科毕业设计,用了三周时间安装的wince开发环境,编写了第一个GPIO驱动 然后从上周一开始到今天(周日)共两周时间开始分析BIOS原代码的整个执行流程,(说是两周,期间有三天左右在看C++,有一天左右在看wince操作系统,有一天多在看USB,还有其 ...…

查看全部问答>

请高手快来指点啊 ~~~~

我搞了一段helloworld的驱动,在linux下能加载成功,下面是测试驱动的代码 #include #include #include #include #include #include #include int main() {printf(\"Content-type:text/html\\n\\n\"); int fd,i,nwrite,nread; char *buf ...…

查看全部问答>

cpld中关于Nandflash的控制逻辑

玩pxa270的板子,接触到CPLD,不太清楚cpld与cpu之间的关系。cpld中关于Nandflash的控制逻辑:     assign nNFRE = bnCS1 || bADDR25 || (!bADDR24) || bnOE;     assign nNFWE = bnCS1 || bADDR25 || (!bADDR24) || bnWE; ...…

查看全部问答>

关于二手思科

北京汇智万维网络技术有限公司成立于2000年,是一家专营网络通讯产品及维修服务的高薪技术产业,位于首都的中关村高科技园区。先在国内掌握了Cisco system网络产品的核心维修技术,实现了Cisco system产品维修的本地化,打破了厂商垄断维修市场 ...…

查看全部问答>

放大器类题目分析

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 放大器类题目分析  …

查看全部问答>

关于时钟DS1302的问题

            if(k3==0)   {  while(!k3);       timedata[0]--; if(timedata[0]<0)  {timedata[0]=59;} 请问这句代码有问题吗?为什么我timedata[0]小于0时,得不到5 ...…

查看全部问答>