久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 51單片機測TDS電導率原理圖+源程序+詳解 [打印本頁]

作者: aktuan007    時間: 2020-4-16 21:23
標題: 51單片機測TDS電導率原理圖+源程序+詳解
大家都知道,51 單片機的外部中斷,可以設定為下降沿觸發。
當第一次下降沿來臨時,在中斷程序中,啟動定時器的計時;在第二次下降沿來臨時,再停止定時器。
這樣一來,計時器所統計的數值,就代表了脈沖的周期。
定時器在計時方式下,是針對機器周期計數,在晶振為 12MHz 時,計時的結果將在 0~65536us 范圍內。
以 ms 為單位,就是:00.000 ~ 65.535,也就是:00.000 ~ 65.535 uF。
直接用顯示器把這個數字顯示出來,這就是測量電容的結果。
如果電容器的容量,超出了這范圍,可以顯示超量程的信息,提示使用者換用不同的檔位,就是換用不同的電阻。
使用單片機測量電容的仿真電路如下:
圖片連接:
超量程的提示顯示如下:
單片機的程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define LCD_IO P0
  4. sbit RS = P2^0;      //1602寫地址
  5. sbit RW = P2^1;      //1602寫數據
  6. sbit EN = P2^2;      //1602工作使能
  7. sbit RST_5 = P3^0;   //555芯片工作控制
  8. sbit K_STA = P3^1;   //開始測量的按鍵
  9. unsigned char a[16] = "Measure Capac...";
  10. //Measure Capacitance
  11. unsigned char b[16] = " C: 00.000 uF   ";
  12. unsigned int Cap;
  13. bit  Flg;
  14. //*************延時1ms*******************
  15. void Delay1ms(unsigned int mm)
  16. {
  17.     unsigned int i;
  18.     for(; mm > 0; mm--)  for(i = 100; i > 0; i--);
  19. }
  20. //*************LCD 延時******************
  21. void LCD_delay(void)   
  22. {
  23.     char i;
  24.     for (i = 10; i > 0; i--);
  25. }
  26. //*************檢查忙否******************
  27. void Checkstates()
  28. {
  29.     RS = 0; RW = 1;
  30.     while(LCD_IO & 0x80) {
  31.       EN = 0; LCD_delay();
  32.       EN = 1; LCD_delay();
  33.     };
  34.     EN = 0;
  35. }
  36. //*************向寫LCD命令***************
  37. void wcomd(unsigned char cmd)
  38. {
  39.     Checkstates();
  40.     RS = 0; RW = 0;
  41.     LCD_IO = cmd; LCD_delay();
  42.     EN = 1; LCD_delay(); EN = 0;
  43. }
  44. //*************向寫LCD數據***************
  45. void wdata(unsigned char dat)
  46. {
  47.     Checkstates();
  48.     RS = 1; RW = 0;
  49.     LCD_IO = dat; LCD_delay();
  50.     EN = 1; LCD_delay(); EN = 0;
  51. }
  52. //*************初始化LCD*****************
  53. void LCD_INIT()
  54. {
  55.     Delay1ms(5);
  56.     wcomd(0x38);  Delay1ms(10);//功能設置
  57.     wcomd(0x01);  Delay1ms(1); //清屏
  58.     wcomd(0x08);  Delay1ms(1); //關顯示
  59.     wcomd(0x0c);  Delay1ms(1); //開顯示,不開光標
  60. }
  61. //*************LCD顯示*******************
  62. void Display(void) //顯示
  63. {
  64.     unsigned char i;
  65.     wcomd(0x80);  Delay1ms(5); //顯示第一行
  66.     for(i = 0; i < 16; i++)  wdata(a[i]);
  67.     wcomd(0xc0);  Delay1ms(5); //顯示第二行
  68.     for(i = 0; i < 16; i++)  wdata(b[i]);
  69. }
  70. //-------------------------------------------------
  71. void main()
  72. {
  73.    
  74.     while(1)  {
  75.       while(!K_STA)   { //當測量鍵被按下
  76.         RST_5 = 1;      //啟動555
  77.         Flg = 0;
  78.         Delay1ms(100);  //稍稍延時, 讓555穩定工作
  79.         EA = 1;         //開總中斷
  80.         while (EA == 1);//等待測量完畢, 下面進行數據處理
  81. //因為硬件設計合理, 所以數據很簡單, 無需復雜處理, 分離出過大過小的即可
  82.         if(Cap < 1000)  { //計數值小于100, 顯示small, 提示換量程
  83.            b[4] = 't'; b[5] = 'o'; b[6] = 'o'; b[7] = ' '; b[8] = 's'; b[9] = 'm';
  84.           b[10] = 'a';b[11] = 'l';b[12] = 'l';b[13] = '.';b[14] = ' ';b[15] = ' ';
  85.         }
  86.         else if(Cap > 60000)  { //大于60000, 顯示large, 提示量程
  87.            b[4] = 't'; b[5] = 'o'; b[6] = 'o'; b[7] = ' '; b[8] = 'l'; b[9] = 'a';
  88.           b[10] = 'r';b[11] = 'g';b[12] = 'e';b[13] = '.';b[14] = ' ';b[15] = ' ';
  89.         }
  90.         else {
  91.           b[4] = '0' + Cap / 10000 % 10;
  92.           b[5] = '0' + Cap / 1000 % 10;
  93.           b[6] = '.';
  94.           b[7] = '0' + Cap / 100 % 10;
  95.           b[8] = '0' + Cap / 10 % 10;
  96.           b[9] = '0' + Cap % 10;
  97.           b[10] = ' ';b[11] = 'u';b[12] = 'F';b[13] = ' ';b[14] = ' ';b[15] = ' ';
  98.         }
  99.         Display();      //顯示
  100.         while(!K_STA);  //等待按鍵釋放
  101.     } }
  102. }
  103. //-------------------------------------------------
  104. void X0_INT(void) interrupt 0 //控制計時的啟動、停止
  105. {
  106.     Flg = ~Flg;
  107.     if(Flg)  TR0 = 1;   //開始計時
  108.     else  {
  109.       TR0 = 0;          //停止計時
  110.       EA = 0;           //關閉中斷
  111.       RST_5 = 0;        //關閉555
  112.       Cap = TH0 * 256 + TL0; //取出機器周期數
  113.       TH0 = 0x00;       //恢復T0初值
  114.       TL0 = 0x00;
  115.     }
  116. }
  117. //-------------------------------------------------
  118. void T0_INT(void) interrupt 1 //測量超時
  119. {
  120.     EA = 0;             //關閉中斷
  121.     RST_5 = 0;          //關閉555
  122.     TR0 = 0;            //停止定時
  123.     TH0 = 0x00;         //恢復T0初值
  124.     TL0 = 0x00;
  125.     Cap = 65535;        //超出值
  126.     Flg = 0;
  127. }
