/*————————————————————————–
IR.H
The 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]键值反码寄存.
/*======================================== 红外解码部分 ======================================================*/
/*****************************************************
函 数 名:void DelayIR(uchar number)
功 能:延时程序
说 明:对红外信号进行解码时的时刻比较
进口参数:无
返 回 值:无
*****************************************************/
void DelayIR(uchar number)//number*0.14MS
{
uchar i;
while (number–)
{
for(i=13; i>0; i–);
}
}
/*****************************************************
函 数 名:void Delay_bell(void)
功 能:蜂鸣器延时程序
说 明:对蜂鸣器发音延时
进口参数:无
返 回 值:无
*****************************************************/
void Delay_bell(void)
{
uint i;
for(i=0; i<20000; i++)
{
;
}
}
/*****************************************************
函 数 名:void Buzzer(num)
功 能:蜂鸣器发音程序
说 明:对暗码输入正确与否、按键等的提示
进口参数:无
返 回 值:无
*****************************************************/
void Buzzer(num)
{
while (num–)
{
BEEP = 0; // 灯亮
Delay_bell(); // 延时
BEEP = 1; // 灯灭
Delay_bell(); // 延时
}
}
/*****************************************************
函 数 名:void IR_IN()
功 能:红外解码
说 明:把红外编码信号进行解码,并寄存在IRCOM[]中
进口参数:无
返 回 值:无
*****************************************************/
// 外中止0,红外数据接纳
void IR_IN()
{
uchar i,j,k,num = 0;
do // 读引导码
{
for (i=0; i<4; i++)
{
if (IRIN == 0)
{
break;
}
if (i == 3)
{
return;
}
}
DelayIR(20);
}while (IRIN == 1); // 承认IR信号呈现
while (!IRIN)
{
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 (IRIN)
{
DelayIR(1); // 等 IR 变为低电平
}
while (!IRIN)
{
DelayIR(1); // 等 IR 变为高电平
}
while (IRIN) // 核算IR高电平时长
{
DelayIR(1);
num++;
if (num >= 30)
{
return;
}
}
IRCOM[j] = IRCOM[j] >> 1; // 接纳数据右移一位
if (num >= 8)
{
IRCOM[j] = IRCOM[j] | 0x80; // 电平长度大于等于8,则写入高电平
}
num = 0;
} // 读完一字节
} // 按键4字节读完
// 接纳数据检测
if (IRCOM[2] != ~IRCOM[3]) // 8位键码!=8位键反码:按键过错
{
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