找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电容表源程序与Proteus仿真电路图

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

通过简易数字电容表的设计,提高运用单片机设计小型电子系统的能力。
二、内容
运用单片机设计一简易数字电容表,具体指标要求如下:
(1)基本要求
①测量范围:1pF~2000pF、10pF~20nF、0.1nF~200nF、1nF~2000nF(量程可以自定);
②显示方式:四位LED十进制数;
③测试精度:≤5%(或±2字);
④测量电容类型:瓷介电容、涤纶电容、电解电容等;
(2)发挥部分
①测试精度:≤1%(或±1字);
②自制符合要求电源。
三、设计过程
(一)设计原理分析
数字电容表以电容器的充电规律作为测量依据,测试原理见图8.1。电源电压E+经电阻R给被测电容CX充电,CX两端原电压随充电时间的增加而上升(原理参见实践五公式1)。当充电时间t等于RC时间常数τ时,CX两端电压约为电源电压的63.2%,即0.632E+。数字电容表就是以该电压作为测试基准电压,测量电容器充电达到该电压的时间,便能知道电容器的容量。例如,设电阻R的阻值为1KΩ,CX两端电压上升到0.632E+所需的时间为1mS(1000uS),那么由公式τ=RC可知CX的容量为1uF(1000nF),同理若测试电容为2000nF,则时间常数τ为2000uS。因此,时间常数τ就可以直接表示为电容的容量。
设计中需要一个精确的电压比较器,充电开始时单片机开始计数,当充电电压达到0.632E+时,为单片机提供中断而停止计数,将计数结果显示出来,就是电容器的容量。为了多次测量,第二次需要对电容完全放电,再进行第二次测量,如此循环。
(二)单片机的选择
从原理分析可知,对单片机的资源要求很低,不需要很多的端口和较大的存储空间,确需要一个电压比较器。T89C2051作为AT89C51的简化版虽然去掉了P0、P2等端口,使I/O口减少了,但是却增加了一个电压比较器,因此其功能在某些方面反而有所增强,如能用来处理模拟量、进行简单的模数转换等。P1、P3口足以满足显示和控制需要,因此作为首选。
(三)电路设计
(1)测量比较器设计
测量电路如图8.2所示。A为AT89C2051内部构造的电压比较器,AT89C2051的P1.0和P1.1口除了作I/O口外,还有一个功能是作为电压比较器的输入端,P1.0为同相输入端,P1.1为反相输入端,电压比较器的比较结果存入P3.6口对应的寄存器,P3.6口在AT89C2051内部无引脚。电压比较器的基准电压设定为0.632E+,在CX两端电压从0升到0.632E+的过程中,P3.6口输出为0,当电池电压CX两端电压一旦超过0.632E+时,P3.6口输出变为1。以P3.6口的输出电平为依据,用AT89C2051内部的定时器T0对充电时间进行计数,再将计数结果显示出来即得出测量结果。
(2)整机电路设计
整机电路见图8.3。电路由单片机电路、电容充电测量电路和数码显示电路等部分组成。
AT89C2051内部的电压比较器和电阻R2~R7等组成测量电路,其中R2~R5为量程电阻,由波段开关S1选择使用,电压比较器的基准电压由5V电源电压经R6、RP1、R7分压后得到,调节RP1可调整基准电压。当P1.2口在程序的控制下输出高电平时,电容CX即开始充电。量程电阻R2~R5每档以10倍递减,故每档显示读数以10倍递增。由于单片机内部P1.2口的上拉电阻经实测约为200K,其输出电平不能作为充电电压用,故用R5兼作其上拉电阻,由于其它三个充电电阻和R5是串联关系,因此R2、R3、R4应由标准值减去1K,分别为999K、99K、9K。由于999K和1M相对误差较小,所以R2还是取1M。
数码管DS1~DS4、电阻R8~R14等组成数码显示电路。本机采用动态扫描显示的方式,用软件对字形码译码。P3.0~P3.5、P3.7口作数码显示七段笔划字形码的输出,P1.3~P1.6口作四个数码管的动态扫描位驱动码输出。这里采用了共阴数码管,由于AT89C2051的P1.3~P1.6口有25mA的下拉电流能力,所以不用三极管就能驱动数码管。R8~R14为P3.0~P3.5、P3.7口的上拉电阻,用以驱动数码管的各字段,当P3的某一端口输出低电平时其对应的字段笔划不点亮,而当其输出高电平时,则对应的上拉电阻即能点亮相应的字段笔划。
(四)软件设计
程序使用C语言编写,详细源程序见附录。
程序由主程序、定时中断服务子程序等模块组成。定时器T0作被测电容器充电时间的计数用。定时器T1用于定时中断服务,定时时间为5mS,即5mS产生一次中断。数组BitTab[4] 用来存储位驱动码,DispTab[11] 用来存储字形码,数组DispBuf[4]的4个元素分别用来存储从定时器T0读出的数据的个、十百千位的4位数字。
程序显示每一位数码的时间为5mS,因此显示完整的4位数的周期为20mS(4次中断)。每过240mS(48次中断)刷新一下数据,即每过240mS测一下电容量,测量时间小于2mS,由于这一时间小于中断的时间5mS,因此在测量过程中不会出现中断现象。测量电容时P1.2口输出高电平,电容开始充电,与此同时定时器T0开始计数,当电容器充电达到基准电压时,P3.6口输出高电平,据此程序做出判断停止T0的计数,并读出数据送数码管显示。如果被测电容器的容量超出测试档的量程,则计数值大于或等于2000,显示结果为千位数显示1,其它三位数不显示,这和数字万用表超过量程的显示模式相同。这时可选择大一档的量程进行测试。
经仿真和电路测试,发现单片机判断P3.6口是否输出高电平要化3个机器周期,这会使显示值增加3,因此在程序中对此误差进行了修正,对计数值减去了3。

