找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7275|回复: 14
收起左侧

基于51单片机温湿度检测系统 protues仿真

  [复制链接]
ID:310349 发表于 2020-6-2 11:17 | 显示全部楼层 |阅读模式
本次设计采用的单片机AT89C52DHT11的温度湿度的检测系统。分为硬件电路设计和单片机程序设计。硬件电路包括单片机、温湿度传感器、显示模块、报警模块以及按键。之所以采用AT89C52DHT11温湿度传感器及OLED显示模块,是要保证工作稳定、集成度高、测量精度高、成本低,其中测温湿度控制电路由温湿度传感器和预设温度限制以及报警电路组成,根据需要通过按键预先输入温湿度的上下限,当实际测量的温湿度大于或小于预设的限制时,蜂鸣器发出报警信号并报警灯亮红。单片机程序主要包括主程序、显示子程序、测量温湿度和设置温湿度上下限子程序。
原理图:

protues仿真图:


proteus仿真结果
测量温度(℃)
测量湿度(%)
温度设定范围
湿度设定范围
现象
42
55
29-40℃
23-63%
报警器响起,红灯亮
30
55
29-40℃
23-63%
报警器不响,绿亮
30
66
29-40℃
23-63%
报警器响起,红灯亮
42
66
29-40℃
23-63%
报警器响起,红灯亮


  1. #include<reg52.h>          //头文件
  2. #include<LCD1602.h>
  3. #include<AT24C02.h>
  4. #include<DHT11.h>
  5. #include<oled.h>
  6. /*****************灯、蜂鸣器、按键引脚定义*******************/
  7. sbit led     = P3^7;  //超限指示灯
  8. sbit led1    = P3^2;  //正常指示灯
  9. sbit buzz    = P2^3;  //蜂鸣器
  10. sbit key_set = P1^5;  //设置键
  11. sbit key_jia = P1^6;  //加键
  12. sbit key_jian= P1^7;  //减键

  13. /************************变量定义***********************/
  14. uchar temp_old,humi_old;//存储上一次的温度、湿度
  15. uchar temp_up,temp_down;//存储温度上、下限值
  16. uchar humi_up,humi_down;//存储湿度上、下限值
  17. uchar set_f;                               //设置选择标记,=0非设置,=1设置湿度上限,=2设置湿度下限
  18.                                                       //              =3设置温度上限,=4设置温度下限。

  19. void jiexianw();
  20. void Delay_1ms(uint i);

  21. /********************************************************
  22. 函数名称:void display(void)
  23. 函数作用:oled显示固定作用
  24. 参数说明:
  25. ********************************************************/
  26. void fixed_display(void)
  27. {
  28.         OLED_ShowString(0,0,"Temp:"); //固定位置显示“Temp:”
  29.         OLED_ShowString(56,0,".");    //固定位置显示“.”
  30.         OLED_ShowString(80,0,"C");    //固定位置显示“C”
  31.         OLED_ShowString(0,1,"Humi:"); //固定位置显示“Humi:”
  32.         OLED_ShowString(56,1,".");    //固定位置显示“.”
  33.         OLED_ShowString(80,1,"%");    //固定位置显示“%”

  34.         if(set_f==0)                  //设置键没按下,非设置模式
  35.         {
  36.         OLED_ShowString(80,4," ");    //不显示
  37.         }        
  38.         if(set_f==1)                  //设置键按了1次
  39.         {
  40.         OLED_ShowString(80,4," HU");  //显示“HU”
  41.         }
  42.         if(set_f==2)                  //设置键按了2次
  43.         {
  44.         OLED_ShowString(80,4," HD");  //显示“HD”
  45.         }
  46.                 if(set_f==3)                //设置键按了3次
  47.         {
  48.         OLED_ShowString(80,4," TU");  //显示“TU”
  49.         }
  50.                 if(set_f==4)                //设置键按了4次
  51.         {
  52.         OLED_ShowString(80,4," TD");  //显示“TD”
  53.         }        
  54. }

  55. /********************************************************
  56. 函数名称:void display1(void)
  57. 函数作用:显示当前实际温湿度
  58. 参数说明:
  59. /********************************************************/
  60. void display1(void)
  61. {
  62.                
  63.         if(DHT11_Check()==1)                //判断校验和是否正确
  64.         {
  65.                 if(humi_old<Humi_H)                                        //判断湿度是否上升
  66.                 {
  67.                         
  68.                         OLED_ShowString(88,1,"up");     //上升则显示‘up’
  69.                         
  70.                         Delay_ms(50);                                            //延时
  71.                         humi_old=Humi_H;                                  //记录当前湿度
  72.                 }
  73.                 else
  74.                         if(humi_old>Humi_H)                                //判断湿度是否下降
  75.                         {
  76.                                 OLED_ShowString(88,1,"down"); //下降则显示‘down’
  77.                                 Delay_ms(50);                                    //延时
  78.                                 humi_old=Humi_H;                          //记录当前湿度
  79.                         }

  80.                 if(temp_old<Temp_H)                                        //判断温度是否上升
  81.                 {
  82.                                 OLED_ShowString(88,0,"up");   //上升则显示‘up’
  83.                           Delay_ms(50);                                            //延时
  84.                           temp_old=Temp_H;                                  //记录当前温度
  85.                 }
  86.                 else
  87.                         if(temp_old>Temp_H)                                //判断温度是否下降
  88.                         {
  89.                                 OLED_ShowString(88,0,"down"); //下降显示‘down’
  90.                                 Delay_ms(50);                                    //延时
  91.                                 temp_old=Temp_H;                          //记录当前温度
  92.                         }

  93.                   //显示实测湿度值
  94.                         OLED_ShowChar(40,1,ASCII[Humi_H/10]);//显示湿度十位的数值
  95.                         OLED_ShowChar(48,1,ASCII[Humi_H%10]);//显示湿度个位的数值
  96.                         OLED_ShowChar(64,1,ASCII[Humi_L/10]);//显示湿度十分位的数值
  97.                         OLED_ShowChar(70,1,ASCII[Humi_L%10]);//显示湿度百分位的数值
  98.                         
  99.                                        
  100.                         OLED_ShowChar(40,0,ASCII[Temp_H/10]);//显示温度十位的数值
  101.                         OLED_ShowChar(48,0,ASCII[Temp_H%10]);//显示温度个位的数值
  102.                         OLED_ShowChar(64,0,ASCII[Temp_L/10]);//显示温度十分位的数值
  103.                         OLED_ShowChar(70,0,ASCII[Temp_L%10]);//显示温度百分位的数值
  104.                                                 
  105.                 if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判断是否超出设置的温湿度上下限
  106.                 {
  107.                         buzz=0;                 //超出的话蜂鸣器响起
  108.                         led=0;                 //点亮报警灯
  109.                         led1=1;
  110.                 }
  111.                 else                     //否者温湿度都处于限值范围内
  112.                 {
  113.                         buzz=1;                 //关闭蜂鸣器
  114.                         led=1;               
  115.                         led1=0;                 //点亮正常灯
  116.                 }        
  117.      jiexianw();               
  118.         }        
  119. }

  120. /***************温度上下限限制*******************/
  121. void jiexianw()
  122. {        
  123.         fixed_display();                        //显示固定内容
  124.         OLED_ShowString(0,4,"T&H limit");                          //设置区域显示"T&H limit"
  125.         OLED_ShowString(0,5,"T:UP");            //设置区域显示"T:UP"
  126.         OLED_ShowChar(32,5,ASCII[temp_up/10]);  //设置区域显示温度上限十位的数值
  127.         OLED_ShowChar(40,5,ASCII[temp_up%10]);  //设置区域显示温度上限个位的数值
  128.         OLED_ShowString(56,5,"DOWN");           //设置区域显示"DOWN"
  129.         OLED_ShowChar(88,5,ASCII[temp_down/10]);//设置区域显示温度下限十位的数值
  130.         OLED_ShowChar(94,5,ASCII[temp_down%10]);//设置区域显示温度下限个位的数值
  131.         
  132.         OLED_ShowString(0,6,"H:UP");            //设置区域显示"H:UP"
  133.         OLED_ShowChar(32,6,ASCII[humi_up/10]);  //设置区域显示湿度上限十位的数值
  134.         OLED_ShowChar(40,6,ASCII[humi_up%10]);  //设置区域显示湿度上限十位的数值
  135.         OLED_ShowString(56,6,"DOWN");           //设置区域显示"DOWN"
  136.         OLED_ShowChar(88,6,ASCII[humi_down/10]);//设置区域显示湿度下限十位的数值
  137.         OLED_ShowChar(94,6,ASCII[humi_down%10]);//设置区域显示湿度下限个位的数值
  138.         
  139. }

  140. /********************************************************
  141. 函数名称:void delayms(uint ms)
  142. 函数作用:毫秒延时函数
  143. 参数说明:
  144. ********************************************************/
  145. void delayms(uint ms)
  146. {
  147.         unsigned char i=100,j;
  148.         for(;ms;ms--)
  149.         {
  150.                 while(--i)
  151.                 {
  152.                         j=10;
  153.                         while(--j);
  154.                 }
  155.         }
  156. }
  157. /********************************************************
  158. 函数名称:void scan(void)
  159. 函数作用:按键检测函数
  160. 参数说明:
  161. ********************************************************/
  162. void scan(void)
  163. {        
  164.         //设置键,不支持连按
  165.         if(key_set==0)                 //按键按下
  166.         {
  167.                 delayms(7);                   //延时消抖
  168.                 if(key_set==0)         //再次确认按键按下
  169.                 {
  170.                         led=1;               //关闭报警灯
  171.                         led1=1;        //关闭正常灯
  172.                         buzz=1;               //关闭蜂鸣器
  173.                         if(set_f==0)   //进入设置先清除屏幕,显示设置部分
  174.                         {
  175.                                 OLED_Clear();      //清除屏幕显示
  176.                                 delay_n40us(100);         //延时等待全部清除完毕
  177.                         }
  178.                         set_f++;                   //设置变量+1
  179.                         if(set_f==5)         //全部设置完成,退出设置
  180.                         {
  181.                                 set_f=0;           //重置设置变量

  182.                                 AT24C02_write_date(0,humi_up);  //写入【湿度上限】数据保存
  183.                                 AT24C02_write_date(1,humi_down);//写入【湿度下限】数据保存
  184.                                 AT24C02_write_date(2,temp_up);  //写入【温度上限】数据保存
  185.                                 AT24C02_write_date(3,temp_down);//写入【温度下限】数据保存
  186.                                 
  187.                                 OLED_Clear();      //清除屏幕显示
  188.                                 delay_n40us(100);         //延时等待全部清除完毕
  189.                                 fixed_display();   //清除显示后显示固定部分
  190.                         }                        
  191.                 }
  192.                 while(!key_set);       //检测按键松开
  193.         }

  194.           //加值键,支持连按        
  195.         if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//进入设置模式,按下加键或减键
  196.         {
  197.          delayms(7);       //延时消抖
  198.   if(set_f==1)       //设置湿度上限
  199.   {
  200.         if(key_jia==0)
  201.         {
  202.                         if(humi_up<99)  //湿度最大值不可大于99%RH
  203.                         humi_up++;      //湿度上限+1%RH
  204.         }
  205.         if(key_jian==0)
  206.         {
  207.         if(humi_up!=0&&humi_up>humi_down+1)//湿度上限最小不可为0%RH,并且上限得比下限大
  208.          humi_up--;                       //湿度上限值-1%RH
  209.         
  210.         }
  211. }
  212.   if(set_f==2)        //设置湿度下限
  213.   {
  214.         if(key_jia==0)
  215.         {
  216.                                 if(humi_down<99&&humi_down+1<humi_up)//湿度下限最大值小于99%RH,并且下限不可超过上限
  217.                                         humi_down++;                       //湿度下限+1%RH
  218.         }
  219.         if(key_jian==0)
  220.         {
  221.                                 if(humi_down!=0)                   //湿度下限最小值不可为0%RH
  222.                                         humi_down--;                    //湿度下限值-1%RH        
  223.         }
  224. }

  225.   if(set_f==3)          //设置温度上限
  226.   {
  227.         if(key_jia==0)
  228.         {
  229.                                 if(temp_up<99) //温度上限最大值不可大于99℃
  230.                                         temp_up++;   //湿度上限+1℃
  231.         }
  232.         if(key_jian==0)
  233.         {
  234.                                 if(temp_up!=0&&temp_up>temp_down+1)//温度上限最小值不可为0℃,并且上限得比下限大
  235.                                         temp_up--;                       //温度上限值-1℃
  236.         
  237.         }
  238. }

  239.         if(set_f==4)        //设置温度下限
  240. {
  241.         if(key_jia==0)
  242.         {
  243.                                 if(temp_down<99&&temp_down+1<temp_up)//温度下限最大值不可大于99℃,并且下限不可超过上限
  244.                                         temp_down++;                       //温度下限+1℃
  245.         }
  246.         if(key_jian==0)
  247.         {               
  248.                                 if(temp_down!=0)                    //温度下限最小值不可为0℃
  249.                                         temp_down--;                      //温度下限值-1℃
  250.         
  251.         }
  252.                 }
  253.         }
  254. }

  255. /********************************************************
  256. 函数名称:void main()
  257. 函数作用:主函数
  258. 参数说明:
  259. ********************************************************/
  260. void main()
  261. {
  262.         if(key_jian==0)              //按键按下
  263.         {
  264.                 delayms(100);              //延时消抖
  265.                 if(key_jian==0)            //按键按下
  266.                 {
  267.                         AT24C02_write_date(0,75);//写入【湿度上限值】数据保存
  268.                         AT24C02_write_date(1,45);//写入【湿度下限值】数据保存
  269.                         AT24C02_write_date(2,30);//写入【温度上限值】数据保存
  270.                         AT24C02_write_date(3,16);//写入【温度下限值】数据保存
  271.                 }
  272.         }

  273.         humi_up=AT24C02_read_date(0);  //读取存储的【湿度上限值】数据
  274.         humi_down=AT24C02_read_date(1);//读取存储的【湿度下限值】数据
  275.         temp_up=AT24C02_read_date(2);  //读取存储的【温度上限值】数据
  276.         temp_down=AT24C02_read_date(3);//读取存储的【温度下限值】数据

  277.         OLED_Init();                         //显示屏初始化        
  278.         fixed_display();               //显示固定内容
  279.         while(1)
  280.         {               
  281.                 scan();                               //按键检测处理
  282.                 DHT11_read();            //读取DHT11温湿度
  283.                 display1();                    //显示当前温、湿度
  284.         }
  285. }   
复制代码



原理图

原理图
图片2.png

基于单片机的多功能室内温湿度测量仪.zip

150.11 KB, 下载次数: 357, 下载积分: 黑币 -5

Proteus8.13

评分

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

查看全部评分

回复

使用道具 举报

ID:792559 发表于 2020-7-4 16:47 | 显示全部楼层
运行了为什么一直在响

回复

使用道具 举报

ID:792559 发表于 2020-7-4 20:57 | 显示全部楼层
博主  你上个月发的那个温湿度感应器的keil文件有没有呀,求一份
回复

使用道具 举报

ID:796671 发表于 2020-7-6 09:16 | 显示全部楼层
楼主,keil工程可以发一份吗,我自建工程添加你的文件总报错
回复

使用道具 举报

ID:803004 发表于 2020-7-14 11:09 | 显示全部楼层
可以发一下keil工程文件吗 自建的报错
回复

使用道具 举报

ID:792559 发表于 2020-7-14 19:59 | 显示全部楼层
发表于 2020-7-4 16:47
运行了为什么一直在响

蜂鸣器
回复

使用道具 举报

ID:803901 发表于 2020-7-15 20:47 | 显示全部楼层
博主  你上个月发的那个温湿度感应器的keil文件有没有呀,求一份
回复

使用道具 举报

