基于单片机电容测量仪设计毕业设计Word格式文档下载.docx
《基于单片机电容测量仪设计毕业设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机电容测量仪设计毕业设计Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
MCS-51单片机片内复位,复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
本设计采用按键手动脉冲复位方式,按键脉冲复位是利用RC微分电路产生的正脉冲来实现的。
复位电路如图3所示。
一般的,单片机的复位速度比外围I/O快些。
若RC上电复位电路接MCS-51单片机和外围电路复位端,则能使系统可靠地同步复位。
为保证系统可靠复位,在初始化程序中应用到一定的复位延迟时间。
复位电路软件程序或者硬件发生错误的时候产生一个复位信号,控制MCS-51单片机从0000H单元开始执行程序,重新执行软件程序。
此电路的输出端RESET接在单片机的复位引脚。
2.2.3基于AT89C51电容测量系统时钟电路
时钟在单片机中非常重要,单片机各功能部件的运行都是以时钟频率为基准。
时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
常用的时钟电路有两种方式,一种是内部时钟方式,另一种为外部时钟方式。
本设计使用内部时钟方式,其内部时钟方式电路图如图4所示。
MCS-51单片机内部有一个用与构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
这两个引脚接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器电路。
电路中的电容C1和C2典型值通常选择为30PF左右。
对外接电容的值虽然没有严格的要求,但是电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。
晶体的振荡频率的范围通常是在1.2MHz—12MHz之间。
很设计中单片机选择12MHz的石英晶体。
2.2.4基于AT89C51电容测量系统按键电路
按键是实现人机对话的比较直观的接口,可以通过按键实现人们想让单片机做的不同的工作。
键盘是一组按键的集合,键是一种常开型开关,平时按键的两个触点处于断开状态,按下键是它们闭合。
图5就是一种比较典型的按键电路,在按键没有按下的时候,输出的是高电平,当按键按下去的时候,输出的低电平。
2.2.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所示。
555芯片芯片输出的频率为f=0.772/(R*C),只要我们改变电阻R,就可以达到改变电阻量程的目的,本设计提供了两组电阻,所以说有两组组的电容测量量程。
分别为(1~50UF)和(0.1~1UF)。
在555芯片输出方波后,由于硬件的原因,输出的方波会有很多毛刺,为了去除这些毛刺本设计中使用了一个两输入与门(74HC08),让信号通过74HC08后会使输出的波形毛刺减少很多,使单片机的测量结果变得精确。
74HC08如图7所示,经过整形前后波形比较如图8所示。
2.2.6基于AT89C51电容测量系统显示电路
本设计使用的是2行16个字的1602液晶模块作为测量值显示部分。
其中字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行
16个字、2行16个字、2行20个字等等。
如图9为LCD1602引脚图。
图10LCD1602引脚图
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.3各部分电路连接成整个电路图
完成各个部分的电路设计后,即可组合成一个总的电路图。
本设计中使用Proteus完成电路图。
总电路图12所示。
2.4系统所用元器件
本系统所用的元器件清单如下所示。
3软件流程及程序设计
3.1软件系统总体设计方案
本设计的程序都是基于C语言的。
要完成的任务是:
初始化程序设计、按键程序设计、中断处理程序,计数器计数程序,显示程序设计等。
本次设计所选用KeilC51中的编译/连接器软件KeiluVision2作为编译器/连接工具。
3.2程序设计算法设计
整个程序设计过程中遇到的最大的问题的如何根据测量到的方波的频率来计算所测量的电容的大小。
在前面的介绍中我们知道:
555时基芯片的输出频率跟所使用的电阻R和电容C的关系是:
又因为
,所以
(7)
即:
(8)
因单片机采用12M的晶振,计数器T0的值增加1,时间就增加1μS,所以采用中断的方式来启动和停止计数器T0,中断的触发方式为脉冲下降沿触发,第一次中断到来启动T0,计数器的值为
,第二次中断到来停止T0,计数器器的值为
,则测量方波的周期为
,令开始时刻计数器的值
,则
。
简单时序图13所示。
则:
(9)
单片机的计数器的值N=0-65535,为了测量的精度,N的取值一般在100~5000,当电阻R越大,电容C的值就越小。
我们取不同的电阻值,就得到不同的电容测量的量程。
第一档:
10~50uF
第二档:
0.1~5uF
为了编写程序的方便,我们只计算
,后面的单位可以根据使用的量程自行添加。
3.3软件设计流程
流程图是一种传统的算法表示法,它利用几何图形的框来代表各种不同性质的操作,用流程线来指示算法的执行方向。
本设计的程序的流程图如图14所示。
4系统调试及仿真
讲上面所编的C语言程序在KeiluVision3软件上链接、编译后,无误,并给总电路图中的单片机AT89C51加载程序进行仿真,得到仿真结果如下所示。
(1)待测电容C5在1~50UF内,选择档位一:
例如C5=45uf、18uf时,档位一开关闭合,仿真结构如下图15所示
(2)待测电容C5在0.1~1.0uf内,选择档位二:
例如C5=0.4uf、0.9uf时,档位二开关闭合,仿真结构如下图16所示。
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上。
总之,整个系统的工作正常,完成了设计任务的全部要求虽然本设计完成了设计任务,但无法得到十分精确的测量结果,这主要是有以下几点原因,首先单片机对于脉冲宽度的测量精确度有限,其次是外界的干扰对波形有一定的影响,还有硬件自身也有一部分原因。
希望在之后的设计之中能够得到进一步解决。
参考文献
[1]康华光.电子技术基础(模拟部分).北京:
高等教育出版社,1999.6
[2]华成英,童诗白.数字电子技术基础.北京:
高等教育出版社,2006.5
[3]谢自美.电子线路设计/实验/测试.武汉:
华中科技大学出版社,2000.7
[4]郭文川.单片机原理与接口技术.北京:
中国农业出版社,2007.8.
[5]丁英丽.交流型微小电容测量电路的设计.北京:
电工技术杂志,2003.5
[6]王毓银.数字电路逻辑设计.北京:
高等教育出版社,1999.9
[7]罗民昌.集成电路系统.北京:
中国铁道出版社,1998.9
[8]申忠如,申淼,谭亚丽主编,MCS-51单片机原理及系统设计,西安:
西安交通大学出版社,2008年3月第1版
[9]付晓光主编,单片机原理与使用技术,北京:
清华大学出版社,2007.11
[10]李桂安主编,电子技术实验及课程设计,南京:
东南大学出版社,2008.8
[11]夏继强主编,单片机实验与实践教程,北京:
北京航空航天大学出版社,2001.9
附录1:
源程序清单
#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^5;
//555时基芯片工作控制信号
unsignedintT_flag,N,C,i,Dis1,Dis0;
unsignedintb[7]={0X13,0X0D,0X00,0X00,0X00,0X25,0X16};
//显示C=00000UF
/***********延时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<
7;
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_test)//如果有测量按键输入就往下执行
{i=0;
_reset=1;
//启动555时基芯片
EX0=1;
//开启中断0
while(_reset)//超出等待时间,中断还没有过来,就退出
{i++;
if(i>
5000)//设置最长等待时间
{_reset=0;
//最长等待时间到还没有中断,停止555
if(N<
100)//如果计数值小于100,显示SM,表示应换用小一点的量程
{b[3]=0X1D;
b[2]=0X23;
if(N>
5000)//如果计数值大于5000,显示LA,表示应换用大一点的量程
{b[3]=0X11;
b[2]=0X1C;
=100&
&
N<
=5000)
if(N>
=100&
N<
=1000)
{b[2]=0X00;
//计算电容的大小
b[3]=0XFE;
b[4]=N/100+1;
b[5]=0X5E;
b[6]=0X5E;
}
else
{
C=N/100;
b[2]=C/10;
//计算电容值的十位
b[3]=(C-b[2]*10);
//计算电容值的各位
b[4]=0X5E;
b[5]=0X5E;
}
}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;
//恢复初值
附录2:
电路原理图
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;
学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;
学校可以采用影印、缩印、数字化或其它复制手段保存论文;
在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。