字形码的输出用了P3口的P3.0-P3.5、P3.7,P3.6为空,P3口输出的数据通过数组DispTab[11]获得。数据位和字形的对应关系表8.1所示,因为数码管为共阴型,所以相应的输出位为1时笔段亮。
表8.1数据位和字形的对应关系表

四、安装与调试
印刷电路板图见图8.4,制作双面板有困难时也可用万能印刷电路板制作。IC1用AT89C2051单片机集成电路,X1用12MHz的石英晶体,S1选用1×4的波段开关,DS1~DS4选用共阴LED数码管,其余元器件的参数见图8.3。

安装前先将C语言源程序用KEIL 51编译成目标文件即HEX文件,再用编程器将HEX文件写入AT89C2051芯片。
安装后的调试工作主要是通过对RP1的调节来调整基准电压,最好是通过对一个精度比较高的电容器的测量进行调节,而不是直接测量基准电压。具体方法是选一个经确认容量比较准确的电容器,如一只15nF的电容器,将S1置于20nF档,调节RP1使测量显示值为1500。选择的电容器容量至少要大于相应量程的一半,最好是接近满量程,这样才能使调节比较准确。该档调试好后其它各档也就相应的调好了,如果发现某档精度有问题可改变其相应的充电电阻阻值进行调整。

在使用过程中,当S1置于2nF档时,在没有放入测试电容器时有10pF左右的显示值为正常现象,因为这是电压比较器的输入电容和电路的分布电容,只要在测量读数时减去这一数值即可。因此在调试时也不要选择该档,以免分布电容影响调试的准确性。

单片机源程序如下:
  1. #include <reg51.h>
  2. unsigned char j,n,t,DispBuf[4];
  3. unsigned int cap;
  4. unsigned char code
  5. BitTab[4]={0xbf,0xdf,0xef,0xf7};//位驱动码
  6. unsigned char code
  7. DispTab[11]={0xfe,0x70,0xed,0xf9,0x73,0xdb,0xdf,0xf0,0xff,0xfb,0x40};//字形码
  8. sbit P1_2=P1^2;
  9. sbit P3_6=P3^6;
  10. main()         //主程序
  11. {        TMOD=0x11;//定时器T0、T1均工作于定时方式1
  12.         TH1=0xec;
  13.         TL1=0x78;//T1定时时间为5ms
  14.         IE=0x88; //开中断
  15.         TR1=1;   //开定时器T1
  16.         for(;;)  //无限循环,定时中断返回点
  17.                 ;
  18. }
  19. Timer1() interrupt 3//定时中断服务程序
  20. {        TH1=0xec;
  21.         TL1=0x78;
  22.         t=BitTab[j];//取位值
  23.         P1=P1|0x78;//P1.3-P1.6送1
  24.         P1=P1&t;   //P1.3-P1.6输出取出的位值
  25.         t=DispBuf[j];//取出待显示的数
  26.         t=DispTab[t];//取字形码
  27.         P3=t; //字型码由P3输出显示
  28.         j++;  //j作为数码管的计数器,取值0-3,显示程序通过它确认显示哪个数码管
  29.         if(j==4)
  30.         j=0;
  31.         n++;
  32.         if(n==48)//每过48个中断测一次电容量
  33.         {        
  34.                 n=0;
  35.                 TH0=0;
  36.                 TL0=0;
  37.                 P1_2=1;//电容开始充电
  38.                 TR0=1; //开定时器T0
  39.                 for(;P3_6==0;)//判断充电电压达到参考电压否
  40.                         ;
  41.                 TR0=0;//充电电压达到参考电压,关定时器T0
  42.                 P1_2=0;
  43.                 cap=TL0|(TH0<<8);//取定时器T0中的数值
  44.                 cap=cap-3;//修正误差
  45.                 if(cap>=2000)
  46.                 {
  47.                         DispBuf[3]=10;
  48.                         DispBuf[2]=10;
  49.                         DispBuf[1]=10;
  50.                         DispBuf[0]=1;  //超量程,最高位显示1,其余各位不显示(灭)
  51.                 }
  52.                 if(cap<2000)  //不超量程,取各位数值
  53.                 {
  54.                           DispBuf[3]=cap%10;//取个位数
  55.                         cap=cap/10;
  56.                         DispBuf[2]=cap%10;//取十位数
  57.                         cap=cap/10;
  58.                         DispBuf[1]=cap%10;//取百位数
  59.                         DispBuf[0]=cap/10;//取千位数
  60.                 }
  61.         }
  62. }
复制代码

所有资料51hei提供下载:
电容表.zip (84.2 KB, 下载次数: 47)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1041619 发表于 2022-8-9 10:03 | 只看该作者
上拉电阻能否更改?比如获取1000uf的上限量产,把R5变为1欧?
回复

使用道具 举报

板凳
ID:1043068 发表于 2022-8-27 13:37 | 只看该作者
感谢版主分享,刚好想自己做一个试试
回复

使用道具 举报

地板
ID:71233 发表于 2023-2-16 18:31 | 只看该作者
请问这款电容表,哪位朋友做过,可以用吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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