復制代碼

系統主要采用了555定時器構成的RC振蕩電路和單片機技術。設計思路:被測電容C通過RC振蕩轉換成頻率信號f,送入單片機測頻,對該頻率進行運算處理求出被測電容的值,并送顯示器顯示。系統框圖如圖1所示,其主要由測量電路和控制電路兩部分組成。當接入被測電容后,由555定時器構成RC振蕩器產生方波信號,把此信號通過接口傳到AT89C51單片機I/O口上,對此方波信號進行測頻,通過軟件編程,計算出得到被測電容值,由LCD1602液晶顯示。

圖1 系統框圖

3 硬件設計

3.1 555振蕩電路的設計

由555芯片構成的多諧振蕩電路如圖2,CX為被測電容,接通電源后,CX被充電,A點電壓UA上升。當UA上升到時,觸發器被復位,同時555芯片內部放電三極管導通,此時U0為低電平。CX通過R2和放電三極管放電,使UA下降。當UA下降到時,觸發器又被置位,U0翻轉為高電平[3]。CX放電所需的時間為:

圖2 555構成的RC振蕩電路

由上式可知,當電路設計完成后,振蕩器輸出f隨CX的變化而改變。改變R1、R2的值即可改變系統量程。系統量程分為四檔:(1)R1+2R2=470KΩ時,測1.0nF-10.0nF的電容值。(2)R1+2R2=47KΩ時,測10.0nF~100.0nF的電容(3)R1+2R2=4.7KΩ時,測100.0nF~1000.0nF的電容。(4)R1+2R2=470Ω時,測1.0μF~10.0μF的電容。圖3為R1+2R2=470KΩ時,測量電容為2μF振蕩輸出輸出波形。

