红外遥控接收模块+普中51单片机+江科大自化协

发布者:Tianyun2021最新更新时间:2024-08-05 来源: cnblogs关键字:红外遥控  接收模块 手机看文章 扫描二维码
随时随地手机看文章

1 实验现象

  LCD1602上显示红外解码遥控器地址、键值。通过红外遥控器,按下某个按键时,遥控器通过红外发光二极管发射红外线,红外一体化接受头接受信号,并对其解码,单片机处理相应的信息,将得到的数据显示在LCD1602上。

2 实验原理

 红外遥控是一种无线、非接触控制技术,具有抗干扰性能力强,信息传输可靠,功耗低、成本低、易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,在工业设备中也得到广泛应用。

什么是红外线?红外线是一种肉眼看不见的光。红外线是波长介于微波和可见光之间的电磁波,波长在760nm和1000nm之间,是波形比红光长的非可见光。

如何发出红外光?红外发射二极管就可以发出红外线。最常用的红外发射管是发出940nm的红外光。它的外形类似二极管,但是它发射出来的是红外光,是我们肉眼所看不到的。发光二极管的亮度会随着电路的增大而增加,同样的道理,红外发射管发射红外线的强度也会随着电流的增大而增强。

红外遥控基本原理:红外遥控器常用的载波的方式传送二级制编码,常用的载波频率为38KHz,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,井缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。

3 系统设计

4 硬件设计(略)

5 软件设计


5.1 主函数


#include

#include 'lcd1602.h'

#include 'InfraredRemote.h'


unsigned char Num;

unsigned char address;

unsigned char command;


void main()

{

    LCD1602_Init();

    LCD1602_ShowString(1,1,'ADDR  CMD  NUM');

    LCD1602_ShowString(2,1,'00    00   000');

    

    IR_init();

    

    while(1)

    {

        if(IR_getdataflag()||IR_getrepeatflag()) //如果收到数据帧或者收到连发帧

        {

            address=IR_getaddress();    //获取遥控器地址码

            command=IR_getcommand();    //获取遥控器命令码

            

            LCD1602_ShowHexNum(2,1,address,2);    //显示遥控器地址码

            LCD1602_ShowHexNum(2,7,command,2);    //显示遥控器命令码

            

            if(command==IR_VOL_MINUS)    //如果遥控器VOL-按键按下

            {

                Num--;                    //Num自减

            }

            

            if(command==IR_VOL_ADD)        //如果遥控器VOL+按键按下

            {

                Num++;                    //Num自增

            }

            LCD1602_ShowNum(2,12,Num,3);//显示Num

        }

    }

}


5.2 红外遥控接收函数


#include

#include 'timer0.h'

#include 'exint0.h'


unsigned int     IR_time;        //记录相邻两个下降沿的时间

unsigned char     IR_state;        //状态机设计

unsigned char     IR_data[4];        //用来接收数据32位,4个字节

unsigned char    IR_pdata;        //用来记录接收第几位数据,0-31


unsigned char     IR_dataflag;    //数据接收完毕标识信号

unsigned char     IR_repeatflag;    //重复发送标识信号

unsigned char     IR_address;        //接收地址

unsigned char     IR_command;        //接收命令


/**

  * @brief  红外遥控初始化

  * @param  无

  * @retval 无

  */

void IR_init(void)

{

    exint0_init();        //外部中断INT0

    timer0_init();        //定时器T0

}


/**

  * @brief  红外遥控获取收到数据帧标志位

  * @param  无

  * @retval 是否收到数据帧,1为收到,0为未收到

  */

unsigned char IR_getdataflag(void)

{

    if(IR_dataflag)

    {

        IR_dataflag=0;

        return 1;

    }

    else

        return 0;

}


/**

  * @brief  红外遥控获取收到连发帧标志位

  * @param  无

  * @retval 是否收到连发帧,1为收到,0为未收到

  */

unsigned char IR_getrepeatflag(void)

{

    if(IR_repeatflag)

    {

        IR_repeatflag=0;

        return 1;

    }

    else

        return 0;

}


/**

  * @brief  红外遥控获取收到的地址数据

  * @param  无

  * @retval 收到的地址数据

  */

unsigned char IR_getaddress(void)

{

    return IR_address;

}


/**

  * @brief  红外遥控获取收到的命令数据

  * @param  无

  * @retval 收到的命令数据

  */

unsigned char IR_getcommand(void)

{

    return IR_command;

}


//外部中断0中断函数,下降沿触发执行,状态机设计

void int0_routine(void) interrupt 0

