标题:
我设计一个温室检测,但是单片机程序无法让蜂鸣器报警和控制继电器,求大佬指点
[打印本页]
作者:
皮皮虾不p
时间:
2019-4-21 12:52
标题:
我设计一个温室检测,但是单片机程序无法让蜂鸣器报警和控制继电器,求大佬指点
TH 和RH是300ms检测一次得到的数据,Data1和2是自己通过按键可以调整的阀值,这两个数据都能在lcd1602上正确显示,但是就是那个报警函数warn(),烧写后跟不不按照预定想法来实行。怎么样都不会报警,我把控制蜂鸣器的管脚连接led也没用。不知道是不是我程序写的有问题,希望大佬们帮我看一下。
单片机源程序如下:
#include"reg52.h"
#include"dht11.h"
#include "lcd1602.h"
#include"keypros.h"
#include"i2c.h"
sbit beep=P1^4;
sbit switch1=P1^5;
sbit switch2=P1^6;
extern uint RH,TH;
extern uint rec_dat1[2]; //用于显示的接收数据数组
extern uint rec_dat2[2];
extern uint Data1,Data2;
extern uchar menu,flat;
uchar DHT11;
uchar i;
uchar menu1_1[]={"Temp: C T:"},menu1_2[]={"Humi: %RH H:"},menu2[]={"Temp"},menu3[]={"Humi"};
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
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;
}
}
void main()
{
Data1=At24c02Read(1);
delay(10);
Data2=At24c02Read(2);
time_init();
while(1)
{
Key(); //通过按键1来选择模式 模式1显示数据 模式二 调整温度阀值 模式三调整湿度阀值
if(menu==0)
{
if(flat==1)
{
flat=0;
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01);
LcdWriteCom(0x80);
for(i=0;i<14;i++)
LcdWriteData(menu1_1[i]);
LcdWriteCom(0x87);
LcdWriteData(0xdf);
LcdWriteCom(0x40+0x80);
for(i=0;i<14;i++)
LcdWriteData(menu1_2[i]);
LcdWriteCom(0x0e+0x80);
LcdWriteData((Data1/10)+0x30);
LcdWriteCom(0x0f+0x80);
LcdWriteData((Data1%10)+0x30);
LcdWriteCom(0x4e+0x80);
LcdWriteData((Data2/10)+0x30);
LcdWriteCom(0x4f+0x80);
LcdWriteData((Data2%10)+0x30);
}
if(DHT11==1)
{
DHT11=0;
DHT11_receive();
warn();
LcdWriteCom(0x85);
LcdWriteData(rec_dat2[0]);
LcdWriteCom(0x86);
LcdWriteData(rec_dat2[1]);
LcdWriteCom(0x45+0x80);
LcdWriteData(rec_dat1[0]);
LcdWriteCom(0x46+0x80);
LcdWriteData(rec_dat1[1]);
}
}
if(menu==1)
{
if(flat==1)
{
flat=0;
LcdInit1(); //初始化 函数
LcdWriteCom(0x86);
for(i=0;i<4;i++)
LcdWriteData(menu2[i]);
}
shezhi(); //此函数是通过按键增加温度阀值
LcdWriteCom(0x47+0x80);
LcdWriteData((Data1/10)+0x30);
LcdWriteCom(0x48+0x80);
LcdWriteData((Data1%10)+0x30);
}
if(menu==2)
{
if(flat==1)
{
flat=0;
LcdInit1();
LcdWriteCom(0x86);
for(i=0;i<4;i++)
LcdWriteData(menu3[i]);
}
shezhi(); ////此函数是通过按键增加湿度阀值
LcdWriteCom(0x47+0x80);
LcdWriteData((Data2/10)+0x30);
LcdWriteCom(0x48+0x80);
LcdWriteData((Data2%10)+0x30);
}
}
}
void time0_int() interrupt 1
{
static uchar i;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
i++;
if(i==6)
{
i = 0;
DHT11=1; //300ms
}
}
复制代码
作者:
SURUBU1976
时间:
2019-4-23 20:23
蜂鸣器选型选对了没?
作者:
wushiye54
时间:
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;
}
}
你判断逻辑都有问题
作者:
Wuhen_123456789
时间:
2019-4-24 23:25
前面两个IF语句应该是大于等于,你的逻辑有点小问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1