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