单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:9231|回复:4
打印上一主题下一主题

51单片机测TDS电导率原理图+源程序+详解

[复制链接]
跳转到指定楼层
楼主
ID:582255发表于 2020-4-16 21:23|只看该作者|只看大图回帖奖励
大家都知道,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, 下载次数: 79)



评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:3666发表于 2020-7-24 20:34|只看该作者
这个与TDS有什么关系呀,能否说详细 一点呀,谢谢
板凳
ID:155485发表于 2023-11-6 16:21|只看该作者
   测量电容,怎么转换成测量 测电导
地板
ID:155485发表于 2023-11-6 16:21|只看该作者
测量电容,测电导
5#
ID:433219发表于 2024-3-13 14:52|只看该作者
这个是电容,,,,,TDS是要测电导吧?

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网