仿真+程序+原理圖+設(shè)計(jì)說明書
Proteus仿真版本:proteus7.8
原理圖:Altium Designer
程序編譯器:keil 4
編程語言:C語言
編號(hào)C0017
C0017 網(wǎng)盤下載鏈接
整個(gè)系統(tǒng)以STC89C52單片機(jī)為核心器件,配合電阻電容晶振等器件,構(gòu)成單片機(jī)的最小系統(tǒng)。
1.煙霧采集傳感器選用MQ-2,由于該傳感器輸出的是模擬信號(hào),因此需要模數(shù)轉(zhuǎn)換芯片ADC0832,把模擬信號(hào)轉(zhuǎn)為數(shù)字信號(hào)再傳給單片機(jī);
2.溫度采集使用DS18B20數(shù)字傳感器,該傳感器通過單總線和單片機(jī)相連;
3.火焰檢測(cè)使用火焰檢測(cè)模塊,該模塊完成了信號(hào)的檢測(cè)、放大、比較等處理,最終輸出高低電平信號(hào)給單片機(jī);
4.顯示設(shè)備使用1602液晶,可以在屏幕上顯示實(shí)時(shí)煙霧濃度值、溫度值,以及報(bào)警值等信息;
5.報(bào)警模塊則采用蜂鳴器和LED燈組成,三個(gè)LED分別代表了火焰報(bào)警指示、煙霧報(bào)警指示和溫度報(bào)警指示,無論哪個(gè)檢測(cè)元素超標(biāo),蜂鳴器都會(huì)鳴叫報(bào)警;
6.3個(gè)按鍵作為操作輸入設(shè)備,可以用來調(diào)節(jié)報(bào)警閾值的大小;
7.供電采用常用的USB 5V進(jìn)行供電。
仿真圖:
原理圖:
/********************************************************
主函數(shù)
********************************************************/
void main(void)
{
int temp; // 保存溫度值
uchar num; // 保存煙霧值
uchar i; // 循環(huán)變量
LcdInit(); // 液晶功能初始化
LcdShowInit(); // 液晶顯示內(nèi)容初始化
gMqAlarm=EEPROM_Read(0x2000); // 從EEPROM中讀取報(bào)警值
if((gMqAlarm==0)||(gMqAlarm>100)) // 如果讀出來數(shù)據(jù)異常,則重新賦值30
gMqAlarm=30;
LcdGotoXY(0,11); // 光標(biāo)定位
LcdPrintNum1(gMqAlarm); // 顯示煙霧濃度的報(bào)警值
gTempAlarm=EEPROM_Read(0x2001)-55; // 將溫度報(bào)警值讀取出來
if((gTempAlarm<=-55)||(gTempAlarm>125)) // 如果讀出來數(shù)據(jù)異常,則重新賦值40度
gTempAlarm=40;
LcdGotoXY(1,11); // 光標(biāo)定位
LcdPrintNum2(gTempAlarm); // 顯示溫度的報(bào)警值
while(DS18B20_ReadTemp()==85) // 等待傳感器初始化完成
{
DelayMs(10);
}
while(1)
{
num=Get_ADC0832(); // 獲取煙霧的濃度值
num=num/2.2; // 調(diào)整濃度值,使其在0-100之間變化
if(num>100)
num=100;
LcdGotoXY(0,5); // 液晶光標(biāo)定位到第0行第5列
LcdPrintNum1(num); // 顯示煙霧濃度的值
temp=DS18B20_ReadTemp(); // 讀取溫度值
LcdGotoXY(1,5); // 液晶光標(biāo)定位到第1行第5列
LcdPrintNum2(temp); // 顯示溫度值
AlarmJudge(num,temp); // 報(bào)警判斷
for(i=0;i<15;i++) // 執(zhí)行15次循環(huán)(延時(shí)0.15秒,并在這個(gè)時(shí)間段進(jìn)行按鍵掃描)
{
KeyScanf(); // 按鍵掃描
DelayMs(10); // 延時(shí)
}
}
}
資料如下: