|
看了很多煙霧報(bào)警系統(tǒng),要么就是要錢的,源代碼還特別貴,要么就是代碼error特別多,于是自己就寫了煙霧報(bào)警系統(tǒng),主要功能是測(cè)量溫度后并在LCD1602上顯示溫度,測(cè)量煙霧濃度,當(dāng)煙霧濃度低于閥值時(shí)蜂鳴器報(bào)警,并且亮紅燈,(正常時(shí)亮藍(lán)燈,煙霧濃度是反著來(lái)的,煙霧濃度越大,顯示的值越小,我也不知道咋回事,如果有會(huì)的大佬還請(qǐng)一起研究指教),并且有六個(gè)按鍵可以控制濃度的閥值。以及溫度的上下限,當(dāng)溫度的值在上下限值中時(shí),亮藍(lán)燈,如果大于上限或低于下限亮紅燈,蜂鳴器不響,第一次發(fā)帖,不知道怎么做,還是想要大佬提點(diǎn)
制作出來(lái)的實(shí)物圖如下:
電路原理圖如下:
部分代碼如下:
#include <REGX52.H>
#include <intrins.h>
#include "LCD1602.h"
#include "DS18B20.h"
#include "key.h"
//宏定義int and char
#define uint unsigned int
#define uchar unsigned char
signed char up=30; //上限值
signed char lay=10; //下限
//#define BEEP P3_4 //定義蜂鳴器
sbit BEEP=P3^4; //蜂鳴器
sbit led_h=P2^4; //藍(lán)燈
sbit led_l=P2^1; //紅燈
sbit ADCS = P1^2;
sbit ADCLK = P1^4;
sbit ADDI = P1^6;
sbit ADDO = P1^6;
bit beep_st; //蜂鳴器間隔標(biāo)志
uint abc ; //定義的煙霧濃度顯示變量
uchar x=8; //計(jì)數(shù)器
uchar m; //溫度值全局變量
uchar n; //溫度值全局變量
uchar data disdata[5];
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00}; //攝氏溫度符號(hào) 12,18,18,12,0,0,0,0
//讀取溫度值
void check_wendu(void)
{
uint a,b,c;
c=ReadTem()-5; //獲取溫度值并減去DS18B20的溫漂誤差
a=c/100; //計(jì)算得到十位數(shù)字
b=c/10-a*10; //計(jì)算得到個(gè)位數(shù)字
m=c/10; //計(jì)算得到整數(shù)位
n=c-a*100-b*10; //計(jì)算得到小數(shù)位
if(m<0){m=0;n=0;} //設(shè)置溫度顯示夏限
if(m>99){m=99,n=9;} //設(shè)置溫度顯示上值
}
//延時(shí)程序 延時(shí)一毫秒
void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
//報(bào)警程序
void Alarm()
{
// if((m<=up)||(m>=lay)) BEEP=0; //如果溫度大于上限或小于下限,蜂鳴器響
// else if((m>up)||m<lay) BEEP=1;
if(abc>=nongdu) BEEP=1; //&&beep_st==1
else BEEP=0;
if(m>top||m<lim)
{
led_h=1;
led_l=0;
BEEP=1;
}
else
if(abc>=nongdu)
{
led_h=0;
led_l=1;
}
else {led_h=1;led_l=0;}
}
uchar ADC0832(bit mode,bit channel) //AD裝換,返回結(jié)果
{
uchar i,dat,ndat;
ADCS = 0; //拉低CS端口
_nop_();
_nop_();
ADDI = 1; //第一個(gè)下降沿為高電平
ADCLK= 1; //拉高時(shí)鐘端口,即CLK
_nop_();
_nop_();
ADCLK= 0; //拉低CLK端口,形成下降沿1;
_nop_();
_nop_();
ADDI= mode; //低電平為差分模式,高電平為單通道模式
ADCLK =1; //拉高CLK;
_nop_();
_nop_();
ADCLK =0; //拉低CLK,形成下降沿2
_nop_();
_nop_();
ADDI = channel; //低電平為CH0,高電平為CH1
ADCLK = 1; //拉高CLK端口
_nop_();
_nop_();
ADCLK = 0; //拉低CLK端,形成下降沿3
ADDI =1; //控制命令結(jié)束
dat=0;
//下面開始讀取轉(zhuǎn)換后的數(shù)據(jù),從最高位開始依次輸出(D7~D0);
for(i=0;i<8;i++)
{
dat<<= 1;
ADCLK=1; //拉高時(shí)鐘
_nop_();
_nop_();
ADCLK=0; //拉低時(shí)鐘端形成一次時(shí)鐘脈沖
_nop_();
_nop_();
dat |= ADDO;
}
ndat =0; //記錄D0
if(ADDO == 1)
ndat |= 0x80;
//下面開始繼續(xù)讀取反序的數(shù)據(jù)(D1~D7)
for(i=0;i<7;i++)
{
ndat >>=1;
ADCLK =1; //拉高時(shí)鐘端
_nop_();
_nop_();
ADCLK=0; //拉低時(shí)鐘端形成一次時(shí)鐘脈沖
_nop_();
_nop_();
if(ADDO==1)
ndat |= 0x80;
}
ADCS =1; //拉高CS端,結(jié)束轉(zhuǎn)換
ADCLK=0; //拉高CLK端
ADDI=1; //拉高數(shù)據(jù)端,回到初始狀態(tài)
if(dat==ndat)
return(dat);
else
return 0;
}
void display() //初始化后的顯示
{
LCD_ShowString(1,1,"Smoke:");
LCD_ShowString(1,10,"T: . C");
LCD_ShowString(2,1,"Alarm:");
LCD_ShowString(2,10," - ");
LCD_ShowNum(2,7,nongdu,1);
LCD_ShowNum(2,13,top,2);
LCD_ShowNum(2,10,lim,2);
}
void main()
{
check_wendu();
check_wendu();
LCD_Init();
delayms(100);
LCD_Init();
delayms(100);
display();
while(1)
{
checkkey(); //按鍵檢測(cè)
abc= ADC0832(1,0); //差分模式,CH0—CH1;
abc=abc*19.607843; //轉(zhuǎn)換為實(shí)際電壓便于顯示
abc=abc/1000%10;
LCD_ShowNum(1,7,abc,2);
LCD_ShowNum(1,12,m,2);
LCD_ShowNum(1,15,n,1);
LCD_ShowNum(2,7,nongdu,1);
LCD_ShowNum(2,13,top,2);
LCD_ShowNum(2,10,lim,2);
check_wendu();
Alarm(); //報(bào)警檢測(cè)
}
}
|
-
-
-
煙霧溫度報(bào)警.zip
2021-10-10 14:06 上傳
點(diǎn)擊文件名下載附件
161.94 KB, 下載次數(shù): 27
評(píng)分
-
查看全部評(píng)分
|