找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5111|回复: 1
收起左侧

51单片机智能家居环境监测系统程序 烟雾温湿度监测Proteus仿真

[复制链接]
ID:673963 发表于 2020-6-1 22:01 | 显示全部楼层 |阅读模式
本设计是基于STC89C52的智能家居环境监测系统主要模块有DHT11温湿度数据采集模块,MQ-2烟雾数据采集模块,ADC0832模数转换模块,LCD1602显示模块,蜂鸣器报警电路,LED闪烁电路,外部按键电路

主要功能包括通过DHT11进行温湿度数据采集并通过LCD1602进行实时显示,MQ-2烟雾模块采集数据反馈到ADC0832经过模数转换后传送到单片机芯片中处理数据,也是通过LCD1602进行显示,当以上任何一个数据超出阈值时,都会触发蜂鸣器报警和对应的LED显示灯闪烁。此外,根据环境的不同需要,可以通过外部按键进行更改温湿度上下限的阈值范围和烟雾浓度的上限

原理图如图所示:
51hei图片20200601213706.png

实物图如图所示:
51hei图片20200601215458.jpg

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

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>  
  5. #include "0832.h"
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #include "eeprom52.h"

  9. sbit DATA = P3^7;  //温湿度
  10. sbit E=P2^5;                //1602使能引脚
  11. sbit RS=P2^7;                //1602数据/命令选择引脚
  12. sbit RW=P2^6;
  13. sbit K1=P1^3;//设置键
  14. sbit K2=P1^4;//加
  15. sbit K3=P1^5;//减
  16. sbit LED1=P3^1;         //烟雾报警
  17. sbit LED2=P3^2;                           //温度上限
  18. sbit LED3=P3^3;                                //温度下限
  19. sbit LED4=P3^4;                                 //湿度上限
  20. sbit LED5=P3^5;                                           //湿度下限
  21. sbit alarm=P3^0;                 //蜂鸣器
  22. uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
  23. uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
  24. uchar Mode,humidity,temperature,smog;
  25. bit BJ_LED1=1,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1;          //定义LED报警变量
  26. bit bdata FlagStartRH;
  27. uchar flag ;//记录当前设置状态
  28. uint count;

  29. //定时器0初始化
  30. void Timer0_Init()
  31. {
  32.         ET0 = 1;        //允许定时器0中断
  33.         TMOD = 0x11;       //定时器工作方式选择
  34.         TL0 = 0xFF;     
  35.         TH0 = 0x4B;     //定时器赋予初值
  36.         TH1=0xdc;
  37.         TL1=0x00;
  38.         ET1=1;
  39.         TR0 = 1;        //启动定时器
  40. }

  41. //定时器0中断
  42. void Timer0_ISR (void) interrupt 1 using 0
  43. {
  44.         uchar RHCounter;
  45.         TL0 = 0xFF;
  46.         TH0 = 0x4B;     //定时器赋予初值
  47.         RHCounter++;
  48.     if (RHCounter >= 15)
  49.     {
  50.        FlagStartRH = 1;
  51.            RHCounter = 0;
  52.     }
  53. }
  54. void Delay1(uint j)
  55. {
  56.     uchar i;
  57.     for(;j>0;j--)
  58.     {        
  59.                 for(i=0;i<27;i++);
  60.     }
  61. }

  62. void  Delay_10us(void)
  63. {
  64.     uchar i;
  65.     i--;
  66.     i--;
  67.     i--;
  68.     i--;
  69.     i--;
  70.     i--;
  71. }

  72. void delay_ms(uint z)  //延时函数
  73. {
  74.         uint x,y;
  75.         for(x=z;x>0;x--)
  76.                 for(y=121;y>0;y--);                        //约1ms
  77. }        

  78. void  COM(void)
  79. {
  80.     uchar i;
  81.     for(i=0;i<8;i++)          
  82.     {
  83.               U8FLAG=2;
  84.                    while((!DATA)&&U8FLAG++);
  85.                 Delay_10us();
  86.                 Delay_10us();
  87.                 Delay_10us();
  88.                   U8temp=0;
  89.         if(DATA)U8temp=1;
  90.                     U8FLAG=2;
  91.                 while((DATA)&&U8FLAG++);
  92.                    //超时则跳出for循环                  
  93.                    if(U8FLAG==1)break;
  94.                    //判断数据位是0还是1         
  95.                      
  96.                 // 如果高电平高过预定0高电平值则数据位为 1
  97.                     
  98.                 U8comdata<<=1;
  99.                    U8comdata|=U8temp;        //0
  100.     }//rof
  101. }

  102. //--------------------------------
  103. //-----温湿度读取子程序 ------------
  104. //--------------------------------
  105. //----以下变量均为全局变量--------
  106. //----温度高8位== U8T_data_H------
  107. //----温度低8位== U8T_data_L------
  108. //----湿度高8位== U8RH_data_H-----
  109. //----湿度低8位== U8RH_data_L-----
  110. //----校验 8位 == U8checkdata-----
  111. //----调用相关子程序如下----------
  112. //---- Delay();, Delay_10us();,COM();
  113. //--------------------------------
  114. uchar RH(void)
  115. {
  116.     //主机拉低18ms
  117.     DATA=0;
  118.         Delay1(180);  //原来为5
  119.         DATA=1;
  120.         //总线由上拉电阻拉高 主机延时20us
  121.         Delay_10us();
  122.         Delay_10us();
  123.         Delay_10us();
  124.         Delay_10us();
  125.         //主机设为输入 判断从机响应信号
  126.         DATA=1;
  127.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
  128.         if(!DATA)                 //T !          
  129.         {
  130.             U8FLAG=2;
  131.             //判断从机是否发出 80us 的低电平响应信号是否结束         
  132.             while((!DATA)&&U8FLAG++);
  133.             U8FLAG=2;
  134.             //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  135.             while((DATA)&&U8FLAG++);
  136.             //数据接收状态                 
  137.             COM();
  138.             U8RH_data_H_temp=U8comdata;
  139.             COM();
  140.             U8RH_data_L_temp=U8comdata;
  141.             COM();
  142.             U8T_data_H_temp=U8comdata;
  143.             COM();
  144.             U8T_data_L_temp=U8comdata;
  145.             COM();
  146.             U8checkdata_temp=U8comdata;
  147.             DATA=1;
  148.             //数据校验
  149.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  150.             if(U8temp==U8checkdata_temp)
  151.             {
  152.                       U8RH_data_H=U8RH_data_H_temp;
  153.                       U8RH_data_L=U8RH_data_L_temp;
  154.                       U8T_data_H=U8T_data_H_temp;
  155.                       U8T_data_L=U8T_data_L_temp;
  156.                       U8checkdata=U8checkdata_temp;
  157.             }
  158.                 return 1;
  159.         }
  160.         else   //传感器不响应
  161.         {
  162.            return 0;
  163.         }
  164. }

  165. /********************************************************************
  166. * 文件名  : 液晶1602显示.c
  167. * 描述    :  该程序实现了对液晶1602的控制。
  168. ***********************************************************************/


  169. /********************************************************************
  170. * 名称 : delay()
  171. * 功能 : 延时,延时时间大概为140US。
  172. * 输入 : 无
  173. * 输出 : 无
  174. ***********************************************************************/

  175. void delay()
  176. {
  177.         int i,j;
  178.         for(i=0; i<=10; i++)
  179.         for(j=0; j<=2; j++);
  180. }          
  181.        
  182. /********************************************************************
  183. * 名称 : enable(uchar del)
  184. * 功能 : 1602命令函数
  185. * 输入 : 输入的命令值
  186. * 输出 : 无
  187. ***********************************************************************/

  188. void write_1602com(uchar del)
  189. {
  190.         P0 = del;
  191.         RS = 0;
  192.         E = 1;
  193.         delay();
  194.         E = 0;
  195.         delay();
  196. }

  197. /********************************************************************
  198. * 名称 : write(uchar del)
  199. * 功能 : 1602写数据函数
  200. * 输入 : 需要写入1602的数据
  201. * 输出 : 无
  202. ***********************************************************************/

  203. void write_1602dat(uchar del)
  204. {
  205.         P0 = del;
  206.         RS = 1;
  207.         E = 1;
  208.         delay();
  209.         E = 0;
  210.         delay();
  211. }

  212. /********************************************************************
  213. * 名称 : L1602_init()
  214. * 功能 : 1602初始化,请参考1602的资料
  215. * 输入 : 无
  216. * 输出 : 无
  217. ***********************************************************************/
  218. void L1602_init(void)
  219. {
  220.        
  221.         write_1602com(0x38);
  222.         write_1602com(0x0c);
  223.         write_1602com(0x06);
  224.         write_1602com(0x01); //清屏要放在最后
  225.         delay_ms(2);
  226. }


  227. void display()
  228. {
  229.   write_1602com(0x83);
  230.   write_1602dat(temperature%100/10+0x30);
  231.   write_1602dat(temperature%100%10+0x30);
  232.   write_1602com(0x8c);
  233.   write_1602dat(humidity%100/10+0x30);
  234.   write_1602dat(humidity%100%10+0x30);
  235.     write_1602com(0xc3);
  236.   write_1602dat(smog%100/10+0x30);
  237.   write_1602dat(smog%100%10+0x30);
  238.           write_1602com(0x85);
  239.         write_1602dat(0xdf);                                                                  
  240. }
  241. void display_1()
  242. {
  243.   write_1602com(0x83);
  244.   write_1602dat(TH%100/10+0x30);
  245.   write_1602dat(TH%100%10+0x30);
  246.   write_1602com(0x8c);
  247.   write_1602dat(TL%100/10+0x30);
  248.   write_1602dat(TL%100%10+0x30);
  249.    write_1602com(0xc3);
  250.   write_1602dat(HH%100/10+0x30);
  251.   write_1602dat(HH%100%10+0x30);
  252.   write_1602com(0xcc);
  253.   write_1602dat(HL%100/10+0x30);
  254.   write_1602dat(HL%100%10+0x30);
  255. }
  256. void write_string(uchar * str)
  257. {
  258.   while( * str)
  259.   {
  260.   write_1602dat(* str);
  261.   str++;
  262.   }
  263. }
  264. /***按键函数***/
  265. void KEY()
  266. {
  267. if(K1==0)
  268. {
  269.    Delay1(200);
  270.   if(K1==0)
  271.   {
  272.            flag++;
  273.         if(flag==1)
  274.     {
  275.          write_1602com(0x80);
  276.          write_string("TH:   C  TL:   C");
  277.          write_1602com(0xc0);
  278.          write_string("HH:  %   HL:  % ");
  279.          write_1602com(0x85);
  280.         write_1602dat(0xdf);
  281.         write_1602com(0x8e);
  282.         write_1602dat(0xdf);
  283.          display_1();
  284.          write_1602com(0x84);
  285.          write_1602com(0x0f);
  286.         }
  287.         else if(flag==2)
  288.          write_1602com(0x8d);
  289.          else if(flag==3)
  290.          write_1602com(0xc4);
  291.          else if(flag==4)
  292.          write_1602com(0xcd);
  293.          else if(flag==5)
  294.          {
  295.          write_1602com(0xc0);
  296.          write_string("                ");
  297.          write_1602com(0x80);
  298.          write_string("Sg:  mg/m3      ");
  299.          write_1602com(0x83);
  300.          write_1602dat(SM/10+0x30);
  301.          write_1602dat(SM%10+0x30);

  302.          write_1602com(0x84);
  303.          }
  304.          else
  305.          {
  306.          write_1602com(0x80);
  307.          write_string("Te:   C  Hu:  % ");
  308.          write_1602com(0xc0);
  309.          write_string("Sg:  mg/m3      ");
  310.          write_1602com(0x85);
  311.      write_1602dat(0xdf);
  312.      display();
  313.          write_1602com(0x0c);
  314.          flag=0;
  315.          write_eeprom();
  316.          }
  317.          while(!K1);
  318.   }
  319. }
  320. if(K2==0)
  321. {
  322.    Delay1(200);
  323.   if(K2==0)
  324.   {
  325.    switch (flag)
  326.            {
  327.                     case 1: TH++;if(TH>99) TH=0;if(TH<=TL) TH=TL+1;  write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
  328.                     case 2: TL++;if(TL>98) TL=0; if(TL>=TH) TL=TH-1;    write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
  329.                         case 3: HH++;if(HH>99) HH=0; if(HH<=HL) HH=HL+1;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
  330.                         case 4: HL++;if(HL>98) HL=0;   if(HL>=HH) HL=HH-1;  write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
  331.                         case 5: SM++;if(SM>9)  SM=0;  write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
  332.                    }
  333.    while(!K2);
  334.   }
  335. }
  336. if(K3==0)
  337. {
  338.    Delay1(200);
  339.   if(K3==0)
  340.   {
  341.    switch (flag)
  342.    {
  343.    case 1: TH--;if(TH>99) TH=99; if(TH<=TL) TH=TL+1;   write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30); write_1602com(0x84);break;
  344.    case 2: TL--;if(TL>99) TL=98;if(TL>=TH) TL=TH-1;   write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d); break;
  345.    case 3: HH--;if(HH>99) HH=99; if(HH<=HL) HH=HL+1;   write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30); write_1602com(0xc4);break;
  346.    case 4: HL--;if(HL>99) HL=98;if(HL>=HH) HL=HH-1;   write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30); write_1602com(0xcd);break;
  347.    case 5: SM--;if(SM>99)  SM=9;  write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84); break;
  348.    }
  349.    while(!K3);
  350.   }
  351. }
  352. }
  353. void Onealarm()
  354. {
  355.   alarm=0;
  356.   Delay1(200);
  357.   alarm=1;
  358. }

  359. void dis_init()
  360. {
  361.         unsigned char pp=0;
  362.         write_1602com(0x80);                                //进入设置状态显示
  363.         write_string("Welcome to use  ");        //设置状态第一行显示
  364.         write_1602com(0xc0);                                //选中第二行
  365.         write_string("Please waiting..");        //设置状态第二行显示
  366.         P3=0xFE;
  367.         delay_ms(500);
  368.         for(pp=0;pp<8;pp++)
  369.         {
  370.                 P3=_crol_(P3,1);
  371.                 delay_ms(100);
  372.         }
  373.         P3=0x7F;
  374.         for(pp=0;pp<8;pp++)
  375.         {
  376.                 P3=_cror_(P3,1);
  377.                 delay_ms(100);
  378.         }
  379.         alarm=1;
  380.         LED1=LED2=LED3=LED4=LED5=0;
  381.         delay_ms(2000);
  382. }

  383. /********************************************************************
  384. * 名称 : Main()
  385. * 功能 : 主函数
  386. ***********************************************************************/
  387. void main()
  388. {
  389.     uint testnum;

  390.     EA = 0;
  391.         Timer0_Init();  //定时器0初始化
  392.         EA = 1;
  393.         RW=0;
  394.   
  395.         L1602_init();
  396.         dis_init();
  397.          write_1602com(0x85);
  398.      write_1602dat(0xdf);
  399.                    write_1602com(0x80);
  400. ……………………

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

所有资料51hei提供下载:
单片机烟雾温湿度监测.7z (1.37 MB, 下载次数: 326)

评分

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

查看全部评分

回复

使用道具 举报

ID:753283 发表于 2020-6-2 20:50 来自手机 | 显示全部楼层
楼主有图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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