你认为优酷该网站哪些地方可以做的更好_为什么?,如何更改asp网站自定义产品顺序,wordpress 后台美化,网站备案客户资料目录
STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…目录
STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按键TPAD STM32作业实现(九)驱动舵机 源码位置
编写dht11(温湿度传感器)驱动文件 打开pa7引脚用于传输数据tim1用做计时器(微秒级定时器,因为时钟频率72MHz分频72之后计数一次为1us) 在项目所在路径的Core目录中Src下添加源文件Inc下添加头文件 Keil uVision5中添加新建的源文件在源文件中include头文件后编译 core下的src 新建并添加一个dht11.c的文件,在core下的Inc也同步新建dht11.h的空文件 编写驱动文件内容 dht11.h
#ifndef __DHT11_H__
#define __DHT11_H__#include main.h
#include tim.huint8_t DHT_read(void); // 读取温湿度#endif
dht11.c
#include dht11.huint8_t dht11_data[5] {0, 0, 0, 0, 0};// 将GPIO引脚设置为输出
void SET_PIN_OUTPUT()
{GPIO_InitTypeDef GPIO_InitStruct {0};/*Configure GPIO pin : PA7 */GPIO_InitStruct.Pin GPIO_PIN_7;GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; // 输出模式GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, GPIO_InitStruct);
}
// 将GPIO引脚设置为输入
void SET_PIN_INPUT()
{GPIO_InitTypeDef GPIO_InitStruct {0};/*Configure GPIO pin : PA7 */GPIO_InitStruct.Pin GPIO_PIN_7;GPIO_InitStruct.Mode GPIO_MODE_INPUT; // 输入模式GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, GPIO_InitStruct);
}
// 微秒级延时
void Delay_us(uint16_t us)
{uint16_t us_cnt us;__HAL_TIM_SET_COUNTER(htim1, 0); // 设置计数器起始值HAL_TIM_Base_Start(htim1); // 启动定时器while (htim1.Instance-CNT us_cnt); // 循环等待HAL_TIM_Base_Stop(htim1);
}
// 电平读取函数,每8个电平存一个字节
uint8_t DGT_read_byte()
{uint8_t read_byte; // 读取到的电平uint8_t hp 0; // 防止死循环for (uint8_t i 0; i 8; i){read_byte 1;// 先判断此时引脚的电平状态如果是低电平就一直循环等待while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_RESET) hp 100){Delay_us(1); // 等待1ushp;}// 直到高电平出现高电平出现后延时 40usDelay_us(40);// 并读取延时后的电平状态如果此时是高电平则数据为 1否则为 0if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_SET){read_byte;}hp 0;// 等待低电平到来开启下一次读取数据或结束while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_SET) hp 100){Delay_us(1); // 等待1ushp;}}return read_byte;
}
// DHT11温湿度读取程序
uint8_t DHT_read(void)
{// 总线控制权在32// 发送18毫秒低电平SET_PIN_OUTPUT(); // 将引脚设置为输出HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); // 设置低电平HAL_Delay(18);// 拉高一段时间高电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);Delay_us(20);// 总线控制在DHT11SET_PIN_INPUT();// 如果读取到低电平说明DHT11有响应if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_RESET){uint8_t hp 0; // 防卡死// 等待反转高电平while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_RESET) hp 100){Delay_us(1);hp;}hp 0;// 等待低电平到来低电平到来后读取数据while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) GPIO_PIN_SET) hp 100){Delay_us(1);hp;}// 开始读取数据for (uint8_t i 0; i 5; i){dht11_data[i] DGT_read_byte();}// 读取结束等待50usDelay_us(50);// 校验数据uint32_t sum dht11_data[0] dht11_data[1] dht11_data[2] dht11_data[3];if ((sum 0x000000ff) dht11_data[4])return 1;}return 0;
}