標題: 單片機TDS水質(zhì)檢測源程序 [打印本頁]
作者: zyxqwain 時間: 2019-4-27 17:30
標題: 單片機TDS水質(zhì)檢測源程序
1.系統(tǒng)是基于低功耗的AT89S51單片機,通過LCD555定時器構(gòu)成的多諧振蕩器產(chǎn)生一定頻率的波,再通過單片機的I/O接口對捕獲高低電平的讀出頻率,然后通過程序算法處理抽換算成電阻的值,使用DS18B20作為溫度采集模塊,經(jīng)過主機的數(shù)據(jù)轉(zhuǎn)換和處理,將溫度值通過字符液晶1602顯示器顯示。本設(shè)計結(jié)構(gòu)簡單,使用靈活,具有很大的使用和研究價值。
2.使用說明:燒錄程序到單片機,此時要把藍牙串口先斷開,下載程序完成后,連接藍牙模塊,將探針放入水中,打開手機藍牙串口助手,搜素配對藍牙,按下按鍵即可發(fā)送數(shù)據(jù),手機端會接收到相應(yīng)的測量數(shù)據(jù)。
3.結(jié)果:測量得到水質(zhì)的TDS值,并通過藍牙傳輸可在手機上得到相關(guān)的測量值
單片機源程序如下:
- /*******************************************************************************
- --------------------------------------------------------------------------------
- * 實 驗 名 : TDS顯示試驗
- * 實驗說明 : LCD1602顯TDS。
- * 連接方式 : 見連接圖
- * 注 意 :
- *******************************************************************************/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- unsigned char code buf3[]={"evaluation\:Suggested filtering\n\n"};
- unsigned char code buf2[]={"evaluation\:Slight solute in water\n\n"};
- unsigned char code buf1[]={"evaluation\: less solute in water\n\n"};
- unsigned char code buf4[]={"Warning\n\n"};
- long caculate_TDS(int temp);
- void LcdDisplay(int temp);
- void TDSDisplay(int temp);
- void send();
- void PutString(unsigned char *TXStr);
- unsigned int count;
- sbit key=P1^4;
- sbit key1=P1^3;
- unsigned int FreResultFlag;
- unsigned int FreNum;
- /*******************************************************************************
- * 函 數(shù) 名 : Timer0
- * 描 述 : 中斷程序,定時時間到后重新賦值開始定時,同時將LED的狀態(tài)取反.
- ********************************************************************************/
- void time0(void) interrupt 1
- {
- unsigned char i;
- TH0=(65536-46083)/ 256;
- TL0=(65536-46083)% 256;
- i++;
- if(i==20)
- {
- i=0;
- count=TH1*256+TL1;
- TH1=0x00;
- TL1=0x00;
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void main()
- {
- unsigned char flag=1;
- TMOD=0x51;
- TH0=(65536-46083)/ 256;
- TL0=(65536-46083)% 256;
- TH1 = TL1 = 0;
- EA=1;
- ET0=1;
- TR0 = 1;
- TR1 = 1;
-
- LcdInit(); //初始化LCD1602
- LcdWriteCom(0x88); //寫地址 80表示初始地址
- LcdWriteData('C');
-
-
- while(1)
- {
- //LcdDisplay();
- // Delay1ms(1000);//1s鐘刷一次
- if( FreResultFlag )
- {
- FreNum = ( TH1 * 256 + TL1);
- TH1 = 0;
- TL1 = 0;
- FreResultFlag = 0;
- TR1 = 1;
- TR0 = 1;
- LcdDisplay(Ds18b20ReadTemp());
- TDSDisplay(caculate_TDS(Ds18b20ReadTemp()));
- send();
- UsartConfiguration();
- }
-
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- float tp;
- if(temp< 0) //當溫度值為負數(shù)
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('-'); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數(shù)點后面。
-
- }
- else
- {
- LcdWriteCom(0x80); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
-
- LcdWriteCom(0x82); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
- LcdWriteCom(0x83); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0x84); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- LcdWriteCom(0x85); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteCom(0x86); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點
- LcdWriteCom(0x87); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點
-
- }
- /*******************************************************************************
- * 函數(shù)名 : TDSDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void TDSDisplay(int TDS) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0, 0}; //定義數(shù)組
- // float tp;
- // if(temp< 0) //當溫度值為負數(shù)
- // {
- // LcdWriteCom(0x80+0x40); //寫地址 80表示初始地址
- // LcdWriteData('-'); //顯示負
- // //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- // temp=temp-1;
- // temp=~temp;
- // tp=temp;
- // temp=tp*0.0625*100+0.5;
- // //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- // //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- // //算由?.5,還是在小數(shù)點后面。
- //
- // }
- // else
- // {
- // LcdWriteCom(0x80+0x40); //寫地址 80表示初始地址
- // LcdWriteData('+'); //顯示正
- // tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- // //如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
- // temp=tp*0.0625*100+0.5;
- // //留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
- // //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- // //算加上0.5,還是在小數(shù)點后面。
- // }
-
- datas[0] = TDS / 100000;
- datas[1] = TDS % 100000 / 10000;
- datas[2] = TDS % 10000 / 1000;
- datas[3] = TDS % 1000 / 100;
- datas[4] = TDS % 100 / 10;
- datas[5] = TDS % 10 ;
-
- LcdWriteCom(0x81+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
- //LcdWriteData('2');
-
- LcdWriteCom(0x82+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- //LcdWriteData('2');
- LcdWriteCom(0x83+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個位
- LcdWriteCom(0x84+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //
- LcdWriteCom(0x85+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點
-
-
- LcdWriteCom(0x86+0x40); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[5]); //顯示小數(shù)點
-
-
-
- }
- /*******************************************************************************
- * 函數(shù)名 : TDSDisplay()
- * 函數(shù)功能 : 計算TDS值
- * 輸入 : 溫度
- * 輸出 : 無
- *******************************************************************************/
- long caculate_TDS(float temp)
- {
- unsigned long TDS;
- float Kt=0;
- double Ks=0;
- Ks=0.0324*count;
- //Kt=1000000/count;
- temp=temp*0.0625*100+0.5;
- //temp=temp/100+(int)temp%100*0.01;
- if(temp<10&&temp>=1)
- {
- Kt=Ks*(0.00169*temp+0.5583);
- }
- else if(temp<20&&temp>=10)
- {Kt=Ks*(0.018*temp+0.5473);
- }
- else if(temp<30&&temp>=20)
- {Kt=Ks*(0.00189*temp+0.5281);
- }
- else
- { Kt=Ks*(0.022*temp+0.45);
- }
- TDS=0.55*Kt;
- return Ks;
- }
- /*******************************************************************************
- * 函 數(shù) 名定義 : PutString()
- * 描 述 : 發(fā)送字符串
- *******************************************************************************/
- void PutString(unsigned char *TXStr)
- {
-
- while(*TXStr!=0)
- {
- SBUF=*TXStr;
- while(TI==0);
- TI=0;
- TXStr++;
- }
-
- }
- /*******************************************************************************
- * 函 數(shù) 名定義 : send()
- * 描 述 : 發(fā)送測量的溫度,TDS
- *******************************************************************************/
- void send()
- {
- unsigned int shi,gewei,TD1,testno,testnoshi,testnoge;
- unsigned int NO[6];
- unsigned int i ,x;
- unsigned int TD[8];
- char str1[5];
- unsigned int TE[8];
- if(key==0)
- {
- while(!key);
- testno++;
- testnoshi=testno/10;
- testnoge=testno%10;
- NO[0]='N';
- NO[1]='O';
- NO[2]='\:';
- NO[3]=testnoshi+0x30;
- NO[4]=testnoge+0x30;
- NO[5]='\n';
- for(x=0;x<6;x++)
- {
- SBUF =NO[x];
- while(!TI);
- TI = 0;
- }
-
- str1[0]='\n';
- str1[1]='T';
- str1[2]='D';
- str1[3]='S';
- str1[4]='=';
- for(x=1;x<5;x++)//??揟DS=?
- {
- SBUF = str1[x];
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
TDS水質(zhì)檢測軟件.zip
(50.35 KB, 下載次數(shù): 329)
2019-4-27 17:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: admin 時間: 2019-4-27 22:10
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者: yyhlsf 時間: 2019-4-28 11:54
謝謝分享
作者: tigerlyt 時間: 2019-4-28 13:52
有電路原理圖和說明,圖片這些嗎,正在做一個凈水器電腦板,要用到這個,如果能提供,那感激不盡了
作者: zqy1818 時間: 2019-5-21 14:58
感謝分享,支持下!
作者: sanbourn 時間: 2019-5-22 17:09
之前看同學(xué)做過類似的,不錯。
作者: cao57508 時間: 2019-6-21 19:43
這個有STM32的嗎?直接用PWM代替555
作者: waerdeng 時間: 2019-11-3 13:01
謝謝分享,一顆MCU可以完成采樣處理顯示等全部功能。
作者: 1481714970 時間: 2019-11-3 20:28
謝謝樓主 很詳細
作者: jianjdand21 時間: 2020-3-22 22:00
不錯不錯,非常感謝分享
作者: aktuan007 時間: 2020-4-16 21:11
樓主能把原理圖也發(fā)一下不?
作者: swordhuang 時間: 2020-4-26 08:11
學(xué)習(xí)一下,我想直接用51片出波形再抓回來計算,不知道可不可行
作者: zhxzhx 時間: 2020-6-14 23:40
這個你可代替不了
作者: wellhope 時間: 2020-11-17 19:33
現(xiàn)在在做一個這樣的項目,參考參考,謝謝!
作者: lsw@dpj 時間: 2020-12-21 00:17
有沒有電路圖
作者: 紫色的云 時間: 2020-12-21 09:24
沒看明白是怎么檢測的,
作者: gordonpeng 時間: 2021-2-1 15:21
有sch,發(fā)一下,謝謝!
作者: gordonpeng 時間: 2021-2-1 15:23
有電路圖?
作者: notdashwood13 時間: 2022-12-26 22:50
請問有電路圖嗎?
作者: 劉曉龍368 時間: 2023-1-6 11:36
有pcb圖和電路圖嗎?
作者: wkman 時間: 2023-1-7 14:40
程序算法處理抽換算成電阻的值,,,什么對比表?
作者: 1261867136qq 時間: 2023-1-9 13:36
沒明白,為啥可以檢測水質(zhì)? 核心內(nèi)容沒說呢
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |