📄 ir.h
字号:
/*--------------------------------------------------------------------------
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() interrupt 0 using 0
功 能:红外解码
说 明:把红外编码信号进行解码,并存放在IRCOM[]中
入口参数:无
返 回 值:无
*****************************************************/
// 外中断0,红外数据接收
void IR_IN() interrupt 0 using 0
{
uchar i,j,k,num=0;
EX0 = 0;
do // 读引导码
{
for(i=0;i<4;i++)
{
if(IRIN==0)break;
if(i==3) {EX0=1;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){EX0=1;return;}
}
IRCOM[j]=IRCOM[j]>>1; // 接收数据右移一位
if(num>=8){IRCOM[j]=IRCOM[j]|0x80;} // 电平长度大于等于8,则写入高电平
num=0;
} // 读完一字节
} // 按键4字节读完
// 接收数据检测
if(IRCOM[2]!=~IRCOM[3]){EX0=1;return;} // 8位键码!=8位键反码:按键错误
Buzzer(1); // 有键按下,蜂鸣器响一声
EX0 = 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -