找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18876|回复: 26
收起左侧

基于51单片机的SHT11温湿度测量仪设计(源码+仿真+文档)

  [复制链接]
ID:166208 发表于 2018-12-26 10:29 | 显示全部楼层 |阅读模式
电路原理图如下:

原理图截图

原理图截图


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真截图

仿真截图

程序截图

程序截图

资源文件

资源文件


一、总体设计要求3
二、方案论证 3
三、系统硬件设计 3
3.1复位电路3
3.2时钟电路3
3.3 温湿度测量电路4
3.4显示电路5
四、系统软件设计
4.1DHT11软件设计6
4.2软件设计流程图 6
4.3 原理图以及原理分析7
五、电路仿真及仿真结果分析
5.1电路仿真图 7
5.2仿真结果分析 8
六、心得体会8
七、参考文献9

一、总体设计要求:

1、能够检测出环境中的温度和湿度,并且显示在LCD1602上面

2、技术参数有以下要求:

湿度测量范围:0%~100%RH;温度测量范围-40~+110℃。

湿度测量分辨率:1%RH;温度测量分辨率:1℃。

湿度测量精度:±2.0%RH;温度测量精度:±0.5℃。

3、电源工作范围:DC 4.5~5.5V。

二、构思与选择:

方案一:

使用AM2301数字温湿度传感器。该型号温湿度传感器,采用3.3—6V直流电源供电,它的各部分参数:湿度测量范围为20%~90%RH;温度测量的范围为0~+50℃;湿度测量精度为±5.0%RH;温度测量精度为±2.0℃。虽然它的价格比较便宜,单测温的范围和测湿的范围太小,温度的精度和湿度的精度太低,不符合设计的要求。

方案二:

使用AM2302电容式数字温湿度传感器。它的各部分参数如下:由于传感器参数:湿度0%~100%相对是湿度的测量范围;温度测量范围为40~+80℃;湿度的测量精度为±3.0%RH;温度的测量精度为±0.5℃。价格也比较适合,基本可以满足设计要求。

方案三:

使用数字温湿度传感器SHT11。湿度测量范围:0%~100%RH;温度测量范围:40~+120℃;湿度测量精度:±2%相对湿度;温度测量精度:±0.2%℃温度测量精度。改传感器价格便宜。温度和湿度都达到或超过了标题的精度要求,属于低功率传感器。

综上分析,设计应以最大化利用内部资源,电路简易,节约成本为原则,而且利用从系统技术参数要求和低功率方面考虑。因此采用方案三。

三、系统硬件设计:

3.1复位电路:

复位是单片机的初始化操作。单片机启动运行时,都需要先复位,作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因此,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。

单片机通电时,从初始态开始执行程序,称为上电复位。单片机死机时,通过手工按“重启”键使其从初始态开始执行程序,称为手工复位。

复位条件:复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作;但如果RST持续为高电平,单片机就处于循环复位状态。

3.2时钟电路:

1.时钟电路

利用芯片内部的振荡电路,在XTAL1、XTAL2的引脚上外接定时元件,内部振荡器便能产生自激振荡。定时元件可以采用石英晶体和电容组成的并联谐振电路。

晶振可以在1.2~12MHZ之间任选,甚至可以达到24MHz,但是频率越高功耗也就越大。和晶振并联的电容C1、C2的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20~40pF之间选择。晶体和电容应尽可能与单机片芯片靠近,以减少引线的寄生电容,保证振荡器可靠工作。


3.3.温湿度测量电路

SHT11是瑞士Scnsirion公司推出的一款数字温湿度传感器芯片。该芯片广泛应用于暖通空调、汽车、消费电子、自动控制等领域。共主要特点如下: 高度集成,将温度感测、湿度感测、信号变换、A/D转换和加热器等功能集成到一个芯片上;提供二线数字串行接口SCK和DATA,接口简单,支持CRC传输校验,传输可靠性高;测量精度可编程调节,内置A/D转换器(分辨率为8~12位,可以通过对芯片内部寄存器编程选择); 测量精确度高,由于同时集成温湿度传感器,可以提供温度补偿的湿度测量值和高质量的露点计算功能;封装尺寸超小(7.62 mm×5.08mm×2.5 mm),测量和通信结束后,自动转入低功耗模式; 高可靠性,采用CMOSens工艺,测量时可将感测头完全浸于水中。SHT11温湿度传感器采用SMD(LCC)表面贴片封装形式,接口非常简单,引脚名称及排列顺序如图下所示。


仿真电路图


3.4、显示电路:

3.4.1电路工作原理

