- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于AT89C2051单片机的数字电容表设计
AT89C2051内部的电压比较器和电阻R2~R7等组成测量电路。其中R2~R5为量程电阻,由波段开关S1选择使用,电压比较器的基准电压由5 V电源电压经R6,RP1,R7分压后得到,调节RP1可调整基准电压。当P1.2口在程序的控制下输出高电平时,电容Cx即开始充电。量程电阻R2~R5每档以10倍递减,故每档显示读数以10倍递增。由于单片机内部P1.2口的上拉电阻经实测约为200 kΩ,其输出电平不能作为充电电压用,故用R5兼作其上拉电阻,由于其他三个充电电阻和R5是串联关系,因此R2,R3,R4应由标准值减去1 kΩ,分别为999 kΩ,99 kΩ,9 kΩ。由于999 kΩ和1 MΩ相对误差较小,所以R2还是取1 MΩ。
数码管DS1~DS4、电阻R8~R14等组成数码显示电路。本机采用动态扫描显示的方式,用软件对字形码译码。P3.0~P3.5,P3.7口作数码显示七段笔划字形码的输出,P1.3~P1.6口作四个数码管的动态扫描位驱动码输出。在此采用了共阴数码管,由于AT89C2051的P1.3~P1.6口有25 mA的下拉电流能力,所以不用三极管就能驱动数码管。R8~R14为P3.0~P3.5,P3.7口的上拉电阻,用以驱动数码管的各字段,当P3的某一端口输出低电平时其对应的字段笔划不点亮,而当其输出高电平时,则对应的上拉电阻即能点亮相应的字段笔划。
5 软件设计
程序用C语言编写。软件部分由主程序、定时中断服务子程序等模块组成。定时器T0作被测电容器充电时间的计数用。定时器T1用于定时中断服务,定时时间为5 ins,即5 ms产生一次中断。数组BitTab[4]用来存储位驱动码,DispTab[11]用来存储字形码,数组DispBtlf[4]的4个元素分别用来存储从定时器T0读出的数据的个、十百千位的4位数字。程序显示每一位数码的时间为5 ms,因此显示完整的4位数的周期为20 ms(4次中断)。每过240 ms(48次中断)刷新一下数据,即每过240 ms测一次电容量,测量时间小于2 ms,由于这一时间小于中断的时间5 ms,因此在测量过程中不会出现中断现象。测量电容时P1.2口输出高电平,电容开始充电,与此同时定时器T0开始计数,当电容器充电达到基准电压时,P3.6口输出高电平,据此程序做出判断停止T0的计数,并读出数据送数码管显示。如果被测电容器的容量超出测试档的量程,则计数值大于或等于2 000,显示结果为千位数显示1,其他三位数不显示。经仿真和电路测试,发现单片机判断P3.6口是否输出高电平要花3个机器周期,这会使显示值增加3,因此在程序中对此误差进行了修正,对计数值减去了3。字形码的输出用了P3口的P3.0~P3.5,P3.7,P3.6为空,P3口输出的数据通过数组DispTab获得。数据位和字形的对应关系如表1所示。
6 安装与调试
该设计用AT89C2051单片机集成电路,X1用12 MHz的石英晶体,S1选用1×4的波段开关,DS1~DS4选用共阴LED数码管。安装前先将C语言源程序用KEIL 51编译成目标文件即HEX文件,再用编程器将HEX文件写入AT89C2051芯片。调试工作主要是通过对RP1的调节来调整基准电压,最好是通过对一个精度比较高的的电容器的测量来进行调节,而不是直接测量基准电压。具体方法是,选一个经确认容量比较准确的电容器,如15 nF的电容器,将S1置于20 nF档上,调节RP1是测量显示值为1 500。选择的电容器容量至少要大于相应量程的50%,最好是接近满量程,才能调得比较准确。该档调试好后其他各档也就调试好了。如果发现某档精度有问题,可改变其相应充电电阻的阻值来进行调整。在使用过程中,当S1置于2 nF档时,在没有接人测试电容器时,有10 pF左右的显示值是正常的,因为这是电压比较器的输入电容和电路的分布电容。
只要在测量读数时间去掉这一数值即可。因此在调试时不要选择该档,以免因分布电容影响调试得准确性。
C文件源程序如下: