AVR单片机红外解码程序

发布者:SereneWanderer最新更新时间:2016-07-15 来源: eefocus关键字:AVR单片机  红外解码程序 手机看文章 扫描二维码
随时随地手机看文章
       在网络上基本上没有avr的红外遥控解码函数,有的也不是ICC的。为了大家的需要,我特地把自己项目需要的红外解码函数发上博客,希望对需要的人有所帮助。本解码方法是伟纳电子51单片机的解码方法,算是移植吧,应用的是扫描方式,需要的可以加上外中断,用中断方式反应会更快,更实时。本解码程序的关键在于延时函数,如果要移植到别的单片机或别的晶振时,一定要把延时调好。

头文件:

/******************************************
* 程序名称: 遥控接收程序
* 程序功能: 遥控操作
* 目标硬件: AVR MCU "ATMEGA128" 16.0000MHz
* 文件名称:telecontrol.c
* 创建日期: 2009-02
* 原创作者: zhaojun 
******************************************/
#ifndef TELECONTROL_H 
#define TELECONTROL_H

// **************  管脚定义

#define IR 5
#define IN_IR (PINE&(1< #define SET_IR_IN (DDRE &= ~(1< #define SET_IR_PORT (PORTE |= (1<

// *************   函数申明

extern void IRInit(void);               // 初始化红外端口
extern void IR_decode(void);            // 红外解码函数

// *************   全局变量申明

extern uint8  IRCOM[4];                 // 红外编码暂存

#endif

C文件:

/******************************************
* 程序名称: 遥控接收程序
* 程序功能: 遥控操作
* 目标硬件: AVR MCU "ATMEGA128" 16.0000MHz
* 文件名称:telecontrol.c
* 创建日期: 2009-02
* 原创作者: zhaojun 
******************************************/

#include "..\SOURCE\config.h"

uint8  IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用户编码;IRCOM[2]键值码暂存
                 // IRCOM[3]键值反码存放.
     
/***************************************************** 
 函 数 名:void IRInit(void)
 功    能:红外引脚初始化
 说    明:无
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void IRInit(void)
{     
 SET_IR_IN;         // 设置端口为输入
 SET_IR_PORT;    // 开上拉电阻

   
/***************************************************** 
 函 数 名:void IR_decode(void)
 功    能:红外解码函数
 说    明:利用普通端口解码
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void IR_decode(void)
{
    uint8 i,j,k,num = 0;
 
 do   // 读引导码
 {
     for (i=0; i<4; i++)
  {
      if (!IN_IR) break;
   if (i == 3)
   {
       return;
   }
  }
  DelayIR(20);
 }while (IN_IR);
 
 while(!IN_IR){DelayIR(1);}               // 等IR变为高电平
 
    // 读4字节按键编码 = 16位的用户码+8位键值码+8位键值反码 
 for (j=0; j<4; j++)
  { // 解码原理:0=0.8ms的低电平+0.4ms的高电平;1=0.8ms的低电平+1.6ms的高电平
     for (k=0; k<8; k++)                    // 8位一接收
     {
      while (IN_IR){DelayIR(1);}         // 等 IR 变为低电平  
       while (!IN_IR){DelayIR(1);}         // 等 IR 变为高电平       
        while (IN_IR)                      // 计算IR高电平时长
        {
         DelayIR(1);
         num++;           
         if (num >= 30)
      {
          return;
      }
     }

        IRCOM[j] >>= 1;                   // 接收数据右移一位
        if (num >= 8)
     {
         IRCOM[j] |= 0x80;             // 电平长度大于等于8,则写入高电平
     } 
        num = 0;
     
     }                                    // 读完一字节
  }                                       // 按键4字节读完
                                             // 接收数据检测   
 if (IRCOM[2] !=~ IRCOM[3])               // 8位键码!=8位键反码:按键错误
 {
     return;
 }   
 Ringing(1,100,50);                       // 蜂鸣器响1声
}

/********************************************************************
                            End Of File
********************************************************************/

延时函数:

/***************************************************** 
 函 数 名:void DelayIR()
 功    能:红外解码延时函数
 说    明:0.14MS延时函数
 入口参数:tt 
 返 回 值:无  
 *****************************************************/
void DelayIR(uint8 tt) 
{
    uint16 i;

    while(tt--)
 {
     for (i=315; i>0; i--)
  {
      asm(" nop");      
  }
 }
}

关键字:AVR单片机  红外解码程序 引用地址:AVR单片机红外解码程序

上一篇:STM32串口库函数版例程
下一篇:ICC AVR精确定时的编程实验

推荐阅读最新更新时间:2024-03-16 15:00

