找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2006|回复: 3
收起左侧

我设计一个温室检测,但是单片机程序无法让蜂鸣器报警和控制继电器,求大佬指点

[复制链接]
ID:506700 发表于 2019-4-21 12:52 | 显示全部楼层 |阅读模式
10黑币
TH 和RH是300ms检测一次得到的数据,Data1和2是自己通过按键可以调整的阀值,这两个数据都能在lcd1602上正确显示,但是就是那个报警函数warn(),烧写后跟不不按照预定想法来实行。怎么样都不会报警,我把控制蜂鸣器的管脚连接led也没用。不知道是不是我程序写的有问题,希望大佬们帮我看一下。

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"dht11.h"
  3. #include "lcd1602.h"
  4. #include"keypros.h"
  5. #include"i2c.h"

  6. sbit beep=P1^4;
  7. sbit switch1=P1^5;
  8. sbit switch2=P1^6;
  9. extern uint RH,TH;
  10. extern uint rec_dat1[2]; //用于显示的接收数据数组
  11. extern uint rec_dat2[2];
  12. extern uint Data1,Data2;
  13. extern uchar menu,flat;
  14. uchar DHT11;
  15. uchar i;
  16. uchar menu1_1[]={"Temp:   C   T:"},menu1_2[]={"Humi:  %RH  H:"},menu2[]={"Temp"},menu3[]={"Humi"};
  17. void time_init()   
  18. {
  19. EA   = 1;     //开总中断
  20. TMOD = 0X01;   //定时器0、定时器1工作方式1
  21. ET0  = 1;    //开定时器0中断
  22. TR0  = 1;    //允许定时器0定时
  23. }

  24. void warn()  //报警函数
  25. {

  26.   if(Data1<=TH)  //检测的温度高于设定温度报警值
  27.                               
  28.      {
  29.       beep=1;    //报警
  30.    switch1=1;
  31.      }      
  32.    
  33. if(Data2<=RH)  //检测的湿度高于设定的湿度值
  34.                               
  35.      {
  36.       beep=1;
  37.       switch2=1;    //报警
  38.      }      
  39.    
  40. if( Data1<=TH && Data2<=RH )  
  41.     {
  42.     beep=0; //停止报警
  43.    switch1=0;
  44.    switch2=0;
  45.   }
  46.    
  47.    
  48.   
  49. }




  50. void main()
  51. {   
  52.    
  53.     Data1=At24c02Read(1);
  54.    delay(10);
  55.    Data2=At24c02Read(2);
  56.   time_init();   
  57.    while(1)
  58.   {
  59.    Key();     //通过按键1来选择模式 模式1显示数据 模式二 调整温度阀值 模式三调整湿度阀值
  60.    if(menu==0)
  61.    {
  62.     if(flat==1)
  63.     {
  64.      flat=0;
  65.      LcdWriteCom(0x38);  //开显示
  66.          LcdWriteCom(0x0c);  //开显示不显示光标
  67.          LcdWriteCom(0x06);  //写一个指针加1
  68.          LcdWriteCom(0x01);
  69.      
  70.      LcdWriteCom(0x80);
  71.      for(i=0;i<14;i++)
  72.      LcdWriteData(menu1_1[i]);
  73.      LcdWriteCom(0x87);
  74.      LcdWriteData(0xdf);
  75.    
  76.      LcdWriteCom(0x40+0x80);
  77.       for(i=0;i<14;i++)
  78.      LcdWriteData(menu1_2[i]);
  79.          
  80.      LcdWriteCom(0x0e+0x80);
  81.      LcdWriteData((Data1/10)+0x30);
  82.      
  83.      LcdWriteCom(0x0f+0x80);
  84.      LcdWriteData((Data1%10)+0x30);
  85.      
  86.      LcdWriteCom(0x4e+0x80);
  87.      LcdWriteData((Data2/10)+0x30);
  88.      
  89.      LcdWriteCom(0x4f+0x80);
  90.      LcdWriteData((Data2%10)+0x30);
  91.          
  92.     }
  93.     if(DHT11==1)
  94.     {
  95.      DHT11=0;
  96.      DHT11_receive();
  97.      warn();
  98.      LcdWriteCom(0x85);
  99.      LcdWriteData(rec_dat2[0]);
  100.      LcdWriteCom(0x86);
  101.      LcdWriteData(rec_dat2[1]);
  102.      LcdWriteCom(0x45+0x80);
  103.      LcdWriteData(rec_dat1[0]);
  104.      LcdWriteCom(0x46+0x80);
  105.      LcdWriteData(rec_dat1[1]);
  106.         
  107.      
  108.     }
  109.    }
  110.    
  111.    
  112.    
  113.    if(menu==1)
  114.    {
  115.     if(flat==1)
  116.     {
  117.      flat=0;
  118.      LcdInit1();  //初始化 函数
  119.      
  120.      LcdWriteCom(0x86);
  121.       for(i=0;i<4;i++)
  122.      LcdWriteData(menu2[i]);
  123.     }
  124.     shezhi();                              //此函数是通过按键增加温度阀值
  125.     LcdWriteCom(0x47+0x80);
  126.     LcdWriteData((Data1/10)+0x30);
  127.      
  128.     LcdWriteCom(0x48+0x80);
  129.     LcdWriteData((Data1%10)+0x30);
  130.    }
  131.    
  132.    
  133.    if(menu==2)
  134.    {
  135.     if(flat==1)
  136.     {
  137.      flat=0;
  138.      LcdInit1();
  139.      
  140.      LcdWriteCom(0x86);
  141.       for(i=0;i<4;i++)
  142.      LcdWriteData(menu3[i]);
  143.   
  144.     }
  145.     shezhi();   ////此函数是通过按键增加湿度阀值
  146.     LcdWriteCom(0x47+0x80);
  147.     LcdWriteData((Data2/10)+0x30);
  148.      
  149.     LcdWriteCom(0x48+0x80);
  150.     LcdWriteData((Data2%10)+0x30);
  151.    }   
  152.   }   
  153. }
  154. void time0_int() interrupt 1
  155. {
  156. static uchar i;
  157. TH0 = 0x3c;
  158. TL0 = 0xb0;  // 50ms
  159. i++;  
  160. if(i==6)
  161. {
  162.   i = 0;
  163.   DHT11=1;    //300ms
  164. }
  165. }
复制代码

回复

使用道具 举报

ID:507641 发表于 2019-4-23 20:23 | 显示全部楼层
蜂鸣器选型选对了没?
回复

使用道具 举报

ID:280876 发表于 2019-4-24 20:01 | 显示全部楼层
void warn()  //报警函数
{

  if(Data1<=TH)  //检测的温度高于设定温度报警值
                              
     {
      beep=1;    //报警
   switch1=1;
     }      
   
if(Data2<=RH)  //检测的湿度高于设定的湿度值
                              
     {
      beep=1;
      switch2=1;    //报警
     }      
   
if( Data1<=TH && Data2<=RH )  
    {
    beep=0; //停止报警
   switch1=0;
   switch2=0;
  }
   
   
  
}
你判断逻辑都有问题
回复

使用道具 举报

ID:520972 发表于 2019-4-24 23:25 | 显示全部楼层
前面两个IF语句应该是大于等于,你的逻辑有点小问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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