5.STM32_红外接收解码(外部中断)

STM32_红外接收解码(外部中断)

1.硬件

硬件:Nucleo-F103RBTx、红外接收管
注意事项:市面上红外接收管型号很多,引脚排序方式也不同,需注意引脚的排列方式,硬件不要接错了。
在这里插入图片描述
硬件连接:红外接收管与Nucleo-f103开发板用杜邦线按照下表进行连接
在这里插入图片描述

2.软件

CubeMX配置
PA8配置为外部中断模式,上/下沿方式触发,配置上拉电阻,使能中断,默认优先级。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码编写
根据正点原子库函数改写。

(1).hw.h

#ifndef _HW_H
#define _HW_H

#include "main.h"

//定义全局变量
extern uint32_t hw_code;
extern uint8_t  hw_flag;

void delay_us(uint32_t us);
uint8_t HW_time(void);

#endif

(2).hw.c

#include "hw.h"

uint32_t hw_code;	  //定义一个32位数据变量,保存接收码
uint8_t  hw_flag;  //定义一个8位数据的变量,用于指示接收标志


//微秒级延时函数,系统时钟频率位64MHz
void delay_us(uint32_t us)
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);
    while (delay--)
	{
		;
	}
}

//判断是否接收到有效红外信号(高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us)
uint8_t HW_time()
{
	uint8_t t=0;
	while(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)//高电平
	{
		t++;
		delay_us(20);
		if(t>=250) 
			return t;//超时溢出
	}
	return t;
}

//红外遥控外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	uint8_t Tim=0,Ok=0,Data,Num=0;
   while(1)
   {
	   	if(HAL_GPIO_ReadPin(HW1_GPIO_Port,HW1_Pin)==1)
			{
			  Tim=HW_time();//获得此次高电平时间
				
			  if(Tim>=250) 
					break;//不是有用的信号
				
			  if(Tim>=200 && Tim<250)
			  {
			 	  Ok=1;//收到起始信号
			  }
			  else if(Tim>=60 && Tim<90)
			  {
			 	  Data=1;//收到数据 1
			  }
			  else if(Tim>=10 && Tim<50)
			  {
			  	Data=0;//收到数据 0
			  }
				else
					break;

			  if(Ok==1)
			  {
			 	  hw_code<<=1;
				  hw_code+=Data;

				  if(Num>=32)
				  {
					  hw_flag=1;
				  	break;
				  }
			  }
			  Num++;
			}
   }
}

(3).main.c

while (1)
  {
  /* USER CODE BEGIN 3 */
		if(hw_flag==1)	 //如果红外接收到有效信号
		{
			hw_flag=0;	   //清除接收标志
			printf("红外接收码 %0.8X\r\n",hw_code);	//打印
			hw_code=0;		 //接收码清零
		}		
		HAL_Delay(10);
  }
  /* USER CODE END 3 */

如何实现串口发送功能此处省略。

3.操作

在这里插入图片描述
连接串口助手,红外遥控器对着红外接收管任意按键,当检测到有信号输入,单片机对信号解码并串口打印出来。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值