新闻中心

EEPW首页>嵌入式系统>设计应用> 自制51单片机常用头文件(红外解码)

自制51单片机常用头文件(红外解码)

作者: 时间:2016-11-10 来源:网络 收藏
/*--------------------------------------------------------------------------

IR.H

本文引用地址://m.amcfsurvey.com/article/201611/317355.htm

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



评论


技术专区

关闭