温湿度DHT11
- //////////////////////////////////////////////////////////////////////////////////
- // 功能描述 : OLED I2C 显示温湿度的值
- // 说明: 主控 stm32f103c8t6
- // ----------------------------------------------------------------
- // GND 电源地
- // VCC 3.3v电源
- // D0 PA0(SCL)
- // D1 PA1(SDA)
- // RES PA2(SPI模块改成IIC模块需要接此引脚,IIC模块用户请忽略)
- // 温湿度DHT11 信号线引脚接线 PB9
- // 串口打印接口---- PA9 PA10
- // ----------------------------------------------------------------
- //******************************************************************************/
- #include "delay.h"
- #include "sys.h"
- #include "oled.h"
- #include "bmp.h"
- #include "DHT11.h"
- #include "usart.h"
- int main(void)
- {
- u8 wd=0;
- u8 sd=0;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Delay_Init();
- uart_init(115200);
-
- DHT11_Init();
-
- OLED_Init();
- OLED_ColorTurn(0);//0正常显示,1 反色显示
- OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
- while(1)
- {
-
- DHT11_Read_Data(&wd,&sd);//读取温湿度值
-
- printf("当前环境温度: %d ℃\r\n",wd); //串口打印温湿度
- printf("当前环境湿度: %d %%\r\n",sd);
-
-
- OLED_ShowChinese(0,0,0,16,1); //温 x,y
- OLED_ShowChinese(18,0,1,16,1);//度
- OLED_ShowNum(50,0,wd,2,16,1); //显示温度值
- OLED_ShowString(36,0,":",16,1);
-
- OLED_ShowChinese(0,16,2,16,1);//湿
- OLED_ShowChinese(18,16,1,16,1);//度
- OLED_ShowNum(50,16,sd,2,16,1); //显示湿度值
- OLED_ShowString(36,16,":",16,1);
- OLED_ShowString(68,16,"%",16,1); //
- delay_ms(1000);
- OLED_Refresh();
- }
- }
复制代码
- #include "stm32f10x.h"
- #include "DHT11.h"
- void DHT11_IO_IN(void)//温湿度模块输入函数
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO_InitStructure.GPIO_Pin = IO_DHT11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIO_DHT11, &GPIO_InitStructure);
- }
- void DHT11_IO_OUT(void)//温湿度模块输出函数
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = IO_DHT11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIO_DHT11, &GPIO_InitStructure);
- }
- //复位DHT11
- void DHT11_Rst(void)
- {
- DHT11_IO_OUT(); //SET OUTPUT
- DHT11_DQ_Low; //DQ=0
- DelayXms(20); //拉低至少18ms
- DHT11_DQ_High; //DQ=1
- DelayUs(30); //主机拉高20~40us
- }
- //等待DHT11的回应
- //返回1:未检测到DHT11的存在
- //返回0:存在
- u8 DHT11_Check(void)
- {
- u8 retry = 0; //定义临时变量
- DHT11_IO_IN();//SET INPUT
- while ((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1) && retry < 100) //DHT11会拉低40~80us
- {
- retry++;
- DelayUs(1);
- };
- if(retry >= 100)return 1;
- else retry = 0;
- while ((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 0) && retry < 100) //DHT11拉低后会再次拉高40~80us
- {
- retry++;
- DelayUs(1);
- };
- if(retry >= 100)return 1;
- return 0;
- }
- //从DHT11读取一个位
- //返回值:1/0
- u8 DHT11_Read_Bit(void)
- {
- u8 retry = 0;
- while((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1) && retry < 100) //等待变为低电平
- {
- retry++;
- DelayUs(1);
- }
- retry = 0;
- while((GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 0) && retry < 100) //等待变高电平
- {
- retry++;
- DelayUs(1);
- }
- DelayUs(40);//等待40us
- if(GPIO_ReadInputDataBit(GPIO_DHT11, IO_DHT11) == 1)
- return 1;
- else
- return 0;
- }
- //从DHT11读取一个字节
- //返回值:读到的数据
- u8 DHT11_Read_Byte(void)
- {
- u8 i, dat;
- dat = 0;
- for (i = 0; i < 8; i++)
- {
- dat <<= 1;
- dat |= DHT11_Read_Bit();
- }
- return dat;
- }
- //从DHT11读取一次数据
- //temp:温度值(范围:0~50°)
- //humi:湿度值(范围:20%~90%)
- //返回值:0,正常;1,读取失败
- u8 DHT11_Read_Data(u8 *temp, u8 *humi)
- {
- u8 buf[5];
- u8 i;
- DHT11_Rst();
- if(DHT11_Check() == 0)
- {
- for(i = 0; i < 5; i++) //读取40位数据
- {
- buf[i] = DHT11_Read_Byte();
- }
- if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
- {
- *humi = buf[0];
- *temp = buf[2];
- }
- }
- else return 1;
- return 0;
- }
- //初始化DHT11的IO口 DQ 同时检测DHT11的存在
- //返回1:不存在
- //返回0:存在
- void DHT11_Init(void)
- {
- DHT11_Rst(); //复位DHT11
- DHT11_Check();//等待DHT11的回应
- }
复制代码
原理图: 无
仿真: 无
代码:
DHT11温湿度程序.7z
(197.04 KB, 下载次数: 71)
|