泳池水質監控PH溫度渾濁度測量_基於STC89C51單片機

前述:
QQ:3177227373
這個是一個自己做的一個畢設的作品。

主要內容

研究泳池水質監控系統的整體結構設計,包括總體方案設計、軟硬件總體設計等,要求監控泳池水溫度、PH值、渾濁度等。
以單片機爲主要控制器件,主要包括硬件電路的設計和系統程序的設計。硬件電路主要包括傳感器的選取,單片機的選取與應用,A/D轉換的選用,電源設計,顯示部分設計等;軟件設計主要包括主程序設計和子程序設計,監測結果通過顯示模塊顯示。

系統硬件結構設計

單片機的選擇

泳池監控系統的核心是微處理器,對處理器的選型將直接決定系統的性能及總體開發方式。選型的主要標準有:
1、具有較高的計算能力;
2、具備與其他設備的通信接口;
3、整體功耗較低等。
根據獲取和軟件開發的難易程度,經過初步的篩選,基本在MSP430單片機,51單片機和其他PIC中進行選擇。根據前文對低功耗要求,首先要選擇的是具備低功耗模式且運算速度較快的芯片。
從供電電壓上來看,MSP430的最低工作電壓爲3.3V,51單片機及其他PIC爲5V,在工作電壓的需求方面,與其他單片機相比,MSP430對電壓的要求較低,可以更好的降低功率。另外,MSP430自身帶有5種低功耗模式,可以根據不同的實際情況選擇對應的低功耗模式,在程序設計上可以根據實際需要關閉閒置的模塊,來達到低功耗的目的。在本次篩選對比MSP430系列的單片機低功耗以及運算能力方面有着相當的優勢。
根據對比篩選得出,本設計選擇MSP430芯片作爲主控芯片。根據前人的設計證明,以及MSP430價格上的優勢加上片內資源豐富,MSP 430能夠很好的完成智能監控的主控功能。整個數據採集處理流程爲,傳感器模塊將採集到的模擬信號經過A/D模塊轉化爲數字信號傳至MSP430芯片中,MSP430芯片對傳來的信號進行分析和處理,實現對採集信息的顯示以及對控制端的控制。
本設計主控芯片採用的是MSP430系列單片機中的f149型號。該單片機在程序設計、開發調試及實際應用上都具有明顯的優點。具有方便、便宜、實用等優點,給用戶提供了一個理想的樣機開發方式。MSP430主控芯片特點:1、處理能力強;2、運算速度快;3、超低功耗;4、摺疊片內資源豐富;5、開發環境簡單。

傳感器選擇

溫度傳感器:

經常用到的溫度傳感器類型有、半導體、熱電偶、熱敏電阻等,其中半導體測溫元件又分爲電壓型、電流型和數值型。DS18B20傳感器爲數值型溫度傳感器、其具備了導線少、體積小以及使用方便等特點。雖然它有0.5℃的固有測溫誤差爲,但是考慮到作爲泳池水質的溫度採集,0.5℃的誤差是可以接受的,其優點遠大於缺點。因此本設計採用DS18B20數字溫度傳感器。
DS18B20溫度傳感器輸出數字信號,通過程序編輯設置可選擇數字值的位數(9-12位),本設計基於泳池水環境的實際使用情況,選擇DS18B20的防水封裝,該封裝類型可以直接將傳感器安裝與水中,且體積小安裝方便。

水位傳感器:

本設計使用HC-SRO4超聲波測距模塊,該模塊提供2cm-400cm的測距功能,測距精度3mm。通過傳感器設置高於泳池水面的固定位置,測量該位置到水面的距離,水深則爲固定位置高度減傳感器到水面的距離。模塊包括超聲波發射器、接收器與控制電路。基本原理爲高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間×聲速(340 m⁄s))÷2;

PH值傳感器:

PH值的測量,主要由指示電極和參考電極構成。目前主要的指示電極有兩大類,分別爲金屬電極和玻璃電極。在實際應用中由於各種原因,金屬電極僅僅在工業測量中使用。而玻璃電極在實驗測量和工業測量中都有比較廣泛的應用。
在PH值測量中玻璃電極和金屬電極都具有比較良好的復現性,都存在可以接受的測量誤差,都能夠較爲準確的測量出被測溶液的PH值。經過各兩類電極的比較,本設計採用玻璃電極傳感器採集泳池水中的PH值。

水濁度傳感器:

游泳池水質在正常營業過程中隨着游泳人員越來越多加上所處的自然環境,水中出現越來越多的懸浮顆粒,從而導致水質被污染。對水濁度進行檢測主要是檢測水中懸浮顆粒的含量。
本設計選用的濁度傳感器爲紅外傳感器,內部有封裝的紅外對管。對管平行放置於泳池的水環境中,通過紅外對管發射端發出光線,紅外對管接收端把透過的光強度轉化爲電流。水中懸浮顆粒會擋住紅外傳感器發出的一部分光線,使光線的強度發生改變。水中的懸浮顆粒越多則水濁度越高,透過光線的強度則越弱,接收端轉化出來的電流也越小。相反,水濁度越高,透光性越強則電流越大。所以可以通過對濁度傳感器電流的檢測,完成對泳池水濁度的監測。
在這裏插入圖片描述

系統軟件結構設計

主程序是程序設計的主幹,在主程序的調控下完成整體的工作。本設計實際流程爲:打開開關,單片機通電,首先進行系統初始化,LCD顯示屏進入歡迎界面,2秒鐘後進入系統測量程序,屏幕實時顯示測量的值,整個系統開始正常工作。主程序流程如圖所示。
在這裏插入圖片描述

