单片机
返回首页

AVR单片机红外解码程序

2016-07-15 来源:eefocus

       在网络上基本上没有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');      
  }
 }
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • PIC单片机控制的遥控防盗报警器电路

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • RS-485基础知识:处理空闲总线条件的两种常见方法

    相关电子头条文章