陳婷婷 李貴強 秦雨晴 龍秀堂 王翔
摘 要:近年來,火災(zāi)頻繁的發(fā)生,國家也對消防工作非常的重視。但現(xiàn)目前市場上存在的滅火器不夠智能化,為了打破傳統(tǒng)滅火器呆板的缺點,現(xiàn)將單片機與滅火器相結(jié)合,使滅火器變得更加智能化,能夠自動檢測及自動滅火。同時,可安裝藍(lán)牙和WiFi裝置,當(dāng)發(fā)生火災(zāi)時,在遠(yuǎn)處的終端也可查看并控制火災(zāi)情況。隨著科技的發(fā)展,時代的進步,嵌入式計算機系統(tǒng)已經(jīng)應(yīng)用到了各行各業(yè),也有很多應(yīng)用實例,如,人們?nèi)粘I钪械氖謾C、空調(diào)、洗衣機都與之密切相關(guān),而單片機應(yīng)用系統(tǒng)是中低檔嵌入式的主流。
關(guān)鍵詞:滅火器;單片機;智能控制;遠(yuǎn)端控制
1 控制原理及系統(tǒng)
想要檢測溫度,達(dá)到燃點溫度時開始報警,并開始自動滅火。系統(tǒng)需要有溫度傳感器,滅火裝置,報警器等組成。在整個工作過程中,當(dāng)溫度達(dá)到了預(yù)警溫度,開始預(yù)警,當(dāng)溫度進一步升高,發(fā)生初期火災(zāi)時,啟動滅火裝置,并開始報警。由于此系統(tǒng)用主要由單片機控制,而單片機只能讀取數(shù)字信號,對溫度變化這種模擬信號無法輸入,則需要一個A/D轉(zhuǎn)換器將溫度傳感器接受了溫度變化引起的電壓電流變化的模擬信號轉(zhuǎn)變?yōu)閿?shù)字信號。當(dāng)然,由于各模塊的有效電壓值不一樣,中間需要變壓器進行變壓,才能將電輸送到各模塊進行工作。工作流程圖如圖1.1所示。
2 單片機工作過程及程序內(nèi)容
單片機控制系統(tǒng):AT89S51
單片機控制系統(tǒng)是整個裝置的關(guān)鍵,單片機需要接受溫度變化帶來的信號,經(jīng)A/D轉(zhuǎn)換器和電壓放大器,(當(dāng)中其中需配備電池)將電壓調(diào)整到單片機的工作電壓范圍內(nèi),經(jīng)過單片機的內(nèi)部程序的運算,輸出高低電平,來觸發(fā)或者不觸發(fā)報警系統(tǒng)和滅火裝置。將單片機的輸出接口與電機總閘連接,還可在火災(zāi)初期切斷電源,以防止火災(zāi)的蔓延。
在此程序中,以蜂鳴器代表報警系統(tǒng),以電磁閥開關(guān)代表滅火裝置,其具體程序如下:
#include? "led.h"
#include? "delay.h"
#include? "key.h"
#include? "sys.h"
#include? "ds18b20.h"
int? main(void)
{
// vu8? key=0;
delay_init();? ? ? ? ? ? //延時函數(shù)初始化
LED_Init();? ? ? //初始化與LED連接的硬件接口
BEEP_Init();? ? ? ? ? ? ? ? ? ?//初始化蜂鳴器端口
KEY_Init();? ? ? ? ? ? ? ? ? ?//初始化與按鍵連接的硬件接口
DS18B20_Init();? ? ? ? ? ? ? //初始化與溫度傳感器
while(1)
{
if(PEin(0)==1)? ? //煙霧傳感器
{PEout(3)=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //氣閥開關(guān)
PEout(4)=1; //蜂鳴器
}
if(PEin(1)==0)? ? //火光傳感器
{PEout(3)=1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //氣閥開關(guān)
PEout(4)=1; //? 蜂鳴器
}
wendu();? ? ? ? //溫度傳感器
}
}
以上為主函數(shù)
子函數(shù)1
void? LED_Init(void)
{
GPIO_InitTypeDef? ? GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);? ?//使能PB,PE端口時鐘
GPIO_InitStructure.GPIO_Pin? =? GPIO_Pin_5|GPIO_Pin_3|GPIO_Pin_4;? ?//LED0-->PB.5? 端口配置
GPIO_InitStructure.GPIO_Mode? =? GPIO_Mode_Out_PP;? ? ?//推挽輸出
GPIO_InitStructure.GPIO_Speed? =? GPIO_Speed_50MHz;? ?//IO口速度為50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure);? ?//根據(jù)設(shè)定參數(shù)初始化GPIOE.5
}
子函數(shù)2
void? LED_Init(void)
{
GPIO_InitTypeDef? ? GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);? ?//使能PB,PE端口時鐘
GPIO_InitStructure.GPIO_Pin? =? GPIO_Pin_5|GPIO_Pin_3|GPIO_Pin_4;? ?//LED0-->PB.5? 端口配置
GPIO_InitStructure.GPIO_Mode? =? GPIO_Mode_Out_PP;? ? ?//推挽輸出
GPIO_InitStructure.GPIO_Speed? =? GPIO_Speed_50MHz;? ?//IO口速度為50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure);? ?//根據(jù)設(shè)定參數(shù)初始化GPIOE.5
}
子函數(shù)3
void? Init_DS18B20(void)
{
unsigned? char? x=0;
DQ=1;? ?//DQ先置高
delay(8);? ?//稍延時
DQ=0;? ?//發(fā)送復(fù)位脈沖
delay(80);? ?//延時(>480us)
DQ=1;? ?//拉高數(shù)據(jù)線
delay(5);? ?//等待(15~60us)
x=DQ;? ?//用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
delay(20);
}
子函數(shù)4
void? ReadTemperature(void)
{
Init_DS18B20();? ?//初始化
WriteOneChar(0xcc);? ?//跳過讀序列號的操作
WriteOneChar(0x44);? ?//啟動溫度轉(zhuǎn)換
delay(125);? ?//轉(zhuǎn)換需要一點時間,延時
Init_DS18B20();? ?//初始化
WriteOneChar(0xcc);? ?//跳過讀序列號的操作
WriteOneChar(0xbe);? ?//讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
tempL=ReadOneChar();? ?//讀出溫度的低位LSB
tempH=ReadOneChar();? ?//讀出溫度的高位MSB
if(tempH>0x7f)? ? ? ? ? ? ?//最高位為1時溫度是負(fù)
{
tempL=~tempL; //補碼轉(zhuǎn)換,取反加一
tempH=~tempH+1;
fg=0;? ? ? ? ? ? ?//讀取溫度為負(fù)時fg=0
}
sdata? =? tempL/16+tempH*16;? ? ? ? ? ? ?//整數(shù)部分
xiaoshu1? =? (tempL&0x0f)*10/16;? ?//小數(shù)第一位
xiaoshu2? =? (tempL&0x0f)*100/16%10; //小數(shù)第二位
xiaoshu=xiaoshu1*10+xiaoshu2;? ?//小數(shù)兩位
}
子函數(shù)5
void? delay_init()
{
#if? SYSTEM_SUPPORT_OS? ? ?//如果需要支持OS.
u32? reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //選擇外部時鐘? ? HCLK/8
fac_us=SystemCoreClock/8000000; //為系統(tǒng)時鐘的1/8
#if? SYSTEM_SUPPORT_OS? ? ?//如果需要支持OS.
reload=SystemCoreClock/8000000; //每秒鐘的計數(shù)次數(shù)? 單位為K
reload*=1000000/delay_ostickspersec; //根據(jù)delay_ostickspersec設(shè)定溢出時間
//reload為24位寄存器,最大值:16777216,在72M下,約合1.86s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延時的最少單位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;? ? ? ?//開啟SYSTICK中斷
SysTick->LOAD=reload;? ?//每1/delay_ostickspersec秒中斷一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;? ? ? ?//開啟SYSTICK
#else
fac_ms=(u16)fac_us*1000; //非OS下,代表每個ms需要的systick時鐘數(shù)
#endif
}
子函數(shù)6
#define? PAout(n)? ? ? BIT_ADDR(GPIOA_ODR_Addr,n)? ? //輸出
#define? PAin(n)? ? ? ? BIT_ADDR(GPIOA_IDR_Addr,n)? ? //輸入
#define? PBout(n)? ? ? BIT_ADDR(GPIOB_ODR_Addr,n)? ? //輸出
#define? PBin(n)? ? ? ? BIT_ADDR(GPIOB_IDR_Addr,n)? ? //輸入
#define? PCout(n)? ? ? BIT_ADDR(GPIOC_ODR_Addr,n)? ? //輸出
#define? PCin(n)? ? ? ? BIT_ADDR(GPIOC_IDR_Addr,n)? ? //輸入
#define? PDout(n)? ? ? BIT_ADDR(GPIOD_ODR_Addr,n)? ? //輸出
#define? PDin(n)? ? ? ? BIT_ADDR(GPIOD_IDR_Addr,n)? ? //輸入
這里只是一個簡單的程序,能簡單的完成控制,可將此程序插入單片機中完成基本的檢測和滅火步驟,若后續(xù)系統(tǒng)組成有變,將程序稍作改動便可實現(xiàn)功能。需注意的是,在此程序中,并未考慮氧氣濃度,如何滅火,滅火介質(zhì)等因素的影響,若需精確的控制,還應(yīng)將各個因素考慮完全。
3 結(jié)束語
在很多控制系統(tǒng)中都運用了單片機,將單片機運用于自動檢測并自動啟動滅火裝置不僅僅可以減輕人們的勞動強度,也可以極大的減少火災(zāi)的發(fā)生幾率,保護一些重要設(shè)備的壽命,遠(yuǎn)端的控制更是提供了整個系統(tǒng)的安全性。當(dāng)然,現(xiàn)在也有很多自動檢測并滅火裝置,雖然都用了控制,但在基礎(chǔ)系統(tǒng)及結(jié)構(gòu)上還是有著很多的差別。此種自動檢測并滅火的裝置也有其缺點,如不能完成地、系統(tǒng)地、滅火,當(dāng)火災(zāi)形勢嚴(yán)重時,此系統(tǒng)基本就報廢了,因為其工作前提是單片機及各線路完好無損,當(dāng)有的重要元件或線路因為某些不可控因素遭到腐蝕或高溫等破壞時,可能會導(dǎo)致整個系統(tǒng)無法正常工作。
參考文獻(xiàn):
[1]徐春輝,陳忠斌,章海亮.單片微型計算機原理及應(yīng)用[M].中國工信出版集團,2017(08).
[2]鄧偉昭.基于單片機AT89S51的房間自動化滅火[J],2016.
[3]劉鑫.基于單片機的火災(zāi)報警系統(tǒng)的設(shè)計[D].東北石油大學(xué),2018.