▼点击下方名片,关注公众号,获取更多精彩内容▼
欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费视频和资料
回复【加群】,【单片机】、【STM32】、【硬件知识】、【硬件设计】、【经典电路】、【论文】、【毕业设计】、【3D封装库】、【PCB】、【电容】、【TVS】、【阻抗匹配】、【资料】、【终端电阻】、【Keil】、【485】、【CAN】、【振荡器】、[USBCAN]、【PCB】、【智能手环】、【智能家居】、【智能小车】、【555】、【I2C】、【华为】、【中兴】,等……
2.解码程序
uint32_t TIM3_Over_Cnt = 0;//tim3溢出次数
uint32_t TIM3_Sum_Cnt = 0;//两次下降沿之间的时间间隔
uint32_t cnt0 = 0;
uint8_t IR_Data[60];
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
// HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_UPDATE)) //定时器溢出中断
{
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE); //清除中断标记
TIM3_Over_Cnt++;
}
cnt0 = __HAL_TIM_GET_COUNTER(&htim3);
TIM3_Sum_Cnt = (TIM3_Over_Cnt << 16) + cnt0;//获取计数器的值
__HAL_TIM_SetCounter(&htim3,0);//清零重新计数
TIM3_Over_Cnt = 0;//清零重新计数
if (__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_CC1) != RESET)//TIM3CH1捕获中断
{
if(StartRevFlag == 1)//接收到引导码,开始解码
{
if(TIM3_Sum_Cnt > 36000)//大于36ms认为是结束
{
RevComplete = 1;//解码完成
IR_Tick = 0;
}
else if(RevComplete == 0)
{
if(TIM3_Sum_Cnt > 1000 && TIM3_Sum_Cnt < 1300)//1ms~1.3ms认为是低电平
IR_Data[IR_Idx] = 0;
else if(TIM3_Sum_Cnt > 2100 && TIM3_Sum_Cnt < 2400)//2.1ms~2.4ms认为是高电平
IR_Data[IR_Idx] = 1;
else //接收错误,重新开始
StartRevFlag = 0;
IR_Idx++;
if(IR_Idx > 59)
IR_Idx = 59;
}
}
else
{
if(TIM3_Sum_Cnt > 13000 && TIM3_Sum_Cnt < 14000)//13~14ms引导码
{
StartRevFlag = 1;
}
IR_Tick = 0;
RevComplete = 0;//解码完成标志置零
IR_Idx = 0;//有效解码位
TIM3_Over_Cnt = 0;
TIM3_Sum_Cnt = 0;//定时器计数清零
}
__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_CC1);
}
/* USER CODE END TIM3_IRQn 1 */
}
void IR_Rev()
{
uint8_t num = IR_Idx / 8;
uint8_t IRValue[8];
if(RevComplete == 1 && StartRevFlag == 1 && IR_Tick > 20)
{
if(num > 7)
num = 7;
for(uint8_t j=0;j
{
for(uint8_t i = 0;i< 8;i++)
{
IRValue[j] = IRValue[j]>>1;
if(IR_Data[j*8+i])
IRValue[j] |= 0x80;
}
}
if(IRValue[0] == 0x00 && IRValue[1] == 0xFF)//地址码正确
{
switch(IRValue[2])//判断数据码
{
case 0x46:
KeyValue = S_key_Menu;
break;
case 0x43:
KeyValue = S_key_Set;
break;
case 0x40:
KeyValue = S_key_Rst;
break;
case 0x15:
KeyValue = S_key_Down;
break;
case 0x09:
KeyValue = S_key_Up;
break;
}
}
StartRevFlag = 0;
RevComplete = 0;
IR_Tick = 0;
}
}
END
扫描上方二维码加群,回复【加群】或扫码加我好友,限时免费进入技术交流群。
推荐阅读
【专辑】器件选型
【专辑】单片机
【专辑】经验分享
【专辑】STM32
【专辑】硬件设计
【专辑】软件设计
【专辑】开源项目
【专辑】职业发展
感谢大家阅读,如果喜欢
请点赞和“在看”吧,或者分享到朋友圈。
点击跳转到原文,限时优惠加入我们的知识星球(加好友获取免费券)