IRHS0038解码程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(RES>=200&&RES<250)OK=1;//获得前导位4.5ms
else if(RES>=85&&RES<250) //按键次数加1
{
REMOTE_RDY=1;//一帧数据接收完成
REMOTE_CNT++;//按键次数加1
break ;
}
else if(RES>=50&&RES<85)RODATA=1;//接收到1
REMOTE_RDY=0;//帧接收标志清零
if(t1==(u8)~t2&&t1==REMOTE_ID) //地址码和地址反码校验正确
{
t1=REMOTE_ODR>>8;//获取控制码
t2=REMOTE_ODR;//获取控制反码
if(t1==(u8)~t2)return(t1); //控制码和控制反码校验正确
//要么是干扰信号,Байду номын сангаас么是无用信号!
void EXTI1_IRQHandler(void)
{
u8 RES;
u8 OK=0;
u8 RODATA=0;
while(1)
{
if(RDATA==1)//有高脉冲出现
{
RES=PULSE_WIDTH_CHECK(); //测量高电平时长
if(RES==250)break ;//一帧发送完成,收到结束信号跳出!
else if(RES>=10&&RES<50)RODATA=0;//接收到0
if(OK)
{
REMOTE_ODR<<=1;//接收发送过来的字节
REMOTE_ODR+=RODATA; //最开始接收字节最高位!(这个可以自定义!)
REMOTE_CNT=0;//按键次数清零
}
}
}
EXTI->PR=1<<1; //清除line1中断标志位
#include "REDREMOTE.H"
#include "DELAY.H"
#include "SYS.H"
//参考正点原子,例说STM32中的IR部分得来!
u32 REMOTE_ODR=0;
u8 REMOTE_CNT=0;
u8 REMOTE_RDY=0;
#define RDATA PAin(1)
}
return(t);
}
//处理红外接收信号
//波长区间检测
//第一个下降沿触发:高电平持续时间4.5MS, RES>4MS&&RES<5MS ,判断为接收到前导码
//第2个下降沿触发:高电平持续时间0.56MS,判断接收到0;RES>0.2MS&&RES<1MS
//高电平持续时间1.68MS,判断接收到1;RES>1MS&&RES<1.7MS
}//返回控制码
return(0);//错误返回0
}
//1 : 0.56ms低电平+1.68ms高电平
//连发码:9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平
u8 PULSE_WIDTH_CHECK(void)
{
u8 t=0;
while(RDATA)//有高电平过来!
{//测量高电平时长
t++;delay_us(20);
if(t==250)return(t); //5ms超时
//初始时,IR数据线被拉高,当IR接收到数据时,被拉低
//所以这里的外部中断1,用下降沿来搞!
MY_NVIC_Init(0,0,EXTI1_IRQChannel,2);
//
}
//检测脉冲宽度
//IR向单片机发送的解码波长
//同步码头:9ms低电平+4.5ms高电平
//0 : 0.56ms低电平+0.56ms高电平
void REMOTE_INIT(void)
{
RCC->APB2ENR|=1<<2;//PA时钟开启
GPIOA->CRL&=0XFFFFFF0F;//PA1配置成模拟输入模式
GPIOA->CRL|=0X00000080;
GPIOA->ODR|=1<<1;//PA1上拉
Ex_NVIC_Config(GPIO_A,1,FTIR);//PA1下降沿触发
//按键按下次数触发:高电平持续时间2.5MS ,RES>1.7MS&&RES<5MS
//干扰/无用信号过来:高电平持续时间>5MS.
//干扰/无用信号时长可以反推证明:前导码触发,高电平持续时间不会超过4.5MS。
//而其他有用信号,触发后,高电平都不会持续5MS.故此认为,>5MS的信号要么是干扰信号,
}
//处理红外键盘
//校验正确,返回控制码
//错误,返回0
u8 REMOTE_PROCESS(void)
{
u8 t1,t2 ;
t1=REMOTE_ODR>>24;//获取地址码
//总共接收了32-bit数据
//地址码-地址反码-控制码-控制反码
t2=(REMOTE_ODR>>16)&0XFF; //获取地址反码
else if(RES>=85&&RES<250) //按键次数加1
{
REMOTE_RDY=1;//一帧数据接收完成
REMOTE_CNT++;//按键次数加1
break ;
}
else if(RES>=50&&RES<85)RODATA=1;//接收到1
REMOTE_RDY=0;//帧接收标志清零
if(t1==(u8)~t2&&t1==REMOTE_ID) //地址码和地址反码校验正确
{
t1=REMOTE_ODR>>8;//获取控制码
t2=REMOTE_ODR;//获取控制反码
if(t1==(u8)~t2)return(t1); //控制码和控制反码校验正确
//要么是干扰信号,Байду номын сангаас么是无用信号!
void EXTI1_IRQHandler(void)
{
u8 RES;
u8 OK=0;
u8 RODATA=0;
while(1)
{
if(RDATA==1)//有高脉冲出现
{
RES=PULSE_WIDTH_CHECK(); //测量高电平时长
if(RES==250)break ;//一帧发送完成,收到结束信号跳出!
else if(RES>=10&&RES<50)RODATA=0;//接收到0
if(OK)
{
REMOTE_ODR<<=1;//接收发送过来的字节
REMOTE_ODR+=RODATA; //最开始接收字节最高位!(这个可以自定义!)
REMOTE_CNT=0;//按键次数清零
}
}
}
EXTI->PR=1<<1; //清除line1中断标志位
#include "REDREMOTE.H"
#include "DELAY.H"
#include "SYS.H"
//参考正点原子,例说STM32中的IR部分得来!
u32 REMOTE_ODR=0;
u8 REMOTE_CNT=0;
u8 REMOTE_RDY=0;
#define RDATA PAin(1)
}
return(t);
}
//处理红外接收信号
//波长区间检测
//第一个下降沿触发:高电平持续时间4.5MS, RES>4MS&&RES<5MS ,判断为接收到前导码
//第2个下降沿触发:高电平持续时间0.56MS,判断接收到0;RES>0.2MS&&RES<1MS
//高电平持续时间1.68MS,判断接收到1;RES>1MS&&RES<1.7MS
}//返回控制码
return(0);//错误返回0
}
//1 : 0.56ms低电平+1.68ms高电平
//连发码:9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平
u8 PULSE_WIDTH_CHECK(void)
{
u8 t=0;
while(RDATA)//有高电平过来!
{//测量高电平时长
t++;delay_us(20);
if(t==250)return(t); //5ms超时
//初始时,IR数据线被拉高,当IR接收到数据时,被拉低
//所以这里的外部中断1,用下降沿来搞!
MY_NVIC_Init(0,0,EXTI1_IRQChannel,2);
//
}
//检测脉冲宽度
//IR向单片机发送的解码波长
//同步码头:9ms低电平+4.5ms高电平
//0 : 0.56ms低电平+0.56ms高电平
void REMOTE_INIT(void)
{
RCC->APB2ENR|=1<<2;//PA时钟开启
GPIOA->CRL&=0XFFFFFF0F;//PA1配置成模拟输入模式
GPIOA->CRL|=0X00000080;
GPIOA->ODR|=1<<1;//PA1上拉
Ex_NVIC_Config(GPIO_A,1,FTIR);//PA1下降沿触发
//按键按下次数触发:高电平持续时间2.5MS ,RES>1.7MS&&RES<5MS
//干扰/无用信号过来:高电平持续时间>5MS.
//干扰/无用信号时长可以反推证明:前导码触发,高电平持续时间不会超过4.5MS。
//而其他有用信号,触发后,高电平都不会持续5MS.故此认为,>5MS的信号要么是干扰信号,
}
//处理红外键盘
//校验正确,返回控制码
//错误,返回0
u8 REMOTE_PROCESS(void)
{
u8 t1,t2 ;
t1=REMOTE_ODR>>24;//获取地址码
//总共接收了32-bit数据
//地址码-地址反码-控制码-控制反码
t2=(REMOTE_ODR>>16)&0XFF; //获取地址反码