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

📄 hs0038b.c

📁 本库函数利用C8051F020 单片机的捕获功能实现了红外HS0038B的解码 代码简洁规范 可以很容易的移植到其它MCU的应用中
💻 C
字号:
#include <c8051f020.h> // SFR 声明

unsigned char xdata  Ir_Data[3]={0,0,0}; //Ir_Data[0]-->设备用户识别码; Ir_Data[1]-->设备用户识别码反码
                                         //Ir_Data[2]-->操作码(键值码); Ir_Data[2]-->操作码(键值码)反码
unsigned char xdata  IrKeyVal=0;         //解码键值
bit  IrKey_sign=0;                       //按键标志,值1表示是红外按键,值2表示是7290按键                     
unsigned char Bit_Cnt=0;                 //红外解码数据接受标识位一帧数据共有4个字节共32位
/***************************************************************************************
**函数名称: PCA0_Init
**函数功能: PCA0初始化
**输入参数: 无
**输出参数: 无
***************************************************************************************/
void PCA0_Init (void)    //PCA0初始化
{
	PCA0MD	  =	0x00;    //PCA0采用系统时钟12分频,禁止PCA0溢出中断
	EIE1	 |=	0x08;    //允许PCA0中断
	PCA0CPM0  =	0x11;    //模块0下降沿中断允许
	CR		  =	0;       //关PCA0
}

/***************************************************************************************
**函数名称: PCA0_INT
**函数功能: PCA0中断处理
**输入参数: 无
**输出参数: 无
***************************************************************************************/
void PCA0_INT (void) interrupt 9
{	
	static unsigned char Irdata;   //用于保存红外接收到的数据
	static unsigned char oldFall;  //用于保存前一次下降沿中断时定时器PCA的数值
	unsigned char temp,newFall;    //用于保存本次下降沿中断时定时器PCA的数值
	EA=0;                          //关总中断,清中断标志位,此步骤不可少	
	CCF0=0;				   
	newFall=PCA0CPH0;		       //读取捕获寄存器的高八位数
	temp=newFall-oldFall; 	       //计算脉冲加间隔的时间
	oldFall=newFall;	
	if(temp>=6&& temp<11) // "0"码
	{
	    temp=0x00;
	    Bit_Cnt++;
	}	
	else 
	   if(temp>10 && temp<=0x15) //"1"码
	   {
	       temp=0x80;
		   Bit_Cnt++;
	   }
	   else 
	      if(temp>=0x59&& temp<=0x65) //引导码信号
	      {
		      Bit_Cnt=0;
		      Ir_Data[0]=0;
		      Ir_Data[1]=0;
		      Ir_Data[2]=0;
		      Ir_Data[3]=0;
		      EA=1;
			  return; 		//返回,等待下次开始接收
	      }	
	      else  //干扰信号
		  { 
		      Bit_Cnt=0;
			  EA=1;
			  return;	
		  }   
    Irdata=Irdata|(unsigned char)temp;//将接收到的一位数据放在Irdata的高位
	switch(Bit_Cnt)
	{	
	    case 8:					//第一字节数据
			Ir_Data[0]=Irdata;
			Irdata=0;
			break;
		case 16:				//第二字节数据
			Ir_Data[1]=Irdata;
			Irdata=0;
			break;
		case 24:				//第三字节数据	
			Ir_Data[2]=Irdata;
			Irdata=0;
			break;
		case 32:				//第四字节数据
			Ir_Data[3]=Irdata;
			Bit_Cnt=0;
			IrKey_sign=1;//一个按键数据发送完毕
			IrKeyVal=Ir_Data[2];
			break;
		default:
			break;
	}
	Irdata=Irdata>>1;//接收到的数据低位在前先发送
	EA=1;
}

⌨️ 快捷键说明

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