找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9020|回复: 4
打印 上一主题 下一主题
收起左侧

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, 下载次数: 77)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩1
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表