#include "hcsr04.h" #include "delay.h" #include "usart.h" #include "lcd.h" float Distance; //距离 cm void HCSR04_Init(void) { GPIO_InitTypeDef GPIO_InitSture; EXTI_InitTypeDef EXTI_InitSture; NVIC_InitTypeDef NVIC_InitSture; //如果外部中断的话则一定使能AFIO复用功能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOE,ENABLE); //配置IO端口 GPIO_InitSture.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式 GPIO_InitSture.GPIO_Pin = HCSR04_Trig; //将PE4于Trig相连 GPIO_InitSture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitSture); GPIO_InitSture.GPIO_Mode = GPIO_Mode_IPD; //下拉输入模式 GPIO_InitSture.GPIO_Pin = HCSR04_Echo; //将PE6于Echo相连 GPIO_InitSture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitSture); //中断和6端口映射一起 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource6); //外部中断配置 EXTI_InitSture.EXTI_Line=EXTI_Line6; EXTI_InitSture.EXTI_LineCmd=ENABLE; EXTI_InitSture.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitSture.EXTI_Trigger=EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitSture); //中断优先级管理 NVIC_InitSture.NVIC_IRQChannel=EXTI9_5_IRQn; NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE; NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitSture.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_InitSture); } void EXTI9_5_IRQHandler(void) { delay_us(10); if(EXTI_GetITStatus(EXTI_Line6)!=RESET) { TIM_SetCounter(TIM3,0); //开始计数 TIM_Cmd(TIM3,ENABLE); //使能 while(ECHO_DQ_IN); //等待低电平GPIO_ReadInputDataBit(GPIOE, HCSR04_Echo) TIM_Cmd(TIM3,DISABLE); //关闭 Distance=TIM_GetCounter(TIM3)*340/200.0; if(Distance>0) { //printf("Distance:%f cm\r\n",Distance); LCD_ShowNum(30+40,120,Distance,3,16); } EXTI_ClearITPendingBit(EXTI_Line6); } } void HCSR04_Strat(void) { GPIO_SetBits(GPIOE, HCSR04_Trig); //将Trig设置为高电平 delay_us(20); //持续大于10us触发,触发超声波模块工作 GPIO_ResetBits(GPIOE, HCSR04_Trig); }
时间: 2023-09-01 22:13:42 浏览: 110
这段代码是用于初始化和操作一个超声波传感器模块HCSR04的。具体来讲,它通过GPIO控制HCSR04的Trig引脚发送超声波信号,然后通过中断和计时器来测量超声波信号从发送到接收所需要的时间,从而计算出距离,并在LCD上显示距离值。其中的一些函数,如HCSR04_Init()和HCSR04_Start()是用于初始化和操作HCSR04模块的,EXTI9_5_IRQHandler()是中断服务函数,用于处理外部中断,LCD_ShowNum()是用于在LCD上显示数字的函数,而其他函数则是用于延时、GPIO设置和中断优先级等方面的操作。
相关问题
#include "stm32f10x.h" // Device header #include "delay.h" #include "OLED.h" #include "hc.h" #include "Servo.h" #include "mlx90614.h" #include "dht11.h" uint32_t length; float leng; u8 temp,humi; int main(void) { uint32_t bufe[5]; OLED_Init(); Hcsr04Init(); OLED_ShowString(1,1,"length:"); OLED_ShowString(2,9,"cm"); OLED_ShowString(3,1,"wen:"); OLED_ShowString(4,1,"shi:"); DHT11_Init(); while(1) { leng =Hcsr04GetLength(); DHT11_Read_Data(&temp,&humi); bufe[0]=temp; bufe[1]=humi; bufe[2]=45; length = leng*100; OLED_ShowNum(2,4,length/1000,1);//bai OLED_ShowNum(2,5,length%1000/100,1);//shi OLED_ShowString(2,6,":"); OLED_ShowNum(2,7,length%100/10,1);// OLED_ShowNum(2,8,length%10/1,1); OLED_ShowNum(3,6,bufe[0],2); OLED_ShowString(4,9,"%"); OLED_ShowNum(4,6,bufe[1],2); OLED_ShowString(4,9,"%"); } }添加注释
好的,以下是添加注释后的代码:
```c
#include "stm32f10x.h" // 包含STM32F10x系列芯片的头文件
#include "delay.h" // 包含延时函数的头文件
#include "OLED.h" // 包含OLED屏幕驱动函数的头文件
#include "hc.h" // 包含超声波测距模块驱动函数的头文件
#include "Servo.h" // 包含舵机模块驱动函数的头文件
#include "mlx90614.h" // 包含红外温度传感器模块驱动函数的头文件
#include "dht11.h" // 包含DHT11温湿度传感器模块驱动函数的头文件
uint32_t length; // 存储距离的变量
float leng; // 存储距离的变量(浮点数)
u8 temp,humi; // 存储温度和湿度的变量
int main(void) {
uint32_t bufe[5]; // 存储温湿度数据的数组
OLED_Init(); // 初始化OLED屏幕
Hcsr04Init(); // 初始化超声波测距模块
OLED_ShowString(1,1,"length:"); // 在第1行第1列显示“length:”
OLED_ShowString(2,9,"cm"); // 在第2行第9列显示“cm”
OLED_ShowString(3,1,"wen:"); // 在第3行第1列显示“wen:”
OLED_ShowString(4,1,"shi:"); // 在第4行第1列显示“shi:”
DHT11_Init(); // 初始化DHT11模块
while(1) { // 进入主循环
leng = Hcsr04GetLength(); // 获取距离
DHT11_Read_Data(&temp,&humi); // 获取温湿度数据
bufe[0] = temp; // 保存温度数据
bufe[1] = humi; // 保存湿度数据
bufe[2] = 45; // 保存固定值
length = leng * 100; // 将距离转换为整型
OLED_ShowNum(2,4,length/1000,1);// 在第2行第4列显示百位数字
OLED_ShowNum(2,5,length%1000/100,1);// 在第2行第5列显示十位数字
OLED_ShowString(2,6,":"); // 在第2行第6列显示“:”
OLED_ShowNum(2,7,length%100/10,1);// 在第2行第7列显示个位数字
OLED_ShowNum(2,8,length%10/1,1);// 在第2行第8列显示个位数字
OLED_ShowNum(3,6,bufe[0],2); // 在第3行第6列显示温度数据
OLED_ShowString(4,9,"%"); // 在第4行第9列显示“%”
OLED_ShowNum(4,6,bufe[1],2); // 在第4行第6列显示湿度数据
OLED_ShowString(4,9,"%"); // 在第4行第9列显示“%”
}
}
```
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "dht11.h" uint32_t length; // 存储距离的变量 float leng; // 存储距离的变量(浮点数) u8 temp,humi; // 存储温度和湿度的变量 u8 bufe[5]; int main(void) { u8 x=0; u32 lcd_id[12]; //存放LCD ID字符串 delay_init(); //延时函数初始化 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 LCD_Init(); POINT_COLOR=RED; sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。 while(1) { // // leng = Hcsr04GetLength(); // 获取距离 DHT11_Read_Data(&temp,&humi); // 获取温湿度数据 bufe[0] = temp; // 保存温度数据 bufe[1] = humi; // 保存湿度数据 bufe[2] = 45; // 保存固定值 length = leng * 100; // 将距离转换为整型 POINT_COLOR=RED; LCD_ShowString(30,70,200,16,16,"wen:"); LCD_ShowString(30,90,200,16,16,"shi:"); LCD_ShowString(30,110,200,16,16,"length/1000"); LCD_ShowString(30,130,200,16,16,"length%1000/100"); LCD_ShowString(170,130,210,16,16,":"); LCD_ShowString(30,170,200,16,16,"length%100/10"); LCD_ShowString(30,190,200,16,16,"length%10/1"); LCD_ShowxNum(60,70,bufe[0],4,16,1); LCD_ShowString(100,70,200,16,16,"C"); LCD_ShowxNum(60,90,bufe[1],4,16,1); LCD_ShowString(100,90,200,16,16,"%"); x++; if(x==12)x=0; LED0=!LED0; delay_ms(1000); } }加注释
这是一段使用了多个外设的 STM32F4 程序,主要实现了通过超声波测距、DHT11 温湿度传感器获取环境数据,并在 LCD 上显示。下面是代码的注释:
```c
#include "led.h" // LED 相关函数库
#include "delay.h" // 延时函数库
#include "key.h" // 按键函数库
#include "sys.h" // 系统函数库
#include "lcd.h" // LCD 相关函数库
#include "usart.h" // 串口函数库
#include "dht11.h" // DHT11 温湿度传感器函数库
uint32_t length; // 存储距离的变量
float leng; // 存储距离的变量(浮点数)
u8 temp,humi; // 存储温度和湿度的变量
u8 bufe[5]; // 存储传感器数据的数组
int main(void)
{
u8 x=0;
u32 lcd_id[12]; // 存放 LCD ID 字符串
delay_init(); // 延时函数初始化
uart_init(115200); // 串口初始化为 115200
LED_Init(); // LED 端口初始化
LCD_Init(); // LCD 初始化
POINT_COLOR=RED; // 设置字体颜色为红色
sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id); // 将 LCD ID 打印到 lcd_id 数组
while(1)
{
leng = Hcsr04GetLength(); // 获取距离
DHT11_Read_Data(&temp,&humi); // 获取温湿度数据
bufe[0] = temp; // 保存温度数据
bufe[1] = humi; // 保存湿度数据
bufe[2] = 45; // 保存固定值
length = leng * 100; // 将距离转换为整型
// 在 LCD 上显示各项数据
POINT_COLOR=RED;
LCD_ShowString(30,70,200,16,16,"wen:");
LCD_ShowString(30,90,200,16,16,"shi:");
LCD_ShowString(30,110,200,16,16,"length/1000");
LCD_ShowString(30,130,200,16,16,"length%1000/100");
LCD_ShowString(170,130,210,16,16,":");
LCD_ShowString(30,170,200,16,16,"length%100/10");
LCD_ShowString(30,190,200,16,16,"length%10/1");
LCD_ShowxNum(60,70,bufe[0],4,16,1);
LCD_ShowString(100,70,200,16,16,"C");
LCD_ShowxNum(60,90,bufe[1],4,16,1);
LCD_ShowString(100,90,200,16,16,"%");
x++; // 控制 LED 闪烁
if(x==12)x=0;
LED0=!LED0;
delay_ms(1000); // 延时 1 秒
}
}
```
阅读全文