網(wǎng)頁設(shè)計(jì)與制作100例hbuiderx武漢搜索引擎排名優(yōu)化
一、基本介紹
項(xiàng)目名:
基于單片機(jī)的CO、有害混合氣體檢測系統(tǒng)設(shè)計(jì)
基于單片機(jī)的空氣質(zhì)量檢測系統(tǒng)設(shè)計(jì)
基于單片機(jī)的有害氣體檢測系統(tǒng)設(shè)計(jì)
項(xiàng)目編號:mcuclub-hj-006-7
單片機(jī)類型:STC89C52
具體功能:
1、通過MQ-7檢測CO值,超過設(shè)置最大值進(jìn)行聲光報(bào)警,并開啟風(fēng)扇和凈化器
2、通過MQ-135檢測有害混合氣體值,超過設(shè)置最大值進(jìn)行聲光報(bào)警,并開啟風(fēng)扇和凈化器
3、通過按鍵設(shè)置上限值,可以手動控制風(fēng)扇和凈化器、切換模式
4、通過顯示屏顯示數(shù)據(jù)
擴(kuò)展功能:通過藍(lán)牙模塊將測量數(shù)據(jù)發(fā)送到手機(jī)端,并可以控制風(fēng)扇和凈化器、切換模式
二、資料總覽
實(shí)物資料
仿真資料
三、51單片機(jī)部分資料展示
1、實(shí)物圖展示
單片機(jī)型號:STC89C52
供電接口:TYPE-C
板子類型:PCB集成板,厚度1.2,兩層板(上下層覆銅接地)
器件類型:元器件基本上為插針式,個(gè)別降壓芯片會使用貼片式。
2、仿真圖展示
仿真軟件版本:proteus8.9
電路連線方式:網(wǎng)絡(luò)標(biāo)號連線方式
注意:部分實(shí)物元器件仿真中沒有,仿真中會用其他工作原理相似的元件代替,這樣可能導(dǎo)致實(shí)物程序和仿真程序不一樣
3、原理圖展示
軟件版本:AD2013
電路連線方式:網(wǎng)絡(luò)標(biāo)號連線方式
注意:原理圖只是畫出了模塊的引腳圖,而并不是模塊的內(nèi)部結(jié)構(gòu)圖
4、PCB圖展示
由原理圖導(dǎo)出,中間有一個(gè)項(xiàng)目編號,隱藏在單片機(jī)底座下,插入單片機(jī)后不會看到。
兩層板,上下覆銅接地。
四、32單片機(jī)部分資料展示
1、實(shí)物圖展示
單片機(jī)型號:STM32F103C8T6
供電接口:TYPE-C
板子類型:PCB集成板,厚度1.2,兩層板(上下層覆銅接地)
器件類型:元器件基本上為插針式,個(gè)別降壓芯片會使用貼片式。
2、原理圖展示
軟件版本:AD2013
電路連線方式:網(wǎng)絡(luò)標(biāo)號連線方式
注意:原理圖只是畫出了模塊的引腳圖,而并不是模塊的內(nèi)部結(jié)構(gòu)原理圖
3、PCB圖展示
由原理圖導(dǎo)出,中間有一個(gè)項(xiàng)目編號,隱藏在單片機(jī)底座下,插入單片機(jī)后不會看到。
兩層板,上下覆銅接地。
五、系統(tǒng)框圖
繪制軟件:VISIO
本設(shè)計(jì)以單片機(jī)為核心控制器,加上其他模塊一起組成此次設(shè)計(jì)的整個(gè)系統(tǒng),其中包括中控部分、輸入部分和輸出部分。中控部分采用了單片機(jī)控制器,其主要作用是獲取輸入部分的數(shù)據(jù),經(jīng)過內(nèi)部處理,邏輯判斷,最終控制輸出部分。輸入由三部分組成,第一部分是氣體檢測模塊,通過該模塊檢測當(dāng)前環(huán)境的有害氣體和一氧化碳;第二部分是按鍵模塊,通過該模塊可以切換界面、設(shè)置閾值、切換模式等;第三部分是供電模塊,通過該模塊可給整個(gè)系統(tǒng)進(jìn)行供電。輸出由三部分組成,第一部分是顯示模塊,通過該模塊可以顯示監(jiān)測的數(shù)據(jù)以及設(shè)置的閾值;第二部分是繼電器模塊,通過兩個(gè)繼電器分別控制通風(fēng)和凈化;第三部分是聲光報(bào)警模塊,當(dāng)監(jiān)測值不在設(shè)置的閾值內(nèi)時(shí)進(jìn)行聲光報(bào)警。除此之外,藍(lán)牙模塊既作為輸入又作為輸出,藍(lán)牙模塊和手機(jī)進(jìn)行連接,可以將監(jiān)測的數(shù)據(jù)傳輸?shù)接脩羰謾C(jī)端,用戶也可以通過手機(jī)端發(fā)送指令控制繼電器的工作及其模式的切換。具體系統(tǒng)框圖如圖3.1所示。
六、部分程序展示
軟件版本:keil5
注意:邏輯程序和驅(qū)動程序分開,分布于main.c和其他.c文件
*******監(jiān)測函數(shù)
*****/
void Monitor_function(void)
{char fasong[256]; if(flag_display == 0) //測量界面{if(time_num % 10 == 0) //約2s檢測一次{if(DO1 == 0) co_value = 60*(Get_Adc_Average(1,1)*3.3/4096.0); //獲取一氧化碳濃度else co_value = 0;if(DO2 == 0 )hgas_value = 60*(Get_Adc_Average(5,1)*3.3/4096.0); //獲取有害氣體濃度elsehgas_value = 0;}}if(time_num % 20 == 0) //約4s發(fā)送一次{sprintf(fasong,"一氧化碳濃度:%dppm\r\n",co_value);UsartPrintf(USART1,fasong);sprintf(fasong,"有害氣體濃度:%dppm\r\n",hgas_value);UsartPrintf(USART1,fasong); } if(USART1_WaitRecive() == 0){if(strstr((char*)usart1_buf,"A") != NULL) //切換自動模式{flag_mode = 0; }else if(strstr((char*)usart1_buf,"B") != NULL)//通風(fēng)關(guān),凈化關(guān) {flag_relay = 0;flag_mode = 1; }else if(strstr((char*)usart1_buf,"C") != NULL)//通風(fēng)開,凈化開 {flag_relay = 1;flag_mode = 1; }USART1_Clear();}
}/****
*******顯示函數(shù)
*****/
void Display_function(void)
{switch(flag_display) //根據(jù)不同的顯示模式標(biāo)志位,顯示不同的界面{case 0: //界面0:測量界面,顯示一氧化碳、有害氣體濃度,模式Oled_ShowCHinese(1, 0, "一氧化碳:");sprintf(display_buf,"%dPPM ",co_value);Oled_ShowString(1, 10, display_buf);Oled_ShowCHinese(2, 0, "有害氣體:");sprintf(display_buf,"%dPPM ",hgas_value);Oled_ShowString(2, 10, display_buf);Oled_ShowCHinese(3, 0, "模式:");if(flag_mode == 0)Oled_ShowCHinese(3,3,"自動");elseOled_ShowCHinese(3,3,"手動");break;case 1: //界面1:顯示設(shè)置一氧化碳最大值Oled_ShowCHinese(1,2,"設(shè)置");Oled_ShowCHinese(2,0,"一氧化碳最大值");if(time_num % 5 == 0){sprintf(display_buf,"%d ",co_max);Oled_ShowString(3, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(3, 7, " ");}break;case 2: //界面2:顯示設(shè)置有害氣體最大值Oled_ShowCHinese(1,2,"設(shè)置"); Oled_ShowCHinese(2,0,"有害氣體最大值");if(time_num % 5 == 0){sprintf(display_buf,"%d ",hgas_max);Oled_ShowString(3, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(3, 7, " ");}break;default:break;}
}/****
*******處理函數(shù)
*****/
void Manage_function(void)
{if(flag_display == 0) //測量界面{if(flag_mode == 0) //如果處于自動模式{if(co_value > co_max || hgas_value > hgas_max) //一氧化碳值或有害氣體值大于設(shè)置的最大值{RELAY_TF = 1;RELAY_JH = 1;flag_alarm = 1;}else //如果在設(shè)置的上下限之間,關(guān)閉兩個(gè)繼電器{RELAY_TF = 0;RELAY_JH = 0;flag_alarm = 0;}}else //手動模式根據(jù)按鍵按下控制繼電器{flag_alarm = 0;LED = 1;BEEP = 0; switch(flag_relay){case 0: //通風(fēng)關(guān),凈化關(guān) RELAY_TF = 0;RELAY_JH = 0;break;case 1: //通風(fēng)開,凈化開RELAY_TF = 1;RELAY_JH = 1;break; default:break;} }if(flag_alarm == 1 && time_num %2 == 0) //如果有異常,聲光報(bào)警{LED = ~LED;BEEP = ~BEEP;}else if(flag_alarm == 0){LED = 1;BEEP = 0;}}else //設(shè)置界面,關(guān)閉兩個(gè)繼電器{RELAY_TF = 0;RELAY_JH = 0; LED = 1;BEEP = 0;}
}