100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > STM32F103:HZ1838红外无线通信

STM32F103:HZ1838红外无线通信

时间:2023-12-28 03:54:32

相关推荐

STM32F103:HZ1838红外无线通信

目录

实物图实现代码infrared.hinfrared.c

实物图

模块实物图

实现代码

infrared.h

infrared.h

#ifndef __INFRARED_H__#define __INFRARED_H__void infrared_init(void);void voice_init(void);#define VOICE_OFFGPIOF->ODR &= ~(1<<2)#define VOICE_ONdo{GPIOF->ODR &= ~(1<<2);GPIOF->ODR |= (1<<2);}while(0)#endif//__INFRARED_H__

infrared.c

infrared.c

#include "stm32f10x.h"#include "infrared.h"#include "delay.h"#include "stdio.h"#include "sys.h"void infrared_init(void){GPIO_InitTypeDef io;EXTI_InitTypeDef e4;NVIC_InitTypeDef n4;GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);//以下是红外探头的初始化io.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 //使能GPIO A组时钟,io.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOA,&io);e4.EXTI_Line = EXTI_Line4;e4.EXTI_LineCmd = ENABLE;e4.EXTI_Mode = EXTI_Mode_Interrupt;e4.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_Init(&e4);n4.NVIC_IRQChannel = EXTI4_IRQn;n4.NVIC_IRQChannelCmd = ENABLE;n4.NVIC_IRQChannelPreemptionPriority = 0xf;n4.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&n4);}/*void EXTI4_IRQHandler(void){static int k=0;if(EXTI_GetITStatus(EXTI_Line4) != RESET){delay_ms(10);if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == RESET) {if(k == 0) { PCout(13)=0; k++; }else { PCout(13)=1; k=0; }}EXTI_ClearITPendingBit(EXTI_Line4);}}*//**计算高电平的时间**/u32 ir_pluse_high_time(void){u32 t=0;//while跳出条件低电平到来或者t > 250while(PAin(4) == 1){t++;delay_us(20); //20微秒if(t > 250) //大于5ms数据异常 250*20 = 5000usbreak;}return t;}/**验证所接收数据是否正确*包括地址码、地址反码,控制码,控制反码*/int check_data_with_Infrared(u32 ir_data){//例子:0XFF30CFu32 tmp1=0, tmp2=0, tmp3;tmp2 = ir_data;for(tmp1=0; tmp1<=7; tmp1++){tmp2 &= (~(0x01<<tmp1));//CF}for(tmp1=16; tmp1<=23; tmp1++){tmp2 &= (~(0x01<<tmp1));//30}tmp3 = ir_data;for(tmp1=8; tmp1<=23; tmp1++){tmp3 &= (~(0x01<<tmp1));//CF}tmp2 = tmp2>>8;tmp1 = tmp2 + tmp3;if(tmp1 == 0XFF){//printf("tmp2 is %#X\t tmp3 is %#X\t", tmp2, tmp3);//printf("\t相等\t");return 1;}return 0;}void EXTI4_IRQHandler(void){u32 t=0;u32 ir_bit=0;u8 ir_valed=0;u32 ir_data = 0;u8 ir_cunt=0;u8 status = 0;//判断是否中断线4if(EXTI_GetITStatus(EXTI_Line4) == SET){while(1){if(PAin(4) == 1) //等待到高电平,过滤低电平{//获取高电平时间t = ir_pluse_high_time();if(t>=250)break;//同步码头高电平时间在4ms~5msif(t>200 && t<250){ir_valed = 1; //同步码头有效continue;}//若高电平持续时间为400~1000us内则为数据位为0: 560us在400~1000uselse if(t>20 && t<50){ir_bit = 0; }else if(t>60 && t<90)//若高电平持续时间为1200~1800us内则为数据位为1: 1680us在1200~1800us{ir_bit = 1;}if(ir_valed){//将位数据移到到ir_datair_data |= ir_bit<<(31-ir_cunt);ir_cunt++;if(ir_cunt >= 32){if(check_data_with_Infrared(ir_data)){printf("ir_data = %#X\n",ir_data);//以下判断根据实际获取的ir_data修改if( ir_data == 0XFFA25D){}else if( ir_data == 0XFF629D){}else if( ir_data == 0XFFE21D){}else if( ir_data == 0XFF22DD){}else if( ir_data == 0XFF02FD){}else if( ir_data == 0XFFC23D){}else if( ir_data == 0XFFE01F){}else {}}break;}}}}}//清除中断标志位EXTI_ClearITPendingBit(EXTI_Line4);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。