#include <reg52.h>
#include "hs0038ir.h"
unsigned char TN=0;
unsigned char IR_COM[4]={0,0,0,0};//存放解码出来的数据
/*******************************************************************************
* Function Name : void Delay100us(unsigned int dly)
* Description : 延时100us
* Input : dly
* Output : None
* Return : None
*******************************************************************************/
void Delay100us(unsigned int dly)
{
unsigned int j,k;
for(j=dly;j>0;j--)
for(k=16;k>0;k--);
}
/*******************************************************************************
* Function Name : void Delay50Us(unsigned char dly)
* Description : 延时50us
* Input : dly
* Output : None
* Return : None
*******************************************************************************/
void Delay50us(unsigned int dly)
{
while(dly--);
}
/*******************************************************************************
* Function Name : void TimeA_Init()
* Description : 定时器A 初始化配置 捕获模式
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TimeA_Init()
{
TACTL |= TASSEL_2 + TACLR +ID_0 + MC_1;//MCLK 0分频 计数器清零
}
/*******************************************************************************
* Function Name : void IR_Init(void)
* Description : 管脚配置配置
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void IR_Init(void)
{
P1DIR |= BIT5;
P1OUT |= BIT5;
P1DIR &=~BIT5; //红外数据输入端
P1OUT |= BIT5;
// P6DIR |= BIT7; //蜂鸣器
// P6OUT |= BIT7;
P1IE |= BIT5; //使能P1.5中断功能
}
/*******************************************************************************
* Function Name : unsigned char Get_data(void)
* Description : 读取IR管脚数据
* Input : None
* Output : None
* Return : 读取到的数据
*******************************************************************************/
unsigned char Get_data(void)
{
unsigned char stat;
stat = P1IN & BIT5;
return (stat);
}
/*******************************************************************************
* Function Name : unsigned char Get_HighTime(void)
* Description : 计算高脉冲宽度
* Input : None
* Output : None
* Return : 脉冲宽度
*******************************************************************************/
unsigned char Get_HighTime(void)
{
unsigned int n=0;
// TimeA_Init(); //连续计数模式
// CCR0=60000;
while(Get_data()==0x20) //等待低电平
{
n++;
Delay50us(10); //延时 50us
if(n==120)return n ; //最大延时 6ms
}
// n = TAR;
// TACTL = 0;
return n; //返回脉冲宽度
}
/*******************************************************************************
* Function Name : unsigned char Get_HighTime(void)
* Description : 计算低脉冲宽度
* Input : None
* Output : None
* Return : 脉冲宽度
*******************************************************************************/
unsigned char Get_LowTime(void)
{
unsigned char n=0;
// TimeA_Init(); //连续计数模式
// CCR0=60000;
while(Get_data()==0) //等待高电平
{
n++;
Delay50us(10); //延时 50us
if(n==250) return n; //最大延时 12.5ms
}
// n = TAR;
// TACTL = 0;
return n; //返回脉冲宽度
}
/*******************************************************************************
* Function Name : unsigned int Remote_decode(void)
* Description : 解码过程1
* Input : None
* Output : None
* Return : 解码出来的数据
*******************************************************************************/
unsigned int *Remote_decode(void)
{
unsigned char i,j,t=0,rd;
// unsigned int *pr=0;
while(Get_data()==0x20); //等待IR低电平
// if(Get_data()!=0x20)
// {
t = Get_LowTime(); //获取低电平时间
if(t==250) return 0; //超时 不是有用信号
if((t<80)||(t>100)) return 0; //不在8到10ms内 跳出
// while(Get_data()==0x20); //跳过4.5ms高信号
//开始解码
for(i=0;i<4;i++)
{
for(j=8;j>0;j--)
{
IR_COM>>=1;
while(Get_data()==0x20); //等低电平
t = Get_LowTime(); //计算低电平时间
// _NOP();
// if((t<4)||(t>7))return 0; //不在0.5~0.6ms内 跳出
Delay50us(150); //延时0.8ms
if((Get_data()==0x20)) //"1"
{
IR_COM |= 0x80;
}
else //"0"
{
IR_COM &= 0x7f;
}
} if(j==0)j=8;
}
P6OUT ^= BIT7;
Delay100us(5);
// }
// *pr = IR_COM[0];
return 0;
} |