该模块采用LCD1602液晶屏将电子时钟工作的实时状态显示在屏幕上,结构简单,显示清晰。其中GND接地,VCC接VCC,LCD偏压输入引脚V0通过接一个电位器来调节显示屏的背光度,数据/命令选择端RS、读/写控制信号端RW、LCD使能端分别由单片机引脚P2.6、P2.5、P2.7进行控制。数据传输端D0-D7则用单片机的P0口进行控制。如图是LCD1602详细的电路引脚连线图。

3.4.2LCD显示模块电路图


  • 系统软件设计:
   4.1.1 DHT11软件设计
微处理器和温湿度传感器通信采用串行二线接口SCK和DATA,其中SCK为时钟线,DATA为数据线。该二线串行通信协议和I2C协议是不兼容的。在程序开始,微处理器需要用一组"启动传输"时序表示数据传输的启动,当SCK时钟为高电平时,DATA翻转为低电平;紧接着SCK变为低电平,随后又变为高电平;在SCK时钟为高电平时,DATA再次翻转为高电平。
根据SHT11湿度测试时序可以知道。主机发出启动命令,随后发出一个后续8位命令码,该命令码包含3个地址位(芯片设定地址为000)和5个命令位;发送完该命令码,将DATA总线设为输入状态等待SHT11的响应;SHT11接收到上述地址和命令码后,在第8个时钟下降沿,将DATA下拉为低电平作为从机的ACK;在第9个时钟下降沿之后,从机释放DATA(恢复高电平)总线;释放总线后,从机开始测量当前湿度,测量结束后,再次将DATA总线拉为低电平;主机检测到DATA总线被拉低后,得知湿度测量已经结束,给出SCK时钟信号;从机在第8个时钟下降沿,先输出高字节数据;在第9个时钟下降沿,主机将DATA总线拉低作为ACK信号。然后释放总线DATA;在随后8个SCK周期下降沿,从机发出低字节数据;接下来的SCK下降沿,主机再次将DATA总线拉低作为接收数据的ACK信号;最后8个SCK下降沿从机发出CRC校验数据,主机不予应答(NACK)则 表示测量结束。

4.1.2总体程序流图的设计:


4.3.原理图以及原理分析



通过AD19绘制出如上图所示的原理图,包括时钟电路、晶振电路、DHT11温湿度检测电路、lcd1602显示电路,因为温湿度传感器与单片机连接电路比较简单。所以可以容易的绘制出电路图。


五、仿真图及仿真分析:


5.1、总体仿真结果:



5.2、仿真分析:

首先,将程序的hex文件加载到单片机中,开始仿真。可以清楚地看到LCD1602上面显示了SHT11当前的温度和湿度,虽然有误差但是误差并不是很大可以忽略不计,调节传感器上面的按钮可以实时的将传感器所在环境的温度显示到LCD1602上面,具有可控性,而且显示性和可控性较好。


六、心得体会:

我这次做的是基于单片机的温湿度测量仪。我们知道,单片机和传感器的应用如今已经在工业、电子等方方面面展示出了它的优越性,利用单片机和传感器设计电路也逐渐成了趋势,它与外围的简单电路再加上优化程序就可以构建任意的产品,使得这次设计成为现实。随着单片机和传感器的日益发展,它们必将在未来显示出更大的活力,为人们提供更好的产品。
虽然这个电路我已经设计出来了,但是在这次的设计当中,我遇到了不少的问题。最开始我不知道要用哪一种传感器作为我的设计,纠结了好久,最终我确定了选择用DHT11作为我的温湿度传感器模块,因为老师说不能用书本上的DS18B20作为此次设计模块,因为书上有该模块的详细电路图原理图以及写好的程序,所以我就仔细的查阅资料,结合以前在实验室学习的经验,通过一个多星期的时间来准备,从方案的选择原理图的绘制再到程序的编写和仿真图的绘制和调试,最终顺利的完成了这一次的传感器设计。
在学习传感器与检测技术这门中,我的收获是特别大的,完成这次设计,不仅巩固了单片机的知识,而且对传感器与单片机的应用也熟悉了基本的操作方法。相信在以后的设计中,就会排除现在遇到的问题,更好的完成设计。以前我不知道传感器到底是什么,只是在字面上理解它的意思,把一个物理量转换成另外一个物理量。但是传感器没有我们想象的那么简单,它有它的工作原理,使用条件。通过这一个学期的学习,我学习了好多传感器,比如说:温度传感器、湿度传感器、位移传感器、压力传感器等等,现在的我大致地能理解他们的一些特性,也能够运用他们来设计作品。在这里,我非常感谢我的老师。同时,对于这门课,我也想提出一些建议,希望我们班能够经常开设一些关于传感器设计与制作的活动。这样既能提高我们的动手水平,也能开发我们设计传感器的思维。

