一、項目介紹
井下瓦斯監(jiān)控系統(tǒng)是煤礦安全生產(chǎn)中非常重要的一部分,防止井下瓦斯爆炸事故的發(fā)生,保障煤礦工人的人身安全。由于地下環(huán)境特殊,需要特殊的監(jiān)測系統(tǒng)來實時監(jiān)測瓦斯?jié)舛鹊汝P(guān)鍵指標,并及時報警以便采取措施進行處理。
瓦斯氣體,又稱沼氣,是一種輕質(zhì)烴類氣體,主要成分是甲烷(CH4),也包含少量的乙烷、丙烷等。它是在地下煤炭層與泥巖等巖石中通過微生物作用或者煤炭化學反應(yīng)形成的。在煤礦等地下工程中,瓦斯常常是一種具有危險性的氣體,如果采取不當?shù)拇胧陀锌赡馨l(fā)生瓦斯爆炸事故。
基于51單片機的井下瓦斯監(jiān)控系統(tǒng),可以通過傳感器檢測瓦斯氣體濃度,將檢測到的數(shù)據(jù)通過AD轉(zhuǎn)換后送入單片機處理,再通過LCD顯示器顯示出來。如果瓦斯?jié)舛瘸^了預設(shè)閾值,系統(tǒng)會自動啟動報警裝置進行警示。同時,這種系統(tǒng)具有適用面廣、成本低、可靠性高等特點。
在目前環(huán)保意識提高的背景下,煤炭企業(yè)和政府對于井下瓦斯監(jiān)控系統(tǒng)的需求越來越大,系統(tǒng)的市場潛力巨大。
二、設(shè)計原理
2.1 傳感器選型
(1)瓦斯氣體檢測
MQ2傳感器是一種常用于氣體檢測的半導體傳感器,主要用于檢測多種易燃、易爆氣體,如瓦斯、丙烷、液化氣等。它采用了半導體氧化物層敏感元件技術(shù),當檢測到目標氣體時,其電阻值會發(fā)生變化,從而可以通過測量電阻值的變化來檢測目標氣體的濃度。MQ2傳感器具有靈敏度高、響應(yīng)速度快、使用方便等特點,因此在氣體檢測領(lǐng)域廣泛應(yīng)用。
MQ2傳感器包括熱敏電阻、電化學傳感器、半導體敏感元件等部分,其中半導體敏感元件是其核心部件,也是影響傳感器性能的關(guān)鍵因素。在使用前需要進行預熱處理,一般預熱時間為1-2分鐘,然后將待測氣體與傳感器接觸,即可讀取傳感器的輸出信號并進行濃度計算。
(2)ADC采集模塊
PCF8591模塊是一種集成了AD轉(zhuǎn)換器和DA轉(zhuǎn)換器的模塊,通過I2C總線可以連接到單片機或其他電子設(shè)備上,用于模擬信號的輸入和輸出。其主要特點是集成度高、精度高、使用方便、成本低廉等。
模塊由PCF8591芯片和相關(guān)外圍電路組成,其中PCF8591芯片是一個具有4個模擬輸入通道和1個模擬輸出通道的集成電路,內(nèi)部集成了128級AD轉(zhuǎn)換器和8位DA轉(zhuǎn)換器,并且支持外部基準電壓輸入。同時,該模塊還包括4個可變電阻,可以通過調(diào)節(jié)來改變模擬輸入通道的電阻值,從而實現(xiàn)對信號的增益和衰減。通過I2C總線,可以方便地讀取和輸出模擬信號。
在實際應(yīng)用中,PCF8591模塊廣泛用于傳感器信號的采集和處理,例如溫度、光強、聲音等信號的轉(zhuǎn)換和傳輸。
2.2 設(shè)計思路
基于51單片機設(shè)計的井下瓦斯監(jiān)控系統(tǒng)的原理如下:
(1)傳感器檢測瓦斯?jié)舛龋菏褂猛咚箓鞲衅鳈z測井下瓦斯?jié)舛?,并將檢測結(jié)果轉(zhuǎn)換為電信號輸出。
(2)單片機采集數(shù)據(jù):使用ADC模塊將傳感器輸出的電信號轉(zhuǎn)換為數(shù)字信號,并將其存儲到單片機內(nèi)部的RAM中。
(3)數(shù)據(jù)處理:單片機通過對采集到的數(shù)據(jù)進行處理,可以實現(xiàn)瓦斯?jié)舛鹊膶崟r監(jiān)測,并根據(jù)預設(shè)閾值進行報警處理。
(4)報警處理:當瓦斯?jié)舛瘸^預設(shè)閾值時,單片機會觸發(fā)報警器進行報警。同時,可以通過OLED顯示屏實時顯示瓦斯?jié)舛龋⑼ㄟ^蜂鳴器發(fā)出警報聲音。
(5)數(shù)據(jù)存儲:單片機還可以將采集到的數(shù)據(jù)存儲到外部存儲器中,以便后續(xù)的數(shù)據(jù)分析和處理。
基于51單片機設(shè)計的井下瓦斯監(jiān)控系統(tǒng)通過傳感器檢測瓦斯?jié)舛龋瑔纹瑱C采集數(shù)據(jù)并進行處理,實現(xiàn)了對瓦斯?jié)舛鹊膶崟r監(jiān)測和報警處理,同時還可以將數(shù)據(jù)存儲到外部存儲器中,方便后續(xù)的數(shù)據(jù)分析和處理。
三、代碼實現(xiàn)
3.1 采集MQ2濃度打印到串口
以下是基于STC89C52通過PCF8591采集MQ2煙霧傳感器的值,并轉(zhuǎn)為濃度打印到串口的詳細代碼。
#include < reg52.h >
#include < intrins.h >
?
#define uchar unsigned char
#define uint unsigned int
?
sbit SCL=P1^0; // I2C時鐘線
sbit SDA=P1^1; // I2C數(shù)據(jù)線
?
sbit MQ2=P3^2; // MQ2煙霧傳感器
?
// 函數(shù)聲明
void delay(uint n);
void I2C_Start();
void I2C_Stop();
void I2C_SendACK(bit ack);
bit I2C_RecvACK();
void I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void PCF8591_Write(uchar addr, uchar dat);
uchar PCF8591_Read(uchar addr);
void InitPCF8591();
uint ReadMQ2();
?
// 主函數(shù)
void main()
{
InitPCF8591(); // 初始化PCF8591
while(1)
{
uint mq2val = ReadMQ2(); // 讀取MQ2傳感器的值
float mq2con = (mq2val / 255.0) * 100.0; // 將傳感器的值轉(zhuǎn)換為濃度
printf("MQ2煙霧濃度:%f%%\\n", mq2con); // 打印濃度到串口
delay(1000); // 延時1秒
}
}
?
// 延時函數(shù)
void delay(uint n)
{
uint i, j;
for(i = 0; i < n; i++)
for(j = 0; j < 125; j++);
}
?
// I2C總線函數(shù)
?
// I2C起始信號
void I2C_Start()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
?
// I2C停止信號
void I2C_Stop()
{
SDA = 0;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
_nop_();
}
?
// I2C發(fā)送應(yīng)答信號
void I2C_SendACK(bit ack)
{
SDA = ack;
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
?
// I2C接收應(yīng)答信號
bit I2C_RecvACK()
{
SCL = 1;
_nop_();
_nop_();
_nop_();
bit ack = SDA;
SCL = 0;
return ack;
}
?
// I2C發(fā)送一個字節(jié)
void I2C_SendByte