⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.h

📁 单片机开发的一个完整性
💻 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 + -