标题:
红外解码通用,解决了可以正常解几次码值后原始码值出错问题
[打印本页]
作者:
fuxinyu
时间:
2025-8-6 17:38
标题:
红外解码通用,解决了可以正常解几次码值后原始码值出错问题
原始解码程序
void decode(void) //无线接收码解码
{
if(RFIN)
{
if(High_low) //处理下降沿触发
{
Signal_L = SignalCnt; //保存低电平的时间
SignalCnt=0;//把同周期低电平记录时间清零
High_low=0;//清除下降沿触发标志
Low_high=1; //上升沿触发标志
}
if( Low_high)
{
SignalCnt++ ; //记录同周期高电平时间
}
}
else //引脚为低电平时
{
if(Low_high) //处理上升沿触发
{
Signal_H = SignalCnt; //记录高电平的时间
SignalCnt=0;//把同周期高电平记录时间清零
Low_high=0;//清除上升沿触发标志
if((80<=Signal_L)&& (Signal_L <=100)) // 判断是否为引导码
{
if((40<= Signal_H) && (Signal_H <= 50))
{
tb_flag=1; // 进入红外遥控
}
else
{
goto loop2; //错码清除
}
// CleanTime = 0;
}
// 调教最优解
else if((3<=Signal_L)&& (Signal_L <= 8))//判断是否为高低电平
{
if((3<= Signal_H) && (Signal_H <= 8)) //低电平
{
// Signal_DataTemp >>= 1; /* 右移一位 */
// Signal_DataTemp &= ~(0x80000000); /* 接收到0 */
Signal_DataTemp = Signal_DataTemp << 1;
Signal_DataTemp = Signal_DataTemp + 0;
wx_bit++;
}
else if((14<= Signal_H) && (Signal_H <= 19))//高电平
{
// Signal_DataTemp >>= 1; /* 右移一位 */
// Signal_DataTemp |= 0x80000000; /* 接收到1 */
Signal_DataTemp = Signal_DataTemp << 1;
Signal_DataTemp = Signal_DataTemp + 1;
wx_bit++;
}
else {
goto loop2; //错码清除
}
// CleanTime = 0;
}
else
{ //错码+长按的重复码在此清零
loop2:
Low_high=0;
High_low=0;
tb_flag=0;
SignalCnt = 0;
Signal_DataTemp=0;
return ;
}
if (wx_bit ==32)
{
tb_flag=0;
wx_bit=0;
wx_ok=1;
Timer_100ms =0;
wx_wait_cal = 1;
}
}
High_low=1; //下降沿触发
SignalCnt++ ; //记录低电平时间
}
}
复制代码
原始解码值程序
void cal_rev_code(void) //解码
{
//存32位无线数据
//用户码 //用户码反码 //按键码 //按键码反码
if (wx_wait_cal) //无线码接收成功未写入buf
{
HW_ReceiveBuffer[0] = Signal_DataTemp ; /* 得到地址码 */
HW_ReceiveBuffer[1] = (Signal_DataTemp >> 8) & 0xff; /* 得到地址反码 */
HW_ReceiveBuffer[2] = (Signal_DataTemp >> 16) & 0xff; /* 得到按键码 */
HW_ReceiveBuffer[3] = (Signal_DataTemp >> 24) & 0xff; /* 得到按键反码*/
if (Timer_100ms >= 0&&Timer_100ms <= 6)//前六百毫秒无动作
{
wx_wait_cal = 0;
// Signal_DataTemp=0;
}
}
}
复制代码
通用解码程序
void decode(void) //无线接收码解码
{
if(wx_wait_cal==0)
{
SignalCnt++ ; //记录一位数据周期时间
if(RFIN)
{
Low_high=1;//上升沿触发
}
else //引脚为低电平时
{
if(High_low==0)
{
SignalCnt=0;
High_low=1;//下降沿第一次触发
}
if((High_low==1) &&( Low_high==1)==1) //下降沿第二次触发 一个数据周期
{
if((SignalCnt<=150)&&(SignalCnt>=120)==1) //9+4.5=13.5ms属于引导码 9+2.25=11.25ms属于重复码
{
wx_bit =0;
Low_high=0;
High_low=0;
SignalCnt=0;
}
else if((SignalCnt<=25)&&(SignalCnt>=20)==1) // 高电平 2.25ms=22.5
{
Signal_DataTemp >>= 1; /* 右移一位 */
Signal_DataTemp |= 0x80000000; /* 接收到1 */
wx_bit ++;
Low_high=0;
High_low=0;
SignalCnt=0;
}
else if((SignalCnt<=14)&&(SignalCnt>=7)==1) // 低电平1.12ms=11.2
{
Signal_DataTemp >>= 1; /* 右移一位 */
Signal_DataTemp &= ~(0x80000000); /* 接收到0 */
wx_bit ++;
Low_high=0;
High_low=0;
SignalCnt=0;
}
else
{
Low_high=0;
High_low=0;
wx_bit=0;
Signal_DataTemp=0;
wx_wait_cal=0;
}
if(wx_bit==32)
{
wx_wait_cal=1;
Low_high=0;
High_low=0;
wx_bit=0;
}
}
}
}
}
复制代码
通用解码值程序
void cal_rev_code(void) //解码
{
//存32位无线数据
//用户码 //用户码反码 //按键码 //按键码反码
if (wx_wait_cal==1) //无线码接收成功未写入buf
{
Signal_DataTemp_1=Signal_DataTemp;
HW_ReceiveBuffer[0] = Signal_DataTemp_1 ; /* 得到地址码 */
HW_ReceiveBuffer[1] = (Signal_DataTemp_1 >> 8) & 0xff; /* 得到地址反码 */
HW_ReceiveBuffer[2] = (Signal_DataTemp_1 >> 16) & 0xff; /* 得到按键码 */
HW_ReceiveBuffer[3] = (Signal_DataTemp_1 >> 24) & 0xff; /* 得到按键反码*/
if(HW_ReceiveBuffer[0] == 0X80 && HW_ReceiveBuffer[1] == 0X7F)
{
code_Buffer1= ~(HW_ReceiveBuffer[1]);
code_Buffer2= ~(HW_ReceiveBuffer[3]);
if(HW_ReceiveBuffer[0] == code_Buffer1&&HW_ReceiveBuffer[2] == code_Buffer2)
{
KeyCode_num=HW_ReceiveBuffer[2];
}
}
wx_wait_cal = 0;
Signal_DataTemp_1=0;
Signal_DataTemp=0;
}
}
复制代码
HWV2.0.zip
(993.31 KB, 下载次数: 0)
2025-8-6 17:32 上传
点击文件名下载附件
原始程序
下载积分: 黑币 -5
HWV3.0.zip
(997.32 KB, 下载次数: 0)
2025-8-6 17:33 上传
点击文件名下载附件
通用程序
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1