历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | AVR红外遥控解码代码

2019-10-29 来源:51hei


/******************红外遥控器解码源代码****************

编译环境:ICCAVR

编译人员:RJW

编译时间:2013_01_10  06:36

代码功能:实现红外遥控器解码,数码管显示用户码和数据码


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

#include

#include

#define uchar unsigned char

#define uint unsigned int

//定义外部中断和定时器中断

#progma interrupt_handler timer1:9

#progma interrupt_handler int0:2

//573使能端宏定义

#define DUAN    PA3

#define WEI     PA4

#define DUAN_OUT   DDRA |= BIT(DUAN)

#define DUAN_SET   PORTA |= BIT(DUAN)

#define DUAN_CLR   PORTA &= ~BIT(DUAN)

#define WEI_OUT   DDRA |= BIT(WEI)

#define WEI_SET   PORTA |= BIT(WEI)

#define WEI_CLR   PORTA &= ~BIT(WEI)

#progma data:code

    const uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};

#progma data:code

    const uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

//定义全局变量

uchar t_num=0,i_num=0,guide_ok=0,receive_ok=0;

//定义用来保存零时数据和编码的数组

uchar time[33];

uchar code[4]={0x40,0x40,0x040,0x40};

/***********1us延时子函数***********

功能:用于延时1us

参数:无

返回值:无

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

void delay_1us()

{

    unsigned char a,b;

    for(b=1;b>0;b--)

        for(a=3;a>0;a--);

}

/***********nus延时子函数***********

功能:用于延时nus

参数:z:代表延时时长,即本函数可延时范围为:(0~65535us)

返回值:无

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

void delay_nus(int z)

{

     int i;

     for(i=z;i>0;i--)

     delay_1us();

}

/***********定时器中断初始化函数***********

功能:设置定时器1中断方式以及分频情况

参数:无

返回值:无

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

void timer1_init()

{

    TCCR1B = 0x01;//设置外部中断1无预分频

    TCNT1H = 0xfb;

    TCNT1L = 0x4f;//设置定时时长为100US

    SREG |= BIT(7);//开启总中断 

}

/***********外部中断初始化函数***********

功能:设置外部中断中断方式以及开启外部中断

参数:无

返回值:无

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

void int0_init()

{

    MCUCR = 0x02;//设置外部中断0下降沿触发方式

    GICR = 0x40;//开启外部中断0中断

    SREG |= BIT(7);//开启总中断

}

/***********定时器中断服务程序***********

功能:用于定时器中断时,计时变量加1

参数:无

返回值:无

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

void timer1()

{

    t_num++;

}

/***********外部中断服务程序***********

功能:用于在响应外部中断的情况下执行相应操作

参数:无

返回值:无

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

void int0()

{

    TIMSK |= BIT(2);//开启定时器1中断

    if(i_num==1)  //判断是否是第二次外部中断

   {

       if(t_num>80)//是否是引导码

       {

            guide_ok=1; //是引导码则标志1  

        }

        else

       {

            guide_ok=0;//不是引导码则标志0

        }

    }

    if(guide_ok==1)    //如果是引导码

    {

        time[i_num]=t_num; //将接收的各位数据保存

        t_num=0;         

        i_num++;

    }

    if(i_num==33)

    {

        i_num=0;

        guide_ok==0;    //清楚引导码标志

        receive_ok=1;  //接收完成标志

    }

}

/***********红外解码函数***********

功能:将接收到的计时码转换为16进制码

参数:无

返回值:无

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

void decode()

{

    uchar i,j,k=1,dat=0;

    for(i=0;i<4;i++)//循环4次取得用户码'用户码'数据码'数据反码

    {

        for(j=0;j<8;j++) //循环8次整合8个bit构成一个字节

        {

            dat>>=1;

            if(time[k]>17)  //PPM方式判断该bit是0还是1

            {

                dat|=0x80;

            }

            k++;

         }

         code[i]=dat;    

     }

     k=0;

     receive_ok=0;

}

/***********数码管显示初始化函数***********

功能:设置数码管段选位选为输出模式

参数:无

返回值:无

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

void smg_init()

{

     DUAN_OUT;  //设置段选端为输出模式

     WEI_OUT;   //设置位选端为输出模式

     DDRB = 0xff;//设置数据端为输出模式

}

/***********数码管显示函数***********

功能:用于显示用户码和数据码

参数:无

返回值:无

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

void smg_display()

{  

    uchar i,k=0;

    for(i=1;i<4;i++)

    {

        DUAN_SET;

        PORTB = duan[code[i]/10];   //将每个码字节的数据高4位送入

        DUAN_CLR;


        WEI_SET;

        PORTB = wei[k];

        WEI_CLR;

        delay_nus(500);  //显示驻留500us


        DUAN_SET;

        PORTB = duan[code[i]%10];   //将每个码字节的数据低4位送入

        DUAN_CLR;


        WEI_SET;

        PORTB = wei[k+1];

        WEI_CLR;

        k=k+2;

        delay_nus(500);  //显示驻留500us

     }

     k=0;

}

void main()

{

    smg_init();   //数码管初始化

    timer1_init();//定时器1初始化

    int0_init();  //外部中断0初始化

    while(1)

   {

       if(receive_ok==1)  //判断33位数据是否接收完成

       {

           decode();      //完成接收开始解码

       }

       smg_display();     //显示

    }

}


推荐阅读

史海拾趣

Diodes Incorporated公司的发展小趣事

Diodes Incorporated公司成立于1970年,其初衷是致力于半导体技术的研发和生产。在创立初期,公司面临着来自行业巨头的激烈竞争,但凭借对技术的深入理解和市场需求的敏锐洞察,Diodes Incorporated逐渐在市场中找到了自己的定位。公司专注于生产高品质、特定应用的半导体产品,逐渐在消费电子、计算机、通信等领域建立了良好的声誉。

CALMIRCO公司的发展小趣事

CALMIRCO公司自成立以来,一直致力于电子技术的研发与创新。在公司发展初期,CALMIRCO团队便成功研发出一款具有划时代意义的智能芯片,该芯片在性能和稳定性上均达到行业领先水平。这一技术突破不仅为CALMIRCO公司赢得了大量市场份额,更推动了整个电子行业的进步。此后,CALMIRCO公司继续加大研发投入,不断推出创新产品,引领行业变革。

Elec & Eltek公司的发展小趣事

Elec公司成立于20世纪初,最初只是一家小型电子元件生产商。创始人李明(化名)对电子技术有着深厚的兴趣和独到的见解。在他的带领下,Elec公司逐步研发出具有竞争力的电阻、电容等基础元件,并逐渐在市场中崭露头角。随着电子技术的不断发展,Elec公司敏锐地捕捉到半导体技术的潜力,开始投入巨资研发。经过数年的努力,Elec公司成功研发出具有自主知识产权的半导体芯片,这一突破让Elec公司在电子行业中声名鹊起。

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

随着产品线的逐渐丰富和技术的不断进步,微芯生物开始积极拓展市场。他们与多家国内外医药企业建立了合作关系,将自主研发的药物推向市场。同时,公司也积极参与各类学术会议和展览,提升品牌知名度和市场影响力。通过不懈的努力,微芯生物逐渐获得了市场的认可和信赖。

Fagor Electrónica公司的发展小趣事

然而,随着市场竞争的加剧和技术的快速变革,Fagor Electrónica也面临着前所未有的挑战。为了应对这些挑战,公司不断加大研发投入,积极引进先进技术和管理经验。同时,Fagor Electrónica还加强了与供应商和客户的合作,以共同应对市场变化。这些努力使得公司在激烈的市场竞争中保持了领先地位。

APX Technologies公司的发展小趣事

为了进一步提升公司实力,APX Technologies开始拓展海外市场。公司在多个国家和地区设立了分支机构,并积极招聘当地的优秀人才。通过不断的努力,APX Technologies的产品逐渐在国际市场上占据了一席之地,公司的规模和影响力也不断扩大。

问答坊 | AI 解惑

PC式硬盘录像机死机全接触(一)

PC式硬盘录像机死机全接触 在使用PC式的硬盘录像机的过程中,难免会遇到许多诸如死机等突发故障,对于平时工作正常的较新机子而言,其中大多数死机都是软件停止了响应造成的,只要强制关闭了这些停止响应的软件,电脑即可恢复正常工作,方法是先按 ...…

查看全部问答>

求助,在5502中SDRAM的写入过程要用210ns,如何提升速度

在TMS320VC5502中,对SDRAM写操作,居然要210ns,简直无法干活,请教前辈,怎样解决这个问题?我对EMIF的相关寄存器进行设置,如WRITE SETUP 、WRITE STROBE 、WRITE HOLD ,对写操作消耗时间一点都没变化,很郁闷呀,在论坛上有说这是5502本身问题 ...…

查看全部问答>

关于磁珠、磁环的选用

磁珠  磁珠专用于抑制信号线、电源线上的高频噪声和尖峰干扰,还具有吸收静电脉冲的能力。磁珠是用来吸 收超高频信号,像一些RF电路,PLL,振荡电路,含超高频存储器电路(DDR SDRAM,RAMBUS等)都需要在电源输入部分加磁珠,而电感是一种蓄能元 ...…

查看全部问答>

指尖“控制”生活的数字家居

几年前,智能化的生活在大多数人看来是一种遥不可及的梦幻,近年来随着相关产业和技术的成熟,经过大量厂家和房地产开发商的宣传推广,越来越多的住宅小区开始配套相对完善的智能家居系统,人们智能化生活的梦想慢慢变成了现实。在南京,已经有数十 ...…

查看全部问答>

WinCE6.0 系统定制及应用开发 问题

在定制WinCE操作系统的时候,我想添加对C#的支持。可是选项中有 .NET Compact Framework 2.0  跟  .NET Compact Framework 2.0-headless两个选择项目。 请问各位大侠,两个有什么不同呢? 还有就是我刚开始添加的是前者,编 ...…

查看全部问答>

射极跟随器问题

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 我想用三极管打一个射极跟随器  应该选取什么型号三极管 …

查看全部问答>

关于port1 中断

对于不同的pin中断该如何区分呢?有没有类似P1IV这样的register ?谢谢…

查看全部问答>

看门狗定时时间到,怎么跳不出循环

#include void main(void) { WDTCTL=WDT_ADLY_1000;//设置看门狗定时时间1000ms IE1|=WDTIE;         //WDT使能 P5DIR|=0x02;        //P5.1输出 P5OUT=0X02; _EINT();//中断 ...…

查看全部问答>