历史上的今天
返回首页

历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2021年08月27日 | 51单片机-代码文件和测试

2021-08-27 来源:eefocus

创建好“infrared.c”和“infrared.h”文件。


1.infrared.c的代码


#include

#include

   

unsigned char irflag = 0; //红外接收标志,收到一帧正确数据后置1

unsigned char ircode[4];  //红外代码接收缓冲区

   

/* 初始化红外接收功能 */

void InitInfrared()

{

    IR_INPUT = 1;  //确保红外接收引脚被释放

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x10;  //配置T1为模式1

    TR1 = 0;       //停止T1计数

    ET1 = 0;       //禁止T1中断

    IT1 = 1;       //设置INT1为负边沿触发

    EX1 = 1;       //使能INT1中断

}

  

/* 获取当前高电平的持续时间 */

unsigned int GetHighTime()

{

    TH1 = 0;                //清零T1计数初值

    TL1 = 0;

    TR1 = 1;                //启动T1计数

    while (IR_INPUT)        //红外输入引脚为1时循环检测等待,变为0时则结束本循环

    {

        if (TH1 >= 0x40)

        {                   //当T1计数值大于0x4000,即高电平持续时间超过约18ms时,

            break;          //强制退出循环,是为了避免信号异常时,程序假死在这里。

        }

    }

    TR1 = 0;                //停止T1计数

    

    return (TH1*256 + TL1); //T1计数值合成为16bit整型数,并返回该数

}

  

/* 获取当前低电平的持续时间 */

unsigned int GetLowTime()

{

    TH1 = 0;                //清零T1计数初值

    TL1 = 0;

    TR1 = 1;                //启动T1计数

    while (!IR_INPUT)       //红外输入引脚为0时循环检测等待,变为1时则结束本循环

    {

        if (TH1 >= 0x40)

        {                   //当T1计数值大于0x4000,即低电平持续时间超过约18ms时,

            break;          //强制退出循环,是为了避免信号异常时,程序假死在这里。

        }

    }

    TR1 = 0;                //停止T1计数

    

    return (TH1*256 + TL1); //T1计数值合成为16bit整型数,并返回该数

}

  

/* INT1中断服务函数,执行红外接收及解码 */

void EXINT1_ISR() interrupt 2

{

    unsigned char i,j;

    unsigned char byt;

    unsigned int time;

      

    //接收并判定引导码的9ms低电平

    time = GetLowTime();

    if ((time<7833) || (time>8755))  //时间判定范围为8.5~9.5ms,

    {                                //超过此范围则说明为误码,直接退出

        IE1 = 0;                     //退出前清零INT1中断标志

        return;

    }

    //接收并判定引导码的4.5ms高电平

    time = GetHighTime();

    if ((time<3686) || (time>4608))  //时间判定范围为4.0~5.0ms,

    {                                //超过此范围则说明为误码,直接退出

        IE1 = 0;

        return;

    }

  

    //接收并判定后续的4字节数据

    for (i=0; i<4; i++)     //循环接收4个字节

    {

        for (j=0; j<8; j++) //循环接收判定每字节的8个bit

        {

            //接收判定每bit的560us低电平

            time = GetLowTime();

            if ((time<313) || (time>718))        //时间判定范围为340~780us,

            {                                    //超过此范围则说明为误码,直接退出

                IE1 = 0;

                return;

            }

            //接收每bit高电平时间,判定该bit的值

            time = GetHighTime();

            if ((time>313) && (time<718))        //时间判定范围为340~780us,

            {                                    //在此范围内说明该bit值为0

                byt >>= 1;                       //因低位在先,所以数据右移,高位为0

            }

            else if ((time>1345) && (time<1751)) //时间判定范围为1460~1900us,

            {                                    //在此范围内说明该bit值为1

                byt >>= 1;   //因低位在先,所以数据右移,

                byt |= 0x80; //高位置1

            }

            else             //不在上述范围内则说明为误码,直接退出

            {

                IE1 = 0;

                return;

            }

        }

        ircode[i] = byt;     //接收完一个字节后保存到缓冲区

    }

    irflag = 1;              //接收完毕后设置标志

    IE1 = 0;                 //退出前清零INT1中断标志

}


2.infrared.h的代码


因为主函数中只需要使用“InitInfrared();”函数来初始化,而“unsigned int GetHighTime()”和“unsigned int GetLowTime()”都是只在“void EXINT1_ISR() interrupt 2”中使用,所以头文件不用声明这三部分的函数。


