新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR單片機紅外解碼程序

AVR單片機紅外解碼程序

作者: 時間:2016-11-10 來源:網絡 收藏
在網絡上基本上沒有avr的紅外遙控解碼函數,有的也不是ICC的。為了大家的需要,我特地把自己項目需要的紅外解碼函數發(fā)上博客,希望對需要的人有所幫助。本解碼方法是偉納電子51單片機的解碼方法,算是移植吧,應用的是掃描方式,需要的可以加上外中斷,用中斷方式反應會更快,更實時。本解碼程序的關鍵在于延時函數,如果要移植到別的單片機或別的晶振時,一定要把延時調好。

頭文件:

本文引用地址:http://m.butianyuan.cn/article/201611/317366.htm

/******************************************
* 程序名稱: 遙控接收程序
* 程序功能: 遙控操作
* 目標硬件: AVR MCU "ATMEGA128" 16.0000MHz
* 文件名稱:telecontrol.c
* 創(chuàng)建日期: 2009-02
* 原創(chuàng)作者: 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
* 創(chuàng)建日期: 2009-02
* 原創(chuàng)作者: zhaojun
******************************************/

#include "..SOURCEconfig.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變?yōu)楦唠娖?br />
// 讀4字節(jié)按鍵編碼 = 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 變?yōu)榈碗娖?br /> while (!IN_IR){DelayIR(1);} // 等 IR 變?yōu)楦唠娖?
while (IN_IR) // 計算IR高電平時長
{
DelayIR(1);
num++;
if (num >= 30)
{
return;
}
}

IRCOM[j] >>= 1; // 接收數據右移一位
if (num >= 8)
{
IRCOM[j] |= 0x80; // 電平長度大于等于8,則寫入高電平
}
num = 0;

} // 讀完一字節(jié)
} // 按鍵4字節(jié)讀完
// 接收數據檢測
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");
}
}
}



評論


技術專區(qū)

關閉