1、福建信息职业技术学院毕业设计(论文)论文题目: 数字电压表设计 I目 录摘 要:1引言:21.系统设计31.1设计任务与要求31.2设计要求32.系统的硬件电路设计32.1单片机数字电压表的总体方案32.2总体系统框图:32.3各个模块的介绍42.4原理图以及实物图53 系统的软件设计63.1 主程序流程图73.2 子程序设计83.2.1初始化程序83.2.2 液晶1602显示子程序83.2.3 ADC转换器测量子程序83.2.4 ADC转换器程序流程图按键扫描子程序94系统调试124.1系统硬件调试124.2程序调试12总结与谢辞13参考文献14附录114I摘要基于51单片机数字电压表设计制
2、作摘 要: 本设计电压表它可测量范围为0100V,并能在液晶1602显示,该数字电压表的最大分辨率为0.109V测量误差约为0.02V。本文主要介绍数字电压表的基本工作原理和电路的设计以及连接。单片机与A/D转换器的接口电路的设计和液晶1602显示电路的设计构成了本次设计的总电路。单片机与A/D转换器的接口电路的设计主要是通过单片机控制A/D转换芯片的采样和转换,将输入的模拟量,经转换器转换后输出数字量。再将转换得到的数字量利用液晶1602显示出来。关键词: 数字电压表 A/D转换器 液晶显示 单片机Abstract:This design voltmeter it can measure t
3、he range of 0 100 V, and able to be in 1602 LCD display, this digital voltmeter maximum resolution of 0.109 V measurement error about 0.02 V. This paper mainly introduces the digital voltmeter basic working principle and circuit design and connection. SCM and A/D converter interface circuit design a
4、nd LCD 1602 display circuit design consists of the design of total circuit.SCM and A/D converter interface circuit is designed through the single-chip microcomputer control A/D transformation chip sampling and conversion, the input analog quantity, the converter after converting output digital quant
5、ity. Then by converting digital quantity using liquid crystal display 1602.1系统的硬件电路设计引言:随着科学技术发展,特别是集成加工工艺发展,促使单片机向体积小、功耗低、功能强大的方向道路上发展。单片机的产生,是许多实验设备、机电设备,应用以单片机为核心的嵌入式系统设计。由此应用,单片机促使众多设备增加了功能,又降低了成本。诸多优点,单片的应用越来越广泛,在如今的工农业生产设备中,单片机无处不在。基于单片机的A/D转换和控制在许多行业有着广泛的应用,而数字电压是其中最基本的,也是最具代表意义的几个例子。在我们的学习中,
6、我们常常需要电压测量电压以保证电路的正常工作。数字电压表测量电压即直观又精确,让我们避免了误差,使得测量更加的方便。电压、电流、功率是表征电信号能量大小的三个基本参量。在电子电路中,只要测量出其中一个参量就可以根据电路的阻抗求出其它二个参量。考虑到测量的方便性、安全性、准确性等因素,几乎都用测量电压的方法来测定表征电信号能量大小的三个基本参量。此外,许多参数,例如频率特性、谐波失真度、调制度等都可视为电压的派生量。所以电压的测量是其它许多电参量,也包括非电量测量的基础。电压是基本的电参数,其它许多电参数可看作电压的派生量,由于电压测量方便,因此电压测量是电子测量中最基本的测量。按测量结果的显示
7、方式可将电子电压表分为模拟式和数字式两大类。数字式电压表的核心是A/D转换器,A/D转换器最基本的两种类型是积分型和比较型。前者抗干扰能力强,测量精度高,但测量速率低;后者测量速度快,但抗干扰能力差。总的来说,积分型特别是双斜积分式DVM性能较优,应用较广泛。数字电压表作为一种基本电子设备无论是在教学、科研还是在实际的工作中,都有着广泛的使用。数字电压表作为一种通用电子测试仪器是学校教学工作设计时不可缺少的一种测试仪器。因此,从理论到工程对数字电压表进行深入研究,不论是从教学科研角度,还是从以后的实际工作的角度出发都有着积极的意义。随着科学技术的发展和测量技术的进步,对电压表的要求越来越高,普
8、通的电压表已无法满足目前日益发展的数字技术领域科研和教学的需要。运用单片机技术可以极大的提高数字电压表的测量分辨率,其具有分辨率极高、误差小、测量时间短、可编程、全数字化易于集成、体积小、重量轻等优点。3系统设计1.系统设计1.1设计任务与要求设计任务设计一台数字电压表,用于电子产品电压测量。1.2设计要求1) 测试直流电压范围:0-100V2) 采用单片机进行程序设计3) 显示精度精确到0.1V4) 可通过按键设置过压报警值,当电压超过用户设定值,就会报警5) 经过ADC0832转换器采集转换,单片机进行数据处理,用液晶1602屏显示输出压2.系统的硬件电路设计2.1单片机数字电压表的总体方
9、案2.1.1总体系统框图:电压信号处理电路A/D转换模块键盘模块单片机统复位电路、晶振液晶1602显示模块报警模块图1 总体系统框图如图1所示,数字电压表主要由六个模块组成,包括 电压信号处理电路、A/D转换模块、1602液晶显示模块、晶振复位模块、报警模块、键盘模块。对于本设计而言,器件选择主要涉及到单片机的选型、显示方案和A/D转换方案这三个方面。根据系统实现要求决定:控制系统采用可以进行电擦除和改写,片内用有128字节的RAMSTC89C52单片机;显示模块采用易于控制的1602液晶显示模块;A/D转换器采用双通道A/D转换的ADC0832。2.1.2各个模块的介绍图2A/D转换模块:如
10、图额所示A/D转换模块主要作用通过电阻分压试来采集电压完,成对采集进来的模拟信号的数字转换。键盘模块:用于设置过压报警值。报警模块:用于当测试电压超过用户设定的过压值时,系统发生报警提示。复位模块:用于单片机的复位如图3所示。图3 图4显示模块:把单片机的数据中的数据显示出来3系统的硬件电路设计2.1.3原理图以及实物图原理图原理图图5作品原理图实物图图6作5图7作品背面3 系统的软件设计本设计是硬件电路和软件编程相结合的设计方案,在单片机的应用系统程序设计时,常用的是汇编语言和C语言。汇编语言的特点是占用内存单元少,执行效率高。执行速度快。但它依赖于计算机硬件,程序可读性和可移植性比较差。而
11、C语言虽然执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。由于现在单片机的发展已经达到了很高的水平,内部的各种资源相当的丰富,CPU的处理速度非常的快。用C语言来控制单片机无疑是一个理想的选择。所以在本设计中采用C语言编写软件程序。系统的程序设计计算机在完成一项工作时,必须按顺序执行各种操作。这些操作是程序设计人员用计算机所能够接受的语言把解决问题的步骤事先描述好的,也就是事先编制好计算机程序,再由计算机去执行。另外,一个有效率的控制系统还需要完善的算法,由算法绘制出相应
12、的流程图,这样根据流程图编制软件程序。3.1 主程序流程图调用液晶显示函数调用按键扫描子程序开始初始化液晶显示字符初始化过压值选择电压采用通道调用A/D转换子函数图8 主程序流程图主程序主要是完成系统初始化以及各个程序之间的联系任务。其程序流程如图8所示。3.2 子程序设计3.2.1初始化程序所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等9。3.2.2 液晶1602显示子程序因为显示用到液晶1602屏来显示时时采样到电压值,把采样到点电压值把每一位都分出来单独显示,分解每一位的
13、代码如下:temp=(uchar)(Value/1000)+0x30;/分解千分位jian=temp;temp=(uchar)(Value%1000)/100)+0x30; /分解百分位bai=temp;temp=(uchar)(Value%100)/10)+0x30; /分解十分位shi=temp;temp=(uchar)(Value%10)+0x30; /分解千个位ge=temp; DisplayOneChar(9,0,jian);/液晶显示 DisplayOneChar(10,0,bai); DisplayOneChar(11,0,.); DisplayOneChar(12,0,shi)
14、; DisplayOneChar(13,0,ge);DisplayOneChar(14,0,V);3.2.3ADC转换器测量子程序模/数(A/D)转换测量子函数用来控制对ADC0832控制的,开始采样电压,判断是否转换完成,如完成则读取采集数字量。其程序流程如图9所示:7系统的程序设计返回开始选择采集通道判断是否转换完成?取采集数据YesNo图93.2.4ADC转换器程序流程图按键扫描子程序按键用于设置过压报警值,三个复位按键控制P1.0P1.2三个I/O口的高低电平void Key_function_scan() if(key_up=0)delay1ms(10);if(key_up=0) f
15、or(num1=0;num115;num1+) DisplayOneChar(num1,0,table1num1); /显示字符串Voltage: delay1ms(10); set_alarm_bit=0; Alarm_temp_up=Alarm_temp_up+100; if(Alarm_temp_up=2800)Alarm_temp_up=0; DisplayOneChar(6,1,Alarm_temp_up/1000+0); /显示电压十位 DisplayOneChar(7,1,(Alarm_temp_up%1000)/100+0); /显示电压十位 DisplayOneChar(8,
16、1,.); DisplayOneChar(9,1,(Alarm_temp_up%100)/10+0); /显示电压个位 DisplayOneChar(10,1,(Alarm_temp_up%10)+0); /显示电压小数点后第一位 while(!key_up);/等待按键释放 /if(key_down=0)delay1ms(10);if(key_down=0) for(num1=0;num115;num1+) DisplayOneChar(num1,0,table1num1); /显示字符串Voltage: delay1ms(10); 9系统的程序设计 set_alarm_bit=0; Ala
17、rm_temp_up=Alarm_temp_up-100; if(Alarm_temp_up=0)Alarm_temp_up=2800; DisplayOneChar(6,1,Alarm_temp_up/1000+0); /显示电压位 DisplayOneChar(7,1,(Alarm_temp_up%1000)/100+0); /显示电压十位 DisplayOneChar(8,1,.); DisplayOneChar(9,1,(Alarm_temp_up%100)/10+0); /显示电压个位 DisplayOneChar(10,1,(Alarm_temp_up%10)+0); /显示温度小
18、数点后第一位 while(!key_down);/等待按键释放 /if(OK=0)delay1ms(10);if(OK=0) for(num=0;num15;num+) DisplayOneChar(num,0,table2num); Delayus(10); set_alarm_bit=1; while(!OK);/等待按键释放 4系统调试硬件设计方面从布线到焊接安装完成之后,就开始进入硬件调试阶段。我们搭出了系统电路,接下来进行系统调试,这一过程是对前期工作的一次检查。系统调试可大体分为电路调试,程序调试和联机调试。在调试过程中可能会遇到各种各样的问题,解决的方法同样也是多种多样,调试的顺
19、利程度取决于实际工作的经验。4.1系统硬件调试1. 对照数字电压表原理图检查实物连接是否正确,用万用表检测连线,例如单片机管脚与ADC0809直接连接,检查元器件焊接是否正确,上述检查完成后再进行上电。2.电路板接上大于5V的直流电源,检测外接电源是否正确,如果电压正常,说明工作正常。4.检查1602液晶是否点亮。5.本次设计的硬件调试顺序为先显示器后键盘。在显示器调试通过后,键盘调试就比较简单,完全可以借助于显示器,利用程序进行调试。利用开发装置对程序进行设置断点,通过断点可以检查程序在断点前后的键值变化,这样可知键盘工作是否正常。4.2程序调试软件调试的任务是利用proteus仿真软件调试
20、,发现和纠正程序的错误,同时也能发现硬件的故障。软件调试是一个模块一个模块进行的。首先单独调试各子程序是否能够按照预期的功能,接口电路的控制是否正常。最后调试整个程序。尤其注意的是各模块间能否正确的传递参数。1) 检查1602显示模块程序。在主程序中调用display()和dislay_zifu()函数,观察在液晶显示器是否能够显示相应的字符。如果不能,则在相关的11系统调试2) 子程序中设计断点,反复调试直到能够显示。3) 检查A/D转换模块程序。可以在硬件电路的输入端输入已知的几个电压,分别观察数码管显示上是否显示相应的电压值。4) 检查按键扫描模块程序。调节不同的过压报警值,通过测量验证
21、电路是否报警。5) 总调试。当相应的各模块环节都正确后,可程序下载到单片机。接上电源运行。再检查所有功能,观察是否能预期的一样。如果一样,说明设计成功完成。总结与谢辞首先,我要衷心感谢我的指导老师廖长庚老师!本次设计的选题及论文的修改,老师都给予了悉心指导和帮助,在此,献上最诚挚的敬意。另外要感谢自己学习生活中帮助我的同学们和老师们,感谢她们在毕业设计期间为我提供的无私帮助!在课题进行到比较困难的时候,经常能提出宝贵的意见及给了我很强大的力量帮助。最后,向在百忙中抽出宝贵时间参与论文评审和答辩的专家和评委们,表示由衷地感谢! 2 参考文献1李群芳、肖看单片机原理、接口及应用,清华大学出版社,2
22、0082三恒星科技单片机原理与应用实例,电子工业出版社,20083沈红卫基于单片机的智能系统设计与实现,电子工业出版社,20054李广弟、 朱月秀、 冷祖祁单片机基础,北京航空航天大学出版社,20075丁元杰单片机原理与应用,机械工业出版社,20096孙育才MCS-51系列单片微型计算机及其应用,东南大学出版社,200513福建信息职业技术学院毕业论文附录1#include#include #include /Keil library #include /Keil library#define uchar unsigned char#define uint unsigned int #defi
23、ne ulong unsigned long#define DataPort P0 sbit LCM_RS=P25; sbit LCM_RW=P26; sbit LCM_EN=P27; sbit bADcs=P20;sbit bADcl=P22;sbit bADda=P21;sbit Alarm=P23;sbit OK=P10;sbit key_up=P11;sbit key_down=P12;bit choose=0;unsigned char data1;unsigned char count;unsigned char cycle;/uint ge,xiao1,xiao2;unsigne
24、d long data2;19附录1ulongValue,num=0;uchartemp,getdata;uchar jian,bai,shi,ge;uchar code table1=Set_Alarm_Limit;uchar code table2=Voltage is ;uchar num1; bit set_alarm_bit=1;ulong Alarm_temp_up=1200;void Key_function_scan();void Delayus(uchar i) while(-i); void delay1ms(uint z)uint x,y;for(x=z;x0;x-)fo
25、r(y=110;y0;y-);void ad(void) uchar i; /data1=0; bADcs = 0;/当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用. bADcl=0; bADda=1; bADcl=1;15 bADcl=0;/i down bADda=1; bADcl=1; bADcl=0;/ 2 down bADda=0; bADcl=1; bADcl=0;/ 3 down bADda=1; bADcl=1; bADcl=0;/ 4 down for(i=8;i0;i-) data1=Alarm_temp_up) Alarm=0; else Alarm=1;
26、temp=(uchar)(Value/1000)+0x30;jian=temp;temp=(uchar)(Value%1000)/100)+0x30;17附录1bai=temp;temp=(uchar)(Value%100)/10)+0x30;shi=temp;temp=(uchar)(Value%10)+0x30;ge=temp; DisplayOneChar(6,1,jian); DisplayOneChar(7,1,bai); DisplayOneChar(8,1,.); DisplayOneChar(9,1,shi); DisplayOneChar(10,1,ge);DisplayOn
27、eChar(11,1,V);main() uchar num; InitLcd(); Alarm=1; for(num=0;num15;num+) DisplayOneChar(num,0,table2num); Delayus(200); Alarm_temp_up=1200; while(1) if(set_alarm_bit=1)19 ad(); cal();Key_function_scan(); void Key_function_scan() / if(key_up=0)delay1ms(10);if(key_up=0) for(num1=0;num115;num1+) Displ
28、ayOneChar(num1,0,table1num1); /显示字符串Voltage: delay1ms(10); set_alarm_bit=0; Alarm_temp_up=Alarm_temp_up+100; if(Alarm_temp_up=2800)Alarm_temp_up=0;附录1 DisplayOneChar(6,1,Alarm_temp_up/1000+0); /显示电压十位 DisplayOneChar(7,1,(Alarm_temp_up%1000)/100+0); /显示电压十位 DisplayOneChar(8,1,.); DisplayOneChar(9,1,(
29、Alarm_temp_up%100)/10+0); /显示电压个位 DisplayOneChar(10,1,(Alarm_temp_up%10)+0); /显示电压小数点后第一位 while(!key_up);/等待按键释放 /if(key_down=0)delay1ms(10);if(key_down=0) for(num1=0;num115;num1+) DisplayOneChar(num1,0,table1num1); /显示字符串Voltage: delay1ms(10);21 set_alarm_bit=0; Alarm_temp_up=Alarm_temp_up-100; if(
30、Alarm_temp_up=0)Alarm_temp_up=2800; DisplayOneChar(6,1,Alarm_temp_up/1000+0); /显示电压位 DisplayOneChar(7,1,(Alarm_temp_up%1000)/100+0); /显示电压十位 DisplayOneChar(8,1,.); DisplayOneChar(9,1,(Alarm_temp_up%100)/10+0); /显示电压个位 DisplayOneChar(10,1,(Alarm_temp_up%10)+0); /显示电压小数点后第一位 while(!key_down);/等待按键释放 /if(OK=0)delay1ms(10);if(OK=0) for(num=0;num15;num+) 附录1DisplayOneChar(num,0,table2num); Delayus(10); set_alarm_bit=1; while(!OK);/等待按键释放 23