實物照片

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

仿真

在這裏插入圖片描述

PCB

在這裏插入圖片描述在這裏插入圖片描述

部分代碼

渾濁度計算
//渾濁度計算
void TURB_Date()
{
	//渾濁度獲取並計算
	Dat1=ReadADC(1);
	TU=(Dat1*5.0)/256;//計算電壓
	temp_data=shi*10+ge;//計算溫度
	TU_calibration=-0.0192*(temp_data-25)+TU;//溫度補償
	TU_value=-865.68*TU_calibration + K_Value;//轉換公式
	
	if(TU_value<=0){TU_value=0;}
	if(TU_value>=3000){TU_value=3000;}
	
	TU_Val=(int)TU_value/30;//計算爲百分比
}
PH值計算
//PH值計算
void PH_Date()
{
	//PH值獲取並計算
	Dat2=ReadADC(0);
	ADC_Voltage_1=Dat2*5.0/255;//轉換爲電壓值
	PH_Value=-5.8887*ADC_Voltage_1+21.677;//轉換公式
	
	if(PH_Value<=0){PH_Value=0;}
	if(PH_Value>=14){PH_Value=14;}

	Disbuff_PH[0]=(int)(PH_Value*100)/1000;
	Disbuff_PH[1]=(int)(PH_Value*100)%1000/100;
	Disbuff_PH[2]=(int)(PH_Value*100)%100/10;
	Disbuff_PH[3]=(int)(PH_Value*100)%10;
	
	PH_DAT=Disbuff_PH[0]*1000+Disbuff_PH[1]*100+Disbuff_PH[2]*10+Disbuff_PH[3];
}
LCD1602顯示
void LCD_Init()//液晶初始化
{
	u8 i;
	LCD_WR=0;
	LCD_Write_Cmd(0x38);//設置16*2顯示,5*7點陣,8位數據接口
	LCD_Write_Cmd(0x0c);//設置開顯示,0x0e顯示光標  0x0c不顯示光標
	LCD_Write_Cmd(0x06);//寫一個字符後地址指針自動加1,光標自動右移
	LCD_Write_Cmd(0x01);//清屏
	LCD_Write_Cmd(0x80);//數據指針定位到第一行第一個字處
	for(i=0;i<16;i++)
		LCD_Write_Data(str1[i]);//液晶顯示第一行寫數據
	LCD_Write_Cmd(0xc0);//數據指針定位到第二行第一個字處
	for(i=0;i<16;i++)
		LCD_Write_Data(str2[i]);//液晶顯示第二行寫數據
}

//LCD1602顯示函數
void LCD_Manifest(u8 row,u8 add,u8 date)
{
 	if(row==1) 	 LCD_Write_Cmd(0x80+add);
	if(row==2)	 LCD_Write_Cmd(0xc0+add);
	LCD_Write_Data(0x30+date);
}

void LCD_Write_Cmd(u8 com)//液晶寫命令
{
   LCD_RS=0;//選擇寫命令模式
   Date=com;//將要寫的命令字送到數據總線上
   delay_ms(1);
   LCD_E=1;//使能端給一高脈衝,高脈衝有效
   delay_ms(1);
   LCD_E=0;
}
void LCD_Write_Data(u8 date)//數據寫命令
{
   LCD_RS=1;//選擇寫數據模式
   Date=date;
   delay_ms(1);
   LCD_E=1;//使能端給一高脈衝,高脈衝有效
   delay_ms(1);
   LCD_E=0;
}
ADC採集
//讀取AD模數轉換的值,有返回值
unsigned char ReadADC(unsigned char Chl)
{
	unsigned char Data;
	Start();        //寫入芯片地址
	Send(0x90);
	Ack();
	Send(0x40|Chl);//寫入選擇的通道,Chl的值分別爲0、1、2、3,分別代表1-4通道
	Ack();
	Start();
	Send(0x91);    //讀入地址
	Ack();
	Data=Read();    //讀數據
	Scl=0;
	NoAck();
	Stop();
	return Data;   //返回值
}
DS18B20溫度採集
void Tem_display(u16 temp)
{
	float tp;
	tp=temp;//因爲數據處理有小數點所以將溫度賦給一個浮點型變量
	//如果溫度是正的那麼,那麼正數的原碼就是補碼它本身
	temp=tp*0.0625*10+0.5;	
	//留一個小數點就*10,+0.5是四捨五入,因爲C語言浮點數轉換爲整型的時候把小數點
	//後面的數自動去掉,不管是否大於0.5,而+0.5之後大於0.5的就是進1了,小於0.5的就
	//算加上0.5,還是在小數點後面。
	shi = temp % 1000 / 100; //顯示溫度十位數
  	ge  = temp % 100 / 10;	 //顯示溫度個位數
  	xs  = temp % 10;		 //顯示小數一位
	Temp_Now=(u16)temp%1000;
}

//讀取溫度
int Ds18b20ReadTemp()
{
	int temp=0;
	u8 tmh,tml;
	Ds18b20ChangTemp();			 //先寫入轉換命令
	Ds18b20ReadTempCom();		//然後等待轉換完後發送讀取溫度命令
	tml=Ds18b20ReadByte();		//讀取溫度值共16位,先讀低字節
	tmh=Ds18b20ReadByte();		//再讀高字節
	temp=tmh;
	temp<<=8;
	temp|=tml;
	return temp;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章