欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11146|回復: 21
打印 上一主題 下一主題
收起左側

單片機TDS水質檢測源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:523086 發表于 2019-4-27 17:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.系統是基于低功耗的AT89S51單片機,通過LCD555定時器構成的多諧振蕩器產生一定頻率的波,再通過單片機的I/O接口對捕獲高低電平的讀出頻率,然后通過程序算法處理抽換算成電阻的值,使用DS18B20作為溫度采集模塊,經過主機的數據轉換和處理,將溫度值通過字符液晶1602顯示器顯示。本設計結構簡單,使用靈活,具有很大的使用和研究價值。
2.使用說明:燒錄程序到單片機,此時要把藍牙串口先斷開,下載程序完成后,連接藍牙模塊,將探針放入水中,打開手機藍牙串口助手,搜素配對藍牙,按下按鍵即可發送數據,手機端會接收到相應的測量數據。
3.結果:測量得到水質的TDS值,并通過藍牙傳輸可在手機上得到相關的測量值

單片機源程序如下:
  1. /*******************************************************************************
  2. --------------------------------------------------------------------------------
  3. * 實 驗 名                 : TDS顯示試驗
  4. * 實驗說明       : LCD1602顯TDS。
  5. * 連接方式       : 見連接圖
  6. * 注    意                 :
  7. *******************************************************************************/

  8. #include<reg51.h>
  9. #include"lcd.h"
  10. #include"temp.h"
  11. unsigned char code buf3[]={"evaluation\:Suggested filtering\n\n"};
  12. unsigned char code buf2[]={"evaluation\:Slight solute in water\n\n"};
  13. unsigned char code buf1[]={"evaluation\: less solute in water\n\n"};
  14. unsigned char code buf4[]={"Warning\n\n"};  
  15. long caculate_TDS(int temp);
  16. void LcdDisplay(int temp);
  17. void TDSDisplay(int temp);
  18. void send();
  19. void PutString(unsigned char *TXStr);
  20. unsigned int count;
  21. sbit key=P1^4;
  22. sbit key1=P1^3;
  23. unsigned int   FreResultFlag;   
  24. unsigned int FreNum;
  25. /*******************************************************************************
  26. * 函  數  名      : Timer0
  27. * 描      述      : 中斷程序,定時時間到后重新賦值開始定時,同時將LED的狀態取反.
  28. ********************************************************************************/
  29. void time0(void) interrupt 1  

  30. {        
  31.         unsigned char i;

  32.         TH0=(65536-46083)/ 256;
  33.         TL0=(65536-46083)% 256;                  
  34.         i++;       
  35.         if(i==20)
  36.         {
  37.                  i=0;       
  38.                 count=TH1*256+TL1;
  39.                 TH1=0x00;
  40.                 TL1=0x00;
  41.         }

  42. }


  43. /*******************************************************************************
  44. * 函數名         : main
  45. * 函數功能                   : 主函數
  46. * 輸入           : 無
  47. * 輸出                  : 無
  48. *******************************************************************************/

  49.         void main()

  50. {       
  51.                                 unsigned char flag=1;
  52.                                 TMOD=0x51;
  53.                                 TH0=(65536-46083)/ 256;
  54.                                 TL0=(65536-46083)% 256;                  
  55.                                 TH1 = TL1 = 0;
  56.                                 EA=1;
  57.                                 ET0=1;
  58.                                 TR0 = 1;
  59.                                 TR1 = 1;
  60.                        
  61.      LcdInit();                         //初始化LCD1602
  62.            LcdWriteCom(0x88);        //寫地址 80表示初始地址
  63.            LcdWriteData('C');
  64.        
  65.           
  66.         while(1)
  67.         {
  68.                 //LcdDisplay();


  69. //                Delay1ms(1000);//1s鐘刷一次
  70.                         if( FreResultFlag )                                 
  71.         {
  72.             FreNum = ( TH1 * 256 + TL1);  
  73.             TH1    = 0;                                   
  74.             TL1    = 0;
  75.             FreResultFlag = 0;                             
  76.             TR1    = 1;
  77.             TR0    = 1;                                    
  78.                        LcdDisplay(Ds18b20ReadTemp());                     
  79.                                          TDSDisplay(caculate_TDS(Ds18b20ReadTemp()));
  80.                                          send();
  81.                                    UsartConfiguration();                     
  82.                                 }

  83.        
  84.         }
  85.         }
  86. /*******************************************************************************
  87. * 函數名         : LcdDisplay()
  88. * 函數功能                   : LCD顯示讀取到的溫度
  89. * 輸入           : v
  90. * 輸出                  : 無
  91. *******************************************************************************/

  92. void LcdDisplay(int temp)          //lcd顯示
  93. {
  94.    
  95.   unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  96.         float tp;  
  97.         if(temp< 0)                                //當溫度值為負數
  98.           {
  99.                   LcdWriteCom(0x80);                //寫地址 80表示初始地址
  100.             LcdWriteData('-');                  //顯示負
  101.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  102.                 temp=temp-1;
  103.                 temp=~temp;
  104.                 tp=temp;
  105.                 temp=tp*0.0625*100+0.5;       
  106.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  107.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  108.                 //算由?.5,還是在小數點后面。

  109.           }
  110.         else
  111.           {                       
  112.                   LcdWriteCom(0x80);                //寫地址 80表示初始地址
  113.             LcdWriteData('+');                 //顯示正
  114.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  115.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  116.                 temp=tp*0.0625*100+0.5;       
  117.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  118.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  119.                 //算加上0.5,還是在小數點后面。
  120.         }
  121.         datas[0] = temp / 10000;
  122.         datas[1] = temp % 10000 / 1000;
  123.         datas[2] = temp % 1000 / 100;
  124.         datas[3] = temp % 100 / 10;
  125.         datas[4] = temp % 10;

  126.         LcdWriteCom(0x82);                  //寫地址 80表示初始地址
  127.         LcdWriteData('0'+datas[0]); //百位

  128.        
  129.         LcdWriteCom(0x83);                 //寫地址 80表示初始地址
  130.         LcdWriteData('0'+datas[1]); //十位

  131.         LcdWriteCom(0x84);                //寫地址 80表示初始地址
  132.         LcdWriteData('0'+datas[2]); //個位

  133.         LcdWriteCom(0x85);                //寫地址 80表示初始地址
  134.         LcdWriteData('.');                 //顯示 ‘.’

  135.         LcdWriteCom(0x86);                 //寫地址 80表示初始地址
  136.         LcdWriteData('0'+datas[3]); //顯示小數點  

  137.         LcdWriteCom(0x87);                 //寫地址 80表示初始地址
  138.         LcdWriteData('0'+datas[4]); //顯示小數點  
  139.        

  140. }

  141. /*******************************************************************************
  142. * 函數名         : TDSDisplay()
  143. * 函數功能                   : LCD顯示讀取到的
  144. * 輸入           : v
  145. * 輸出                  : 無
  146. *******************************************************************************/
  147. void TDSDisplay(int TDS)          //lcd顯示
  148. {
  149.    
  150.   unsigned char datas[] = {0, 0, 0, 0, 0, 0}; //定義數組
  151. //        float tp;  
  152. //        if(temp< 0)                                //當溫度值為負數
  153. //          {
  154. //                  LcdWriteCom(0x80+0x40);                //寫地址 80表示初始地址
  155. //            LcdWriteData('-');                  //顯示負
  156. //                //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  157. //                temp=temp-1;
  158. //                temp=~temp;
  159. //                tp=temp;
  160. //                temp=tp*0.0625*100+0.5;       
  161. //                //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  162. //                //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  163. //                //算由?.5,還是在小數點后面。
  164. //
  165. //          }
  166. //         else
  167. //          {                       
  168. //                  LcdWriteCom(0x80+0x40);                //寫地址 80表示初始地址
  169. //            LcdWriteData('+');                 //顯示正
  170. //                tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  171. //                //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  172. //                temp=tp*0.0625*100+0.5;       
  173. //                //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  174. //                //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  175. //                //算加上0.5,還是在小數點后面。
  176. //        }
  177.                

  178.         datas[0] = TDS / 100000;
  179.         datas[1] = TDS % 100000 / 10000;
  180.         datas[2] = TDS % 10000 / 1000;
  181.         datas[3] = TDS % 1000 / 100;
  182.         datas[4] = TDS % 100 / 10;
  183.         datas[5] = TDS % 10 ;


  184.         LcdWriteCom(0x81+0x40);                  //寫地址 80表示初始地址
  185.         LcdWriteData('0'+datas[0]); //百位
  186.         //LcdWriteData('2');
  187.        
  188.         LcdWriteCom(0x82+0x40);                 //寫地址 80表示初始地址
  189.         LcdWriteData('0'+datas[1]); //十位
  190.         //LcdWriteData('2');

  191.         LcdWriteCom(0x83+0x40);                //寫地址 80表示初始地址
  192.         LcdWriteData('0'+datas[2]); //個位


  193.         LcdWriteCom(0x84+0x40);                 //寫地址 80表示初始地址
  194.         LcdWriteData('0'+datas[3]); //

  195.         LcdWriteCom(0x85+0x40);                 //寫地址 80表示初始地址
  196.         LcdWriteData('0'+datas[4]); //顯示小數點  
  197.        
  198.        
  199.         LcdWriteCom(0x86+0x40);                 //寫地址 80表示初始地址
  200.         LcdWriteData('0'+datas[5]); //顯示小數點  
  201.        
  202.                
  203.        

  204. }
  205. /*******************************************************************************
  206. * 函數名         : TDSDisplay()
  207. * 函數功能                   : 計算TDS值
  208. * 輸入           : 溫度
  209. * 輸出                  : 無
  210. *******************************************************************************/
  211. long caculate_TDS(float temp)

  212. {       
  213.         unsigned long TDS;
  214.         float Kt=0;
  215.         double Ks=0;
  216.         Ks=0.0324*count;
  217.         //Kt=1000000/count;
  218.         temp=temp*0.0625*100+0.5;       
  219.         //temp=temp/100+(int)temp%100*0.01;
  220.         if(temp<10&&temp>=1)
  221.         {
  222.                 Kt=Ks*(0.00169*temp+0.5583);
  223.         }
  224.         else if(temp<20&&temp>=10)
  225.         {Kt=Ks*(0.018*temp+0.5473);
  226.         }
  227.         else if(temp<30&&temp>=20)
  228.         {Kt=Ks*(0.00189*temp+0.5281);
  229.         }
  230.     else
  231.     {  Kt=Ks*(0.022*temp+0.45);
  232.     }
  233.      TDS=0.55*Kt;
  234.                  return Ks;
  235. }
  236. /*******************************************************************************
  237. * 函 數 名定義         : PutString()
  238. * 描      述           : 發送字符串
  239. *******************************************************************************/
  240. void PutString(unsigned char *TXStr)  
  241.   {               
  242.          
  243.       while(*TXStr!=0)
  244.       {                     
  245.          SBUF=*TXStr;
  246.          while(TI==0);
  247.          TI=0;   
  248.           TXStr++;
  249.        }
  250.       
  251.     }   
  252.         /*******************************************************************************
  253. * 函 數 名定義         : send()
  254. * 描      述           : 發送測量的溫度,TDS
  255. *******************************************************************************/
  256.                 void send()
  257.                 {
  258.                 unsigned int shi,gewei,TD1,testno,testnoshi,testnoge;
  259.         unsigned int NO[6];
  260.         unsigned int i ,x;
  261.         unsigned int TD[8];
  262.         char str1[5];
  263.         unsigned int TE[8];
  264.                         if(key==0)
  265. {
  266.                 while(!key);
  267.                 testno++;
  268.                 testnoshi=testno/10;
  269.                 testnoge=testno%10;
  270.                 NO[0]='N';
  271.                 NO[1]='O';
  272.                 NO[2]='\:';
  273.                 NO[3]=testnoshi+0x30;
  274.                 NO[4]=testnoge+0x30;       
  275.                 NO[5]='\n';
  276.                                         for(x=0;x<6;x++)
  277.                          {
  278.                 SBUF =NO[x];
  279.                  while(!TI);   
  280.                  TI = 0;         
  281.                                                                 }
  282.                

  283.                 str1[0]='\n';
  284.                 str1[1]='T';
  285.                 str1[2]='D';
  286.                 str1[3]='S';
  287.                 str1[4]='=';
  288. for(x=1;x<5;x++)//??揟DS=?
  289.                 {
  290.    SBUF = str1[x];
  291. ……………………

  292. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
TDS水質檢測軟件.zip (50.35 KB, 下載次數: 329)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2019-4-27 22:10 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:375715 發表于 2019-4-28 11:54 來自觸屏版 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:522450 發表于 2019-4-28 13:52 | 只看該作者
有電路原理圖和說明,圖片這些嗎,正在做一個凈水器電腦板,要用到這個,如果能提供,那感激不盡了
回復

使用道具 舉報

6#
ID:58591 發表于 2019-5-21 14:58 | 只看該作者
感謝分享,支持下!
回復

使用道具 舉報

7#
ID:544851 發表于 2019-5-22 17:09 | 只看該作者
之前看同學做過類似的,不錯。
回復

使用道具 舉報

8#
ID:105377 發表于 2019-6-21 19:43 | 只看該作者
這個有STM32的嗎?直接用PWM代替555
回復

使用道具 舉報

9#
ID:71535 發表于 2019-11-3 13:01 | 只看該作者
謝謝分享,一顆MCU可以完成采樣處理顯示等全部功能。
回復

使用道具 舉報

10#
ID:634898 發表于 2019-11-3 20:28 | 只看該作者
謝謝樓主  很詳細
回復

使用道具 舉報

11#
無效樓層,該帖已經被刪除
12#
ID:511131 發表于 2020-3-22 22:00 | 只看該作者
不錯不錯,非常感謝分享
回復

使用道具 舉報

13#
ID:582255 發表于 2020-4-16 21:11 | 只看該作者
樓主能把原理圖也發一下不?
回復

使用道具 舉報

14#
ID:701809 發表于 2020-4-26 08:11 | 只看該作者
學習一下,我想直接用51片出波形再抓回來計算,不知道可不可行
回復

使用道具 舉報

15#
ID:378108 發表于 2020-6-14 23:40 | 只看該作者
cao57508 發表于 2019-6-21 19:43
這個有STM32的嗎?直接用PWM代替555

這個你可代替不了
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
17#
ID:38662 發表于 2020-11-17 19:33 | 只看該作者
現在在做一個這樣的項目,參考參考,謝謝!
回復

使用道具 舉報

18#
無效樓層,該帖已經被刪除
19#
ID:746641 發表于 2020-12-21 00:17 | 只看該作者
有沒有電路圖
回復

使用道具 舉報

20#
ID:156220 發表于 2020-12-21 09:24 | 只看該作者
沒看明白是怎么檢測的,
回復

使用道具 舉報

21#
ID:728064 發表于 2021-2-1 15:21 | 只看該作者
有sch,發一下,謝謝!
回復

使用道具 舉報

22#
ID:728064 發表于 2021-2-1 15:23 | 只看該作者
有電路圖?
回復

使用道具 舉報

23#
無效樓層,該帖已經被刪除
24#
無效樓層,該帖已經被刪除
25#
無效樓層,該帖已經被刪除
26#
ID:1059298 發表于 2022-12-26 22:50 | 只看該作者
請問有電路圖嗎?
回復

使用道具 舉報

27#
ID:574329 發表于 2023-1-6 11:36 來自觸屏版 | 只看該作者
有pcb圖和電路圖嗎?
回復

使用道具 舉報

28#
ID:433219 發表于 2023-1-7 14:40 | 只看該作者
程序算法處理抽換算成電阻的值,,,什么對比表?
回復

使用道具 舉報

29#
ID:308903 發表于 2023-1-9 13:36 | 只看該作者
沒明白,為啥可以檢測水質? 核心內容沒說呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表