单片机源程序如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2) //50us进一次中断
{
RF = HAL_GPIO_ReadPin(ASK_Data_GPIO_Port, ASK_Data_Pin);//接收数据的电平 PB9
if (!RF) //如果是低电平
{
ll_w++; // 检测到低电平 低电平时间加1,记录本次电平状态old_rc5
old_rc5=0;
} // 检测到低电平 低电平时间加1,记录本次电平状态old_rc5
else // 检测到高电平
{
hh_w++;
if (!old_rc5) // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
{
if (((hh_w>=2)&&(hh_w<=5))&&((ll_w>=100)&&(ll_w<=130))) //判同步码 2/5 100/130
{
tb_ok = 1 ;
ma_x = 0;
bma1=0; bma2=0; bma3=0; bma4=0;
}
else if ((tb_ok)&&((ll_w>=8)&&(ll_w<=13))) // 8/13
{
ma_x++; //已经接收到同步码,判0
if(ma_x>23)
{
if(!rf_ok1) //rf_ok1 临时接收成功
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
mma4=bma4; //将接收到的编码复制到解码寄存器中
rf_ok1=1; // 通知解码子程序可以解码了
tb_ok=0;
// bt_auto=0;
s=1000;
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
mmb4=bma4; //将接收到的编码复制到解码寄存器中
rf_ok2=1; // 通知解码子程序可以解码了
tb_ok=0;
// bt_auto=0;
}
}
}
else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=7))) // 2/7
{
switch (ma_x)
{
case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位
case 1 : { bma1=bma1 | 0x40; break; }
case 2 : { bma1=bma1 | 0x20; break; }
case 3 : { bma1=bma1 | 0x10; break; }
case 4 : { bma1=bma1 | 0x08; break; }
case 5 : { bma1=bma1 | 0x04; break; }
case 6 : { bma1=bma1 | 0x02; break; }
case 7 : { bma1=bma1 | 0x01; break; }
case 8 : { bma2=bma2 | 0x80; break; }
case 9 : { bma2=bma2 | 0x40; break; }
case 10: { bma2=bma2 | 0x20; break; }
case 11: { bma2=bma2 | 0x10; break; }
case 12: { bma2=bma2 | 0x08; break; }
case 13: { bma2=bma2 | 0x04; break; }
case 14: { bma2=bma2 | 0x02; break; }
case 15: { bma2=bma2 | 0x01; break; }
case 16: { bma3=bma3 | 0x80; break; }
case 17: { bma3=bma3 | 0x40; break; }
case 18: { bma3=bma3 | 0x20; break; }
case 19: { bma3=bma3 | 0x10; break; }
case 20: { bma3=bma3 | 0x08; break; }// 按键状态第1位
case 21: { bma3=bma3 | 0x04; break; }
case 22: { bma3=bma3 | 0x02; break; }
case 23: { bma3=bma3 | 0x01;
if(!rf_ok1)
{
mma1=bma1;
mma2=bma2;
mma3=bma3;
// mma4=bma4; // 将接收到的编码复制到解码寄存器中
rf_ok1=1; // 通知解码子程序可以解码了
tb_ok=0;
// bt_auto=0;
s=1000;
break;
}
else
{
mmb1=bma1;
mmb2=bma2;
mmb3=bma3;
// mmb4=bma4;// 将再次接收到的编码复制到解码寄存器中,
rf_ok2=1; // 通知解码子程序可以解码了
tb_ok=0;
// bt_auto=0;
break;
}
}
}
ma_x++;
}
else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; hh_w=1;ll_w=0;} //接收到不符合的高-低电平序列
ll_w=0;hh_w=1;
}
old_rc5=1; // 记录本次电平状态
}
if(rf_ok1) //规定时间内接受到2帧相同的编码数据才有效
{
s--;
if(!s) rf_ok1=0;
if(rf_ok2)
{
if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
{
rf_ok=1;
rf_ok1=0;
rf_ok2=0;
}
else
{
rf_ok=0;
rf_ok1=0;
rf_ok2=0;
}
}
}
if((rf_ok)) //判断是否接收成功
{
//TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);
HAL_TIM_Base_Stop_IT(&htim2);
// Delay_ms(100);
rf_ok=0;
rf_data[0]=mma1;
rf_data[1]=mma2;
rf_data[2]=mma3;
// USART_Send(USART2, rf_data, 3);
decode_ok=1;
// s1=1000;
//TIM_ITConfig(TIM6 , TIM_IT_Update, ENABLE);
HAL_TIM_Base_Start_IT(&htim2);
}
}
}
全部资料51hei下载地址:
STM32_433Project.7z
(1.25 MB, 下载次数: 73)
|