江阴响应式网站建设做系统去哪个网站好
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:37
当前位置: 首页 > news >正文
江阴响应式网站建设,做系统去哪个网站好,广州优化排名推广,电子商务的应用场景目录 前言
- DHT11简介
- DHT11数据结构
- DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法
- 硬件分析
- 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h 前言 DH…目录 前言
- DHT11简介
- DHT11数据结构
- DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法
- 硬件分析
- 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h 前言 DHT11数字温湿度传感器不但能测温度还能测湿度。本节我们将利用STM32F4来读取DHT11的温湿度传感器获取环境的温度和湿度值。
- DHT11简介 DHT11是广州奥松有限公司生产的一款温湿度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个NTC测温元件并与一个高性能8位单片机相连。通过单片机等微处理器简单的电路连接就能实时的采集本地的温度和湿度。DHT11 与单片机之间能采用简单的单总线进行通信仅仅需要一个I/O 口。 性能指标和特性 工作电压范围3.5V~5.5V 工作电流0.5mA 湿度测量范围20-90%RH 温度测量范围0-50℃ 湿度分辨率1%RH 8位 温度分辨率1℃ 8位 采样周期1S 单总线结构 与TTL兼容5V 2. DHT11数据结构 DHT11数字温湿度传感器采用单总线数据格式。通过单个数据的引脚端口就可以完成输入输出双向传输。其数据包由5Byte5*840Bit组成。数据分小数部分和整数部分。 一次完整的数据传输为40bit高位先行。 数据格式8bit湿度整数数据8bit湿度小数数据8bit温度整数数据8bit温度小数数据8bit校验和 其中校验和数据为前四个字节相加。 DHT11和DS18B20相同传感器输出的都是未编码的二进制数字。数据湿度、温度、整数、小数之间应该分开进行处理。 比方说 DHT11温湿度传感器一次完整的数据传输位如上图所示 那么humidity湿度byte4 . byte345.0%RH temperature温度byte2 . byte128.0℃ 校验位byte0byte4byte3byte2byte173humiditytemperature 因此温湿度的读取方式就是整数部分的二进制转换成十进制放在整数部分小数部分的二进制转换成十进制放在小数部分。 注意DHT11和MCU的一次通讯时间最大3ms主机连续向DHT11采样的间隔建议不小于100ms。
- DHT11的传输时序 3.1 DHT11开始发送数据流程 主机发送开始信号后延时等待20us~40us后读取DHT11的应答信号正常的话DHT11 会拉低数据线保持40~50us时间读取总线为低电平说明DHT11发送响应信号DHT11发送响应信号后再把总线拉高保持40-50us准备发送数据每一位 bit 数据都以低电平开始。 如果读取响应为高电平则DHT11没有响应检查线路是否连接正常。 3.2 主机复位信号和DHT11响应信号 主机发送复位信号后主机拉低总线延时至少18ms然后将主机拉高延迟20-40us等待DHT11的应答信号。读取总线电平如果为低电平则表示从机DHT11发送应答信号成功。然后从机把总线拉高准备发送数据。之所以拉高是因为每发送一位数据都是以低电平开始的为发送数据做准备。 3.3 数字 “0” 信号表示方法 因为DHT11也是遵循单总线协议的。所以也是通过高低电平延时不同时间进行组合来发送逻辑1或者逻辑0. 从机DHT11拉低总线延时12-14us然后从机释放总线延时26-28us。表示发送数字 “0” 3.4 数字 “1” 信号表示方法 从机DHT11拉低总线延时12-14us然后从机释放总线延时116-118us。表示发送数字 “1”
- 硬件分析 VCC正电源支持3.5V~5.5VDout输出引脚NC空脚GND地
DHT11数字温湿度传感器的第一脚接电源正极第四脚接电源地端。数据端为第二脚。第二端数据引脚可以直接接在主机(单片机)的IO口。同时为了提高稳定性一般在数据端和电源正极之间接一只4.7K的上拉电阻。第三脚NC为空脚此管脚悬空不用。 5. 实验程序详解
实验现象开机的时候先检测是否有DHT11存在如果没有则提示错误。只有在检测到DHT11之后才会开始读取温湿度值。如果发现了DHT11则程序每隔100ms左右读取一次数据。
5.1 main.c
#include stm32f4xx.h
#include delay.h #include usart.h #include LED.h #include lcd.h #include Key.h #include usmart.h #include MyI2C.h #include AT24C02.h #include DS18B20.h #include DHT11.h//LCD状态设置函数 void led_set(u8 sta)//只要工程目录下有usmart调试函数主函数就必须调用这两个函数 {LED1sta; } //函数参数调用测试函数 void test_fun(void(*ledset)(u8),u8 sta) {led_set(sta); } int main(void) {u8 t0;u8 temperature;u8 humidity;delay_init(168);uart_init(115200);LED_Init();LCD_Init();POINT_COLORRED;LCD_ShowString(30,50,200,16,16,Explorer STM32F4);LCD_ShowString(30,70,200,16,16,DHT11 Text);LCD_ShowString(30,90,200,16,16,ATOMALIENTER);LCD_ShowString(30,110,200,16,16,2023/20/23);while(DHT11_Init())//返回1表示没有检测到DHT11的存在报错{LCD_ShowString(30,130,200,16,16,DHT11 Rrror);delay_ms(200);LCD_Fill(30,130,239,13016,WHITE); //清除这块区域 x 30~239 y 130~13016delay_ms(200);}LCD_ShowString(30,130,200,16,16,DHT11 OK);POINT_COLORBLUE;LCD_ShowString(30,150,200,16,16,Temperature: C);LCD_ShowString(30,170,200,16,16,Humidity: %);while(1){if(t%100) //每100ms读取一次{DHT11_Read_Data(temperature,humidity); //读取温湿度的值LCD_ShowNum(3012*8,150,temperature,2,16); //显示温度LCD_ShowNum(309*8,170,humidity,2,16); //显示湿度}delay_ms(10);t;if(t20){t0;LED0!LED0;}} } 5.2 DHT11.c #include stm32f4xx.h
#include DHT11.h #include delay.h//复位DHT11 void DHT11_Reset(void) {//复位DHT11的时序主机拉低总线延时至少18ms然后主机拉高总线延时20-40us等待从机应答DHT11_IO_OUT(); //复位时序是主机来完成的所以首先设置主机IO引脚输出模式DHT11_DQ_OUT0; //主机拉低总线delay_ms(20); //延时至少18msDHT11_DQ_OUT1; //主机拉高总线delay_us(30); //延时20-40us } //等待DHT11的应答信号 //返回1未检测到DHT11的存在 //返回0存在 u8 DHT11_CheckExist(void) {//应答信号的时序是主机发送应答信号后从机DHT11会拉低信号线保持40-50us。此时若读取主机总线为低电平这说明DHT11发送了应答信号//DHT11发送应答信号之后再把总线拉高保持40-50us准备发送数据每一位bit数据都是以低电平开始的。u8 Existence0;DHT11_IO_IN(); //主机IO引脚设置为输入模式等待从机的应答信号输入while(DHT11_DQ_INExistence100) //从机DHT11会拉低信号线保持40-80us等待应答 按位操作必须两个条件都为真才是真{//DHT11_DQ_IN为真就一直在这里循环表示始终没有接收到从机DHT11的应答信号因为总线拉低读取高电平是始终没有响应的//DHT11_DQ_IN是从机DHT11发送主机MCU的信号应答信号时从机会拉低信号线因此如果主机收到的是高电平那么意味着没有发送应答信号//Existence100表示设置一个缓冲时间去等待从机发送应答这里设置的就是100usExistence;delay_us(1);}if(Existence100){return 1; //主机给从机的缓冲时间是100us主机等了从机100us还是没有接收到应答信号那么返回信息未检测到DHT11的存在}else //在给定的100us内接收到了应答信号将缓冲计时变量Existence清0为后续总线拉高后延迟做准备Existence0;while(!DHT11_DQ_INExistence100) //拉低后再次拉高准备发送数据延迟40-80us{//!DHT11_DQ_IN表示主机接收到了应答信号也就是主机接收到了低电平延迟100usExistence;delay_us(1);}if(Existence100){return 1;}return 0; } //从DHT11读取一个位 //返回值1/0 u8 DHT11_Read_Bit(void) {//DHT11读取一位的时序不管读的那一位是高电平1还是低电平0首先从机DHT11都需要拉低总线//数据0从机拉低总线延时12-14us然后从机释放总线延时26-28us//数据1从机拉低总线延时12-14us然后从机释放总线延时116-118usu8 data0;while(DHT11_DQ_INdata100)//等待变为低电平//主机从DHT11读取一位从机要拉低总线在没有拉低之前主机收到的DHT11_DQ_IN一定是高电平1,而通过观察低电平的时序可以发现不管是逻辑1还是0低电平延时12-14us//所以设置的100us是远远大于低电平延时时间的所以data100这个条件在此while循环中一定为真跳出循环的条件一定是DHT11_DQ_IN0也就是等待变为低电平{data;delay_us(1);}data0; //离开while循环时主机一定收到了低电平此时DHT11_DQ_IN0设置data0是为后续等待高电平做准备while(!DHT11_DQ_INdata100) //等待变为高电平{//从上面的循环出来时DHT11_DQ_IN0取反就为真//条件data100低电平0的整个发送时序延时时间(包括低电平延时12-14us高电平延时26-28us)也远远小于100us所以data100在该循环中也是始终为真的// 高电平1的整个发送时间是大于100us的(低电平延时12-14us高电平延时116-118us)//经分析离开循环的条件是DHT11_DQ_IN变为高电平1取反等于0为假。在低电平0的12-14us过去以后高电平信号就会来临data;delay_us(1);}//delay_us(40) 没有这个延迟40us是无法判断是数据1还是数据0的delay_us(40);//从上一个while循环出来以后时序停留在刚刚变为高电平的瞬间这个时候延时40us数据0会跳过高电平数据1会停留在高电平if(DHT11_DQ_IN) //这个时候根据主机读到的是1还是0设置返回值return 1;elsereturn 0; } //从DHT11读取一个字节 //返回值读到的数据 u8 DHT11_Read_Byte(void) {u8 i,data;data0;for(i0;i8;i){datadata1; //DHT11读取的字节是高位先行的所以每循环一次都要将上次读取的那一位左移右侧最低位补0每次都将新读取的那一位数据和0进行|或运算。datadata|DHT11_Read_Bit();}return data; } //从DHT11读取一位数据 //temperature温度值(范围0~50℃) //humidity湿度值(范围20%90%) //返回值0 正常1 读取失败 u8 DHT11_Read_Data(u8 *temperature,u8 *humidity) {//DHT11的数据格式是5个字节40位数据前两位是湿度的整数和小数部分第三、第四位是温度的整数和小数部分最后一位是校验位u8 Buf[5]; //定义一个数组来存放收到的5个字节的数组u8 i;DHT11_Reset();if(DHT11_CheckExist()0) //应答信号返回值为0表示检测到了DHT11应答信号{for(i0;i5;i) //调用读字节函数将读取到的5个字节存放到Buf数组中{Buf[i]DHT11_Read_Byte();}if((Buf[0]Buf[1]Buf[2]Buf[3])Buf[4]) //检验成功{*humidityBuf[0]; //这里只显示了温湿度的整数部分*temperatureBuf[2];}}elsereturn 1; //DHT11_CheckExist()1 表示没有检测到DHT11的应答信号报错return 0; //返回正常情况 } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1不存在 //返回0存在 u8 DHT11_Init(void) {RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE); //使能GPIOG时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_OUT; //默认设置为输出模式GPIO_InitStructure.GPIO_OTypeGPIO_OType_PP;GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_PuPdGPIO_PuPd_UP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOG,GPIO_InitStructure);DHT11_Reset();return DHT11_CheckExist(); //初始化返回检测DHT11是否成功0成功 1收不到应答信号报错 } 5.3 DHT11.h #ifndef DHT11__H #define DHT11__H #include sys.h//IO方向设置 //IO方向是通过位段设置的调用GPIO模式寄存器以下代码已经多次使用如有不理解可回头温习DS18B20的实验代码 #define DHT11_IO_IN() {GPIOG-MODER(3(9*2));GPIOG-MODER|09*2;} //PG9输入模式 #define DHT11_IO_OUT() {GPIOG-MODER~(3(9*2));GPIOG-MODER|19*2;} //PG9输出模式 //IO引脚设置 #define DHT11_DQ_OUT PGout(9) //PG9输出 #define DHT11_DQ_IN PGin(9) //PG9输入void DHT11_Reset(void); u8 DHT11_CheckExist(void); u8 DHT11_Read_Bit(void); u8 DHT11_Read_Byte(void); u8 DHT11_Read_Data(u8 *temperature,u8 *humidity); u8 DHT11_Init(void);#endif 本节程序每一步都进行了详细的注释有哪里解释的不对的欢迎指正
- 上一篇: 江阴网站建设多少钱seo外链代发
- 下一篇: 江阴做网站的地方织梦栏目页不显示网站描述
相关文章
-
江阴网站建设多少钱seo外链代发
江阴网站建设多少钱seo外链代发
- 技术栈
- 2026年03月21日
-
江阴公司企业网站建设国外做饮用来源的网站
江阴公司企业网站建设国外做饮用来源的网站
- 技术栈
- 2026年03月21日
-
江西做网站找谁网站支付接口怎么做
- 技术栈
- 2026年03月21日
-
江阴做网站的地方织梦栏目页不显示网站描述
江阴做网站的地方织梦栏目页不显示网站描述
- 技术栈
- 2026年03月21日
-
江阴做网站的企业中卫网站推广服务
江阴做网站的企业中卫网站推广服务
- 技术栈
- 2026年03月21日
-
将网站源码下载下来如何使用wordpress linux 权限设置
将网站源码下载下来如何使用wordpress linux 权限设置
- 技术栈
- 2026年03月21日