ID:89286 发表于 2020-8-3 12:58 | 显示全部楼层
Thanks for sharing
回复

使用道具 举报

ID:783837 发表于 2020-9-8 09:01 | 显示全部楼层
博主,keil文件可以发一下吗?
回复

使用道具 举报

ID:883149 发表于 2021-2-24 11:12 | 显示全部楼层
求一份keil文件,谢谢啦~
回复

使用道具 举报

ID:310349 发表于 2021-4-16 12:34 | 显示全部楼层
发表于 2020-7-4 20:57
博主  你上个月发的那个温湿度感应器的keil文件有没有呀,求一份

DHT11.H就是温湿度感应模块的文件
回复

使用道具 举报

ID:1031103 发表于 2022-10-12 16:46 | 显示全部楼层
温度和湿度上下限在代码里面怎么修改初值啊 求求了
回复

使用道具 举报

ID:1031103 发表于 2022-10-12 16:47 | 显示全部楼层
在代码里面怎么修改温度和湿度的初值啊 大哥们求求了
回复

使用道具 举报

ID:922131 发表于 2023-4-25 22:10 | 显示全部楼层
博主用的Proteus几啊,我的8打不开
回复

使用道具 举报

ID:922131 发表于 2023-5-21 11:05 | 显示全部楼层
楼主用AT24c02的主要用途是干什么的啊?直接用单片机读取传感器温湿度的值也可以吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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