找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2331|回复: 0
收起左侧

单片机SHT11湿度传感器的湿度显示仿真程序(可存储检索8K历史信息)详细注释

[复制链接]
ID:780742 发表于 2020-7-1 09:15 | 显示全部楼层 |阅读模式
       由于最近的设计,花费不少心思做出了这个系统,虽然很简单,但是还是想发出来一下。当初在找资料的时候,也辛亏是这个平台的老前辈们的资料拯救了我,现在仿真做完了,调试也没什么问题,就发上去给做个留念,也留给下一个像我一样需要的人。       该系统有5个模块,单片机主体、L298驱动电机模块、SHT11湿度传感器模块、RAM6264存储湿度模块以及按键切换模式模块;该系统功能是:湿度传感器采集湿度信息经过51单片机处理,显示于LCD1602液晶显示屏上,当按下湿度传感器下方按钮,即可存储湿度信息进RAM6264存储器(此处是仿真专用按钮,现实中要实现存储需要设置一个定时),当湿度小于设定值,L298驱动直流电机转动启动浇水功能;当按下功能按钮,可切换当前湿度模式和历史检索模式,另外两个按钮在历史检索模式下发挥作用,用于检索上一条和下一条。另外复位电路还模拟了一个检测阴天的复位电路,当为阴天时,则为开关按下,电路进行复位,电机停止。

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

单片机源程序如下(程序带有非常详细的注释):
  1. #include <reg52.h>                                        //特殊功能寄存器地址的声明的头文件,如P0-P3口的地址
  2. #include <intrins.h>                                //单片机内部头文件,包含很多逻辑指令,如左右移指令crol,空指令nop等
  3. #include <math.h>                                   //数学公式头文件,如开方sqrt
  4. #include <stdio.h>                                        //标准输入输出头文件,如print,scanf
  5. #include <1602.h>                                                //LCD1602液晶显示屏的头文件,用来显示当前湿度和历史湿度
  6. #include <sht11.h>                                        //湿度传感器头文件,用来采集湿度信息
  7. #include <absacc.h>                                        //绝对地址访问头文件,如XBYTE

  8. #define uchar unsigned char                //宏定义8位无符号整型,最大256
  9. #define uint  unsigned  int                //宏定义16位无符号整型,最大65536
  10. #define RAM_6264 XBYTE[RAMADDR]  //6264地址范围8000H-9FFFH

  11. uint RAMADDR  ;               //定义6264的地址
  12. uint humi;                                                                                 //定义湿度
  13. value humi_val;                                             //定义整型和浮点型共同体  humi_val
  14. uchar error;                                                //用于检验是否出现错误
  15. uchar checksum;                     //CRC:循环冗余校验码
  16. uchar HUMI_data[6];                  //该数组存放采集到的湿度信息
  17. uchar humi_lowest=15.5;                                //湿度若小于设定的15.5%时,就启动电机浇水
  18. uchar humi_search;                                           //用于检索历史湿度
  19. uchar show_humi[5];                                                //该数组存放显示历史湿度的信息
  20. uchar presskeynum;                                    //按键次数变量
  21. uchar last_humi;                                                  //上一条湿度信息
  22. uchar next_humi;                                                  //下一条湿度信息
  23. uchar code word1[]={"  a product of  "};                //开机LCD显示单词
  24. uchar code word2[]={"  Humi  Display "};                //开机LCD显示单词
  25. uchar code word3[]={" Welcome........"};                //开机LCD显示单词

  26. sbit k1=P1^0;                                                                 //切换模式按键
  27. sbit k2=P1^1;                                                                 //上一条湿度信息查询按钮
  28. sbit k3=P1^2;                                                                 //下一条湿度信息查询按钮
  29. sbit k4=P1^3;                                                                        //存储湿度信息仿真键
  30. sbit IN1=P1^5;                                                                //电机驱动,和IN2相反状态时启动
  31. sbit IN2=P1^6;                                                                //电机驱动,和IN1相反状态时启动
  32. sbit ENA=P1^7;                                                                //短接时电机全速启动

  33. //********延时函数*********//
  34. void delay(uint z)  //z为毫秒数
  35. {
  36.      int a,b;
  37.      for(a=z;a>0;a--)
  38.      for(b=120;b>0;b--);
  39. }
  40. /************************************************************************/
  41. //函数名:key
  42. //功能:按键切换两种模式(显示模式和历史查询模式);查询上下条湿度信息
  43. /************************************************************************/
  44. void key()
  45. {  
  46.      if (k1==0)                                                         //查询按键是否被按下
  47.      {
  48.          delay(30);                                         //消抖,30ms检查是否是误触
  49.          if (k1==0)                                         //当按键被按下
  50.          {
  51.              presskeynum++;                  //按键次数加一,切换模式
  52.              if(presskeynum==2)        //因为只有两个模式,当再次按下按键,按键次数就会回到0
  53.              presskeynum=0;                        //因为只有两个模式,当再次按下按键,按键次数就会回到0
  54.              while(k1==0);            //按键不被松开就一直循环
  55.              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  56.          }
  57.                  }  
  58.                                         if(presskeynum==1)                                        //查询历史湿度模式
  59.          {               
  60.               if(k2==0)                                                          //查询上一条湿度按键是否被按下
  61.               {
  62.                   delay(30);                                        //消抖,30ms检查是否是误触
  63.                   RAMADDR--;                                  //存储器中指针向前移动一位
  64.                   if (RAMADDR<0x8000)        //如果指针指向第一位
  65.                                                                         {
  66.                   RAMADDR=0x8000;                        //那么指针就停在第一位
  67.                                                                         }
  68.                                                                         humi_search=RAM_6264;//将6264存储器当前地址的湿度信息取出来放在humi_search中
  69.                                                                         while(k2==0);                                //按键不被松开就一直循环
  70.               }       
  71.                 if(k3==0)                                                        //查询下一条湿度按键是否被按下
  72.                 {
  73.                     delay(30);                                //消抖,30ms检查是否是误触
  74.                     RAMADDR++;                        //存储器中指针向后移动一位
  75.                     if (RAMADDR>0x83ff)          //如果指针指向最后一位(1k)
  76.                     RAMADDR=0x83ff;                                //那么指针就停在最后一位
  77.                     humi_search=RAM_6264;        //将6264存储器当前地址的湿度信息取出来放在humi_search中
  78.                                                                                 while(k3==0);                                        //按键不被松开就一直循环
  79.                 }
  80.           }
  81. }
  82. /************************************************************************/
  83. //程序名:main主函数
  84. //功能:,控制显示屏显示湿度、查询湿度;驱动电机;存储8K湿度信息;数据传输;湿度采样及AD转换
  85. /************************************************************************/
  86. void main()
  87. {                       
  88.                  RAMADDR=0x8000;                                 //6264首地址
  89.      LCD_Initial();                    //液晶初始化
  90.      GotoXY(0,0);                                        //选择湿度显示开始位置,在第一行第一个字符处
  91.      Print_slow(word1);                //显示 a product of 字符串
  92.            LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  93.      GotoXY(0,0);                                        //选择湿度显示开始位置,在第二行第一个字符处
  94.      Print_slow(word2);                //显示 Humidity display 字符串
  95.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  96.      GotoXY(0,0);                                        //选择湿度显示开始位置,在第一行第一个字符处
  97.      Print_slow(word3);                //显示 Welcome........ 字符串
  98.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏                     
  99.      while(1)
  100.         {
  101.                                                  key();                                //开机后,按键在任何时候按下都可切换模式
  102.              if(presskeynum==0)         //显示模式,显示当前采集回来的湿度
  103.              {                                                                  
  104.              s_connectionreset(); //启动连接复位
  105.              error=0;             //初始化error=0,即没有错误
  106.              error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
  107.                                                  if(error!=0)                                         //如果error仍为0则发生错误,因为上一步已经加上要测量的湿度信息
  108.                                s_connectionreset();  //如果发生错误,系统复位
  109.              else
  110.                  {
  111.                       humi_val.f=(float)humi_val.i;  //转换为浮点数
  112.                       calc_sth10(&humi_val.f);       //修正相对湿度及温度
  113.                       humi=humi_val.f*10;                                                 //修正后的湿度乘10,方便存储
  114.                                                                          if(humi/10<humi_lowest)                                   //当湿度小于最小湿度20.5%时,启动电机浇水
  115.                                                                          {
  116.                                                                                  ENA=1;                                        //高电平,最高速转动
  117.                                                                                  IN1=1;                                        //电机正转
  118.                                                                                  IN2=0;                                 //电机正转
  119.                                                                          }
  120.                                                                          else                                                                                                                   //当湿度小于最小湿度20.5%时,启动电机浇水
  121.                                                                          {
  122.                                                                                  ENA=0;                                       
  123.                                                                                  IN1=0;                                        //电机停转
  124.                                                                                  IN2=0;                                 //电机停转
  125.                                                                          }
  126.                                                                          
  127.                                                                                         GotoXY(0,0);                            //选择温度显示开始位置,第一行第一个字符处
  128.                       Print(" Current Humi: ");                //当前湿度
  129.                       GotoXY(0,1);                            //选择温度显示开始位置,第二行第一个字符处
  130.                       Print("Humi:      %  ");                //5格空格                                                                                           
  131.                       GotoXY(5,1);                            //选择温度显示开始位置,第二行第六个字符处
  132.                                           HUMI_data[0]=humi/1000+'0';                             //湿度百位                           
  133.                       if (HUMI_data[0]==0x30)                                                                        //如果首位为0,ascall码0x30=‘0’
  134.                                           HUMI_data[0]=0x20;                                                                                                                                //首位为空格,ascall码0x20=‘空格’
  135.                       HUMI_data[1]=humi%1000/100+'0';         //湿度十位      
  136.                       HUMI_data[2]=humi%100/10+'0';           //湿度个位
  137.                       HUMI_data[3]='.' ;                      //小数点
  138.                       HUMI_data[4]=humi%10+'0';               //湿度小数点后第一位   
  139.                       HUMI_data[5]='\0';                                                                                        //显示停止标志。str=‘\0‘,停止
  140.                       Print(HUMI_data);                       //输出湿度
  141.                                                                                         if(k4==0)                                                                                                                                //按下确定按键
  142.                                                                                         {        
  143.                                                                                                 delay(30);                                                                                                                //消抖30ms
  144.                                                                                                 if(k4==0)                                                                                                                        //按下确定键
  145.                                                                                                 {
  146.                                                                                                 RAM_6264=humi;                                                                                                //将湿度信息存储于6264存储器中
  147.                                                                                                 RAMADDR++;                                                                                                                //地址指针后移一位
  148.                                                                                                 while(k4==0);                                                                                                        //按键不被松开就一直循环
  149.                                                                                                 }
  150.                                                                                         }
  151.                }  
  152.                                                 }  
  153.                                                          if(presskeynum==1)                      //历史查询湿度时显示的内容
  154.               {                       
  155.                     show_humi[0]=humi_search%1000/100+'0';  //历史湿度十位
  156.                     show_humi[1]=humi_search%100/10+'0';          //历史湿度个位
  157.                     show_humi[2]='.' ;                                                                                        //小数点
  158.                                                                                 show_humi[3]=humi_search%10+'0';                                //历史湿度信息小数点后一位
  159.                     show_humi[4]='\0';                                                                                        //显示停止标志。str=‘\0‘,停止
  160.                     GotoXY (0,0);                                                                                                                //选择温度显示开始位置,第一行第一个字符处                                               
  161.                     Print("History Of Humi:");                                                                //历史湿度
  162.                                                                                 GotoXY(0,1);                            //选择温度显示开始位置,第二行第一个字符处       
  163.                     Print("Humi:      %  ");                //5格空格         
  164.                     GotoXY (5,1);                                                                                                                //选择温度显示开始位置,第二行第六个字符处
  165.                     Print(show_humi);                                                                                                //显示历史湿度
  166.                }                                                                  
  167.          }
  168. }
复制代码
51hei.png
所有资料51hei提供下载:
基于SHT11湿度传感器的LCD显示及历史检索 .zip (135.9 KB, 下载次数: 21)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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