{

    if(IR_state==0)        //状态0,空闲状态

    {

        timer0_SetCounter(0);    //设置计数器起始值,从0开始计数

        timer0_Run(1);            //启动定时器T0

        IR_state=1;

    }

    else if(IR_state==1)    //状态1,等待Start信号或Repeat信号

    {

        IR_time=timer0_GetCounter(); //获取上一次中断到此次中断的时间

        timer0_SetCounter(0);        //设置计数器起始值,从0开始计数

        //如果计时为9ms+4.5ms=13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)

        if(IR_time>12442-500 && IR_time<12442+500)    //起始信号(11.0592MHz)

        {

            IR_state=2;        //状态2,接收数据

        }

        //如果计时为9ms+2.25ms=11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)

        else if(IR_time>10368-500 && IR_time<10368+500)    //重复信号

        {

            IR_repeatflag=1;    //置收到连发帧标志位为1

            timer0_Run(0);        //关闭定时器T0

            IR_state=0;            //置状态为0

        }

        else  IR_state=1;        //接收错误,状态保持

    }

    else if(IR_state==2)        //接收数据状态

    {

        IR_time=timer0_GetCounter();     //获取上一次中断到此次中断的时间

        timer0_SetCounter(0);            //设置计数器起始值,从0开始计数

        //如果计时为560+560=1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)

        if(IR_time>1032-500 && IR_time<1032+500)        //数据0

        {

            IR_data[IR_pdata/8] &= ~(0x01<<(IR_pdata%8));    //数据对应位清0

            IR_pdata++;        //数据位置指针自增

        }

        //如果计时为560+1690=2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)

        else if(IR_time>2074-500 && IR_time<2074+500)    //数据1

        {

            IR_data[IR_pdata/8] |= (0x01<<(IR_pdata%8));    //数据对应位置1

            IR_pdata++;        //数据位置指针自增

        }

    }

    else                //接收出错

    {

        IR_pdata=0;        //数据位置指针清0

        IR_state=1;        //置状态为1

    }

    if(IR_pdata>=32)    //接收完所有数据

    {

        IR_pdata=0;        //数据位置指针清0

        //判断地址码和地址反码,数据码和数据反码是否相反,数据验证

        if((IR_data[0]==~IR_data[1])&&(IR_data[2]==~IR_data[3]))    

        {

            IR_address=IR_data[0];    //转存数据,地址数据

            IR_command=IR_data[2];    //命令数据

            IR_dataflag=1;            //置收到数据帧标志位为1

        }

        timer0_Run(0);            //关闭定时器T0

        IR_state=0;                //空闲状态

    }        

}


#ifndef _InfraredRemote_h_

#define _InfraredRemote_h_


#define IR_POWER        0x45

#define IR_MODE            0x46

#define IR_MUTE            0x47


#define IR_START_STOP    0x44

#define IR_PREVIOUS        0x40

#define IR_NEXT            0x43


#define IR_EQ            0x07

#define IR_VOL_MINUS    0x15

#define IR_VOL_ADD        0x09


#define IR_0            0x16

#define IR_RPT            0x19

#define IR_USD            0x0D


#define IR_1            0x0C

#define IR_2            0x18

#define IR_3            0x5E


#define IR_4            0x08

#define IR_5            0x1C

#define IR_6            0x5A


#define IR_7            0x42

#define IR_8            0x52

#define IR_9            0x4A


void IR_init(void);

unsigned char IR_getdataflag(void);

unsigned char IR_getrepeatflag(void);

unsigned char IR_getaddress(void);

unsigned char IR_getcommand(void);

    

#endif


5.3 外部中断INT0


#include


void exint0_init(void)

{

    IT0=1;

    IE0=0;

    EX0=1;

    EA=1;

    PX0=1;

}


//void int0_routine(void) interrupt 0

//{

//    

//}

[1] [2]
关键字:红外遥控  接收模块 引用地址:红外遥控接收模块+普中51单片机+江科大自化协

上一篇:红外遥控电机调速+普中51单片机+江科大自化协
下一篇:步进电机控制+普中51单片机+普中官方

推荐阅读最新更新时间:2024-11-03 09:36

基于可控硅的红外遥控开关
  关断单向可控硅的方式有两种:其中一种是众所周知的,就是可控硅的阳极电位低于阴极电位或阳极电流小于维持电流时,可由导通转为关断。别一种则是将可控硅的控制极对地短路,也可以将其关断。单向可控硅具有一触即发实现自锁的功能。本人利用它的这个特性制作了下面这款简单的红外遥控开关电路,如图1所示。 一、工作原理   220V交流电压经电容C1降压,VD1、VD2、C2整流滤波,VD3稳压后输出12V直流电压给本电路供电用。12V直流电压再经R2、VD4、C3进一步稳压滤波后供红外接收头HRM作电源用。   开启过程:静态时脉冲放大管外于饱和状态,集电极输出0.1V低电平,此时可控硅触发电路不工作。瞬间按遥控器(各类彩电、VCD遥控器均
[嵌入式]
基于STC89C52的红外遥控智能太阳能热水器控制系统
0 引言 随着社会节能技术的不断改革创新,太阳能成为新时代可持续发展战略中的绿色标签,太阳能热水器已经变成我们日常里不可或缺的设备。然而,现在商场上销售的太阳能热水器普遍存在如:电路复杂、成本较高、不具有防护功能、易引起管道冻裂、伴热带容易引起火灾、操作繁琐等的问题,使得太阳能热水器在冬天容易引起火灾、容易漏电和浪费电等一系列安全隐患。的系统功能有很的新起管道冻裂,伴热带容易引起火灾。本系统引进的自动上水、自动排空、红外遥控等先进技术正好解决了上述的管道冻裂、容易引起火灾、容易漏电和浪费电等一系列安全隐患,方便使用,节约能源。 1 系统基本结构及功能 系统硬件设计选取STC89C52作为主控芯片,硬件设计涉及以下几个方面;温
[单片机]
基于STC89C52的<font color='red'>红外遥控</font>智能太阳能热水器控制系统
可控硅在红外遥控开关中的应用及工作原理
    关断单向可控硅的方式有两种:其中一种是众所周知的,就是可控硅的阳极电位低于阴极电位或阳极电流小于维持电流时,可由导通转为关断。别一种则是将可控硅的控制极对地短路,也可以将其关断。单向可控硅具有一触即发实现自锁的功能。本人利用它的这个特性制作了下面这款简单的红外遥控开关电路,如图1所示。 一、工作原理   220V交流电压经电容C1降压,VD1、VD2、C2整流滤波,VD3稳压后输出12V直流电压给本电路供电用。12V直流电压再经R2、VD4、C3进一步稳压滤波后供红外接收头HRM作电源用。   开启过程:静态时脉冲放大管外于饱和状态,集电极输出0.1V低电平,此时可控硅触发电路不工作。瞬间按遥控器(各类彩电、VCD遥控
[电源管理]
可控硅在<font color='red'>红外遥控</font>开关中的应用及工作原理
CD4017构成的红外遥控开关电路图
  现在的建筑物照明线路大都采用暗线,如果采用4线制的电子开关去控制这些照明灯,还要另接电源而改造线路,且工程耗时费力,又影响美观。今天我们来设计并制作了一款单线红外遥控开关。它只有单根进线、单根出线,可以直接代换家居中非常普及的墙壁开关,安装和代换都很方便;还可以方便地实现遥控。   一、性能简介:   该电路的优点是:⑴电路采用电流互感器原理来升压,采用二极管限幅、稳压, 巧妙地解决了开关自身供电的难题;⑵ 适用范围广,随便用彩电或影碟机遥控器就能遥控 ⑶它还具有自身压降小、功耗小等优点。      二、工作原理:   如图所示,电路左边A B端为单线进出端,和负载串联后接在220V市电上。集成块CD4017 接成双稳
[电源管理]
CD4017构成的<font color='red'>红外遥控</font>开关电路图
使用AT89S51单片机制作红外遥控器,
本文档的主要内容详细介绍的是使用AT89S51单片机制作红外遥控器的资料和源代码详细说明。 一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。 当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征: 采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。一般电视遥控器的遥控编码是连续的
[单片机]
PLD器件在红外遥控解码的应用
    摘 要: 介绍了红外遥控发射和接收的原理,提出了一种用PLD(可编程逻辑器件)进行解码的方案,并分别用EPROM和GAL实现。该方案思路新颖、原理简单、工作可靠,可用于各种以键盘扫描为输入方式的智能仪器系统中。       关键词: 红外遥控 可编程逻辑器件 遥控解码 键盘扫描       红外遥控技术已经在日常家用电器中得到了广泛应用,其使用方便、功耗低、抗干扰能力强的优点也越来越在智能仪器系统中受到重视。市场上的各种家电红外遥控系统技术成熟、成本低廉,但都是针对各自的遥控对象(彩电、冰箱、空调等),不能直接用于智能仪器。本文探讨了如何借鉴家电红外遥控系统的原理,自行设计解码电
[网络通信]
自学习红外遥控器的设计与实现
    红外遥控在家电产品中有广泛应用,但各产品的遥控器不能相互兼容,目前市面上常见的万能遥控器只能对某几种产品进行控制,不是真正的“万能”。本文利用单片机对遥控器的发射信号的波形进行测量,然后将测量的数据回放,由于只关心发射信号波形中的高低电平的宽度,不管其如何编码,因此做到了真正的“万能”。 1 发射信号波形的测量   所有红外遥控器的输出都是用编码后的串行数据对38kHz~40kHz的方波进行脉冲幅度调制而产生的。如果直接对已调波进行测量,而其脉宽只有20多微秒,由于单片机的指令周期是微秒级,会产生很大的误差。因此,先要对已调波进行解调,对解调后的波形进行测量。   用CX20106对已调波进行解调,原理图如图1所示。
[嵌入式]
51单片机红外遥控解码
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4. 5ms的高电平(结果码)组成,作为接受数据的准备脉冲。以脉宽为0. 56ms、周期为1. 12ms的组合表示二进制的“0”;以脉宽为1. 68ms、周期为2. 24ms的组合表示二进制的“1”。如果按键按下超过108m
[工业控制]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved