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

📄 decode.c

📁 主要供用户进行学习和简单设计
💻 C
字号:
//====================================================================================
//文 件 名: Decode.c
//功能描述: 红外接收头的遥控器接收译码程序
//维护记录: 2006年6月16         by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
unsigned int STime=0x0100;					//定义起始位的低电平持续时间//0x00f5
unsigned int HLTime=0x0028;					//定义高电平(其实是逻辑1)的持续时间//0x0020

unsigned int iData=0x0080;					//锁存I/O口读到的数据
unsigned int iCounter=0;					//用来计数

//====================================================================================
//语法格式: void RN_Initial(void)
//功能描述: 红外接收头的端口初始化函数
//入口参数: 无
//出口参数: 无
//维护记录: 2006年6月26         by hongyan.Feng
//====================================================================================	
void RN_Initial(void)
{	
	*P_IOA_Dir = 0xff00;					//初始化IOA7为带上拉电阻的输入口(红外接收头的数据输入口)
	*P_IOA_Attrib = 0xff00;
	*P_IOA_Data = 0x0080;
}
//====================================================================================
//语法格式: unsigned int Decode(void)
//功能描述: 红外接收头的遥控器译码函数
//入口参数: 无
//出口参数: 译码后数据
//维护记录: 2006年6月26         by hongyan.Feng
//====================================================================================	
unsigned int Decode(void)
{	
	unsigned int iCode=0;					//用来存储译码
	unsigned int Flag,i,SFlag=0;
	unsigned int j;
	unsigned int iTest[8];					//存储各个码读到的高电平持续时间,以便译码
	Flag = 0;
	i = 0;
	iCode = 0;
	
	*P_TimerA_Ctrl = 0x0000;				//TimerA的频率设置为fosc/2
	*P_TimerA_Data = 0xFEB4;				//设置38KHz的计数频率
	*P_INT_Ctrl = 0x1000;					//允许IRQ1中断 
	__asm("INT IRQ");						//开IRQ中断
	
	while(iData==0x0080)					//如果读到IOA8口的值为1,循环读IOA8口的值,等待起始标志到来。----没有信号时HS0038输出高电平
	{
		*P_Watchdog_Clear = 0x0001;
	}
	iCounter = 0;
	while(iData==0)							//读低电平
	{
		*P_Watchdog_Clear = 0x0001;
	}
	if(iCounter>STime)						//判断读到的低电平是否为起始标志----根据观察波形,这个起始位的持续时间是15ms(38*15/2)
	{
		SFlag = 1;							//如果是,起始标志置1
		iCounter = 0;
	}
	while(SFlag == 1)						//读数据----主要是读8位码高电平的持续时间
	{
		while(iData==0x0000)				//如果读到是低电平,等待高电平到来 
			*P_Watchdog_Clear = 0x0001;
		iCounter = 0;
		while(iData==0x0080)				//读到高电平,循环等待下跳沿的到来
		{
			*P_Watchdog_Clear = 0x0001;
		}
		iTest[i] = iCounter;				//下跳沿到来,保存高电平持续时间
		i++;
		if(i>7)								//判断8位是否已经读完
		{ 
		 	SFlag = 0;						//已经读完,清起始标志,以便下一次读取
			i = 0;
		}
	}
	if(iTest[0]>HLTime)						//先译第一位码
		iCode |= 1;
	for(j=1;j<8;j++)						//译剩余7位码
	{
		if(iTest[j]>HLTime)					//1的译码,这个HLTime可以通过示波器观察得到,需要一定的余量 
		{
			iCode = iCode<<1;
			iCode |= 1;
		}
		else								//0的译码
		{
			iCode = iCode<<1;			
			iCode |= 0;
		}
		*P_Watchdog_Clear = 0x0001;
	}
	iCode &= 0x00ff;						//取得最终的译码值
	*P_Watchdog_Clear = 0x0001;
	return iCode;
}

⌨️ 快捷键说明

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