收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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++;
}
}
}
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!