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