AVR单片机(学习ing)—(一)、ATMEGA16的I\0端口的使用—01
一、ATMEGA16的I\0端口的使用:(只有一个实验,下面的部分每个小节可能有几个实验验证,你懂得) 一—(01)、)—使用4*4行列式按键开关的使用 I/O端口介绍: 直接一个图就哦了,因为根本没什么,就是控制寄存器(这里一定要注意,后面的ATmega16的引脚的功能都是控制寄存器来实现引脚或者器件的功能的,说白了,知道了寄存器,会用了寄存器,再来点51的基础,那这些东西真的就没什么了,AVR单片机很简单的~~~) 我用的就是IAR和Proteus(我这还有AVRStudio和WinAVR,有要的Q我,哈哈 好了先给个图,这个是按照手机上的设计的~~你看了就懂了 别的就不费话了,一看图不就全明白了 然后就是今天的
[单片机]
<font color='red'>AVR单片机</font>(学习ing)—(一)、ATMEGA16的I\0端口的使用—01
AVR单片机高精度延时程序汇编语言 可以直接使用
波特率为7.3728MHZ 延时1ms,精度误差为10us ;******************************** delay_1ms: ldi r27,41 delay_11: ldi r28,35 delay_22: nop nop dec r28 brne delay_22 dec r27 brne delay_11 ret ;***************************
[单片机]
AVR单片机Atmega128外扩RAM
由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器)、I/O寄存器、扩展I/O寄存器和内部SRAM的连续内部存储空间。所以在扩展外部RAM时,和内部SRAM地址重叠的外部RAM地址是不能直接访问的。也就是说扩展的外部RAM每64k要浪费掉内部SRAM那么大的空间(AT90系列如此)。所幸的是mega系列解决了这一缺点,专门有一个寄存器XMCRB用来解决对与内部SRAM地址空间相同地址的外部RAM访问。其低三位XMM2 、XMM1 、XMM0三位的设置,决定高位地址线PC口的哪些口线被释放为普通I/O,而不是作为高位地址。这
[单片机]
<font color='red'>AVR单片机</font>Atmega128外扩RAM
任务9:编写程序,实现“倒计时器”
本系列教程以AVR单片机为对象,介绍单片机的快速开发方法。 参考教材:《单片机技术及应用项目教程》 栾秋平 电子工业出版社 2019.6 第1版 本文介绍使用74HC595在LED阵列上,显示数字“0-9”的方法。 一、数字字模0-9 1、0的字模:0x80、0xB6、0x80 2、1的字模0xFF、0x80、0xFF 3、2的字模0x86、0xB6、0xB0 4、3的字模0xB6、0xB6、0x80 5、4的字模0xF0、0xF7、0x80 6、5的字模0xB0、0xB6、0x86 7、6的字模0x80、0xB6、0x86 8、7的字模0xFE、0xFE、0x80 9、8的字模0x80
[单片机]
任务9:编写<font color='red'>程序</font>,实现“倒计时器”
摆脱仿真器的AVR单片机程序开发设计
在开发单片机程序时,有许多人依赖于仿真机,一旦离开了仿真机开发程序时就感觉无从下手。其实对FLASH存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手: 一、尽量使用高级语言开发系统程序 您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。在开发程序时,除了建立一个良好的开发文档外,使用语言的选择也很重要。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机的汇编高手而言,他是能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、
[单片机]
AVR单片机GCC编程:外部中断基本操作
#include avr/io.h #include avr/interrupt.h #include avr/signal.h int main(void) { MCUCR |= (1 ISC11); //INT1 下降沿触发 MCUCR |= ((1 ISC00) | (1 ISC01)); //INT0 上升沿触发 GICR |= ((1 INT1) | (1 INT0)); //INT0, INT1 使能 sei(); //全局中断使能SREG.I //中断发生时, 通用中断标志寄存器GIFR中相应INTF0,INTF1置位,时入中断服务程序后自动清零,也可以人为清零. } SIGNAL(SIG_INTERR
[单片机]
如何解决AVR单片机熔丝位锁死的问题
1.AVR单片机熔丝位锁死简单快捷的解密方法: 在很多AVR单片机的初学者在使用AVR单片机中,很容易把熔丝位弄错而造成单片机锁死,比如说JTAGEN置为1后,单片机的JTAG就不能再下载程序进去了,因此给我们带来很多麻烦。 常见的恢复方法是使用并口编程器来恢复,对于初学者来说,很多设备是很欠缺的,所以很难解决。 现为我们初学者介绍一个简单实用可行的方法——有源晶振恢复法。将被锁死的AVR单片机接入最小系统或者开发板中,将系统中的晶振拆下来,在XAIL1接上有源晶振的第三脚(按下图接即可)。 然后通电,使用ISP下载线进行熔丝位编辑,本人使用智峰progisp(Ver 1.6.7)软件,打开软件选择好芯片型号,使用默
[单片机]
如何解决<font color='red'>AVR单片机</font>熔丝位锁死的问题
基于AVR单片机高精度电子秤设计
0 引言 随着电子技术和自动化测量技术的不断发展,传统的称重系统在功能、精度、性价比等方面已难以满足人们的需要,尤其在智能化、便携式、对微小质量的测量方面更显得力不从心。近年来,新型单片机的出现和集成电路技术的发展为更新产品设计,研制高性价比的称重控制器提供了条件。本设计采用AVR单片机为控制核心,结合电阻应变式压力传感器和相应的信号采集电路,设计出一种高精度、多功能、低成本的新型电子秤。 1 系统总体设计 首先由称重传感器采集因压力变化而产生的电压信号,通过A/D转换器将模拟信号转换为数字信号,把数字信号送入AVR单片机,单片机做相应的处理后,得到当前物体重量的数据,并通过LCD显示出来。系统硬件结构如图1所示。 系
[单片机]
基于<font color='red'>AVR单片机</font>高精度电子秤设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved