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

📄 irdrv.c

📁 这是红外接受部分的程序
💻 C
字号:
//***********************************************************************************************************************
//	*Filedis:		IR driver
//	*Author:		Meijjun Wang,ShangHai,China
//	*E-MAIL:		Jimmy416@163.com
// 	*Sys Info:		MCS51 @ 12MHz /DG00B board
//	*date:			2006.5
//***********************************************************************************************************************
//*****************************************************************************************************************
//红外发射芯片UPD6121G接收驱动程序
//接收头为一体化红个接收头,可以将38K红外信号解调成TTL电平
//*****************************************************************************************************************
#include <reg52.h>
#include "1602.h"
#include "IrDrv.h"

unsigned int HardId,IRValue;
bit okflag=0;

//---------------------------------------------------------------------
//延时,延时时间为 val*2+3 us
//@12MHz
//---------------------------------------------------------------------
void delayus(unsigned char val){
	while(--val);
}


//---------------------------------------------------------------------
//初始化
//---------------------------------------------------------------------
void IrInit(void){
	INT0 = 1;
	EA = 1;									//开中断
	EX0 = 1;								//外部中断0开启
	IE0 = 1;								//外部中断边沿触发
}


//--------------------------------------------------------------------
//中断服务程序
//--------------------------------------------------------------------
void Int0ser(void) interrupt 0{
	unsigned char i=0;
	unsigned int count=0;
	EX0 = 0;								//关闭INT0中断
	
	//------------------------------------------------------------
	count=0;
	while(INT0==0){							//开始时序中的9ms低电平等待
		count++;
		if(count>=3000){					//超时
			EX0 = 1;
			return;
		}
	}
	//------------------------------------------------------------
	count=0;
	while(INT0==1){							//开始时序中的4.5ms高电平等待
		count++;
		if(count>=1500){					//超时
			EX0 = 1;
			return;
		}
	}
	//------------------------------------------------------------
	HardId = 0x00;
	for(i=0;i<16;i++){						//32个位接收

		count = 0;
		while(INT0==0){						//等待0.56ms低电平过去
			count++;
			if(count>=3000){				//超时
				EX0 = 1;
				return;
			}
		}

		delayus(200);delayus(200);			//延时大概800us
		if(INT0==1)	{HardId |= (0x01<<i);}	//'1',如果800us后还是1,表示此位为1,否则为0

		count = 0;
		while(INT0==1){						//等待高电平过去
			count++;
			if(count>=3000){				//超时
				EX0 = 1;
				return;
			}
		}
	}
	//-------------------------------------------------------------
	IRValue = 0x00;
	for(i=0;i<16;i++){						//16个硬件标实位接收

		count = 0;
		while(INT0==0){						//等待0.56ms低电平过去
			count++;
			if(count>=3000){				//超时
				EX0 = 1;
				return;
			}
		}

		delayus(200);delayus(200);			//延时大概800us
		if(INT0==1)	{IRValue |= (0x01<<i);}	//'1',如果800us后还是1,表示此位为1,否则为0

		count = 0;
		while(INT0==1){						//等待高电平过去
			count++;
			if(count>=3000){				//超时
				EX0 = 1;
				return;
			}
		}
	}
	//------------------------------------------------------------

	okflag = 1;
	EX0 = 1;								//重开INT0中断
}


unsigned char GetIrValue(void){
	unsigned int temp,temp2;
	if(okflag){
		okflag = 0;
		temp = (IRValue>>8)&0x00FF;
		temp2 = (~IRValue & 0x00FF);
		if(temp==temp2){
			return temp;
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -