基于单片机电容测量仪设计Word文档格式.docx

上传人:b****7 文档编号:22201940 上传时间:2023-02-03 格式:DOCX 页数:24 大小:396.63KB
下载 相关 举报
基于单片机电容测量仪设计Word文档格式.docx_第1页
第1页 / 共24页
基于单片机电容测量仪设计Word文档格式.docx_第2页
第2页 / 共24页
基于单片机电容测量仪设计Word文档格式.docx_第3页
第3页 / 共24页
基于单片机电容测量仪设计Word文档格式.docx_第4页
第4页 / 共24页
基于单片机电容测量仪设计Word文档格式.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于单片机电容测量仪设计Word文档格式.docx

《基于单片机电容测量仪设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机电容测量仪设计Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。

基于单片机电容测量仪设计Word文档格式.docx

2.3.1AT89C51单片机工作电路

单片机电路是本设计的核心部分,本设计选用了常用的AT89C51单片机。

AT89C51是低功耗、高性能、经济的8位CMOS微处理器,工作频率为0—24MHz,内置4K字节可编程只读闪存,128x8位的内部RAM,16位可编程I/O总线。

AT89C51工作的最简单的电路是其外围接一个晶振和一个复位电路,给单片机接上电源和地,单片机就可以工作了。

其最简单的工作原理图如图2所示。

图2工作原理图

2.3.2基于AT89C51电容测量系统复位电路

MCS-51的复位是由外部的复位电路来实现的。

MCS-51单片机片内复位,复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

本设计采用按键手动脉冲复位方式,按键脉冲复位是利用RC微分电路产生的正脉冲来实现的。

复位电路如图3所示。

图3复位电路

一般的,单片机的复位速度比外围I/O快些。

若RC上电复位电路接MCS-51单片机和外围电路复位端,则能使系统可靠地同步复位。

为保证系统可靠复位,在初始化程序中应用到一定的复位延迟时间。

复位电路软件程序或者硬件发生错误的时候产生一个复位信号,控制MCS-51单片机从0000H单元开始执行程序,重新执行软件程序。

此电路的输出端RESET接在单片机的复位引脚。

2.3.3基于AT89C51电容测量系统时钟电路

时钟在单片机中非常重要,单片机各功能部件的运行都是以时钟频率为基准。

时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。

常用的时钟电路有两种方式,一种是内部时钟方式,另一种为外部时钟方式。

本设计使用内部时钟方式,其内部时钟方式电路图如图4所示。

图4内部时钟方式电路图

MCS-51单片机内部有一个用与构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。

这两个引脚接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器电路。

电路中的电容C1和C2典型值通常选择为30PF左右。

对外接电容的值虽然没有严格的要求,但是电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。

晶体的振荡频率的范围通常是在1.2MHz—12MHz之间。

很设计中单片机选择12MHz的石英晶体。

2.3.4基于AT89C51电容测量系统按键电路

按键是实现人机对话的比较直观的接口,可以通过按键实现人们想让单片机做的不同的工作。

键盘是一组按键的集合,键是一种常开型开关,平时按键的两个触点处于断开状态,按下键是它们闭合。

图5就是一种比较典型的按键电路,在按键没有按下的时候,输出的是高电平,当按键按下去的时候,输出的低电平。

图5按键电路

2.3.5基于AT89C51电容测量系统555芯片电路

对于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。

55芯片电路的应用电路很多,本次设计应用直接反馈型无稳类电路。

电路如图6所示。

图6555产生方波电路

555芯片芯片输出的频率为f=0.772/(R*C),只要我们改变电阻R,就可以达到改变电阻量程的目的,本设计提供了一组电阻,所以说有电容测量量程为(0.01~1UF)。

在555芯片输出方波后,由于硬件的原因,输出的方波会有很多毛刺,为了去除这些毛刺本设计中使用了一个两输入与门(74HC08),让信号通过74HC08后会使输出的波形毛刺减少很多,使单片机的测量结果变得精确。

74HC08如图7所示。

图774HC08

2.3.6基于AT89C51电容测量系统显示电路

本设计使用的是2行16个字的1602液晶模块作为测量值显示部分。

其中字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行

16个字、2行16个字、2行20个字等等。

如图8为LCD1602引脚图。

图8LCD1602引脚图

1602采用标准的16脚接口,其中:

第1脚:

VSS为地电源

第2脚:

VDD接5V正电源

第3脚:

V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15~16脚:

空脚

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”

表1CGROM和CGRAM中字符代码与字符图形对应关系

1602液晶模块内部的控制器共有11条控制指令,其控制命令如下表所示。

表2LCD1602内部11条控制指令

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)

指令1:

清显示,指令码01H,光标复位到地址00H位置

指令2:

光标复位,光标返回到地址00H

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:

高电平时为8位总线,低电平时为4位总线)

指令7:

字符发生器RAM地址设置

指令8:

DDRAM地址设置

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据指令11:

读数据

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,LCD1602的内部显示地址如下。

2.4各部分电路连接成整个电路图

完成各个部分的电路设计后,即可组合成一个总的电路图。

本设计中使用Proteus完成电路图。

总电路图10所示。

图10总电路

2.5系统所用元器件

本系统所用的元器件清单如下所示。

2.6、PCB板制图如图11

图11PCB制图

3软件流程及程序设计

主程序

键盘模块

中断模块

振荡模块

显示模块

3.1系统模块层次结构图

要完成的任务是:

初始化程序设计、按键程序设计、中断处理程序,计数器计数程序,显示程序设计等。

3.2程序设计算法设计

整个程序设计过程中遇到的最大的问题的如何根据测量到的方波的频率来计算所测量的电容的大小。

在前面的介绍中我们知道:

555时基芯片的输出频率跟所使用的电阻R和电容C的关系是:

又因为

,所以

(7)

即:

(8)

因单片机采用12M的晶振,计数器T0的值增加1,时间就增加1μS,所以采用中断的方式来启动和停止计数器T0,中断的触发方式为脉冲下降沿触发,第一次中断到来启动T0,计数器的值为

,第二次中断到来停止T0,计数器器的值为

,则测量方波的周期为

,令开始时刻计数器的值

,则

简单时序图12所示。

则:

(9)

单片机的计数器的值N=0-65535,为了测量的精度,N的取值一般在100~5000,当电阻R越大,电容C的值就越小。

我们取不同的电阻值,就得到不同的电容测量的量程。

第一档:

10~50uF

第二档:

0.1~5uF

为了编写程序的方便,我们只计算

,后面的单位可以根据使用的量程自行添加。

3.3软件设计流程

流程图是一种传统的算法表示法,它利用几何图形的框来代表各种不同性质的操作,用流程线来指示算法的执行方向。

本设计的程序的流程图如图13所示。

图13流程图

3.4源程序代码

#include"

reg51.h"

#include"

intrins.h"

//库函数

#defineDATAP0

sbitRW=P2^1;

//1602写数据

sbitRS=P2^0;

//1602写地址

sbitEN=P2^2;

//1602工作使能

sbitb_test0=P3^7;

//开始测量电容的按键输入

//sbitb_test1=P1^7;

sbit_reset=P3^5;

//555时基芯片工作控制信号

unsignedintT_flag,N,C,i,Dis1,Dis0;

unsignedintb[8]={0X13,0X0D,0X00,0X00,0X00,0X00,0X25,0X16};

//显示C=0000UF

/***********延时1MS******************/

voidDelay1ms(unsignedintmm)

{unsignedinti;

for(mm;

mm>

0;

mm--)

for(i=100;

i>

i--);

}

/***************检查忙否*****************/

voidCheckstates()

{

unsignedchardat;

RS=0;

RW=1;

do{EN=1;

//下降沿

_nop_();

//保持一定间隔

dat=DATA;

EN=0;

}while((dat&

0x80)==1);

/**************LCD写命令函数*********/

voidwcomd(unsignedcharcmd)

Checkstates();

RW=0;

DATA=cmd;

EN=1;

/**********LCD写数据函数**************/

voidwdata(unsignedchardat)

RS=1;

DATA=dat;

/*****************初始化********************/

voidLCDINIT()

Delay1ms(15);

wcomd(0x38);

//功能设置

Delay1ms(5);

wcomd(0x01);

//清屏

wcomd(0x08);

//关显示

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]);

for(j=0;

j<

8;

j++)//写显示第二行

wcomd(0xc0+j);

wdata(0x30+b[j]);

Delay1ms(150);

voidmain()

IE=0x81;

//打开全部的中断控制,并开启外部中断允许

TMOD=0x09;

//T0为16位计数工作方式1

IT0=1;

//设置外部中断的触发的方式为脉冲触发

TH0=0x00;

TL0=0x00;

T_flag=0;

_reset=0;

while

(1)

while(!

b_test0)//如果有测量按键输入就往下执行

{

i=0;

_reset=1;

//启动555时基芯片

EX0=1;

//开启中断0

while(_reset)//超出等待时间,中断还没有过来,就退出

i++;

if(i>

5000)//设置最长等待时间

_reset=0;

//最长等待时间到还没有中断,停止555

if(N<

100)//如果计数值小于100,显示SM,表示应换用小一点的量程

b[2]=0X23;

b[3]=0X1D;

b[4]=0X5E;

b[5]=0X5E;

b[6]=0X5E;

b[7]=0X5E;

if(N>

=1000)//如果计数值大于1000,显示LA,表示应换用大一点的量程

b[2]=0X1C;

b[3]=0X11;

=100&

&

N<

1000)

b[3]=0XFE;

//计算电容的大小

b[4]=N/100;

b[5]=(N/10)%10;

b[6]=0X25;

b[7]=0X16;

}

Display();

//显示电容的大小

voidint0(void)interrupt0//第一次中断开始计数,第二个中断停止计数

{

T_flag=!

T_flag;

if(T_flag==1)

TR0=1;

//开始计时

if(T_flag==0)

TR0=0;

//停止计时

EX0=0;

//关闭中断

//停止发出方波

N=TH0*256+TL0;

//计算计数器的值

N=N*5/3;

//恢复初值

4系统调试及仿真

讲上面所编的C语言程序在KeiluVision3软件上链接、编译后,无误,并给总电路图中的单片机AT89C51加载程序进行仿真,得到仿真结果如下所示。

(1)待测电容C5在0.1~0.99uf内

例如C5=0.55uf、0.99uf时,仿真结构如下图14所示。

A、C5=0.55uf时仿真图B、C5=0.99uf时仿真图图

14仿真图

5总结

5.1本系统存在的问题及改进措施

本设计基于单片机AT89C51的计数器

和中断

配合使用来计算RC振荡电路输出的频率,设计中使R固定不变,从而推算出C的大小。

由于单片机的计数器的值N=0~65535,为了测量的精度,N的取值一般在100~5000,所以所设计的电容测量仪的量程受较小。

5.2心得体会

本次课程设计是一次非常好的将理论与实际相结合的机会,通过对电容测试仪的课题设计,锻炼了我的实际动手能力,增强了我解决实际工程问题的能力,同时也提高我查阅文献资料、设计规范以及电脑制图等其他专业能力水平。

本设计通过由555芯片和电容电阻组成的振荡电路来输出方波,通过单片机定时器T0测量其输出频率,再通过单片机软件编程,对数据进行进一步的计算从而得出被测电容的值,再通过LCD1602显示出其测量值。

系统的软件部分是系统实现功能的关键,软件部分是在Keil51的平台上使用是C语言编写程序。

本系统通过一个测量按键启动整个测量程序,通过外部中断零INT0来控制计数器T0的开始和停止,INT0采用边沿触发方式,在第一个脉冲边沿启动T0,使T0开始计数,在第二个脉冲边沿停止T0计数,然后通过对数据的计算和处理最后将数据显示在LCD1602上。

总之,整个系统的工作正常,完成了设计任务的全部要求虽然本设计完成了设计任务,但无法得到十分精确的测量结果,这主要是有以下几点原因,首先单片机对于脉冲宽度的测量精确度有限,其次是外界的干扰对波形有一定的影响,还有硬件自身也有一部分原因。

希望在之后的设计之中能够得到进一步解决。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1