基于单片机的数字电压表的设计.docx
《基于单片机的数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字电压表的设计.docx(14页珍藏版)》请在冰豆网上搜索。
![基于单片机的数字电压表的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/7/f03adf19-889d-4712-91fc-d44f4ab41c1f/f03adf19-889d-4712-91fc-d44f4ab41c1f1.gif)
基于单片机的数字电压表的设计
河南农业大学
《智能仪器设计实习》
设计说明书
题目:
基于单片机的数字电压表的设计
学院:
理学院
专业:
电子信息科学与技术
班级:
08级
(2)班
学号:
0808101035
姓名:
石利芳
指导教师:
潘建斌
成绩:
时间:
2011年12月6日至2011年12月14日
智能仪器设计实习
设计任务书
题目基于单片机的数字电压表的设计
专业、班级08级电科
(2)班学号0808101035姓名石利芳
主要内容:
功能要求:
完成数字电压表的制作
(1)能够测量一定量程范围的电压信号
(2)将测得的电压值用4位数码管进行显示,显示精度不得低于0.1V。
基本要求:
(1)明确设计任务,复习与查阅有关资料。
(2)设计所用硬件芯片按给定使用。
(3)按要求对设计进行简要说明,总体设计方案,各部分的详细设计。
(4)写出体会和总结。
完成期限:
2011年12月20日
指导教师签名:
2011年12月20日
基于单片机的数字电压表的设计
一、引言
随着电子科学技术的发展,电子测量成为广大电子工作者必须掌握的手段,对测量的精度和功能的要求也越来越高,而电压的测量甚为突出,因为电压的测量最为普遍。
数字电压表是采用数字化测量技术设计的电压表。
数字电压表与模拟电压表相比,具有读数直观、准确、显示范围宽、分辨力高、输入阻抗大、集成度高、功耗小、抗干扰能力强,可扩展能力强等特点,因此在电压测量、电压校准中有着广泛的应用。
本文采用ADC0808对输入模拟信号进行转换,控制核心AT89S51单片机对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号,通过Proteus仿真软件实现接口电路设计,并进行实时仿真。
Proteus软件是一种电路分析和实物模拟仿真软件。
它运行于Windows操作系统上,可以进行仿真、分析(SPICE)各种模拟器件和集成电路,是集单片机和SPICE分析于一身的仿真软件,功能强大,具有系统资源丰富、硬件投入少、形象直观等优点,近年来受到广大用户的青睐。
二、系统概述
(一)设计任务
利用单片机AT89S51与ADC0808设计一个数字电压表,将模拟信号0~5V之间的电压值转换成数字量信号,以两位数码管显示,并通过虚拟电压表观察ADC0808模拟量输入信号的电压值,LED数码管实时显示相应的数值量。
(二)总体方案
数字电压表电路组成框图如图1所示[1]:
驱动
数码管
程序
模拟量数字量处理
图1系统组成框图
本设计中需要用到的电路有电源电路、模/数转换电路、单片机控制电路、显示电路等。
设计中需要用到的芯片有AT89S51单片机、ADC0808、74LS74、LED数码管等[2]。
三、数字电压表的Proteus软件仿真电路设计
待测电压输入信号在ADC0808芯片承受的最大工作电压范围内,经过模/数转换电路实现A/D转换,通过单片机控制电路进行程序数据处理,然后通过七段译码/驱动显示电路实现数码管显示输入电压。
硬件电路原理图如图2所示:
图2Proteus软件仿真电路图
(一)AT89S51单片机和数码管显示电路的接口设计
利用单片机AT89C51与ADC0808设计一个数字电压表,将模拟信号0~5V之间的直流电压值转换成数字量信号0~FF,以两位数码管显示[3]。
Proteus软件启动仿真,当前输入电压为2.5V,转换成数字值为7FH,用鼠标指针调节电位器RV1,可改变输入模/数转换器ADC0808的电压,并通过虚拟电压表观察ADC0808模拟量输入信号的电压值LED数码管实时显示相应的数值量。
在Proteus软件中设置AT89S51单片机的晶振频率为12MHz[4]。
本电路EA接高电平,没有扩展片外ROM。
(二)A/D转换电路的接口设计
A/D转换器采用集成电路ADC0808。
ADC0808具有8路模拟量输入信号IN0~IN7(1~5脚、26~28脚),地址线C、B、A(23~25脚)决定哪一路模拟输入信号进行A/D转换,本电路将地址线C、B、A均接地,即选择0号通道输入模拟量电压信号[5]。
22脚ALE为地址锁存允许控制信号,当输入为高电平时,对地址信号进行锁存。
6脚START为启动控制信号,当输入为高电平时,A/D转换开始。
本电路将ALE脚与START脚接到一起,共同由单片机的P2.0脚和WR脚通过或非门控制。
7脚EOC为A/D转换结束信号,当A/D转换结束时,7脚输出一个正脉冲,此信号可作为A/D转换是否结束的检测信号或向CPU申请中断的信号,本电路通过一个非门连接到单片机的P3.2脚。
9脚OE为A/D转换数据输出允许控制信号,当OE脚为高电平时,允许读取A/D转换的数字量。
该OE脚由单片机的P2.0脚和RD脚通过或非门控制。
l0脚CLOCK为ADC0808的实时时钟输入端,利用单片机30引脚ALE的六分频晶振频率得到时钟信号。
数字量输出端8个接到单片机的P0口。
四、数字电压表的软件程序设计
系统上电状态,初始化ADC0808的启动地址,数码管显示关闭,开始启动A/D转换。
等待启动结束后,将ADC0808的0号通道模拟量输入信号转换输出的数字量结果通过数码管动态显示的方式显示到三位数码管上。
根据设计要求结合硬件电路,在输入模拟信号时采用电阻分压[6],最终的采样输入电压只有实际输入电压的十分之一,所以在编写程序中要编写一段数据调整程序,其中还应注意硬件显示电路采用了动态扫描显示,在动态扫描显示方式中,动态扫描的频率有一定的要求,频率太低,数码管LED将会出现闪烁现象,通常数码管点亮时间间隔一般均取5ms左右为宜[7],这就要求在编写程序时,使其点亮并保持一定的时间。
总结以上分析,程序流程图如图3、图4所示:
图3主程序流程图
图4LED数码显示程序流程
本电路的程序设计主要包括A/D转换部分、LED显示、初始化和定时器中断部分。
部分程序代码见附录。
五、结束语
本文的数字电压表可以测量0~5V的电压值,AT89S51为8位单片机[8],当ADC0808的输入电压为5V时,输出数字量值为+4.99V。
如果要获得更高的精度,需采用I2位、I3位等高于8位的A/D转换器。
数字电压表的显示部分可以增加BCD码调整程序来通过三位数码管显示其数据。
本设计的显示偏差,可以通过校正0832的基准参考电压来解决,或用软件编程来校正其测量值。
本系统在设计过程中通过Proteus仿真软件的调试,具有电路简单、成本低、精度高、速度快和性能稳定等特点。
六、心得体会
因为家里有事情,在做实验的第一周,我便请假回家了。
由于客观原因没能把实验完整的做好,我深感遗憾。
于是回学校之后,我认认真真看了实验指导和相关资料,做实验时更是一丝不苟,遇到不懂不会的及时向老师和同学们请教。
做实验时,更深刻的体会到了“书到用时方恨少”这句话,虽然学过单片机,但有好多东西不是忘了就是不会了,主要还是当时学的知识不够扎实的原因吧。
这次的实验“基于单片机的数字电压表的设计”,不仅让我加深了对单片机知识和硬件设计的理解,还重温了C语言程序的编写以及软件设计的过程。
接触了Proteus软件,了解了它的用法并用他进行了数字电压表的仿真。
尽管实验中遇到过困难,但还是如期的完成了设计,我还是很欣慰的。
相信这次的实验对我以后会很有帮助的,让我提高了动手实践的能力,明白了团队协作的重要性,也让我懂得了做任何事都需要认真严谨的态度,一心一意的做好眼前的事。
可能实验设计上还有不足之处,但总体来说,还是挺成功的,希望以后再接再厉,可以设计出更优秀的作品。
【参考文献】
[1]_刘振忠.数字电压表发展概况和原理:
电压-频率(V-F)变换式积分型数字电压表[J].电讯工程,1998
(2):
39-42.
[2]_王幸之.单片机应用系统抗干扰技术[M].北京:
北京航空航天大学出版社,2000.
[3]_吴金戌,沈庆阳,郭庭吉.单片机实践与应用[M].北京:
清华大学出版社,2002.
[4]_张志良,马彪.单片机原理与控制技术[M].北京:
机械工业出版社,2001.
[5]_沈任元,吴勇.常用电子元器件简明手册[M].北京:
机械工业出版社,2004.
[6]_沙占友.新型数字电压表原理与应用[M].北京:
机械工业出版社,2006.
[7]_谢自美.电子线路设计实验测试[M].武汉:
华中科技大学出版社,2000.
[8]_曲娜,程凤琴,周鹏,等.基于51单片机的舵机控制信号的设计[J].中国科技信息,2010,21(63):
137-142
附录:
1.A/D转换函数
#include
//ADC0808接口定义
#defineDATA0832P1_5
#defineCS0832P1_3
#defineCLK0832P1_4
voidAdstart(void){//开始条件
CLK0832=0;
CS0832=0;
DATA0832=1;
CLK0832=1;
CLK0832=0;}
voidAdsendsign(Ucharsignifi){//发送信号
Uchartemp;
temp=signifi&0x03;
DATA0832=(signifi>>1)&0x01;
CLK0832=1;
CLK0832=0;
DATA0832=temp&0x01;
CLK0832=1;
CLK0832=0;
DATA0832=1;//使DATA0832保持高电平?
}
UcharAdoutdata(void){//数据输出
Ucharmfdata,i,j;
bitD;
while(DATA0832);
CLK0832=1;
for(i=0;i<8;i++)
{CLK0832=0;
D=DATA0832;
mfdata=mfdata|D;
CLK0832=1;
mfdata=mfdata<<1;
}
for(j=0;j<7;j++)
{
CLK0832=0;CLK0832=1;
}
CS0832=1;
DATA0832=1;
return(mfdata);
}
UcharAdconvert(sign){//开始转换
Ucharaddata;
Adstart();
Adsendsign(sign);
addata=Adoutdata();
return(addata);}
2.延时子程序
#include
voidDelayus(Ucharj)//延时时间为j*10+8us(根据生成的汇编代码计算)
{
while(j){
_nop_();
_nop_();
_nop_();
_nop_();
j--;
}
}
voidDelayms(Uintn){//延时时间大约n*1ms
while(n){
Delayus(100);//延时为1008us
n--;
}
}
3.动态扫描显示程序
#include
#defineA138P2_3//A138B138C138分别对应74HC138的译码输入端ABC
#defineB138P2_2
#defineC138P2_1
codeUcharSZDM[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff,0x00};//共阳数码管数字0--9和全灭、全亮的对应值
voidDisplay(Uchar*p){
Dsenddata(SZDM[*p]);
C138=1;B138=0;A138=1;
Delayms(3);
C138=1;B138=1;A138=1;
Dsenddata(SZDM[*++p]);
C138=1;B138=0;A138=0;
Delayms(3);
C138=1;B138=1;A138=1;
Dsenddata(SZDM[*++p]);
C138=0;B138=1;A138=1;
Delayms(3);
C138=1;B138=1;A138=1;
Dsenddata(SZDM[*++p]);
C138=0;B138=1;A138=0;
Delayms(3);
C138=1;B138=1;A138=1;
Dsenddata(SZDM[*++p]);
C138=0;B138=0;A138=1;
Delayms(3);
C138=1;B138=1;A138=1;
Dsenddata(SZDM[*++p]);
C138=0;B138=0;A138=0;
Delayms(3);
C138=1;B138=1;A138=1;
}
4.A/D转换模块演示程序
#include
dataUchardisplaybuff[6];//定义显示缓冲区
dataUcharCH0=0X02;//通道0转换数据
voidmain(){
Uchartemp,temp1,temp2,temp3,temp4,temp5;
Delayms(500);//延时使芯片复位完成
while
(1){
temp1=Adconvert(CH0);
temp2=Adconvert(CH0);
temp3=Adconvert(CH0);
temp4=Adconvert(CH0);
temp5=Adconvert(CH0);//需要合适的A、D转换延时
temp=(temp1+temp2+temp3+temp4+temp5)/5;
displaybuff[2]=temp/100;
displaybuff[1]=(temp-displaybuff[2]*100)/10;
displaybuff[0]=temp-(displaybuff[2]*100+displaybuff[1]*10);
Display(displaybuff);//在数码管上显示转换的数据
}
}
5.74HC164串行移位输出数码管的段数据
#include
#defineSDA164P2_5//74HC164的接口定义
#defineSCK164P2_4
voidDsenddata(Uchardd){
Ucharj;
for(j=0;j<8;j++){
SDA164=(bit)(dd&0x01);
SCK164=1;SCK164=0;
dd=dd>>1;
}
}