暑期实习报告——数字电压表 本文关键词:电压表,暑期,实习报告,数字
暑期实习报告——数字电压表 本文简介:电子实习报告数字电压表姓名:严宏海学号:20101003032班级:075102-22指导老师:王巍、郝国成、张晓峰、闻兆海、王国洪、吴让仲、李杏梅、王瑾中国地质大学(武汉)机械与电子信息学院通信工程专业2012年6月22日目录一、前言……………………………………………………………2二、系统方案的选
暑期实习报告——数字电压表 本文内容:
电子实习报告
数字电压表
姓名:严宏海
学号:20101003032
班级:075102-22
指导老师:王巍、郝国成、张晓峰、闻兆海、王国洪、吴让仲、李杏梅、王瑾
中国地质大学(武汉)机械与电子信息学院通信工程专业
2012年6月22日
目
录
一、前言……………………………………………………………2
二、系统方案的选择和论证………………………………………………2
2.1
数模转换模块
…………………………………………………………………2
2.2
模拟数据采集处理模块
………………………………………………………2
2.3
液晶显示模块
…………………………………………………………………3
2.4
AC-DC转换模块
………………………………………………………………3
三、
软件硬件设计
……………………………………………………3
3.1所采用实验方案的原理…………………………………………………………3
3.2硬件设计部分
…………………………………………………………………4
3.3软件设计部分
…………………………………………………………………8
四、
测试数据与结果分析
…………………………………………………
9
4.1测试仪器…………………………………………………………………………9
4.2测试数据…………………………………………………………………………9
4.3测试数据分析…………………………………………………………………10
五、实验心得……………………………………………………………14
六、参考文献……………………………………………………………14
七、附录………………………………………………………14
一、前言
本数字电压表可以对直流电源和交流电压进行比较准确的测量。其中直流部分的测量范围是0-20V,分为三个档位:0-0.2V,0.2V-2V,2V-20V。该直流电压表的测量电路主要由三个模块组成:模拟数据采集处理模块、A/D转换模块及液晶显示控制模块。模拟数据的采集处理模块由模拟电路部分完成。A/D转换模块主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到STC89S51单片机进行数据处理。显示模块是单片机将处理好的数据送到液晶1602进行显示。交流部分的测量范围是0-5V,测量的是交流电压的有效值。该交流电压表的测量电路由三个模块构成:AC-DC转换模块、电压补偿模块、直流电压表测试模块。其中AC-DC转换模块由AD637完成。电压补偿模块对AD637的非线性部分进行补偿,由LM324完成。直流电压表测试模块由直流部分完成。
二、
系统方案的选择和论证
2.1数模转换模块
方案一:用分离元件完成数据采集AD转换的功能。该方案由于需要大量的元器件,实现起来比较复杂,而且精度不易控制。
方案二:选则集成芯片ADC0809。ADC0809的采样频率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8个单断模拟输入信号中的一个进行A/D转换。由于本实验要求的测量误差是26则正常处理:
选档程序如下:
if
(
(B0==0)m=1;}
if
(
(B0==1)m=2;}
3.3.3液晶显示模块
ADC0809的输出端与单片机的P0口相连,单片机的P1口与1602的8为数据口相连,1602的RS
RW
E三个控制端分别连接P3.5,P3.6,P3.7。
temp=(getdata*1.0/255)*2000;
a=temp/1000;
b=temp/100%10;
c=temp/10%10;
d=temp%10;
在得到得到要在1602上显示的四位数值a,b,c,d后,再在合适的位置加上小数点即可。P0口的getdata经过数据处理后,送至P1口,由程序控制显示。
四、测试数据与结果分析
4.1测试仪器
(1)数字万用表
(2)双通道数字示波器
(3)频率发生器
4.2测试数据
0-0.2V档测量的数据(直流)
万用表测量(V)
1602显示值(mV)
0.01
10.1
0.07
69.0
0.12
122.0
0.18
188.0
表1
0.2V-2V档测量的数据(直流)
万用表测试(V)
1602显示值(mV)
0.26
258
0.44
447
0.45
454
0.61
611
0.84
847
1.04
1050
1.16
1168
1.30
1301
1.63
1639
1.76
1788
1.94
2.03
表2
2V-20V档测量的数据(直流)
万用表测量(V)
1602显示值(V)
2.01
2.01
2.67
2.72
3.37
3.42
4.4
4.35
5.1
5.09
6.1
6.03
7.0
6.90
7.9
7.88
8.5
8.47
9.5
9.52
9.8
9.88
10.3
10.19
11.8
11.76
12.6
12.7
14.0
14.05
15.0
15.5
18.8
18.6
表3
4.3数据分析
用MATLAB分别做不同量程的曲线拟合图,横坐标是1602显示值,纵坐标万用表测量值,做三次曲线拟合。然后做万用表测量值和1602显示值之差,再做三次曲线拟合
0-0.2V档测量的数据(直流)
图8
图9
分析:从图8可以看出,线性良好。图9纵坐标单位为MV,在60MV和160MV左右时,误差较小接近于0.但在量程的两端误差较大。
4.3.2
0.2V-2V档测量的数据(直流)
图10
图11
分析:从图10可以看出,线性良好。图11纵坐标单位为MV,0.4-1.4范围内,误差较小,在2MV左右.但在量程的两端误差较大。
4.3.3
2V-20V档测量的数据(直流)
图12
图13
分析:从图12可以看出,线性良好。图13纵坐标单位为V,4V-12V范围内,误差较小,在0.05V左右.但在量程的两端误差较大,误差达到0.1V-0.15V。
在0-2V的范围内测试时,精度完全满足,在2-20V测试时,经过调整分压那一路的电位器,精度也能满足要求。另外本实习中对电阻及电位器数值的确定要尽可能精准。
五、实验心得
因为对单片机这一块比较熟悉,电路的仿真及程序编写半天就做完了,在实习的过程中遇到的最大问题是LM324的参考电压没选择正确,开始看书上给的是12-15V,后来经过仔细研究及对LM324输出端的测量发现,LM324参考电压给6-7V时,LM324输出端能够输出0-5V的电压,而这一电压正好是ADC0809的采集范围。在0-2V的范围内测试时,精度完全满足,在2-20V测试时,经过调整分压那一路的电位器,精度也能满足要求。另外本实习中对电阻及电位器数值的确定要尽可能精准。
这个实验没有来得及做出扩展部分感觉很遗憾,因为手头上没有交流转直流的AD芯片,调试电路是一个枯燥乏味的工作,是需要耐心、细心、耐力的事情,如果这些都做不到,要想完成一个好的项目可以说是一个很难完成的任务,我个人觉得我在这方面还是需要加强,必须耐下心来,认认真真的对待。
六、参考文献
【1】汪文,《单片机原理及应用》
【M】.
武汉:华中科技大学出版社,2007.3
【2】谢子美,《电子线路.设计.试验.测试》【M】.北京:清华大学出版社,2007
【3】高峰,《单片微型计算机与接口技术》【M】.北京:科学出版社,2003
七、附录
7.1单片机程序
/*
LM324的参考电压可以是单电源,取6V左右,关键是要能从LM324的输出端能输出0-5V,
不能超过5V,也不能小于5V,ADC0809的参考电压5V尽量稳定*/
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
a,b,c,d;
unsigned
char
getdata;
unsigned
int
temp;
unsigned
int
i,j;
unsigned
char
m;
uchar
code
table0[]=“V=“;
uchar
code
table1[]=“0123456789mV
.“;
uchar
code
table2[]=“Range:2-20V“;
uchar
code
table3[]=“Range:0.2-2V“;
uchar
code
table4[]=“Range:0-0.2V“;
sbit
rs=P2^5;
sbit
rw=P2^6;
sbit
e
=P2^7;
sbit
ST=P3^0;
sbit
OE=P3^1;
sbit
EOC=P3^2;
sbit
CLK=P3^3;
sbit
ALE=P3^7;
sbit
led1=P2^2;
sbit
led2=P2^3;
sbit
led3=P2^4;
sbit
A0=P3^4;//代表地址编码中的A
sbit
B0=P3^5;
//代表地址编码中的B
#define
v20
B0=0;A0=0;
//0
通道
#define
v2
B0=0;A0=1;
//1
通道
#define
v0_2
B0=1;A0=0;
//2
通道
void
TimeInitial()
//用于产生ADC0809所需的时钟信号
{
TMOD=0x10;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET1=1;
TR1=1;
CLK=1;
}
void
delay(unsigned
char
x)//延时函数
{
unsigned
char
a,b;
for(a=x;a>0;a--)
for(b=20;b>0;b--);
}
bit
lcd_busy()//
测试LCD忙碌状态,实际上延时一会同样可以达到效果
{
bit
result;
rs
=
0;
rw
=
1;
e
=
1;
delay(5);
result
=
(bit)(P0
e=
0;
return
result;
}
void
writecomm(uchar
comm)
{
//while(lcd_busy());
rs=0;
rw=0;
e=0;
delay(5);
P0=comm;
e=1;
delay(5);
e=0;
}
void
writedat(uchar
dat)
{
//while(lcd_busy());
rs=1;
rw=0;
e=0;
delay(5);
P0=dat;
e=1;
delay(5);
e=0;
}
void
writesmh(uchar
add,uchar
date)
{
uchar
count;
count=date;
writecomm(0xc0+add);
delay(5);
writedat(table1[count]);
delay(5);
}
void
init()
{
delay(50);
writecomm(0x38);
delay(50);
writecomm(0x0c);
delay(50);
writecomm(0x06);
delay(50);
writecomm(0x80);
delay(5);
writecomm(0x01);
delay(50);
}
void
main()
{
init();
v0_2;
m=3;
TimeInitial();
while(1)
{
ST=0;//启动ADC0809
ALE=1;
ST=1;
delay(50);
ST=0;
ALE=0;
while(EOC==0);
//等待转换结束
OE=1;
getdata=P1;
OE=0;
//锁定输出
temp=getdata;
//数据处理
delay(50);
a=temp/1000;
b=temp/100%10;
c=temp/10%10;
d=temp%10;
writecomm(0x80+0x40+12);
writedat(a+48);
writedat(b+48);
writedat(c+48);
writedat(d+48);
delay(50);
if
(
(B0==0)m=1;}
if
(
(B0==1)m=2;}
temp=(getdata*1.0/255)*2000;
a=temp/1000;
b=temp/100%10;
c=temp/10%10;
d=temp%10;
delay(50);
if(m==1)
{
for(i=0;i<2;i++
)//显示量程
{writecomm(0xc0+i);
writedat(table0[i]);
delay(5);
}
for(i=0;i<12;i++
)
{
writecomm(0x80+i);
writedat(table2[i]);
delay(5);
}
writesmh(4,a);
delay(5);
writesmh(5,b);
delay(5);
writesmh(6,13);
delay(5);
writesmh(7,c);
delay(5);
writesmh(8,d);
delay(5);
writesmh(9,12);
delay(5);
writesmh(10,11);
delay(5);
}
if
(m==2)
{
for(i=0;i<2;i++
)//显示量程
{
writecomm(0xc0+i);
writedat(table0[i]);
delay(5);
}
for(i=0;i<12;i++
)
{
writecomm(0x80+i);
writedat(table3[i]);
delay(5);
}
writesmh(4,a);
delay(5);
writesmh(5,b);
delay(5);
writesmh(6,c);
delay(5);
writesmh(7,d);
delay(5);
writesmh(8,12);
delay(5);
writesmh(9,10);
delay(5);
writesmh(10,11);
delay(5);
}
if
(m==3)
{
for(i=0;i<2;i++
)//显示量程
{
writecomm(0xc0+i);
writedat(table0[i]);
delay(5);
}
for(i=0;i<12;i++
)
{
writecomm(0x80+i);
writedat(table4[i]);
delay(5);
}
writesmh(4,a);
delay(5);
writesmh(5,b);
delay(5);
writesmh(6,c);
delay(5);
writesmh(7,13);
delay(5);
writesmh(8,d);
delay(5);
writesmh(9,10);
delay(5);
writesmh(10,11);
delay(5);
}
for(j=0;j<40;j++)
delay(250);
}
}
void
t1(void)
interrupt
3
using
0
//用于产生ADC0809的时钟信号
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK}
7.2电路图
7.3材料清单
名
称
数
量
10K
7个
22uF
1个
30PF
2个
电位器
503
、504
各一个,103
两个
按键
1个
11.0592M晶振
1个
LM324
1片
ADC0809
1片
89C51
1片
22