找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5002|回复: 4
收起左侧

51单片机家庭环境监测系统全套资料 DHT11程序+原理图 并附上实体图

  [复制链接]
ID:544041 发表于 2019-5-21 18:23 | 显示全部楼层 |阅读模式
基于单片机的家庭环境监测系统
制作出来的实物图如下:
OE391K`9HB%AJ~}Y_)RSGU6.png

电路原理图如下:
EX7}JETB]TR54FXO~U.png

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

  11. //T:23C P0.12mg/m3
  12. //H:45% C:000mL/m3

  13. sbit DATA = P2^0;  //温湿度
  14. sbit E=P2^5;                //1602使能引脚
  15. sbit RS=P2^7;                //1602数据/命令选择引脚
  16. sbit RW=P2^6;
  17. sbit K1=P1^3;//设置键
  18. sbit K2=P1^4;//加
  19. sbit K3=P1^5;//减
  20. sbit K4=P1^6;  //确认
  21. sbit LED6=P3^2;         //烟雾报警
  22. sbit LED1=P3^3;                           //温度上限
  23. sbit LED2=P3^4;                                //温度下限
  24. sbit LED3=P3^5;                                 //湿度上限
  25. sbit LED4=P3^6;                                           //湿度下限
  26. sbit LED5=P3^7;                                                         //PM2.5报警
  27. sbit alarm=P1^7;                 //蜂鸣器
  28. uchar U8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;
  29. uchar U8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;
  30. uchar Mode,humidity,temperature;
  31. uint DA;
  32. bit bdata FlagStartRH;
  33. uchar flag ;//记录当前设置状态
  34. uint count;
  35. uchar sec=0;
  36. #define NULL 0
  37. #define RsBuf_N                        150
  38. bit flag_ok=0;
  39. uint sum;
  40. unsigned char xdata RsBuf[RsBuf_N];        //定义串口接收数据缓冲区
  41. uchar RsPoint;
  42. bit state=0;
  43. void TransmitText();
  44. unsigned char  dianhuahaoma[12]="17606735816";

  45. void Delay1(uint j)
  46. {
  47.     uchar i;
  48.     for(;j>0;j--)
  49.     {         
  50.                 for(i=0;i<27;i++);
  51.     }
  52. }


  53. void  Delay_10us(void)
  54. {
  55.     uchar i;
  56.     i--;
  57.     i--;
  58.     i--;
  59.     i--;
  60.     i--;
  61.     i--;
  62. }        

  63. void  COM(void)
  64. {
  65.     uchar i;
  66.     for(i=0;i<8;i++)           
  67.     {
  68.               U8FLAG=2;
  69.                    while((!DATA)&&U8FLAG++);
  70.                 Delay_10us();
  71.                 Delay_10us();
  72.                 Delay_10us();
  73.                   U8temp=0;
  74.         if(DATA)U8temp=1;
  75.                 U8FLAG=2;
  76.                 while((DATA)&&U8FLAG++);
  77.                    //超时则跳出for循环                  
  78.                    if(U8FLAG==1)break;
  79.                    //判断数据位是0还是1         
  80.                      
  81.                 // 如果高电平高过预定0高电平值则数据位为 1
  82.                     
  83.                 U8comdata<<=1;
  84.                    U8comdata|=U8temp;        //0
  85.     }//rof
  86. }

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

  150. /********************************************************************
  151. * 文件名  : 液晶1602显示.c
  152. * 描述    :  该程序实现了对液晶1602的控制。
  153. ***********************************************************************/


  154. /********************************************************************
  155. * 名称 : delay()
  156. * 功能 : 延时,延时时间大概为140US。
  157. * 输入 : 无
  158. * 输出 : 无
  159. ***********************************************************************/

  160. void delay()
  161. {
  162.         int i,j;
  163.         for(i=0; i<=10; i++)
  164.         for(j=0; j<=2; j++);
  165. }         
  166.         
  167. /********************************************************************
  168. * 名称 : enable(uchar del)
  169. * 功能 : 1602命令函数
  170. * 输入 : 输入的命令值
  171. * 输出 : 无
  172. ***********************************************************************/

  173. void write_1602com(uchar del)
  174. {
  175.         P0 = del;
  176.         RS = 0;
  177.         E = 1;
  178.         delay();
  179.         E = 0;
  180.         delay();
  181. }

  182. /********************************************************************
  183. * 名称 : write(uchar del)
  184. * 功能 : 1602写数据函数
  185. * 输入 : 需要写入1602的数据
  186. * 输出 : 无
  187. ***********************************************************************/

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

  197. /********************************************************************
  198. * 名称 : L1602_init()
  199. * 功能 : 1602初始化,请参考1602的资料
  200. * 输入 : 无
  201. * 输出 : 无
  202. ***********************************************************************/
  203. void L1602_init(void)
  204. {
  205.         write_1602com(0x38);
  206.         write_1602com(0x0c);
  207.         write_1602com(0x06);
  208.         write_1602com(0x01); //清屏要放在最后
  209.         write_1602com(0x80);
  210.         write_1602dat('W');
  211.         write_1602dat('e');
  212.         write_1602dat('l');
  213.         write_1602dat('c');
  214.         write_1602dat('o');
  215.         write_1602dat('m');
  216.         write_1602dat('e');
  217.         write_1602dat(' ');
  218.         write_1602dat('t');
  219.         write_1602dat('o');
  220.         write_1602dat(' ');
  221.         write_1602dat('u');
  222.         write_1602dat('s');
  223.         write_1602dat('e');
  224.         write_1602com(0x80+0x40);
  225.         write_1602dat(' ');
  226.         write_1602dat(' ');
  227.         write_1602dat(' ');
  228.         write_1602dat(' ');
  229.         write_1602dat(' ');
  230.         write_1602dat('I');
  231.         write_1602dat('n');
  232.         write_1602dat('i');
  233.         write_1602dat('t');
  234.         write_1602dat('.');
  235.         write_1602dat('.');
  236.         write_1602dat('.');
  237. }

  238. //T:23C P0.12mg/m3
  239. //H:45% C:000mL/m3

  240. void display()
  241. {
  242.         write_1602com(0x82);
  243.         write_1602dat(temperature%100/10+0x30);
  244.         write_1602dat(temperature%100%10+0x30);
  245.         write_1602com(0xc2);
  246.         write_1602dat(humidity%100/10+0x30);
  247.         write_1602dat(humidity%100%10+0x30);
  248.         write_1602com(0x87);
  249.         write_1602dat(PM%10000/1000+0x30);
  250.         write_1602dat('.');
  251.         write_1602dat(PM%1000/100+0x30);
  252.         write_1602dat(PM%100/10+0x30);
  253.         write_1602com(0xc8);
  254.         write_1602dat(MQ/100+0x30);
  255.         write_1602dat(MQ%100/10+0x30);
  256.         write_1602dat(MQ%10+0x30);                                                                  
  257. }
  258. void display_1()
  259. {
  260.         write_1602com(0x83);
  261.         write_1602dat(TH%100/10+0x30);
  262.         write_1602dat(TH%100%10+0x30);
  263.         write_1602com(0x8c);
  264.         write_1602dat(TL%100/10+0x30);
  265.         write_1602dat(TL%100%10+0x30);
  266.         write_1602com(0xc3);
  267.         write_1602dat(HH%100/10+0x30);
  268.         write_1602dat(HH%100%10+0x30);
  269.         write_1602com(0xcc);
  270.         write_1602dat(HL%100/10+0x30);
  271.         write_1602dat(HL%100%10+0x30);
  272. }
  273. void display_2()
  274. {
  275.         write_1602com(0x86);
  276.         write_1602dat(PMH%1000/100+0x30);
  277.         write_1602dat('.');
  278.         write_1602dat(PMH%100/10+0x30);
  279.         write_1602dat(PMH%10+0x30);
  280.         write_1602com(0xc7);
  281.         write_1602dat(MQH/100+0x30);
  282.         write_1602dat(MQH%100/10+0x30);
  283.         write_1602dat(MQH%10+0x30);
  284. }
  285. void write_string(uchar * str)
  286. {
  287.   while( * str)
  288.   {
  289.   write_1602dat(* str);
  290.   str++;
  291.   }
  292. }

  293. /***********************发送TEXT短信息********************************
  294. */
  295. void TransmitText()   //发送号码        发送内容,字母或数字
  296. {
  297. //        uchar i=5,j=5;
  298.         uchar send_number;
  299.         
  300.         SendString("AT+CMGF=1\r\n");        
  301.                
  302.         delayms_1000ms();
  303.         
  304.         SendString("AT+CSCS=\"UCS2\"\r\n");        
  305.         
  306.         delayms_1000ms();
  307.         
  308.         SendString("AT+CSMP=17,0,2,25\r\n");        
  309.         
  310.         delayms_1000ms();
  311.         
  312.         SendString("AT+CMGS=");        //信息发送指令 AT+CMGS=//
  313.         SendASC('"');
  314.         for(send_number=0;send_number<11;send_number++)
  315.         {
  316.                 SendASC('0');
  317.                 SendASC('0');
  318.                 SendASC('3');
  319.                 SendASC(dianhuahaoma[send_number]);
  320.         }   
  321.         SendASC('"');
  322.         SendASC('\r');                        //发送回车指令//
  323.         SendASC('\n');                        //发送换行指令//
  324.         
  325.         delayms_1000ms();
  326.         delayms_1000ms();
  327.         delayms_1000ms();

  328.         SendString("5F53524D6E295EA6FF1A");        //当前温度:
  329.         if(temperature/10!=0)
  330.         {
  331.                 SendASC('0');
  332.                 SendASC('0');
  333.                 SendASC('3');
  334.                 SendASC(temperature/10+0x30);
  335.         }
  336.         SendASC('0');
  337.         SendASC('0');
  338.         SendASC('3');
  339.         SendASC(temperature%10+0x30);
  340.         SendString("2103");        //摄氏度符号
  341.         SendString("0020");                        //发送空格
  342.         SendString("6E295EA64E0A9650FF1A");        //温度上限:
  343.         if(TH/10!=0)
  344.         {
  345.                 SendASC('0');
  346.                 SendASC('0');
  347.                 SendASC('3');
  348.                 SendASC(TH/10+0x30);
  349.         }
  350.         SendASC('0');
  351.         SendASC('0');
  352.         SendASC('3');
  353.         SendASC(TH%10+0x30);
  354.         SendString("2103");        //摄氏度符号
  355.         SendString("0020");                        //发送空格
  356.         SendString("6E295EA64E0B9650FF1A");        //温度下限:
  357.         if(TL/10!=0)
  358.         {
  359.                 SendASC('0');
  360.                 SendASC('0');
  361.                 SendASC('3');
  362.                 SendASC(TL/10+0x30);
  363.         }
  364.         SendASC('0');
  365.         SendASC('0');
  366.         SendASC('3');
  367.         SendASC(TL%10+0x30);
  368.         SendString("2103");        //摄氏度符号
  369.         SendString("0020");                        //发送空格
  370.         if(temperature>=TH)
  371.         SendString("6E295EA68FC79AD88BF76CE8610FFF01");        //温度过高请注意!
  372.         if(temperature<=TL)
  373.         SendString("6E295EA68FC74F4E8BF76CE8610FFF01");        //温度过低请注意!
  374.         SendString("0020");                        //发送空格
  375.         SendString("5F53524D6E7F5EA6FF1A");        //当前湿度:
  376.         if(humidity/10!=0)
  377.         {
  378.                 SendASC('0');
  379.                 SendASC('0');
  380.                 SendASC('3');
  381.                 SendASC(humidity/10+0x30);
  382.         }
  383.         SendASC('0');
  384.         SendASC('0');
  385.         SendASC('3');
  386.         SendASC(humidity%10+0x30);
  387.         SendString("0025");        //百分号符号
  388.         SendString("0020");                        //发送空格
  389.         SendString("6E7F5EA64E0A9650FF1A");        //湿度上限:
  390.         if(HH/10!=0)
  391.         {
  392.                 SendASC('0');
  393.                 SendASC('0');
  394.                 SendASC('3');
  395.                 SendASC(HH/10+0x30);
  396.         }
  397.         SendASC('0');
  398.         SendASC('0');
  399.         SendASC('3');
  400.         SendASC(HH%10+0x30);
  401.         SendString("0025");        //百分号符号
  402.         SendString("0020");                        //发送空格
  403.         SendString("6E7F5EA64E0B9650FF1A");        //湿度下限:
  404.         if(HL/10!=0)
  405.         {
  406.                 SendASC('0');
  407.                 SendASC('0');
  408.                 SendASC('3');
  409.                 SendASC(HL/10+0x30);
  410.         }
  411.         SendASC('0');
  412.         SendASC('0');
  413.         SendASC('3');
  414.         SendASC(TL%10+0x30);
  415.         SendString("0025");        //百分号符号
  416.         SendString("0020");                        //发送空格
  417.         if(humidity>=HH)
  418.         SendString("6E7F5EA68FC79AD88BF76CE8610FFF01");        //湿度过高请注意!
  419.         if(humidity<=HL)
  420.         SendString("6E7F5EA68FC74F4E8BF76CE8610FFF01");        //湿度过低请注意!
  421.         SendString("0020");                        //发送空格
  422.         delayms_1000ms();
  423.         delayms_1000ms();        
  424.         SendASC(0x1a);
  425.         
  426.         SendASC('\r');
  427.         SendASC('\n');
  428.     delayms_1000ms();
  429.         RsPoint=0;
  430.         delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();
  431.         delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();
  432.         delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();
  433.         delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();
  434.         delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();delayms_1000ms();
  435.         SendString("AT+CMGF=1\r\n");        
  436.                
  437.         delayms_1000ms();
  438.         
  439.         SendString("AT+CSCS=\"UCS2\"\r\n");        
  440.         
  441.         delayms_1000ms();
  442.         
  443.         SendString("AT+CSMP=17,0,2,25\r\n");        
  444.         
  445.         delayms_1000ms();
  446.         SendString("AT+CMGS=");        //信息发送指令 AT+CMGS=//
  447.         SendASC('"');
  448.         for(send_number=0;send_number<11;send_number++)
  449.         {
  450.                 SendASC('0');
  451.                 SendASC('0');
  452.                 SendASC('3');
  453.                 SendASC(dianhuahaoma[send_number]);
  454.         }   
  455.         SendASC('"');
  456.         SendASC('\r');                        //发送回车指令//
  457.         SendASC('\n');                        //发送换行指令//
  458.         
  459.         delayms_1000ms();
  460.         delayms_1000ms();
  461.         delayms_1000ms();

  462.         SendString("0050004D0032002E0035FF1A");        //PM2.5:

  463.         SendASC('0');
  464.         SendASC('0');
  465.         SendASC('3');
  466.         SendASC(PM/1000+0x30);
  467.         SendString("002E");        //.
  468.         SendASC('0');
  469.         SendASC('0');
  470.         SendASC('3');
  471.         SendASC(PM%1000/100+0x30);
  472.         SendASC('0');
  473.         SendASC('0');
  474.         SendASC('3');
  475.         SendASC(PM%100/10+0x30);
  476.         SendString("006D0067002F006D0033");        //mg/m3
  477.         SendString("0020");                        //发送空格
  478.         SendString("0050004D0032002E003562A58B66503CFF1A");        //PM2.5报警值:

  479.         SendASC('0');
  480.         SendASC('0');
  481.         SendASC('3');
  482.         SendASC(PMH/100+0x30);
  483.         SendString("002E");        //.
  484.         SendASC('0');
  485.         SendASC('0');
  486.         SendASC('3');
  487.         SendASC(PMH%100/10+0x30);
  488.         SendASC('0');
  489.         SendASC('0');
  490.         SendASC('3');
  491.         SendASC(PMH%10+0x30);
  492.         SendString("006D0067002F006D0033");        //mg/m3
  493.         SendString("0020");                        //发送空格
  494.         SendString("70DF96FEFF1A");        //烟雾:

  495.         if(MQ/100!=0)
  496.         {
  497.                 SendASC('0');
  498.                 SendASC('0');
  499.                 SendASC('3');
  500.                 SendASC(MQ/100+0x30);
  501.         }
  502.         if(MQ/10!=0)
  503.         {
  504.                 SendASC('0');
  505.                 SendASC('0');
  506.                 SendASC('3');
  507.                 SendASC(MQ%100/10+0x30);
  508.         }
  509.         SendASC('0');
  510.         SendASC('0');
  511.         SendASC('3');
  512.         SendASC(MQ%10+0x30);
  513.         SendString("006D0067002F006D0033");        //mg/m3
  514.         SendString("0020");                        //发送空格
  515.         SendString("70DF96FE62A58B66503CFF1A");        //烟雾报警值:
  516.         if(MQH/100!=0)
  517.         {
  518.                 SendASC('0');
  519.                 SendASC('0');
  520.                 SendASC('3');
  521.                 SendASC(MQH/100+0x30);
  522.         }
  523.         if(MQH/10!=0)
  524.         {
  525.                 SendASC('0');
  526.                 SendASC('0');
  527.                 SendASC('3');
  528.                 SendASC(MQH%100/10+0x30);
  529.         }
  530.         SendASC('0');
  531.         SendASC('0');
  532.         SendASC('3');
  533.         SendASC(MQH%10+0x30);
  534.         SendString("006D0067002F006D0033");        //mg/m3
  535.         
  536.         delayms_1000ms();
  537.         delayms_1000ms();        
  538.                 SendASC(0x1a);

  539.                         SendASC('\r');
  540.                     SendASC('\n');
  541.                 SendString("AT+CMGF=1\r\n");
  542.     delayms_1000ms();

  543.         RsPoint=0;           
  544. }
  545. /***按键函数***/
  546. void KEY()
  547. {
  548.         if(K1==0)
  549.         {
  550.                 Delay1(200);
  551.                 if(K1==0)
  552.                 {
  553.                         flag++;
  554.                         if(flag==1)
  555.                         {
  556.                                 FlagStartRH = 0;
  557.                                 TR0 = 0;
  558.                                 alarm=1;
  559.                                 write_1602com(0x80);
  560.                                 write_string("TH:   C  TL:   C");
  561.                                 write_1602com(0xc0);
  562.                                 write_string("HH:  %   HL:  % ");
  563.                                 write_1602com(0x85);
  564.                                 write_1602dat(0xdf);
  565.                                 write_1602com(0x8e);
  566.                                 write_1602dat(0xdf);
  567.                                 display_1();
  568.                                 write_1602com(0x84);
  569.                                 write_1602com(0x0f);
  570.                         }
  571.                         else if(flag==2)
  572.                         write_1602com(0x8d);
  573.                         else if(flag==3)
  574.                         write_1602com(0xc4);
  575.                         else if(flag==4)
  576.                         write_1602com(0xcd);
  577.                         else if(flag==5)
  578.                         {
  579.                                 write_1602com(0x80);
  580.                                 write_string("PM2.5: .  mg/m3 ");
  581.                                 write_1602com(0xc0);
  582.                                 write_string(" MQ  :    mL/m3 ");
  583.                                 display_2();
  584.                                 write_1602com(0x89);
  585.                         }
  586.                         else if(flag==6)
  587.                         write_1602com(0xc9);
  588.                         else
  589.                         {
  590.                                 flag=1;
  591.                                 write_1602com(0x80);
  592.                                 write_string("TH:   C  TL:   C");
  593.                                 write_1602com(0xc0);
  594.                                 write_string("HH:  %   HL:  % ");
  595.                                 write_1602com(0x85);
  596.                                 write_1602dat(0xdf);
  597.                                 write_1602com(0x8e);
  598.                                 write_1602dat(0xdf);
  599.                                 display_1();
  600.                                 write_1602com(0x84);
  601.                         }
  602.                         while(!K1);
  603.                 }
  604.         }
  605.         if(K2==0)
  606.         {
  607.                 Delay1(200);
  608.                 if(K2==0)
  609.                 {
  610.                         switch (flag)
  611.                         {
  612.                                 case 1: TH++;
  613.                                                 if(TH>99)
  614.                                                 TH=0;
  615.                                                 if(TH<=TL)
  616.                                                 TH=TL+1;  
  617.                                                 write_1602com(0x83);
  618.                                                 write_1602dat(TH/10+0x30);
  619.                                                 write_1602dat(TH%10+0x30);
  620.                                                 write_1602com(0x84);
  621.                                                 break;
  622.                                 case 2: TL++;
  623.                                                 if(TL>98)
  624.                                                 TL=0;
  625.                                                 if(TL>=TH)
  626.                                                 TL=TH-1;   
  627.                                                 write_1602com(0x8c);
  628.                                                 write_1602dat(TL/10+0x30);
  629.                                                 write_1602dat(TL%10+0x30);
  630.                                                 write_1602com(0x8d);
  631.                                                 break;
  632.                                 case 3: HH++;
  633.                                                 if(HH>99)
  634.                                                 HH=0;
  635.                                                 if(HH<=HL)
  636.                                                 HH=HL+1;
  637.                                                 write_1602com(0xc3);
  638.                                                 write_1602dat(HH/10+0x30);
  639.                                                 write_1602dat(HH%10+0x30);
  640.                                                 write_1602com(0xc4);
  641.                                                 break;
  642.                                 case 4: HL++;
  643.                                                 if(HL>98)
  644.                                                 HL=0;   
  645.                                                 if(HL>=HH)
  646.                                                 HL=HH-1;  
  647.                                                 write_1602com(0xcc);
  648.                                                 write_1602dat(HL/10+0x30);
  649.                                                 write_1602dat(HL%10+0x30);
  650.                                                 write_1602com(0xcd);
  651.                                                 break;
  652.                                 case 5: PMH++;
  653.                                                 if(PMH>200)  
  654.                                                 PMH=200;  
  655.                                                 write_1602com(0x86);
  656.                                                 write_1602dat(PMH%1000/100+0x30);
  657.                                                 write_1602dat('.');
  658.                                                 write_1602dat(PMH%100/10+0x30);
  659.                                                 write_1602dat(PMH%10+0x30);
  660.                                                 write_1602com(0x89);
  661.                                                 break;
  662.                                 case 6: MQH++;
  663.                                                 if(MQH>200)  
  664.                                                 MQH=200;  
  665.                                                 write_1602com(0xc7);
  666.                                                 write_1602dat(MQH%1000/100+0x30);
  667.                                                 write_1602dat(MQH%100/10+0x30);
  668.                                                 write_1602dat(MQH%10+0x30);
  669.                                                 write_1602com(0xc9);
  670.                                                 break;
  671.                         }
  672.                         while(!K2);
  673.                 }
  674.         }
  675.         if(K3==0)
  676.         {
  677.                 Delay1(200);
  678.                 if(K3==0)
  679.                 {
  680.                         switch (flag)
  681.                         {
  682.                                 case 1: TH--;
  683.                                                 if(TH>99)
  684.                                                 TH=99;
  685.                                                 if(TH<=TL)
  686.                                                 TH=TL+1;   
  687.                                                 write_1602com(0x83);
  688.                                                 write_1602dat(TH/10+0x30);
  689.                                                 write_1602dat(TH%10+0x30);
  690.                                                 write_1602com(0x84);
  691.                                                 break;
  692.                                 case 2: TL--;
  693.                                                 if(TL>99)
  694.                                                 TL=98;
  695.                                                 if(TL>=TH)
  696.                                                 TL=TH-1;   
  697.                                                 write_1602com(0x8c);
  698.                                                 write_1602dat(TL/10+0x30);
  699.                                                 write_1602dat(TL%10+0x30);
  700.                                                 write_1602com(0x8d);
  701.                                                 break;
  702.                                 case 3: HH--;
  703.                                                 if(HH>99)
  704.                                                 HH=99;
  705.                                                 if(HH<=HL)
  706.                                                 HH=HL+1;   
  707.                                                 write_1602com(0xc3);
  708.                                                 write_1602dat(HH/10+0x30);
  709.                                                 write_1602dat(HH%10+0x30);
  710.                                                 write_1602com(0xc4);
  711.                                                 break;
  712.                                 case 4: HL--;
  713.                                                 if(HL>99)
  714.                                                 HL=98;
  715.                                                 if(HL>=HH)
  716.                                                 HL=HH-1;   
  717.                                                 write_1602com(0xcc);
  718.                                                 write_1602dat(HL/10+0x30);
  719.                                                 write_1602dat(HL%10+0x30);
  720.                                                 write_1602com(0xcd);
  721.                                                 break;
  722.                                 case 5: PMH--;
  723.                                                 if(PMH<=0)  
  724.                                                 PMH=0;  
  725.                                                 write_1602com(0x86);
  726.                                                 write_1602dat(PMH%1000/100+0x30);
  727.                                                 write_1602dat('.');
  728.                                                 write_1602dat(PMH%100/10+0x30);
  729.                                                 write_1602dat(PMH%10+0x30);
  730.                                                 write_1602com(0x89);
  731.                                                 break;
  732.                                 case 6: MQH--;
  733.                                                 if(MQH<=0)  
  734.                                                 MQH=0;  
  735.                                                 write_1602com(0xc7);
  736.                                                 write_1602dat(MQH%1000/100+0x30);
  737.                                                 write_1602dat(MQH%100/10+0x30);
  738.                                                 write_1602dat(MQH%10+0x30);
  739.                                                 write_1602com(0xc9);
  740.                                                 break;
  741.                         }
  742.                         while(!K3);
  743.                 }
  744.         }
  745.         if(K4==0)
  746.         {
  747.                 Delay1(200);
  748.                 if(K4==0)
  749.                 {
  750.                         FlagStartRH = 1;
  751.                         TR0 = 1;
  752.                         write_1602com(0x0c);
  753.                         write_1602com(0x80);
  754.                         write_string("T:  C P .  mg/m3");
  755.                         write_1602com(0xc0);
  756.                         write_string("H:  % M:   mL/m3");
  757.                         display();
  758.                         flag=0;
  759.                         write_eeprom();
  760.                 }
  761.         }
  762. }

  763. void Onealarm()
  764. {
  765.         alarm=0;
  766.         Delay1(200);
  767.         alarm=1;
  768.         Delay1(200);
  769. }

  770. //T:23C P0.12mg/m3
  771. //H:45% C:000mL/m3

  772. /********************************************************************
  773. * 名称 : Main()
  774. * 功能 : 主函数
  775. ***********************************************************************/
  776. void main()
  777. {
  778.     uint testnum;
  779.         uchar ys;
  780.         
  781.     Uart_init();
  782.         RW=0;
  783.           init_eeprom();
  784.         read_eeprom();
  785.         L1602_init();
  786.         for(ys=0;ys<10;ys++)
  787.         {
  788.                 delayms_1000ms();        
  789.         }
  790.         SendString("AT\r\n");
  791.         delayms_1000ms();
  792.         delayms_1000ms();
  793.         SendString("AT\r\n");
  794.         delayms_1000ms();
  795.         delayms_1000ms();
  796.         SendString("ati\r\n");
  797.         delayms_1000ms();
  798.         delayms_1000ms();
  799.         SendString("ati\r\n");
  800.         delayms_1000ms();
  801.         delayms_1000ms();
  802.         SendString("ATH\r\n");
  803.         delayms_1000ms();
  804.         delayms_1000ms();
  805.         SendString("AT+CMGF=1\r\n");
  806.         delayms_1000ms();
  807.         delayms_1000ms();
  808.         SendString("AT+CNMI=2,1,0,0,0\r\n");
  809.         delayms_1000ms();
  810.         delayms_1000ms();
  811.         SendString("ATH\r\n");
  812.         delayms_1000ms();
  813.         delayms_1000ms();
  814.         SendString("AT+CSCS=");
  815.         SendASC('"');
  816.         SendString("UCS2");
  817.         SendASC('"');
  818.         SendString("\r\n");         
  819.         delayms_1000ms();
  820.         write_1602com(0x80);
  821.         write_string("T:  C P .  mg/m3");
  822.         write_1602com(0xc0);
  823.         write_string("H:  % M:   mL/m3");
  824. //        Uart_init();
  825. //        TH=30;TL=20;HH=80;HL=50;COH=100;PMH=100;
  826.         while(1)
  827.         {
  828.                 KEY();
  829.                 if(flag==0)
  830.                 {
  831.                         if(FlagStartRH==1)
  832.                         {
  833.                                 testnum = RH();
  834.                                 FlagStartRH = 0;
  835.         //                        TR0 = 1;
  836.                                 humidity = U8RH_data_H;         //读出温湿度,只取整数部分
  837.                                 temperature = U8T_data_H;        
  838.                                 
  839.                                 DA=sum/40;
  840.                                 sum=0;
  841.                                 PM=DA*(float)(DA/4);
  842.                                 MQ=adc0832(1);
  843.                                 display();
  844.                         }
  845.                         if(temperature>=TH)
  846.                         LED1=0;
  847.                         else
  848.                         LED1=1;
  849.                         if(temperature<=TL)
  850.                         LED2=0;
  851.                         else
  852.                         LED2=1;
  853.                         if(humidity>=HH)
  854.                         LED3=0;
  855.                         else
  856.                         LED3=1;
  857.                         if(humidity<=HL)
  858.                         LED4=0;
  859.                         else
  860.                         LED4=1;
  861.                         if(PM/10>=PMH)
  862.                         LED5=0;
  863.                         else
  864.                         LED5=1;
  865.                         if(MQ>=MQH)
  866.                         LED6=0;
  867.                         else
  868.                         LED6=1;
  869.                         if(temperature>=TH||temperature<=TL||humidity>=HH||humidity<=HL||PM/10>=PMH||MQ>=MQH)
  870.                         {
  871.                                 Onealarm();        
  872.                         }
  873.                         else
  874.                         alarm=1;
  875.                         if((temperature>=TH||temperature<=TL||humidity>=HH||humidity<=HL||PM/10>=PMH||MQ>=MQH)&&flag_ok==1)
  876.                         {
  877.                                 TR0=0;
  878.                                 TransmitText();        
  879.                                 flag_ok=0;
  880.                                 TR0=1;
  881.                         }
  882.                 }
  883.         }
  884. }

  885. void timer0() interrupt 1
  886. {
  887.         TH0=0x4b;
  888.         TL0=0xff;
  889.         count++;

  890.         DA=adc0832(0);
  891.         sum=sum+DA;
  892.         if(count>=40)
  893.         {
  894.                 count=0;
  895.                 FlagStartRH=1;
  896.                 if(flag_ok==0)
  897.                 {
  898.                         sec++;
  899.                         if(sec>=10)
  900.                         {
  901.                                 sec=0;
  902.                                 flag_ok=1;
  903.                         }
  904.                 }
  905.         }
  906. }
复制代码

所有资料51hei提供下载:
基于单片机的家庭环境监测系统.rar (2.82 MB, 下载次数: 225)

参考文档.7z

1.65 MB, 下载次数: 146, 下载积分: 黑币 -5

6-制作详解.rar

3.39 MB, 下载次数: 121, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:520521 发表于 2019-6-3 13:32 | 显示全部楼层
你好 请问SIM模块怎样用CAD仿真呢
回复

使用道具 举报

ID:441206 发表于 2020-2-15 12:47 来自手机 | 显示全部楼层
这个用的哪款传感器
回复

使用道具 举报

ID:577269 发表于 2021-5-19 21:12 来自手机 | 显示全部楼层
楼主没有画仿真,有谁能画一个吗?
回复

使用道具 举报

ID:473988 发表于 2021-5-30 22:11 | 显示全部楼层
有哪位大神能画一个仿真,给大家学习一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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