#ifndef __INFRARED_H__

#define __INFRARED_H__

   

sbit IR_INPUT = P3^3;           //红外接收引脚

extern unsigned char irflag;    //红外接收标志,收到一帧正确数据后置1

extern unsigned char ircode[4]; //红外代码接收缓冲区

   

void InitInfrared();            //初始化红外接收功能

   

#endif

13.03.png?imageView2/2/w/550

3.main.c测试代码


我们在宋老师的例程lesson16_1中通过按红外遥控器上的按键得知,第一行的三个按键会使ircode[2]分别变为0x45、0x46、0x47显示在数码管上,那么我们只需要判断ircode[2]的数据就可以知道按下的是哪个按键然后去执行相关任务就可以了。


我们用小灯测试红外遥控器的按键是否有效,有效则会切换小灯的亮灭。


#include

#include //详见第六章第8讲

#include

  

void main()

{

    LED_Init();//初始化LED硬件模块

    EA = 1; 

    InitInfrared();

   

    while (1)

    {

        if (irflag)  

        {

            irflag = 0;   

            //以下是遥控器第一行按键

            if(ircode[2]==0x45)LED9=!LED9;

            if(ircode[2]==0x46)LED8=!LED8;

            if(ircode[2]==0x47)LED7=!LED7;

       

            //以下是遥控器第二行按键

            if(ircode[2]==0x44)LED4=!LED4;

            if(ircode[2]==0x40)LED3=!LED3;

            if(ircode[2]==0x43)LED2=!LED2;    

        }  

    }

}


推荐阅读

史海拾趣

Hi-Optel Technologly Co Ltd公司的发展小趣事

Hi-Optel Technologly Co Ltd在电子行业中的五个发展故事

故事一:创立与初期发展

Hi-Optel Technologly Co Ltd(以下简称Hi-Optel)成立于1999年,由国有大型上市公司和国内著名风险投资机构共同投资,注册资本高达1亿美元。公司自创立之初便专注于光纤通信领域的模块开发、制造和营销。初期,Hi-Optel面临着技术挑战和市场开拓的双重压力,但凭借其强大的研发实力和敏锐的市场洞察力,逐步在光纤收发器、TO-CAN等关键产品的研发上取得突破,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品线拓展

随着技术的不断进步,Hi-Optel持续加大研发投入,不断推出新产品以满足市场需求。公司不仅拥有从TO-CAN到光纤收发器等完整产品的研发、生产和处理能力,还涵盖了不同速率和不同封装传输和数据通信的主动模块。这些产品广泛应用于SONET、以太网、FTTx、LTE和IDC光纤传输/接入系统,极大地提升了公司在行业内的竞争力。同时,Hi-Optel还积极拓展产品线,将业务范围延伸至更广泛的电子通信领域。

故事三:市场拓展与品牌建设

在市场拓展方面,Hi-Optel采取了多种策略以扩大市场份额。公司积极参加国内外各类电子通信展会,展示其最新技术和产品,吸引了众多客户和合作伙伴的关注。同时,Hi-Optel还注重品牌建设,通过提升产品质量和服务水平,赢得了客户的广泛好评。此外,公司还建立了完善的销售网络和售后服务体系,为客户提供全方位的支持和服务。

故事四:供应链优化与成本控制

为了应对激烈的市场竞争,Hi-Optel不断优化供应链管理,降低生产成本。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,Hi-Optel还通过引入先进的生产设备和工艺,提高生产效率和产品质量,进一步降低了生产成本。这些措施不仅增强了公司的市场竞争力,还为公司的可持续发展提供了有力保障。

故事五:国际化战略与全球化布局

随着全球化进程的加速,Hi-Optel积极实施国际化战略,拓展海外市场。公司成立了多个海外分支机构,并在多个国家和地区建立了销售网络和售后服务体系。通过与国际知名企业的合作与交流,Hi-Optel不断提升自身的技术水平和品牌影响力。同时,公司还积极参与国际标准和规范的制定工作,推动行业技术的进步和发展。这些努力使得Hi-Optel在全球电子通信领域的影响力日益增强。

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
如果传感器被遮挡或污染,可能无法正常工作。
Auris公司的发展小趣事

Auris公司的创始人Federic Moll博士,被誉为手术机器人之父。他在2007年创立了Auris Health(原名Auris Surgical Robotics),总部位于美国加利福尼亚州圣卡洛斯。Moll博士此前已经成功创办了多家手术机器人企业,其中最为知名的是上市公司Intuitive Surgical,其达芬奇手术机器人技术已在全球范围内广泛应用。Moll博士的深厚技术背景和丰富的创业经验为Auris的起步奠定了坚实的基础。

