AVR單片機紅外解碼程序
頭文件:
本文引用地址: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 // ************* 函數申明 extern void IRInit(void); // 初始化紅外端口 // ************* 全局變量申明 extern uint8 IRCOM[4]; // 紅外編碼暫存 #endif C文件: /****************************************** #include "..SOURCEconfig.h" uint8 IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用戶編碼;IRCOM[2]鍵值碼暫存 IRCOM[j] >>= 1; // 接收數據右移一位 /******************************************************************** 延時函數: /***************************************************** while(tt--)
#define IN_IR (PINE&(1<
extern void IR_decode(void); // 紅外解碼函數
* 程序名稱: 遙控接收程序
* 程序功能: 遙控操作
* 目標硬件: AVR MCU "ATMEGA128" 16.0000MHz
* 文件名稱:telecontrol.c
* 創(chuàng)建日期: 2009-02
* 原創(chuàng)作者: zhaojun
******************************************/
// 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;
}
}
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;
{
for (i=315; i>0; i--)
{
asm(" nop");
}
}
}
評論