wordpress手机版怎么做,华为手机一键优化,长春网站推广,网站优化的方式有哪些目录
一、教程简介
二、驱动原理讲解 #xff08;一#xff09;通信4步骤 #xff08;二#xff09;传感器数据解析
三、CubeMX生成底层代码 #xff08;一#xff09;基础配置 #xff08;二#xff09;配置DHT11的驱动引脚 #xff08;三#xff09;配置串口
四…
目录
一、教程简介
二、驱动原理讲解 一通信4步骤 二传感器数据解析
三、CubeMX生成底层代码 一基础配置 二配置DHT11的驱动引脚 三配置串口
四、Keil中编写代码 一dht11.c 代码 二dht11.h 代码 三main.c 中调用
五、效果展示 一、教程简介 DHT11是单片机开发常用的一个温湿度传感器采用单总线通信优点是单片机和传感器的连接只需要一根数据线缺点则是对通信时序的要求较高。 本教程用通俗易懂的语言和详细的操作过程截图为开发者清除DHT11这只拦路虎本教程还提供可以快速使用DHT11的驱动代码只要跟着本教程操作都可以正确读取到温湿度信息。
二、驱动原理讲解 DHT11采用的是单总线的通信方式系统中数据的交换、控制均由单总线完成。注意DHT11的数据引脚需要一个4.7K的上拉电阻若使用的传感器是不带PCB的那种请自己外加上拉电阻。 一通信4步骤 步骤一 DHT11上电后(DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令)测试环境温湿度数据并记录数据同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态时刻检测外部信号。 步骤二 微处理器的I/0设置为输出同时输出低电平且低电平保持时间不能小于18ms(最大不得超过30ms)然后微处理器的I/0设置为输入状态由于上拉电阻微处理器的I/0即DHT11的DATA数据线也随之变高等待DHT11作出回答信号。发送信号如下图所示 步骤三 DHT11的DATA引脚检测到外部信号有低电平时等待外部信号低电平结束延迟后DHT11的DATA引脚处于输出状态输出83微秒的低电平作为应答信号紧接着输出87微秒的高电平通知外设准备接收数据微处理器的I/0此时处于输入状态检测到I/0有低电平(DHT11回应信号)后等待87微秒的高电平后的数据接收发送信号如图5所示: 步骤四 由DHT11的DATA引脚输出40位数据微处理器根据I/0电平的变化接收40位数据位数据“0”的格式为:54微秒的低电平和23-27微秒的高电平位数据“1”的格式为:54微秒的低电平加68-74微秒的高电平。位数据“0”、“1”格式信号如图6所示: 结束信号 DHT11的DATA引脚输出40位数据后继续输出低电平54微秒后转为输入状态由于上拉电阻随之变为高电平。但DHT11内部重测环境温湿度数据并记录数据等待外部信号的到来。 二传感器数据解析 传感器发送的40位数据分为5个部分分别是湿度高8位、湿度低8位、温度高8位、温度低8位、校验位。下面举例分析 示例一接收到的40位数据为
0011 01010000 00000001 10000000 01000101 0001湿度高8位湿度低8位温度高8位温度低8位校验位 计算 00110101 00000000 00011000 00000100 01010001 校验正确接收数据正确。 湿度00110101(整数) 0x35 53% 湿度小数为0。 所以湿度为 53% 温度00011000(整数) 0x18 24 度 00000100(小数) 0x04 0.4度 所以温度为24 0.4 24.4 摄氏度 三、CubeMX生成底层代码
一基础配置 1、配置Debug 2、配置外部高速晶振 3、 配置时钟 二配置DHT11的驱动引脚 将任意一个引脚配置为输出模式、内部上拉、高速模式、重命名为DHT11 三配置串口 四生成工程文件 四、Keil中编写代码
一dht11.c 代码
#include dht11.h
/** DHT11引脚输入/输出模式配置函数 * Mode 0/INPUT 时 输入模式 * Mode 1/OUTPUT 时 输出模式 */
void DHT11_PIN_Mode(int Mode)
{ if(Mode) {GPIO_InitTypeDef GPIO_InitStruct {0}; // 定义GPIO_InitTypeDef结构体 GPIO_InitStruct.Pin DHT11_Pin; // 引脚选择GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; // 引脚模式输出模式GPIO_InitStruct.Pull GPIO_NOPULL; // 配置内部上拉GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; // 引脚速率高速HAL_GPIO_Init(DHT11_GPIO_Port, GPIO_InitStruct);}else{GPIO_InitTypeDef GPIO_InitStruct {0}; // 定义GPIO_InitTypeDef结构体 GPIO_InitStruct.Pin DHT11_Pin; // 引脚选择GPIO_InitStruct.Mode GPIO_MODE_INPUT; // 引脚模式输入模式GPIO_InitStruct.Pull GPIO_NOPULL; // 配置内部上拉HAL_GPIO_Init(DHT11_GPIO_Port, GPIO_InitStruct);}
} /**DHT11起始函数*根据DHT11时序图主机要要发送起始信号需要将总线电平拉低18~30ms*/
void DHT11_Start(void)
{DHT11_PIN_Mode(OUTPUT);DHT11_IO_SET; // 先让总线处于高电平状态HAL_Delay(1);DHT11_IO_RESET; // 拉低总线20ms表示主机发送起始信号HAL_Delay(20);DHT11_IO_SET; // 将总线拉高等待传感器响应DHT11_Delay_us(30);
}/*** DHT11响应检测函数* 返回1未检测到DHT11的存在* 返回0存在出现由高到低的变化即可*/
uint8_t DHT11_Check(void)
{uint8_t retry 0;DHT11_PIN_Mode(INPUT); //将引脚切换为输入模式while(!DHT11_IO_Read retry100) //单片机发送起始信号后DHT11会将总线拉低83微妙{retry;DHT11_Delay_us(1);}if(retry 100)return 1;else retry 0;while(DHT11_IO_Read retry100) //DHT11拉低后会再次拉高87微妙{retry;DHT11_Delay_us(1);}if(retry 100) return 1;return 0;
}/*** 从DHT11读取一个位* 返回值1/0*/
uint8_t DHT11_Read_Bit(void)
{DHT11_PIN_Mode(INPUT);while(!DHT11_IO_Read);DHT11_Delay_us(40);if(DHT11_IO_Read){while(DHT11_IO_Read);return 1;}else{return 0;}
}/*** 读取一个字节数据 1byte / 8bit* 返回值是一个字节的数据*/
uint8_t DHT11_Read_Byte(void)
{uint8_t i,buf 0; // 暂时存储数据for(i0; i8 ;i){buf 1; if(DHT11_Read_Bit()) // 1byte - 8bit{buf | 1; // 0000 0001}}return buf;
}/*** 读取温湿度传感器数据 5byte / 40bit* 使用方法创建两个float变量将变量地址传入函数* 注意两次使用该函数的间隔需要大于2秒否则会导致数据测量不准确*/
uint8_t data[5] {0};uint8_t DHT11_READ_DATA(float *temp, float *humi)
{uint8_t i;DHT11_Start(); // 主机发送启动信号if(!DHT11_Check()) // 如果DHT11应答 { for(i0; i5; i){ data[i] DHT11_Read_Byte(); // 读取 5byte}if(data[0] data[1] data[2] data[3] data[4]){*humi data[0] 0.1*data[1];*temp data[2] 0.1*data[3];return 1; // 数据校验通过}else return 0; // 数据校验失败}else return 2; // 如果DHT11不应答
}/*** 微妙延时函数* 全系列通用只需要将宏定义CPU_FREQUENCY_MHZ根据时钟主频修改即可。* 系统滴答定时器是HAL库初始化的且必须有HAL库初始化。*/
#define CPU_FREQUENCY_MHZ (int)(HAL_RCC_GetHCLKFreq()/1000000) // 自动获取STM32时钟主频void DHT11_Delay_us(__IO uint32_t delay)
{int last, curr, val;int temp;while (delay ! 0){temp delay 900 ? 900 : delay;last SysTick-VAL;curr last - CPU_FREQUENCY_MHZ * temp;if (curr 0){do{val SysTick-VAL;}while ((val last) (val curr));}else{curr CPU_FREQUENCY_MHZ * 1000;do{val SysTick-VAL;}while ((val last) || (val curr));}delay - temp;}
}
二dht11.h 代码
#include main.h#ifndef __DHT11_H_
#define __DHT11_H_
/**** 如果未用CubeMX配置引脚可以将下面代码的注释取消并替换后面的GPIOB以及GPIO_PIN_1 * 例如: 使用了PA5引脚则应将 GPIOB 替换成 GPIOA 将 GPIO_PIN_1 替换成 GPIO_PIN_5*
***/// #define DHT11_GPIO_Port GPIOB
// #define DHT11_Pin GPIO_PIN_1#define DHT11_IO_Read HAL_GPIO_ReadPin(DHT11_GPIO_Port,DHT11_Pin) //读DHT11引脚电平
#define DHT11_IO_SET HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_SET) //DHT11引脚置高电平
#define DHT11_IO_RESET HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_RESET) //DHT11引脚置低电平#define INPUT 0 //引脚输入模式
#define OUTPUT 1 //引脚输出模式void DHT11_Delay_us(__IO uint32_t delay); // 微妙级延时函数
void DHT11_PIN_Mode(int Mode); // 引脚模式配置函数
void DHT11_Start(void); // 起始信号发送函数
uint8_t DHT11_Check(void); // DHT11应答检测函数
uint8_t DHT11_Read_Bit(void); // 读取一个数据位bit8 bit 1 byte
uint8_t DHT11_Read_Byte(void); // 读取一个字节的数据
uint8_t DHT11_READ_DATA(float *temp, float *humi); // 温湿度数据读取函数#endif 三main.c 中调用 注意 在main.c中需要包含dht11.h、stdio.h两个头文件声明两个浮点变量和一个串口发送缓冲数组。使用的时候不需要初始化直接放while里面循环读取就可但必须要加上延时。
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h
#include usart.h
#include gpio.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include dht11.h
#include stdio.h
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
float Humi,Temp;
char DHT11_TX[40];
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(2000);DHT11_READ_DATA(Temp,Humi);sprintf(DHT11_TX,温度%0.1f 度 湿度%0.1f %%\r\n,Temp,Humi);HAL_UART_Transmit(huart1,(uint8_t*)DHT11_TX,40,200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
五、效果展示 文章转载自: http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn http://www.morning.fswml.cn.gov.cn.fswml.cn http://www.morning.lqgtx.cn.gov.cn.lqgtx.cn http://www.morning.kzxlc.cn.gov.cn.kzxlc.cn http://www.morning.zrqs.cn.gov.cn.zrqs.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.tmsxn.cn.gov.cn.tmsxn.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.glnfn.cn.gov.cn.glnfn.cn http://www.morning.qxlgt.cn.gov.cn.qxlgt.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.dangaw.com.gov.cn.dangaw.com http://www.morning.ctlzf.cn.gov.cn.ctlzf.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.mcjrf.cn.gov.cn.mcjrf.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.nlkm.cn.gov.cn.nlkm.cn http://www.morning.yzfrh.cn.gov.cn.yzfrh.cn http://www.morning.fpkdd.cn.gov.cn.fpkdd.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.zrnph.cn.gov.cn.zrnph.cn http://www.morning.nhzps.cn.gov.cn.nhzps.cn http://www.morning.rszbj.cn.gov.cn.rszbj.cn http://www.morning.tpqzs.cn.gov.cn.tpqzs.cn http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.rfpq.cn.gov.cn.rfpq.cn http://www.morning.clkjn.cn.gov.cn.clkjn.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.txlnd.cn.gov.cn.txlnd.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.dbnpz.cn.gov.cn.dbnpz.cn http://www.morning.qzglh.cn.gov.cn.qzglh.cn http://www.morning.ymmjx.cn.gov.cn.ymmjx.cn http://www.morning.leyuhh.com.gov.cn.leyuhh.com http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.smdkk.cn.gov.cn.smdkk.cn http://www.morning.poapal.com.gov.cn.poapal.com http://www.morning.rylr.cn.gov.cn.rylr.cn http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn http://www.morning.zwppm.cn.gov.cn.zwppm.cn http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn http://www.morning.xpzrx.cn.gov.cn.xpzrx.cn http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn http://www.morning.cybch.cn.gov.cn.cybch.cn http://www.morning.mpszk.cn.gov.cn.mpszk.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.nrchx.cn.gov.cn.nrchx.cn http://www.morning.yxplz.cn.gov.cn.yxplz.cn http://www.morning.pwppk.cn.gov.cn.pwppk.cn http://www.morning.tjqcfw.cn.gov.cn.tjqcfw.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.pmghz.cn.gov.cn.pmghz.cn http://www.morning.kjdxh.cn.gov.cn.kjdxh.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.lddpj.cn.gov.cn.lddpj.cn http://www.morning.gyfhk.cn.gov.cn.gyfhk.cn http://www.morning.ynryz.cn.gov.cn.ynryz.cn http://www.morning.jjwt.cn.gov.cn.jjwt.cn http://www.morning.qwlml.cn.gov.cn.qwlml.cn http://www.morning.kpgbz.cn.gov.cn.kpgbz.cn http://www.morning.npmx.cn.gov.cn.npmx.cn http://www.morning.krbjb.cn.gov.cn.krbjb.cn http://www.morning.kczkq.cn.gov.cn.kczkq.cn http://www.morning.pdmsj.cn.gov.cn.pdmsj.cn http://www.morning.rhkmn.cn.gov.cn.rhkmn.cn http://www.morning.ylpl.cn.gov.cn.ylpl.cn http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.wsrcy.cn.gov.cn.wsrcy.cn http://www.morning.gnkdp.cn.gov.cn.gnkdp.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn