《数字电压表设计与制作报告.doc》由会员分享,可在线阅读,更多相关《数字电压表设计与制作报告.doc(27页珍藏版)》请在三一办公上搜索。
1、江阴职业技术学院项目设计报告项目:数字电压表设计与制作摘 要 本文介绍了一种基于单片机的简易数字电压表的设计。该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。A/D转换主要由芯片ADC0832来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块。数据处理则由芯片AT89C51来完成,其负责把ADC0832传送来的数字量经过一定的数据处理,产生相应的显示码送到显示模块进行显示;此外,它还控制着ADC0832芯片工作。该系统的数字电压表电路简单,所用的元件较少,成本低,且测量精度和可靠性较高。此数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过一个四位一体
2、的7段数码管显示出来。关键词 单片机;数字电压表;A/D转换;AT89C51;ADC0832.AbstractThis paper which introduces a kind of simple digital voltmeter is based on single-chip microcontroller design. The circuit of the voltage meter is mainly consisted of three mould pieces: A/D converting mould piece, A/D converting is mainly compl
3、eted by the ADC0832, it converts the collected analog data into the digital data and transmits the outcome to the manifestation controlling mould piece. Data processing is mainly completed by the AT89C51 chip, it processes the data produced by the ADC0832 chip and generates the right manifestation c
4、odes, also transmits the codes to the manifestation controlling mould piece. Also, the AT89C51 chip controls the ADC0832 chip to work. The voltmeter features in simple electrical circuit, lower use of elements, low cost, moreover, its measuring precision and reliability. The voltmeter is capable of
5、measuring voltage inputs from 1 route ranging from 0 to 5 volt, and displaying the measurements though a digital code tube of 7 pieces of LED.Keywords Single-chip microcontroller; Digital voltmeter; A/D converter; AT89C51; ADC0832目 录摘 要IAbstractI目 录II第一章 绪论11.1 课题的应用场合11.2 系统的功能和性能指标1第二章 总体方案22.1 方案
6、设计与选择22.2 系统的总体结构3第三章 硬件电路设计53.1 硬件电路框图53.2 主要器件选择与应用53.3 单片机小系统设计53.4 键盘与显示电路设计6第四章 软件设计94.1 软件组成框图94.2 软件流程图设计94.3 主要程序设计10第五章 系统调试135.1 调试的方法与工具135.2 Proteus仿真调试及效果135.3 软硬件联合调试145.4 系统运行145.5 调试心得15第六章 展望与拓展17致 谢17参考资料17附录18附录 系统电原理图18附录 系统仿真效果图19附录 样机实物图19附录 软件流程图20附录源程序清单21第一章 绪论 1.1 课题的应用场合在电
7、量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实
8、时通信。数字电压表是诸多数字化仪表的核心与基础2。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,A/D转换采用ADC0832对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号。1.2 系统的功能和性能指标数字电压表由A/D转换、数据处理及显示控制等组成,测量05.0V范围内的输入电压值,由四位一体的7段数码管
9、显示,最大分辨率0.1V,误差0.05V。以AT89C51和ADC0832为核心内件。ADC0832实现模数转换。单片机AT89C51是整个系统的核心,实现输入端的分路选择(量程转换),模数转换后数据的处理及在数码管上数据的显示,提供ADC0832芯片的工作频率等功能。第二章 总体方案2.1 方案设计与选择AT89C51具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器A
10、T89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。AT89S5与AT89C51相比,前者的性能比后者高,所以本设计采用AT89C51芯片。数模转换芯片选择:ADC0809是采样分辨率为8位的、以逐次逼近原理进行模数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,转换时间为100s。ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯
11、片的模拟电压输入在05V之间。芯片转换时间仅为32S,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。由于ADC0832芯片的转换时间短,并且性能比较高,所以采用ADC0832作为数模转换芯片.2.2 系统的总体结构数字电压表系统硬件设计框图第三章 硬件电路设计3.1 硬件电路框图硬件电路设计由6个部分组成; A/D转换电路,AT89C51单片机系统,LED显示系统、时钟电路、键盘以及测量电压输入电路。 数字电压表系统硬件设计框图3.2 主要器件选择与应用数模转换芯片:ADC0832是采样分辨率为8位的、以逐次逼近原理进行模数转换的器件。其内部有一个8通道多路开关,它可以
12、根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,转换时间为100s。ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在05V之间。芯片转换时间仅为32S,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。由于ADC0832芯片的转换时间短,并且性能比较高,所以采用ADC0832作为数模转换芯片。 3.3 单片机小系统设计晶振电路:单片机内部每个部件要想协调一致地工作,必须在统一口令时钟信号的控制下工作。单片机工作所需要的时钟信号有两种产生方式,即
13、内部时钟方式和外部时钟方式。单片机内部有一个构成振荡器的增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输入端,这个放大器与作为反馈元件的片外晶振一起构成自激振荡器。在该图中,电容C1和C2取22PF,晶体的振荡频率取12MHz,晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。3.4 键盘与显示电路设计应用系统中,设计要求不同,使用的LED显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LED显示器供选择,在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。本系统中前一位显示电压的整数位,即个位,后两位显示电压的小数位。4-LED显示器引脚如图
14、所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。 4位LED引脚对于这种结构的LED显示器,它的体积和结构都符合设计要求,由于4位LED阴极的各段已经在内部连接在一起,所以必须使用动态扫描方式(将所有数码管的段选线并联在一起,用一个I/O接口控制)显示。第四章 软件设计4.1 软件组成框图 4.2 软件流程图设计4.3 主要程序设计#include#includetyp
15、edef unsigned int uint;typedef unsigned char uchar;/*端口定义*/sbit CS=P34; sbit CLK=P35; /定义时钟信号sbit DI=P36;sbit DO=P36;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/ 共阴段码表void delay(uint xms) / 延时函数uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);void display(uchar add,uchar dat)uchar a
16、a=0x80;P0=tabledat;/送段码if(add=1) P0|=0x80;P2=(aaadd);/送位码delay(1);P2=0xff;uchar AD0832(bit channel)uchar AdcByte0,AdcByte1,i;CLK=0; _nop_();_nop_(); DI=1; _nop_();_nop_();CS=0; _nop_();_nop_();CLK=1; _nop_();_nop_();CLK=0; _nop_();_nop_();DI=1; _nop_();_nop_();CLK=1;_nop_();_nop_();CLK=0; _nop_();_n
17、op_();DI=channel; _nop_();_nop_();CLK=1; _nop_();_nop_();CLK=0;DI=1;for(i=0;i8;i+) AdcByte0=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();AdcByte0|=DO;if(DO)AdcByte1|=0x80;for(i=0;i=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();if(DO) AdcByte1|=0x80;CS=1;return(AdcByte0=AdcByte1?AdcByte0:0);void main()uint date;uch
18、ar AdcByte,bit0,bit1,bit2,bit3,i;while(1)AdcByte=AD0832(0);date=(AdcByte/255.0)*5*100;bit0=date%10;bit1=date%100/10;bit2=date%1000/100;bit3=date/1000;for(i=0;i100;i+)display(3,bit0);display(2,bit1);display(1,bit2);display(0,bit3);第五章 系统调试5.1 调试的方法与工具用keil软件编写程序,编好程序后再进行编译,编译完成后检查程序有无错误,然后修改程序直到没有错为止
19、,然后再与硬件联调,直到仿真出结果。5.2 Proteus仿真调试及效果5.3 软硬件联合调试在系统上电开始测量前,要用万用表的电压档对被测电压进行估测,然后以此选择适当的量程,防止过大电压烧坏A/D转换器。首先用万用表按照原理图逐步检查印刷板中各器件的电源及各引脚的连接是否正确,有否断路、短路或者虚焊,尤其是给电路供电的电源部分要重点检查,是否稳定,且稳定即可说明电源电路的设计基本达到要求。如果电压没有达到要求,要及时排查给予解决,以免烧坏芯片和其他元器件。软件调试时先进行单元测试,分别对各个代码模块进行测试,看其是否实现了规定功能,再把已经测试过的模块组合起来进行测试,一旦不能正确运行,要
20、找出程序中的错误,确定大致的出错位置,研究有关部分的错误程序,找出错误原因,修改设计和代码,以排除错误。在程序编写完成后,就可以利用仿真器进行初步调试,观察在计算机里能否通过编译与运行并达到设计的基本要求。在基本符合的情况下,利用仿真器与工作正常的硬件连接进行仿真调试;或用编程器把程序烧写到芯片中,直接观察能否正常运行。如果达不到设计要求或者不能正常运行,可以直接在程序中进行修改。系统调试中遇到的问题及解决的方法:1)在应用滤波电容的过程中,一开始是把电容串联在电路中,导致电路无法导通,而后我们短路电容,解决了问题。2)电源指示灯上,一开始发现接上电源,指示灯不亮,经过仪器测量发现正负极接反,
21、后重新焊接,问题解决。3)由于源程序的多处错误,使得仿真无法通过,后经过单步调试,把存在的错误一一排除,通过了软件仿真。4)在烧录芯片的过程中,由于选择烧录文件的错误及芯片自身问题(因多次烧录,无法再次烧录)使得烧录失败,后经过老师指导并更换了AT89C51芯片,解决了问题。5.4 系统运行调试好之后,把程序固化到单片机芯片中,单机运行,数码管显示被测电压,调节电位器,仿真电压表与之变化,数码管显示数值与电压表数值相同,可以看出系统运行正常。5.5 调试心得从开始设计数字电压表到完成这个项目的设计,我从中学到了许多关于调试方面的经验,这些经验都是从困难中累积起来的,每当调试遇到无法继续下去时,
22、总感觉渺茫时,我总是告诉自己不能放弃,一定要坚持下来,慢慢理清思绪,找出出错的地方,不断调试,每当自己克服一重重困难,才发现自己进步了许多。第六章 展望与拓展通过本次设计,我对单片机这门课程有了更进一步的了解。无论是在其硬件连接方面还是在软件编程方面,都取得了新的收获。本次实验采用了AT89S51单片机芯片,与以往我们所熟悉的C51芯片有许多不同之处,通过本次设计及查阅相关资料,我对其之间的区别有了一定的认识,在本设计报告的硬件介绍部分也对其作了详细的论述。S51在C51的基础上增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。单片机的应用如今已经在工业、电子等方方面面展现出它的优越性
23、,利用单片机设计电路已经成一乐一种趋势,他与外围的简单电路加上优化程序就可以构建成任意的产品,使得本设计得以实现。随着单片机的发展,他必将在未来显示出更大的活力。致 谢由于是初次尝试设计电路,由于知识及经验的匮乏,难免遇到很多困难,如果没有老师的督促指导以及同学们的支持,很难顺利的完成此次设计。从开始做这个项目到完成,都离不开老师、同学、朋友给以的帮助,在这里请接受我的谢意!参考资料1胡健.单片机原理及接口技术.北京:机械工业出版社,2004年10月2王毓银.数字电路逻辑设计.高等教育出版社,2005年12月3于殿泓、王新年.单片机原理与程序设计实验教程.西安电子科技大学出版社,2007年5月
24、4谢维成、杨加国.单片机原理与应用及C51程序设计实例.电子工业出版社,2006年3月5李广弟.单片机基础.北京航空航天大学出版社,2007年5月6姜志海,黄玉清等著.单片机原理及应用M .北京:电子工业出版社.2005年7月 7魏立峰.单片机原理及应用技术.北京大学出版社,2005年8周润景.Protues在MCS-51&ARM7系统中的应用百例.第一版.北京:电子工业出版社,2006年9边春远等著.MCS-51单片机应用开发实用子程序M .北京:人民邮电出版社.2005年9月.附录附录 系统电原理图附录 系统仿真效果图附录 样机实物图附录 软件流程图 数字式直流电压表主程序框图 A/D转换
25、流程图附录源程序清单#include#includetypedef unsigned int uint;typedef unsigned char uchar;sbit CS=P34;sbit CLK=P35;sbit DI=P36;sbit DO=P36;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;void delay(uint xms)uint i,j;for(i=xms;i0;i-)for(j=110;j0;j-);void display(uchar add,uchar dat)uchar aa=
26、0x80;P0=tabledat;if(add=1) P0|=0x80;P2=(aaadd);delay(1);P2=0xff;uchar AD0832(bit channel)uchar AdcByte0,AdcByte1,i;CLK=0; _nop_();_nop_();DI=1; _nop_();_nop_();CS=0; _nop_();_nop_();CLK=1; _nop_();_nop_();CLK=0; _nop_();_nop_();DI=1; _nop_();_nop_();CLK=1;_nop_();_nop_();CLK=0; _nop_();_nop_();DI=ch
27、annel; _nop_();_nop_();CLK=1; _nop_();_nop_();CLK=0;DI=1;for(i=0;i8;i+) AdcByte0=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();AdcByte0|=DO;if(DO)AdcByte1|=0x80;for(i=0;i=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();if(DO) AdcByte1|=0x80;CS=1;return(AdcByte0=AdcByte1?AdcByte0:0);void main()uint date;uchar AdcByte,bit0,bit1,bit2,bit3,i;while(1)AdcByte=AD0832(0);date=(AdcByte/255.0)*5*100;bit0=date%10;bit1=date%100/10;bit2=date%1000/100;bit3=date/1000;for(i=0;i100;i+)display(3,bit0);display(2,bit1);display(1,bit2);display(0,bit3);