STM32CubeMX系列 红外遥控_嵌入式stm32红外遥控按键在哪里

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

NEC 遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。引导码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。数据格式如下:

在这里插入图片描述

NEC 码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms 高电平组成),如果在一帧数据发送完毕之后,红外遥控器按键仍然没有放开,则发射连发码,可以通过统计连发码的次数来标记按键按下的长短或次数。

1.2 红外接收设备

红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、 检波、整形,形成遥控指令脉冲,输出至遥控微处理器。
由于红外接收头在没有脉冲的时候为高电平,当收到脉冲的时候为低电平,所以可以通过外部中断的下降沿触发中断,在中断内通过计算高电平时间来判断接收到的数据是0还是1。

2. 硬件设计

D1指示灯用来提示系统运行状态,红外遥控器用来发射红外键值的编码信号,通过红外接收头进行解码,并将解码后的数据通过串口1打印输出

  • D1指示灯
  • USART1
  • 红外遥控器和红外接收头
  • TIM7(提供us延时)

在这里插入图片描述

3. 软件设计
3.1 STM32CubeMX设置
  • RCC设置外接HSE,时钟设置为72M
  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • PG15设置为GPIO中断模式、引脚设为上拉(红外接收头在没有脉冲的时候为高电平)、下降沿触发中断,NVIC中开启中断并设置优先级

在这里插入图片描述

  • 激活TIM7,预分频因子设为72-1,向上计数,自动重载值为65535;因此计数器CNT_CLK = 1MHz,计数器周期为1us

在这里插入图片描述

  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码
3.2 MDK-ARM编程
  • 在tim.c文件下实现微秒延时(us)函数
void delay\_us(uint16_t us){
	uint16_t differ = 0xffff-us-5;				
	\_\_HAL\_TIM\_SET\_COUNTER(&htim7,differ);	//设定TIM7计数器起始值
	HAL\_TIM\_Base\_Start(&htim7);		//启动定时器 
	
	while(differ < 0xffff-5){	//判断
		differ = \_\_HAL\_TIM\_GET\_COUNTER(&htim7);		//查询计数器的计数值
	}
	HAL\_TIM\_Base\_Stop(&htim7);
}

  • 创建按键驱动文件irremote.c 和相关头文件irremote.h
uint8_t IR\_HighLevelPeriod(void){	//高电平持续时间函数
	uint8_t t=0;
	while(HAL\_GPIO\_ReadPin(GPIOG,GPIO_PIN_15)==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(GPIOG,GPIO_PIN_15)==1){
			 Tim = IR\_HighLevelPeriod();	//获得此次高电平时间

			 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

			 if(Ok==1){
			 	receive_Code <<= 1;
				receive_Code += Data;
				if(Num>=32){
					receive_Flag=1;
				    break;
				}
			 }
			 Num++;
		}
	}
}

  • 在main.c文件下编写红外遥控测试代码
int main(void){
  HAL\_Init();
  SystemClock\_Config();
  MX\_GPIO\_Init();
  MX\_TIM7\_Init();
  MX\_USART1\_UART\_Init();
  /\* USER CODE BEGIN 2 \*/
  printf("IR Remote testing...please press the controller!!!\r\n");
  /\* USER CODE END 2 \*/
  while (1){
    if(receive_Flag == 1){
		receive_Flag = 0;
		printf("IR Received Code: %0.8x\r\n",receive_Code);
		receive_Code = 0;
	}		
	HAL\_GPIO\_TogglePin(GPIOC,GPIO_PIN_0);
	HAL\_Delay(200);
  }
}

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我可以给你一些关于STM32和NEC红外遥控器的基本介绍。 STM32是一种嵌入式系统开发板,它基于ARM Cortex-M内核,并具有丰富的外设和功能,适用于各种应用领域。在红外遥控器实验中,STM32可以用来控制红外发射和接收的功能。 NEC红外遥控器是一种常见的红外遥控器协议,被广泛用于家电等设备。它的数据格式包括同步码头、地址码、地址反码、控制码、控制反码。同步码头由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位二进制格式。数据按照低位在前,高位在后的顺序发送,采用反码是为了增加传输的可靠性。 为了实现STM32 NEC红外遥控,你可以按照以下步骤进行: 1. 配置STM32的GPIO口作为红外发射和接收引脚。 2. 编写代码来发送NEC红外遥控指令。首先发送同步码头,然后发送地址码和地址反码,最后发送控制码和控制反码。 3. 配置STM32的定时器来生成所需的红外信号波形。 4. 配置STM32的外部中断用于接收红外信号。 5. 编写代码来解码接收到的红外信号,判断是否为有效的NEC红外遥控指令。 这是一个简单的示例代码来发送NEC红外遥控指令的步骤。 ```c #include "stm32f10x.h" // 配置红外发射引脚 #define IR_LED_PIN GPIO_Pin_0 #define IR_LED_GPIO GPIOB // 发送NEC红外遥控指令 void sendNECCommand(uint8_t address, uint8_t command) { // 发送同步码头 GPIO_SetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(9000); GPIO_ResetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(4500); // 发送地址码和地址反码 for (int i = 0; i < 8; i++) { if (address & (1 << i)) { GPIO_SetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); GPIO_ResetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); } else { GPIO_SetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); GPIO_ResetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(1690); } } // 发送控制码和控制反码 for (int i = 0; i < 8; i++) { if (command & (1 << i)) { GPIO_SetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); GPIO_ResetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); } else { GPIO_SetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(560); GPIO_ResetBits(IR_LED_GPIO, IR_LED_PIN); delay_us(1690); } } } ``` 请注意,这只是一个示例代码,你需要根据自己的硬件配置和需求进行适当的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值