Electro-Optical Systems Inc公司的发展小趣事

进入21世纪,EOS在红外探测器领域取得了重大技术突破。他们成功将探测器的波长范围扩展到远红外(40微米)领域,这一成果在行业内引起了广泛关注。同时,EOS的产品也凭借其高性能、高可靠性和高稳定性,赢得了广大用户的认可和信赖。他们开始与国内外多家知名企业建立合作关系,产品广泛应用于军事、科研、安防等领域。

AMSCO [Austria micro systems AG]公司的发展小趣事

进入21世纪,EOS在红外探测器领域取得了重大技术突破。他们成功将探测器的波长范围扩展到远红外(40微米)领域,这一成果在行业内引起了广泛关注。同时,EOS的产品也凭借其高性能、高可靠性和高稳定性,赢得了广大用户的认可和信赖。他们开始与国内外多家知名企业建立合作关系,产品广泛应用于军事、科研、安防等领域。

台湾晶豪(ESMT)公司的发展小趣事

随着电子行业的不断发展,晶豪科技也积极应对市场变化。公司扩大代工厂的晶圆开工规模,以满足不断增长的客户需求。这一举措不仅使公司能够更灵活地应对市场波动,还为客户提供了更稳定的产品供应。同时,随着晶圆开工量的增加,公司的销售额也实现了稳步增长。

问答坊 | AI 解惑

[转帖]转一篇学习STM8的好文章

第一节: 心情和时钟 说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。 前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是 ...…

查看全部问答>

监控系统常见的故障现象

安全监控系统常见的故障现象在一个监控系统进入调试阶段、试运行阶段以及交付使用后,有可能出现这样那样的故障现象,如:不能正常运行、系统达不到设计要求的技术指标、整体性能和质量不理想,亦即一些软毛病。这些问题对于一个安防系统工程项目来 ...…

查看全部问答>

M41T11设置完时间之后为什么时间不走啊?

已经设置M41T11的start位,每次读时间都是当初设置的时间值。为什么?…

查看全部问答>

如何在指定的平台开发应用程序

原来在windows mobile 6.0上开发了个应用程序,现在想移植到wince6.0 的PND上(找别人买的,好象没有提供SDK),不知该如何做,我用VS2005,只能选择mobile 6.0的开发环境。我想在在这个pnd上开发程序,并能在其模拟器运行与调试…

查看全部问答>

帮忙看下,这2款PIC 以太网开发板,我该选择谁呢

爱晶电子 基于ENC28J60的PIC以太网开发板(PIC实验板/PIC开发板)  ¥450 http://item.taobao.com/auction/item_detail-db2-cdaacf2253921bc4ab5b5d41b991e651.jhtml 小新电子 PIC18F97J60 以太网开发板 一 口 价: 298.00元 http:/ ...…

查看全部问答>

两个设备是否可以使用Jtag接口通信?

最近做一个项目,把两个现有设备并凑到一起。两个设备CPU需要通信,所有接口都有其他用途,只剩下一个Jtag,有没有办法使用Jtag进行通信?系统是基于Linux的,想不重写驱动就可以通信,不知有没有可能,本人对Jtag没什么了解,望达人指教。…

查看全部问答>

【VxWorks5.x -->VxWorks6.x 移植问题】

大家好,谁有没有做过 PPC的BSP 从 5.X ---> 6.X 的移植啊? 我所知道的是,从6.x对5.X的支持是兼容的,那么我就先把 5.X 的BSP文件夹 如 ppc_myself_XXX 放到 h/config/ 下,然后新建立 BSP 工程,进行编译,可是编译的时候,发现ERROR超多啊 ...…

查看全部问答>

我现在是2000系统,因需要装了个98,现在的问题是装了98后,就进不了2000了

我现在是2000系统,因需要装了个98,现在的问题是装了98后,就进不了2000了…

查看全部问答>

周立功的开发板easyarm2104

现在小弟我手上有款ARM开发板、是周立功出的。型号是easyarm2104 但是所有相关的资料全丢了。有哪位大侠有的,能共享下吗?不胜感激。 …

查看全部问答>

STM32F105USBiap

103系列的好用的USB iap现在挪到105下不好用了。 对这个USB很不了解。 现在哪里能找到基于USB-OTG的USB iap例程? 哪位能分享一下例程不胜感激…

查看全部问答>