自制51單片機(jī)常用頭文件(紅外解碼)
IR.H
本文引用地址:http://www.ex-cimer.com/article/201611/317355.htmThe user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __IR_H__
#define __IR_H__
#define uchar unsigned char
#define uint unsigned int
#define IRIN P3_2 // 紅外引腳
#define BEEP P3_7 // 蜂鳴器引腳
uchar IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用戶編碼;IRCOM[2]鍵值碼暫存
// IRCOM[3]鍵值反碼存放.
/*======================================== 紅外解碼部分 ======================================================*/
/*****************************************************
函 數(shù) 名:void DelayIR(uchar number)
功 能:延時(shí)程序
說 明:對(duì)紅外信號(hào)進(jìn)行解碼時(shí)的時(shí)間比較
入口參數(shù):無
返 回 值:無
*****************************************************/
void DelayIR(uchar number)//number*0.14MS
{
uchar i;
while (number--)
{
for(i=13; i>0; i--);
}
}
/*****************************************************
函 數(shù) 名:void Delay_bell(void)
功 能:蜂鳴器延時(shí)程序
說 明:對(duì)蜂鳴器發(fā)音延時(shí)
入口參數(shù):無
返 回 值:無
*****************************************************/
void Delay_bell(void)
{
uint i;
for(i=0; i<20000; i++)
{
;
}
}
/*****************************************************
函 數(shù) 名:void Buzzer(num)
功 能:蜂鳴器發(fā)音程序
說 明:對(duì)密碼輸入正確與否、按鍵等的提示
入口參數(shù):無
返 回 值:無
*****************************************************/
void Buzzer(num)
{
while (num--)
{
BEEP = 0; // 燈亮
Delay_bell(); // 延時(shí)
BEEP = 1; // 燈滅
Delay_bell(); // 延時(shí)
}
}
/*****************************************************
函 數(shù) 名:void IR_IN()
功 能:紅外解碼
說 明:把紅外編碼信號(hào)進(jìn)行解碼,并存放在IRCOM[]中
入口參數(shù):無
返 回 值:無
*****************************************************/
// 外中斷0,紅外數(shù)據(jù)接收
void IR_IN()
{
uchar i,j,k,num = 0;
do // 讀引導(dǎo)碼
{
for (i=0; i<4; i++)
{
if (IRIN == 0)
{
break;
}
if (i == 3)
{
return;
}
}
DelayIR(20);
}while (IRIN == 1); // 確認(rèn)IR信號(hào)出現(xiàn)
while (!IRIN)
{
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 (IRIN)
{
DelayIR(1); // 等 IR 變?yōu)榈碗娖?br />}
while (!IRIN)
{
DelayIR(1); // 等 IR 變?yōu)楦唠娖?br />}
while (IRIN) // 計(jì)算IR高電平時(shí)長
{
DelayIR(1);
num++;
if (num >= 30)
{
return;
}
}
IRCOM[j] = IRCOM[j] >> 1; // 接收數(shù)據(jù)右移一位
if (num >= 8)
{
IRCOM[j] = IRCOM[j] | 0x80; // 電平長度大于等于8,則寫入高電平
}
num = 0;
} // 讀完一字節(jié)
} // 按鍵4字節(jié)讀完
// 接收數(shù)據(jù)檢測
if (IRCOM[2] != ~IRCOM[3]) // 8位鍵碼!=8位鍵反碼:按鍵錯(cuò)誤
{
return;
}
Buzzer(1); // 有鍵按下,蜂鳴器響一聲
}
/*===================================
DT9122D 遙控器
****** 紅外遙控器鍵值表 ***********
| 10 | 03 | 01 | 06 |
- - - - - - - - - - - - - - - - - - -
| 09 | 1D | 1F | 0D |
- - - - - - - - - - - - - - - - - - -
| 19 | 1B | 11 | 15 |
- - - - - - - - - - - - - - - - - - -
| 17 | 12 | 16 | 4C |
- - - - - - - - - - - - - - - - - - -
| 40 | 48 | 04 | 00 |
- - - - - - - - - - - - - - - - - - -
| 02 | 05 | 54 | 4D |
- - - - - - - - - - - - - - - - - - -
| 0A | 1E | 0E | 1A |
- - - - - - - - - - - - - - - - - - -
| 1C | 14 | 0F | 0C |
=====================================*/
#endif
評(píng)論