单片机源程序如下:
  1. #include "all.h"

  2. typedef union   
  3. {
  4.   uint i;        //定义了两个共用体   
  5.   float f;  
  6. } value;   
  7.   enum
  8.   {
  9.           TEMP,HUMI   //TEMP=0,HUMI=1
  10.   };

  11. void s_transstart(void)   // 生成传输启动
  12. {        
  13.         DATA=1;
  14.         SCK=0;              
  15.         _nop_();     
  16.         SCK=1;     
  17.         _nop_();     
  18.         DATA=0;     
  19.         _nop_();     
  20.         SCK=0;        
  21.         _nop_();_nop_();_nop_();     
  22.         SCK=1;     
  23.         _nop_();      
  24.         DATA=1;           
  25.         _nop_();      
  26.         SCK=0;        
  27. }

  28. void s_connectionreset(void)  
  29. {      
  30.         uchar i;      
  31.         DATA=1;
  32.         SCK=0;                          
  33.         for(i=0;i<9;i++)                  
  34.         {      
  35.                 SCK=1;     
  36.                 SCK=0;   
  37.         }     
  38.         s_transstart();                   //传输开始
  39. }

  40. char s_write_byte(uchar value)   //在敏总线上写入一个字节并检查应答  
  41. {      
  42.         uchar i,error=0;      
  43.         for (i=0x80;i>0;i/=2)              
  44.         {        
  45.                 if(i&value)
  46.                         DATA=1;          //用i屏蔽值,写入敏总线   
  47.                 else
  48.                         DATA=0;                              
  49.                 SCK=1;                           
  50.                 _nop_();_nop_();_nop_();         
  51.                 SCK=0;   
  52.         }     
  53.         DATA=1;                           //释放数据线
  54.         SCK=1;                              
  55.         error=DATA;                       //DATA在第9个上升沿将被DHT90自动下拉为低电平。   
  56.         _nop_();_nop_();_nop_();   
  57.         SCK=0;   
  58.         DATA=1;                           //释放数据线
  59.         return error;                     //返回:0成功,1失败
  60. }

  61. char s_read_byte(uchar ack)        // 从敏感总线读取字节,并在“ack=1”的情况下给出确认
  62. {      
  63.         uchar i,val=0;     
  64.         DATA=1;                           //释放数据线
  65.         for (i=0x80;i>0;i/=2)             //shift bit for masking
  66.         {
  67.                 SCK=1;                          //clk for SENSI-BUS      
  68.                 if (DATA) val=(val|i);        //read bit      
  69.                 _nop_();_nop_();_nop_();        //pulswith约3 us     
  70.                 SCK=0;                 
  71.         }     
  72.         if(ack==1)
  73.             DATA=0;                          //如果“ack==1”下拉数据线   
  74.         else DATA=1;                      //如果是校验(ack==0),读取完后结束通讯   
  75.             _nop_();_nop_();_nop_();          //pulswith约3 us   
  76.         SCK=1;                            //clk #9 for ack   
  77.         _nop_();_nop_();_nop_();          //pulswith约3 us     
  78.         SCK=0;                     
  79.         _nop_();_nop_();_nop_();          //pulswith约3 us   
  80.         DATA=1;                           //释放数据线   
  81.         return val;  
  82. }

  83. char s_measure(uchar *p_value,uchar *p_checksum,uchar mode)  //用校验和进行测量(湿度/温度)
  84. {      
  85.         uint error=0;   
  86.         uint i;      
  87.         s_transstart();                   //传输开始  
  88.         switch(mode)
  89.         {                                //发送命令给传感器
  90.                 case TEMP : error+=s_write_byte(MEASURE_TEMP); break;     
  91.                 case HUMI : error+=s_write_byte(MEASURE_HUMI); break;     
  92.                 default:
  93.                         break;      
  94.         }     
  95.         for (i=0;i<65535;i++)
  96.         if(DATA==0)
  97.                 break;                        //等待传感器完成测量
  98.         if(DATA) error+=1;                // 或超时(~2秒)   
  99.                 *(p_value)  =s_read_byte(ACK);    //读取第一个字节(MSB)
  100.                 *(p_value+1)=s_read_byte(ACK);    //读取第二个字节(LSB)
  101.                 *p_checksum =s_read_byte(noACK);  //读取校验和
  102.         return error;  
  103. }

  104. void calc_dht90(float *p_humidity ,float *p_temperature)

  105. {
  106.         const float C1=-4.0;              // 12位
  107.         const float C2=+0.0405;           // 12位
  108.         const float C3=-0.0000028;        // 12位   
  109.         const float T1=+0.01;             // 14位   
  110.         const float T2=+0.00008;           // 14位
  111.         float rh=*p_humidity;             // rh:      湿度[滴答声]12位   
  112.         float t=*p_temperature;           // t:       温度[刻度]14位  
  113.         float rh_lin;                     // rh_lin:  湿度线性   
  114.         float rh_true;                    // rh_true: 温度补偿湿度
  115.         float t_C;                        // t_C   :  温度 [C]     
  116.         t_C=t*0.01-40;                  // 温度从刻度到[C]  
  117.         rh_lin=C3*rh*rh+C2*rh+C1;     
  118.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //.温度补偿湿度[%RH]
  119.         if(rh_true>100)rh_true=100;       //如果值在外面,则削减   
  120.         if(rh_true<0.1)rh_true=0.1;       //物理可能范围  
  121. ……………………

  122. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

程序仿真文档51hei附件下载:
仿真程序原理图文档.7z (419.5 KB, 下载次数: 620)

评分

参与人数 3黑币 +78 收起 理由
xxpp2011 + 8 共享资料的黑币奖励!
Bulbzero + 20 淡定
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-12-29 22:13 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:345368 发表于 2019-2-20 15:02 | 显示全部楼层
第一项数据误差有点大啊
回复

使用道具 举报

ID:137005 发表于 2019-2-20 20:54 | 显示全部楼层
温湿度传感器是SHT11,还是DHT11呢?
回复

使用道具 举报

ID:370485 发表于 2019-3-25 14:52 | 显示全部楼层
好东西
回复

使用道具 举报

ID:147069 发表于 2019-4-8 11:30 | 显示全部楼层
顶一个
回复

使用道具 举报

ID:291815 发表于 2019-4-9 18:25 | 显示全部楼层
挺好的,刚好学习学习
回复

使用道具 举报

ID:502112 发表于 2019-4-11 01:28 | 显示全部楼层
从理论到实践,学习一下,感谢分享
回复

使用道具 举报

ID:523526 发表于 2019-4-28 11:40 | 显示全部楼层
bucuo keyiyong
回复

使用道具 举报

ID:523526 发表于 2019-4-28 11:42 | 显示全部楼层
适合初学者
回复

使用道具 举报

ID:549936 发表于 2019-5-29 10:03 | 显示全部楼层
想问问仿真像图上那样显示是对的吗?
回复

使用道具 举报

ID:552193 发表于 2019-5-31 23:30 来自手机 | 显示全部楼层
我刚下载啦!等明天看看能否运行,谢谢编辑
回复

使用道具 举报

ID:245466 发表于 2019-6-1 19:27 | 显示全部楼层
资料好详细啊,51有你更精彩~!
回复

使用道具 举报

ID:715731 发表于 2020-3-25 23:49 | 显示全部楼层
101544 发表于 2019-5-29 10:03
想问问仿真像图上那样显示是对的吗?

对啊,似乎湿度才是要百分之几显示的
回复

使用道具 举报

ID:724207 发表于 2020-4-7 17:41 来自手机 | 显示全部楼层
molo 发表于 2019-2-20 20:54
温湿度传感器是SHT11,还是DHT11呢?

应该是SHT11
回复

使用道具 举报

ID:755834 发表于 2020-5-19 16:35 | 显示全部楼层
初学者表示十分好
回复

使用道具 举报

ID:187802 发表于 2020-5-20 10:34 | 显示全部楼层

谢谢分享
回复

使用道具 举报

ID:767948 发表于 2020-6-6 15:51 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:772396 发表于 2020-6-8 08:53 来自手机 | 显示全部楼层
好东西
回复

使用道具 举报

ID:493532 发表于 2020-6-8 11:38 | 显示全部楼层
好!!
回复

使用道具 举报

ID:772720 发表于 2020-6-8 12:57 | 显示全部楼层
有DS18B20的设计嘛
回复

使用道具 举报

ID:772720 发表于 2020-6-8 12:57 | 显示全部楼层
就是引脚设计咋办嘛
回复

使用道具 举报

ID:419084 发表于 2020-6-21 09:16 | 显示全部楼层
捉个虫,显示器的温度湿度写反了
回复

使用道具 举报

ID:639106 发表于 2020-6-21 12:44 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:883911 发表于 2021-3-5 19:35 | 显示全部楼层
楼主辛苦了~学习学习
回复

使用道具 举报

ID:1020489 发表于 2022-5-4 15:58 来自手机 | 显示全部楼层
我按照上面的程序基础上设计了 按键设定温湿度数值,并与读取的值比较进行降温除湿,设定值只有个位和十位,但仿真时只显示没有比较,想问问是怎么改改
回复

使用道具 举报

ID:195496 发表于 2022-5-15 11:46 | 显示全部楼层
想不到PROTEUS里面还有SHT11,真是太牛了,这么老的软件里有,说明这个器件很早就有了,只是我没有用到,不清楚。唉,可悲。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表