单片机做电容测量仪解析Word文档下载推荐.docx
《单片机做电容测量仪解析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机做电容测量仪解析Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
3.1.3总程序框图错.误!
3.1.4电源错.误!
3.2程序的设计错.误!
3.2.1程序功能描述与设计思路错误!
3.2.2程序流程图错.误!
5测试方案与测试结果错.误!
4.1测试方案错.误!
4.2测试条件与仪器错.误!
4.3测试结果及分析错.误!
4.3.1测试结果(数据)错误!
4.3.2测试分析与结论错误!
附录1:
电路原理图错.误!
1设计方案
设计一:
利用电容器放电测电容实验原理
电容器充电后,所带电量Q与两极板间电压U和电容C之间满足Q=CU的关系。
U可由直流电压表测出,Q可由电容器放电测量。
使电容器通过高电阻放电,放电电流随电容器两极板间的电压下降而减少,通过测出不同时刻的放电电流值,直至1=0,作
出放电电流I随时间变化的曲线,曲线下的面积即等于电容器所带电量。
由C=Q/U可
求出电容器的电容值。
但此方法操作性差,很难实现其功能,故舍之。
设计二:
利用放电时间比率来测电容
其测量原理是把被测电容和基准电容连接到同一电阻上,构成RC网络。
通过测量两个电容放电时间的比率,就可以求出被测电容的电容值。
充电前电容的电压为0,放电时电容电压与时间的关系为:
当Vc达到Vth时
从而
由于R和Vth/E已知,可根据Tc算出Co
此方法的测量范围从pF(10-12F)到几十个nF(10-9F),并且在寄生电容的抑制和温度稳定性方面具有极很大的优势,但此方法适用于电解电容,对于瓷片电容并不适用。
设计三:
利用单片机测脉冲来测时间常数RC再计算电容
其测量原理是把被测电容和电阻串联,构成RC网络,然后可利用这个时间常数去利用多谐振荡器,调好振荡信号的波形然后开始计数脉冲值,可能的周期为T=A0XRC,A0为一个常数,可通过周期可以计算出C的值。
这个可以用单片机来测,理论上可以从测的值可以为N多个,大大超过前面所讲述的。
考虑到实用性和可操作性,我们选择设计三。
利用555构成单稳态电路(如图****),待测电容是电路中的Cx,再把”OUT”口输出的信号的频率输入单片机的P1.0口,Cx的一端连接单片机的P2.3口,通过公式换算得到电容值。
P3.7口接一独立按键,当其按下时,555定时器的3引脚输出方波,3脚与P1.0口相接,可通过程序测出其频率,进而求出Cx的值,并显示在LCD1602液晶屏上。
由分析可知其振荡周期为:
由单稳态电路的特性知:
使Rl=R2,则:
电容测量电路如图1所示:
图1555定时器构成单稳态的电容测量电路图此方案从计算公式可知,只需要通过单片机处理频率信号即可得到待测电容值,对测量精度要求而言,还是比较符合要求的,由于是通过单片机读取转化,精确度会明显的提高。
核心元器件简介
STC89C52的介绍
STC89C52是STC公司生产的一种低耗能、性能高的CM0S8位微控制器。
具有以下标准功能:
内置4KBEEPROM,有MAX810复位电路,3个16位定时器/计数器,4个外部中断,8k字节Flash,32位I/O口线,512字节RAM,看门狗定时器,一个7向量4级中断结构,全双工串行口。
另外STC89C52可降至OHz静态逻辑操作,支持2种软件可选择节电模式。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
最高运作频率35MHz,12T/6T可选。
STC89C52单片机最小系统原理图:
图2STC89C52单片机最小系统
555定时器的介绍
NE555集成电路是8脚封装,双列直插型。
NE555引脚功能如下:
Pin1-GND(接地)-通常被连接到电路共同接地。
Pin2-Trigger(触发点)-这个脚位是触发NE555使其启动它的时间周期,又称触发端,是下比较器的输入。
触发信号上缘电压须大于2/3VCC,下缘须低于1/3VCC。
Pin3-Output(输出)-输出端(Vo),它有0和1两种状态,由输入端所加电平决定,当时间周期开始555的输出输出脚位,移至比电源电压少1.7伏的高电位。
周期的结束输出回到0伏左右的低电位。
于高电位时的最大输出电流大约0.2A。
Pin4-Reset重置)-一个低逻辑电位送至该脚位时会重置定时器且使输出回落到一个低电位,加上低电平时可使输出为低电平[5]。
它通常被接到电源或不用连接。
Pin5-Controlvoltage(控制)-控制电压端(Vc),准许由外部电压控制触发和闸限电压,可用它控制改变上下触发电平值。
当计时器经营在振荡或稳定的运作方式下,这个输入可以用来改变或调整输出的频率值。
Pin6-Threshold重置锁定)-又称阈值端(TH),是上比较器的输入;
重置锁定并能使输出呈低电平。
当此接脚的电压从1/3VCC电压以下移至2/3VCC以上时启动这个动作。
Pin7-Discharge放电端DIS),它是内部放电管的输出,有悬空和接地两种状态,
也是由输入端的状态决定这个接脚和主要的输出接脚有相同的电流输出能力,当输出为
ON时为LOW,对地为低阻抗,当输出为OFF时为HIGH,对地为高阻抗。
Pin8-Vcc(V+)-这是555个计时器IC的正电源电压端。
供应电压的范围是+4.5伏特(最小值)至+16伏特(最大值)。
图3555定时器输出波形图4555集成电路内部结构图
1602液晶的介绍
本设计使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,
不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。
接口说明:
Pin-1-VSS电源地
Pin-2-VDD电源正极
Pin-3-VQ液晶显器对比度调节
Pin-4-RS数据/命令选择输入(H/L)
Pin-5-R/W读写选择端(H/L)
Pin-6-E使能信号
Pin-7-D0数据接口
Pin-8-D1数据接口
Pin-9-D2数据接口
Pin-10-D3数据接口
Pin-11-D4数据接口
Pin-12-D5数据接口
Pin-13-D6数据接口
Pin-14-D7数据接口
Pin-15-BLA背光灯电源正极
Pin-16-BLK背光灯电源负极
基本操作时序:
读状态输入:
RS=L,R/W=H,E=H
输出:
D0~D7=状态字
读数据输入:
RS=H,R/W=H,E=H
无
写指令输入:
RS=L,R/W=L,D0~D7=指令码,E=高脉冲输出:
D0~D7=数据
写数据输入:
RS=H,R/W=L,D0~D7=指令码,E=高脉冲输出:
1602与单片机接口:
图51602与单片机接口
系统的总体设计思路是被测电容通过555定时器构成多谐振荡电路,频率输入单片机,通过分屏电路把频率送入单片机,并把频率通过单片机处理,运算出相应的数值,再用LCD062显示出来。
系统方框图***如下:
主程序流程是先通过按键对单片机时钟和端口进行初始化,再对定时器进行初始化,液晶初始化显示开机界面,再转入上面所设计的开机总中断,结束之后进入低功耗模式,具体流程如图7所示。
图7主程序流程图
心得体会
这次设计历时两个周左右。
在此期间,查找资料,同学交流,反复调试,每一个过
程都是对我们这个团队的一次检验和挑战。
通过这次实践,我们深入学习了52单片机、
555定时器和LCD1602的用途及工作原理,掌握了设计步骤,锻炼了实践能力,培养了独立设计能力。
这次课程设计收获很多,比如学会了查找相关资料相关标准,分析数据,提高了自己的制作能力。
但是此次比赛也暴露出了我们的知识基础有很多不足之处。
由于能力有限,未能做到用键盘输入电容的测量范围来筛选电容,因此感到有点儿遗憾。
这次实践是对自己模电和单片机所学的一次大检阅,使我明白自己的能力还有待提高。
本设计是在老师的精心指导和鼓励下完成的。
在此,谨向老师和帮助我的同学表示衷心的感谢!
此外,我还要感谢在我的论文中所有被援引过的文献的作者们,他们是我的知识之源。
最后,再次向所有给予我帮助和鼓励的同学和老师致以最诚挚的谢意!
附件
附件1:
电路图
图8总电路图
附件2:
元件清单
表1
元件[型号|位号数量
单片机
STC89C52RC
U1
1
排阻
A103J
RP1
电磁继电器
JWD
RL1,RL2,RL3
3
晶振
12M
X1
瓷片电容
30pF
C1,C2
2
独石电容
103(0.01uF)
C4
电阻
10KQ
R1,R2,R5,R6,R7
5
按键
J1,J2,
液晶
LCD1602
LCD1
555定时器
NE555
U2
1KQ
R3,R4
10Q
R9,R10,R11
与门
HD74LS08
U3
电解电容
50V,1000pF
C3
附件三:
程序
#include<
reg52.h>
#include"
intrins.h"
II库函数
#defineuintunsignedint#defineucharunsignedchar#defineulongunsignedlonguchartable4[16]="
C(nF)="
;
ucharnum,b,x=1,i,a=2,th0,tl0;
uintC;
ulongf,Cpf,f1;
sbitlcden=P2T;
II液晶使能端
sbitlcdrs=P2A5;
II液晶数据命令选择端
〃测量电容按键
〃测量电容信号输入
sbitRW=P2A6;
II1602写地址sbitkey_C=P3A7;
sbitC_out=PM7;
sbitswitch0=P1A。
sbitswitch1=P1Al;
sbitswitch2=P1A2;
sbitkey_C0=P1A3;
sbitkey_C仁PM4;
sbitkey_C2=P1A5;
〃延时函数
〃液晶写命令函数
II声明子函数
voiddelayms(uintxms);
voidwrite_com(ucharcom);
II液晶初始化函数
//定时器0初始化函数
II键盘检测函数(确定被测元件为电阻、电容或电感)
II频率显示函数
II电容显示函数
voidwrite_data(uchardate);
/I液晶写数据函数voidled」nit();
voidt_init();
voidkeyscan();
voiddisplay_f(ulongf);
voiddisplay_C(uintC);
voiddisplay_Cpf();
//主函数
voidmain()
{
switch0=0;
switch1=0;
switch2=0;
key_C0=0;
key_C1=0;
key_C2=0;
RW=0;
led_init();
//清屏函数
t_init();
keyscan();
write_com(0x0c);
//开显示,不开光标
a=2;
while
(1)
switch(b)
case0:
delayms(80);
C=(int)(0.069*f*2);
if(C<
10)display_Cpf();
else{switch0=1;
}
}break;
case1:
if(C)C=(int)(0.9*C+0.0069*f*2);
elseC=(int)(0.069*f*2);
49){table4[2]=110;
display_C(C);
}else{switch1=1;
}}break;
case2:
elseC=(int)(0.069*f*2);
if(C<
499){table4[2]=110;
}else{switch2=1;
case3:
if(C>
4999)C=4999;
table4[2]=110;
}break;
//中断函数voidT0_count()interrupt1{
switch(a)
while(C_out);
while(!
C_out);
TH0=0;
TL0=0;
while(C_out);
th0=TH0;
tl0=TL0;
TR0=1;
break;
}f=th0*256+tl0;
//延时函数voiddelayms(uintxms){
uinti,j;
for(i=xms;
i>
0;
i--)for(j=110;
j>
j--);
}//液晶写命令函数voidwrite_com(ucharcom){
delayms
(2);
lcdrs=0;
P0=com;
lcden=1;
_nop_();
lcden=0;
//液晶写数据函数voidwrite_data(uchardate){
lcdrs=1;
lcden=1;
P0=date;
_nop_();
lcden=0;
//液晶初始化函数voidled_init()
〃设置16X2显示,5X7点阵,8位数据接口
//设置定时器0工作方式1(M1M0=0x0001)
delayms(15);
write_com(0x38);
delayms(5);
write_com(0x01);
write_com(0x08);
write_com(0x0C);
//定时器0初始化函数voidt_init()
TMOD=0x01;
TH0=0;
//装初值
TL0=0;
EA=1;
//开总中断
ET0=1;
//开定时器0中断
TR0=1;
//启动定时器0
//档位检测函数(确定被测元件的档位)voidkeyscan()
{if(key_C0==1)
delayms(10);
if(key_C0==1)b=1;
if(key_C1==1)
{delayms(10);
if(key_C1==1)b=2;
if(key_C2==1)
if(key_C2==1)b=3;
//电容显示函数voiddisplay_C(uintC)
ucharcount=0;
uintC0;
C0=C;
while(C)
C=C/10;
count++;
}for(num=5+count;
num>
5;
num--)
table4[num]=C0%10+48;
C0=C0/10;
write_com(0x80+0x40);
for(num=0;
num<
6+count;
num++){
write_data(table4[num]);
delayms(5);
}//电容值偏小时使用的显示函数voiddisplay_Cpf(){while(C_out);
while(!
th0=TH0;
tl0=TL0;
f1=th0*256+tl0;
table4[2]=112;
if(Cpf)Cpf=(int)(0.9*Cpf+1.13645*f1*2/1.2);
elseCpf=(int)(11.3645*f1*2/1.2);
display_C(Cpf);