圖3 振蕩電路輸出的頻率信號

3.2 信號處理及顯示電路

信號處理電路部分采用單片機AT89S51作為系統的主控制器。AT89S51單片機的最小系統由時鐘電路、復位電路、外加電源及單片機構成[4],其硬件電路如圖4所示。555振蕩電路輸出的是脈沖波,接到AT89S51處理器的輸入引腳P3.5,通過AT89S51內部定時/計時器T0、T1及相應的程序設計,構成一個數字式頻率測量系統,測出頻率后按(5)式運算處理后得到被測電容值。

圖4 單片機控制顯示模塊

顯示模塊LCD1602液晶第1、2腳接驅動電源;第三腳VL為液晶的對比度調節,通過在VCC和GND之間接一個10K多圈可調電阻,中間抽頭接VL,可實現液晶對比度的調節;液晶的控制線RS、R/W、E分別接單片機的P2.5、P2.6、P2.7;D0~D7為LCD1602液晶模塊的8位雙向數據口,分別與STC89C52RC單片機的P1.0~P1.7相連,用于傳輸數據。接在單片機的P0口;BL+、BL-為液晶背光電源[5][6]。

4 系統軟件設計

圖5 主程序流程圖

系統軟件環境以Keil4.0為仿真平臺,使用C語言編程編寫了運行程序;包括主程序模塊、顯示模塊和電容測試模塊。軟件設計主要包括三個方面:一是初始化系統;二是按鍵檢測;三是數據采集、數據處理并進行顯示。程序采用模塊化的結構,這樣便于調試和修改,易編程和易讀性好,也程序結構清楚[7]。系統程序流程如圖6所示,首先對P3.5口脈沖信號頻率的測量,再通過(5)式算出所測的電容值,由LCD1602顯示出來。

5 系統的測試

表1 電容測試數據

6 結束語

設計的電容測試儀硬件采用555定時器作為信號采集模塊、AT89S51單片機作為信號處理器模塊,軟件采用Keil4.0為仿真平臺,使用C語言編程編寫了運行程序。其具有性能穩定、精度高、操作簡單、功耗低等優點。經測試表明:其可以測試1.0nF-10.0uF范圍的電容,誤差小于0.5%。誤差產生主要原因與電路元件參數、測試環境、測試方法等因素有關。



以上的Word格式文檔51黑下載地址:
測電導格式整理版.docx (1.48 MB, 下載次數: 85)




作者: liushiming82    時間: 2020-7-24 20:34
這個與TDS有什么關系呀,能否說詳細 一點呀,謝謝
作者: chy137    時間: 2023-11-6 16:21
   測量電容,怎么轉換成測量 測電導
作者: chy137    時間: 2023-11-6 16:21
測量電容,測電導
作者: wkman    時間: 2024-3-13 14:52
這個是電容,,,,,TDS是要測電導吧?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 另类ts人妖一区二区三区 | www.黄色网| 亚洲免费视频网站 | 亚洲精品观看 | 免费a在线观看 | 四虎影院在线 | 国产色一区 | 亚洲视频在线观看 | 精品一二三 | 免费三级网站 | 亚洲精品一区中文字幕乱码 | 哦┅┅快┅┅用力啊┅aps | 久久久久精 | 国产精品手机在线 | 国产成人精品一区二区三区视频 | aaa亚洲 | 三级黄色网| 日本黄色免费网站 | 色天天综合| 精品国产精品三级精品av网址 | 成人一级视频 | 99久久精品国产毛片 | 日韩精品一二区 | 亚洲视频三区 | 免费日韩视频 | 人与拘一级a毛片 | 夜夜操夜夜 | 日韩精品一区二区三区中文在线 | 国产精品第二页 | 国产成人免费视频 | 一级黄片毛片 | 九色在线视频 | 97视频免费在线观看 | 精品一区二区三区在线观看 | 国产精品成人国产乱一区 | 黄色成人毛片 | 欧美超碰在线 | www.99色| 在线观看黄色av | 天天久久 | 不卡视频一区二区 |