一个简单的单片机DHT11温湿度测量系统

 单片机温湿度测量系统3D视图

       前几天做了一个简单的单片机温湿度测量系统,主要是用来测一下房间里面的温度和湿度。整个系统采用STC89C52RC微处理器作为主控系统,硬件电路主要包括STC89C52RC单片机最小系统、DHT11温湿测量模块、1602显示器模块、18650锂电池供电模块。通过单片机读取DHT11温度传感器模块的测量数据,并由LCD1602显示出来,LCD显示实时的温、湿度值。成品如下图所示。

反面视图

正面视图

  1. 系统原理图

    原理图比较简单,主要有单片机最小系统、DHT11测温接口电路、DS18B20测温接口电路、LCD1602显示接口电路,锂电池供电模块。

2.程序代码

/**************************dht11测温驱动程序*************************************/ 

void start()//开始信号 

  io=1; 

  delay1(); 

  io=0; 

  delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号 

  io=1;    //发送开始信号结束后拉高电平延时20-40us 

  delay1();//以下三个延时函数差不多为24us符合要求 

  delay1(); 

  delay1(); 

uchar receive_byte()//接收一个字节// 

  uchar i,temp; 

  for(i=0;i<8;i++)//接收8bit的数据 

  { 

  while(!io);//等待50us的低电平开始信号结束 

  delay1();//开始信号结束之后延时26us-28us以下三个延时函数 

 delay1(); 

  delay1(); 

  temp=0;//时间为26us-28us表示接收的为数据'0' 

  if(io==1) 

 temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1' 

    while(io);//等待数据信号高电平'0'为26us-28us'1'为70us 

  data_byte<<=1;//接收的数据为高位在前右移 

 data_byte|=temp; 

  } 

  return data_byte; 

    

void receive()//接收数据// 

  uchar T_H,T_L,R_H,R_L,check,num_check,i; 

  start();//开始信号// 

  io=1;   //主机设为输入判断从机DHT11响应信号 

  if(!io)//判断从机是否有低电平响应信号// 

  {  

while(!io);//判断从机发出 80us 的低电平响应信号是否结束// 

while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态 

R_H=receive_byte();//湿度高位 

  R_L=receive_byte();//湿度低位 

T_H=receive_byte();//温度高位 

T_L=receive_byte();//温度低位 

check=receive_byte();//校验位 

io=0; //当最后一bit数据接完毕后从机拉低电平50us// 

for(i=0;i<7;i++)//差不多50us的延时 

delay1(); 

io=1;//总线由上拉电阻拉高进入空闲状态 

num_check=R_H+R_L+T_H+T_L; 

if(num_check==check)//判断读到的四个数据之和是否与校验位相同 

  { 

   RH=R_H; 

   RL=R_L; 

   TH=T_H; 

   TL=T_L; 

   check=num_check; 

  } 

  } 

3.总结

      本系统控制器采用STC89C52RC,采用LCD1602作为显示设备,2800maH的锂电池供电,持续亮屏工作时间能达到5-6天。目前来看,待机时间有点短,LCD背光功耗比较高,关闭背光源显示又不清晰。后续准备改进,采用STC15W408AS作为主控制器,IIC通信的OLED屏幕,加上光敏传感器电路和声控电路还有小夜灯功能,夜间系统进入睡眠模式,通过声控电路唤醒系统,达到省电目的,希望待机时长可以更久些。本文完整软件工程和电路原理图PCB图可以在公众号回复DHT11获取。

DHT11是一种常用的温湿度传感器,它通过I2C通信协议与STC89C52RC这样的单片机相连。以下是基本的步骤和一个简化的程序示例: 1. **硬件连接**: - 将DHT11的数据线(D4)连接到单片机的I2C数据总线(通常A0或SCL)。 - 接地线(GND)连接单片机的地。 - 电源线(VCC)连接到单片机的5V电源。 2. **软件配置**: - 首先需要设置单片机的I2C通信模式。对于STC89C52RC,你需要配置相应的寄存器来控制I2C模块。 - 使用库函数(如MCP23017_I2C库)来初始化I2C,并设置正确的地址(0x40或0x44取决于你的接法)。 ```c #include <i2c.h> ... void I2C_Init(void) { // 初始化I2C模块设置地址 I2C_InitStructure.I2C_Mode = I2C_Mode_7bit; I2C_InitStructure.I2C_SlaveAddress = DHT11_ADDRESS; // 0x40 或 0x44 I2C_InitStructure.I2C_DataSpeed = I2C_Speed_FastMode; HAL_I2C_Init(&hi2c1, &I2C_InitStructure); } ``` 3. **读取传感器数据**: DHT11每次测量后需要发送一次读命令,然后等待响应。你可以编写一个函数来处理这个过程,并解析返回的数据。 ```c uint8_t DHT11_ReadTemperatureHumidity(uint8_t* humidity, uint8_t* temperature) { uint8_t data[5]; uint8_t checksum; // 发送读命令并接收数据 if (HAL_I2C_Master_Transmit(&hi2c1, DHT11_ADDRESS, DHT11_READ_COMMAND, 1, timeout) != HAL_OK) { return ERROR; } HAL_Delay(1); // 等待数据准备 if (HAL_I2C_Master收到了更多数据, HAL_I2C_Master_Receive(&hi2c1, DHT11_ADDRESS, data, sizeof(data), timeout) != HAL_OK) { return ERROR; } // 校验和检查 checksum = data[0] + data[1]; for (int i = 2; i < 4; i++) { checksum += data[i]; } if (checksum != data[4]) { return ERROR; } *humidity = data[0] << 8 | data[1]; // 湿度 *temperature = data[2] << 8 | data[3]; // 温度 return SUCCESS; } // 调用函数获取数据 uint16_t temp, hum; if (DHT11_ReadTemperatureHumidity(&hum, &temp) == SUCCESS) { printf("Temperature: %d°C Humidity: %d%%\n", temp / 10, hum / 10); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值