您的位置 首页 ADAS

AVR单片机红外解码程序

在网络上基本上没有avr的红外遥控解码函数,有的也不是ICC的。为了大家的需要,我特地把自己项目需要的红外解码函数发上博客,希望对…

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/275940.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部