×
嵌入式 > 嵌入式开发 > 详情

AVR单片机红外解码程序

发布时间:2020-08-21 发布时间:
|
在网络上基本上没有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");
}
}
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
现场总线系统的功能安全评价