电容数字测量仪设计总结报告.docx
《电容数字测量仪设计总结报告.docx》由会员分享,可在线阅读,更多相关《电容数字测量仪设计总结报告.docx(28页珍藏版)》请在冰点文库上搜索。
电容数字测量仪设计总结报告
自动化综合设计总结报告
题目:
电容数字测量仪
二级学院电子信息与自动化学院
专业自动化专业
班级自动化2班、3班
指导老师刘晓东
组员
考核项目
设计50分
平时成绩20分
答辩30分
得分
总分
考核等级
教师签名
电容数字测量仪
摘要
本设计是基于555定时器构成多谐振荡器产生输入脉冲信号,然后通过AT89C51对方波脉冲中断计数而测量电容的。
在多谐振荡器输出端加入一个74HC08对方波消除毛刺产生方波输入到单片机外部中断0,再通过单片机内部计数器对方波进行脉宽计数。
555定时器中所涉及的电容,即是被测量的电容
。
信号的频率可以根据所选的电阻,电容的参数而调节,这样便可以定量的确定被测电容的容值范围。
最后通过LCD1602显示被测电容数值。
关键词:
电容,555定时器,AT89C51,LCD1602
1、引言
当前数字系统的设计正朝着快速以及大容量和便利的方向发展。
现代电子产品几乎几乎应用到各个领域,有力推动了现代社会信息化的进展,这反过来也要求电子产品要以更快的速度节奏升级。
在日常的电路工程或者电路试验中,电容为一个最常见的电子元件,在实际电路中对电容的要求也愈加精确,传统的电容测量仪表现的不够直观、精确度不高以及便利。
因此,这次,我们选择一个数字式电容测量仪,只要打开开关就可以直观的观察电容数量值大小。
相比以前的更为方便、高精确度的有点,这也为本次选题带来了意义,同时也提高了我们对设计的兴趣。
2.1设计要求
1、设计电容数字测量仪电路,测量并显示电容大小
2、测量电容范围为100pf~50
F
3、系统工作满足电容测量一般要求。
2.2系统整体方案设计
本设计是通过一块555芯片来测量电容,让555芯片工作在直接反馈无稳态的状态下,555芯片输出一定频率的方波,其频率的大小跟被测量的电容之间的关系是:
,我们固定
的大小,其公式就可以写为:
,只要我们能够测量出555芯片输出的频率,就可以计算出测量的电容。
计算频率的方法可以利用单片机的计数器
和中断
配合使用来测量,这种研究方法相当的简单。
系统框图见下图。
系统框图
图中给出了整个系统设计的系统框图,系统主要由四个主要部分组成,单片机和晶振电路设计,555芯片电路设计,LCD1602显示电路,复位电路设计。
3、硬件电路设计
3.1单片机AT89C51简介
MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MCS-51单片机可以算是相当成功的产品,一直到现在,MCS-51系列或其兼容的单片机仍是应用的主流产品,各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。
AT89C51是一个低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案。
AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
3.2.2单片机最小系统复位电路与
1、从原理上,一般采用上电复位电路。
这种复位电路的工作原理是:
通电时,电容两端相当于短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降到一定程序,即为低电平,单片机开始正常工作。
该设计中复位电路采用按键复位方式。
电路选用22uF的电容、200k欧姆的电阻、1000欧姆电阻和一个按键组成。
2、内部时钟电路和晶振频率一般选择在4MHz~12MHz之间(该设计选用12MHz),外接两个谐振电容。
本系统采用内部时钟方式。
3.2.3按键控制电路
本设计采用3个按键来执行检测作用,因为根据测量范围要求该设计制定了3个档位,每个按键对应555定时器上规定档位,该按键在软件程序用来控制程序是否往下面执行,如检测到按键按下,再对程序变量置位进而控制显示程序的执行;同时单片机上设定了开始测量电容输入的按键,单片机通过P3.7端口对按键进行检测;该四个按键如图所示:
3.2555定时器多谐振荡器
3.2.1555定时器概述
555芯片电路是一种将模拟功能与逻辑功能巧妙结合在同一硅片上的组合集成电路。
它设计新颖,构思奇巧,用途广泛,备受电子专业设计人员和电子爱好者的青睐,人们将其戏称为伟大的小IC。
1972年,美国西格尼蒂克斯公司(Signetics)研制出TmerNE555双极型时基电路,设计原意是用来取代体积大,定时精度差的热延迟继电器等机械式延迟器。
但该器件投放市场后,人们发现这种电路的应用远远超出原设计的使用范围,用途之广几乎遍及电子应用的各个领域,需求量极大。
美国各大公司相继仿制这种电路1974年西格尼蒂克斯公司又在同一基片上将两个双极型555单元集成在一起,取名为NF556。
1978年美国英特锡尔(Intelsil)研制成功CMOS型时基电路ICM555ICM556,后来又推出将四个时基电路集成在一个芯片上的四时基电路558由于采用CMOS型工艺和高度集成,使时基电路的应用从民用扩展到火箭、导弹、卫星、航天等高科技领域。
在这期间,日本、西欧等各大公司和厂家也竞相仿制、生产。
尽管世界各大半导体或器件公司、厂家都在生产各自型号的555/556时基电路,但其内部电路大同小异,且都具有相同的引出功能端。
555电路,也称555芯片电路,是一种中规模集成电路。
它具有功能强、使用灵活、适用范围宽的特点。
通常只要外接少量几个元件,就可构成各种不同用途的脉冲电路以及许多实用电路,如多谐振荡器、单稳态电路及施密特触发器等等。
从而能够实现振荡、定时、调光、调压、调速等。
555集成电路有双极型和CMOS两种。
CMOS型的优点是功耗低、电源电压低、输入阻抗高。
对于初学者来说,可以把555电路等效看成一个带放电开关的RS触发器,这个特殊的触发器有两个输入端:
阈值端TH可看成是置零端R,要求高电平,触发端R可看成置位端低电平有效。
它只有一个输出端Vo,Vo可等效为触发器的Q端。
放电端DIS可看成由内部放电开关控制的一个接点,放电开关由触发器的端控制:
Q=1时DIS端接地;Q=0时,DIS端悬空。
此外,这个触发器还有复位端MR加上低电平(<0.3V)时可使输出为低电平。
该特殊的RS触发器有两个输入端,这两个输入端的触发电平要求一高一低,其中置零端R即阈值端TH要求高电平,置位端即触发端则要求低电平,也就是使它们翻转的阈值电压值不同。
当VK端不接控制电压时,对TH端(即R端)来讲,大于2/3VDD是高电平1,小于2/3VDD时是低电平0;而对TR端(即端)来讲,大于1/3VDD是高电平1,小于1/3VDD是低电平O。
3.2.2555定时器与AT89C51接口
555定时器芯片电路的应用电路很多,在实际应用中,除了单一品种的电路外,还可组合出很多不同电路。
本次设计中应用的电路是直接反馈型无稳类电路,外设按键控制三个档位,555定时器的4脚复位端有单片机P3.6端口来控制发出芯片发出方波的发生;另外多555谐振荡器7端口接入P3.2端口来进行单片机的中断控制,由于我们是进行方波脉宽计数,说以选择中断请求方式为边沿触发方式;
3.2.3555程序设计档位算法
整个程序设计过程中遇到的最大的问题的如何根据测量到的方波的频率来计算所测量的电容的大小。
在前面的介绍中我们知道:
555时基芯片的输出频率跟所使用的电阻R和电容C的关系是:
又因为
,所以
即:
如果单片机采用12M的晶振,计数器T0的值增加1,时间就增加1μS,我们采用中断的方式来启动和停止计数器T0,中断的触发方式为脉冲下降沿触发,第一次中断到来启动T0,计数器的值为
,第二次中断到来停止T0,计数器器的值为
,则测量方波的周期为
,如何开始时刻计数器的值
,则
。
简单时序图如下。
则:
单片机的计数器的值N=0-65535,为了测量的精度,N的取值一般在100~5000,当电阻R越大,电容C的值就越小。
我们取不同的电阻值,就得到不同的电容测量的量程。
第一档:
1~50uF
第二档:
0.1~5uF
第三档:
0.01~0.5uF
为了编写程序的方便,我们只计算
,后面的单位可以根据使用的量程自行添加。
测量范围的大小100pf~50
F。
3.2.474H08对发出方波消刺
在555芯片输出方波后,由于硬件的原因,输出的方波会有很多毛刺,为了去除这些毛刺本设计中使用了一个两输入与门(74HC08),让信号通过74HC08后会使输出的波形毛刺减少很多,使单片机的测量结果变得精确。
黄线为没有加74HC08前555输出波形,蓝线为加入74HC08后输出波形图;下图为两种波形的对比图;
3.3基于AT89C51电容测量系统LCD1602显示电路
LCD以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里我们使用的是2行16个字的1602液晶模块。
3.3.1LCD1602显示器引脚介绍
3.3.2LCD1602内部储存器CGROM
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
3.3.3lcd1602显示自定义符
步骤如下:
1.先将字符写入CGRAM
2.再将CGRAM中的字符写入DDRAM,DDRAM为待显示字符的储存空间;
下图为CGROM和CGRAM中字符代码与字符图形对应关系
4、软件设计
软件设计是一个创造性的过程,对一些设计者来说需要一定的资质,而最后设计通常都是由一些初步设计演变而来的。
从书本上学不会设计,只能经过实践,通过对实际系统的研究和实践才能学会。
对于高效的软件工程,良好的设计是关键,一个设计得好的软件系统应该是可直接实现和易于维护、易懂和可靠的。
设计得不好的系统,尽管可以工作,但很可能维护起来费用昂贵、测试困难和不可靠,因此,设计阶段是软件开发过程中最重要的阶段。
直到最近,软件设计在很大程度上仍是一个特定过程。
一般用自然语言给定一个需求集,预先作非正式设计,常常用流程图的形式说明,接着开始编码,当系统实现时设计还需修改。
当实现阶段完成后,设计往往已与起初形式相去甚远以至于设计的原始文档完全不适合对系统的描述。
软件设计主要是针对硬件设计里面的控制部分的,这里指AT89C51单片机,一般的单片机均可用汇编语言和C语言进行编程。
C语言直观,相对比较的简单,但占用的程序存储器的内存比较大,汇编语言是针对硬件设计的语言,如果想用汇编语言设计的话必须要对硬件有很大的了解,相对C语言就比较的复杂,但是比较的精简,占用的程序存储器的空间比较的小。
作为还在学生阶段的我们,用汇编语言进行编程对我们理解单片机的内部结构、资源都有很好的帮助,但是C语言编程在以后的实际工作中将会大大简化自己的工作。
因此本论文的程序都是基于C语言的。
要完成的任务是:
初始化程序设计、按键程序设计、中断处理程序,计数器计数程序,显示程序设计等。
4.1主程序
在主程序中,通过检测按键是否按下来执行循环程序。
通过单片机P3.7端口检测是否开始测量电容,然后通过端口P3.6端口对555定时器复位端进行方波输出控制。
最后通过程序对外部中断0与定时器控制,计算出电容值得大小通过LCD1602进行显示。
下图为该程序设计的流程图:
4.2软件调试
软件调试主要是通过proteus和keil软件进行仿真实验。
ProteusISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。
keil是德国Keil公司推出的KeilC51软件,它是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。
通过proteus和keil的仿真实验,证明了我们的设计在理论是可行的。
设计仿真图见附件一。
4.3硬件调试
硬件调试,即通过连接实物的方式进行验证方案的可行性。
经过实践操作,也同样证明了我们设计方案的正确性。
5.结果分析
通过仿真得到如下数据表格
被测电容值
80.16PF
25uF
10uF
5uF
测量值
81PF
25uF
10uF
5uF
通过表中的数据可以看出仿真的数据还是比较准确的,但是在实际的操作中,测量值可能没有这么准确,因为在实际的电路中,555芯片输出的方波可能不会如仿真时的那么标准平滑,即使加上一些去除毛刺和去干扰的电路例如加上一个两输入与门或者加上一个过零比较器或者泻回比较器波形还是不会那么理想,再加上单片机的测量也会存在一些误差,所以综合以上的一些考虑,真实中的测量结果肯定要比仿真中的结果误差大。
所以本次的方案算然说不能过非常精确的测出结果来,但是相比较一些能够测出比较精确结果的电路来,本电路是实现起来很容易,测量结果也比较准确,实际操作中比较有保障的一种电路。
6.总结
本次试验设计通过proteus和keil的仿真结合,基本上完成了试验要求,能精确的测量电容值大小,并准确通过lcd1602显示器显现出来。
过这次计算机课程设计,我们拓宽了知识面,对电子电路的设计进一步加强了,锻炼了能力,综合素质得到较大提高。
通过理论与实际的结合进一步提高自身,尤其是观察、分析和解决问题的实际工作能力得到了加强。
但是,在做课程设计的过程当中,我们仍发现了一些设计过程中自己暴露的一些问题,对单片机的掌握还应进一步加强,同时对电子元器件的应用还用改更加熟练,这对以后的设计有较大的帮助。
7.参考文献
[1]康华光主编,电子技术基础(数字部分),北京:
高等教育出版社,2000.6
[2]万文略主编,单片机原理及应用,重庆大学出版社,2004.3
[3]江世明主编,基于Proteus的单片机用用技术,北京:
电子工业出版社,2009.6
[4]边春元主编,C51单片机典型模块设计与应用,机械工业出版社育出版社,2008.6
[5]李海清,黄志遥主编,电容传感器新型微弱电容测量电路,北京:
传感技术学报,2002.5
8.附件
附件1仿真整体电路图
附件2C语言程序
#include"reg51.h"
#include"intrins.h"
#defineDATAP0
sbitRW=P2^1;//1602写数据
sbitRS=P2^0;//1602写地址
sbitEN=P2^2;//1602工作使能
sbitb_test=P3^7;//开始测量电容的按键输入
sbit_reset=P3^6;//555时基芯片工作控制信号
sbitl_key=P2^3;
sbitzh_key=P2^4;
sbith_key=P2^5;
unsignedintT_flag,N,C,i,Dis1,Dis0;
unsignedintb[10]={0X13,0X0D,0X00,0X00,0X00,0X00,0X00,0X00,0x45,0x16};//显示C=00UF
bitlow_disable;
bitzhig_disable;
bithig_disable;
voidDelay1ms(unsignedintmm)/*延时1MS*/
{unsignedinti;
for(mm;mm>0;mm--)
for(i=100;i>0;i--);
}
voidCheckstates()/*检查忙否*/
{
unsignedchardat;
RS=0;
RW=1;
do{EN=1;//下降沿
_nop_();//保持一定间隔
_nop_();
dat=DATA;
_nop_();
_nop_();
EN=0;
}while((dat&0x80)==1);
}
voidwcomd(unsignedcharcmd)/*LCD写命令函数*/
{
Checkstates();
RS=0;
RW=0;
DATA=cmd;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
voidwdata(unsignedchardat)/*LCD写数据函数*/
{
Checkstates();
RS=1;
RW=0;
DATA=dat;
EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
EN=0;
}
voidLCDINIT()/*初始化*/
{
Delay1ms(15);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x38);//功能设置
Delay1ms(5);
wcomd(0x01);//清屏
Delay1ms(5);
wcomd(0x08);//关显示
Delay1ms(5);
wcomd(0x0c);//开显示,不开光标
}
voidDisplay(void)//显示函数
{
unsignedchari,j;
unsignedchara[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//显示measurements
LCDINIT();
for(i=0;i<12;i++)//写显示第一行
{wcomd(0x80+i);
Delay1ms
(1);
wdata(a[i]);
Delay1ms
(1);
}
for(j=0;j<10;j++)//写显示第二行
{
wcomd(0xc0+j);
Delay1ms
(1);
wdata(0x30+b[j]);
Delay1ms
(1);
}
Delay1ms(150);
}
voidmain()
{
IE=0x81;//打开全部的中断控制,并开启外部中断允许
TMOD=0x09;//T0为16位计数工作方式1
IT0=1;//设置外部中断的触发的方式为脉冲触发
TH0=0x00;
TL0=0x00;
T_flag=0;
_reset=0;
while
(1)
{
if(l_key==0)
{
low_disable=1;
}
if(zh_key==0)
{
zhig_disable=1;
}
if(h_key==0)
{
hig_disable=1;
}
while(!
b_test)//如果有测量按键输入就往下执行
{
i=0;
_reset=1;//启动555时基芯片
EX0=1;//开启中断0
while(_reset)//超出等待时间,中断还没有过来,就退出
{
i++;
if(i>5000)//设置最长等待时间
{
_reset=0;//最长等待时间到还没有中断,停止555
}
}
if(N>10000)//如果计数值大于5000,显示LA,表示应换用大一点的量程
{
b[2]=0X1C;
b[3]=0X11;
b[4]=0x22;
b[5]=0x17;
b[6]=0x15;
b[7]=0xF0;
b[8]=0xF0;
b[9]=0xF0;
}
/*if(N<50)
{
b[2]=0X23;
b[3]=0X1D;
b[4]=0x11;
b[5]=0x1C;
b[6]=0x1C;
b[7]=0xF0;
b[8]=0xF0;
b[9]=0xF0;
*/
if((N>=50)&&(N<=5000))
{
if(hig_disable==1)
{if((N>=1000)&&(N<=5000))
{
b[2]=N/1000;
b[3]=N%1000/100;
b[4]=0XFE;//计算电容的大小
b[5]=N%100/10;//计算电容值的十位
b[6]=N%10;//计算电容值的各位
b[7]=0x45;
b[8]=0x16;
b[9]=0xF0;
}
if((N>=100)&&(N<=999))
{
b[2]=N/100;
b[3]=0xFE;
b[4]=N%100/10;
b[5]=N%10;
b[6]=0x45;
b[7]=0x16;
b[8]=0xF0;
b[9]=0xF0;
}
if((N>=50)&&(N<=99))
{
b[2]=0x00;
b[3]=0XFE;
b[4]=N/10;
b[5]=N%10;
b[6]=0x45;
b[7]=0x16;
b[8]=0xF0;
b[9]=0xF0;
}
}
}
if((N>=50)&&(N<=5000))
{
if(zhig_disable==1)
{if((N>=1000)&&(N<=5000))
{
b[2]=0x00;
b[3]=0xFE;
b[4]=N/1000;
b[5]=N%1000/100;
b[6]=N%100/10;
b[7]=N%10;//计算电容值的十位
b[8]=0x45;
b[9]=0x16;//计算电容值的各位
}
if((N>=100)&&(N<=999))
{
b[2]=0x00;
b[3]=0xFE;
b[4]=0x00;
b[5]=N/100;
b[6]=N%100/10;
b[7]=N%10;
b[8]=0x45;
b[9]=0x16;
}
if((N>50)&&(N<=99))
{
b[2]=0x00;
b[3]=0XFE;
b[4]=0x00;
b[5]=0x00;
b[6]=N/