课程设计-简易直流电压表的设计.doc_第1页
课程设计-简易直流电压表的设计.doc_第2页
课程设计-简易直流电压表的设计.doc_第3页
课程设计-简易直流电压表的设计.doc_第4页
课程设计-简易直流电压表的设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目 数字电压表 任务与要求利用单片机知识以及89s52为主控器,设计并调试一个数字电压表。通过网上或图书馆的资料掌握相关知识。课程设计要求是该设计能正常显示并精确到到百分位,通过本课程设计,学习研究开发软件的能力,并提交课程设计报告和实验成品开始日期 2011年 4月 20 日完成日期 2011 年5月 25 日目录1 设计方案12 设计总体框图12.1 硬件部分12.2 软件部分22.2.1主程序设计22.2.2 a/d转换子程序32.2.3数据处理子程序43 设计单元电路53.1 模数转换单元53.1.1 adc0808引脚说明53.1.2 adc0808通道选择63.1.3 adc0808的工作原理:63.2 数据处理及控制单元73.3 4位一体七段数码管84 电路原理说明94.1 模数转换94.2 数据处理及控制105 参考文献116 结论及心得117 附录127.1 调试报告127.2元器件清单16简易直流电压表的设计1 设计方案 本设计主要采用at89c51芯片和adc0808芯片来完成一个简易的数字电压表,能够对输入的05 v的模拟直流电压进行测量,并通过一个4位一体的7段led数码管进行显示,测量误差约为0.02 v。该电压表的测量电路主要由三个模块组成:a/d转换模块、数据处理模块及显示控制模块。a/d转换主要由芯片adc0808来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。数据处理则由芯片at89c51来完成,其负责把adc0808传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着adc0808芯片的工作。显示模块主要由7段数码管组成,显示测量到的电压值。2 设计总体框图2.1 硬件部分 本实验采用at89c51单片机芯片配合adc0808模/数转换芯片构成一个简易的数字电压表,原理电路如图1所示。该电路通过adc0808芯片采样输入口in7输入的05 v的模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道d0d7传送给at89c51芯片的p0口。at89c51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码,并通过其p1口传送给数码管。同时它还通过其三位i/o口p3.0、p3.1、p3.2产生位选信号,控制数码管的亮灭。另外,at89c51还控制着adc0808的工作。其ale管脚为adc0808提供了1mhz工作的时钟脉冲;p2.3控制adc0808的地址锁存端(ale);p2.4控制adc0808的启动端(start);p2.5控制adc0808的输出允许端(oe);p3.7控制adc0808的转换结束信号(eoc)。系统框图如图2所示。图1电路图原理数据处理及控制模块at89c51p2p1显示模块4位一体led数码管数据采集模块adc08081控制信号输出显示analogdigitalled位控制信号p0p1图2 系统框图2.2 软件部分2.2.1主程序设计本设计采用c语言编程。首先是初始化,主要是针对定时器t0,设置其工作方式,装入计数初值,允许中断等。准备工作做好后便启动adc0808对in7脚输入进的05v电压模拟信号进行数据采集并转换成相对应的0255十进制数字量。在数据处理子程序中,运用标度变换知识,编写算法将0255十进制数字量转换成0.005.00v的数据,输出到显示子程序进行显示。整个主程序就是在a/d转换,数据处理及显示程序循环执行。整个程序流程框图如图3所示。开始初始化调用a/d转换子程序数据处理调用显示程序图3 主程序流程图2.2.2 a/d转换子程序启动adc0808对模拟量输入信号进行转换,通过判断eoc(p1.6引脚)来确定转换是否完成,若eoc为0,则继续等待;若eoc为1,则把oe置位,将转换完成的数据存储到at89c51中。程序流程图如图4所示。开始初始化启动a/d转换a/d转换结束p1.6=1?p1.7置位,允许数字量输出结束yn图4 数据处理子程序流程图2.2.3 数据处理子程序数据处理子程序主要根据标度变换公式1-1,把0255十进制数转换为0.005.00v。,:模拟测量值;:模拟输入最小值;:模拟输入最大值;:模数转换后的值;:模数转换后的最小值;:模数转换后的最大值。在本设计中,根据要求知,则上式可以简化为。3 设计单元电路3.1 模数转换单元此处采用adc0808模块实现,它是典型的8位8通道逐次逼近式a/d转换器,主要由8路模拟开关、地址所存译码电路、逐次逼近寄存器sar、树状模拟开关、256r电阻分压器、电压比较器及三态输出锁存器等组成。3.1.1 adc0808引脚说明adc0808芯片为28引脚双列直插式封装,其引脚如图5所示,图5 adc0808的引脚图(1)in0in7:8路模拟量输入通道。(2)a、b、c:模拟通道地址线。这3根地址线用于对8路模拟通道的选择,其译码关系如表1-1所示。其中,a为低地址,c为高地址,引脚图中为adda,addb和addc。(3)ale:地址锁存允许信号。对应ale上跳沿,a、b、c地址状态送入地址锁存器中。(4)start:转换启动信号。start上升沿时,复位adc0808;start下降沿时启动芯片,开始进行a/d转换;在a/d转换期间,start应保持低电平。本信号有时简写为st。(5)d7d0:数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。d0为最低位,d7为最高。 (6)oe:输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。oe=0,输出数据线呈高阻;oe=1,输出转换得到的数据。(7)clk:时钟信号。adc0808的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500khz的时钟信号。(8)eoc:转换结束信号。eoc=0,正在进行转换;eoc=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。(9)vcc:+5v电源,gnd:地。 (10)vref:参考电压。参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5v(vref(+)=+5v, vref(-)=0v)。3.1.2 adc0808通道选择表1 adc0808通道选择表 c(addc)c(addb)c(addc)选择的通道000in0001in1010in2011in3100in4101in5110in6111in7多路模拟开关可选通8路模拟通道,允许8路模拟量分时输入,并共用一个a/d转换器进行转换。地址锁存与译码电路完成对a、b、c三个地址位进行锁存与译码,如表1所示。3.1.3 adc0808的工作原理:首先输入3位地址,并使ale=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。start上升沿将逐次逼近寄存器复位。下降沿启动 a/d转换,之后eoc输出信号变低,指示转换正在进行。直到a/d转换完成,eoc变为高电平,指示a/d转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当oe输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。图6 adc0808信号的时序配合3.2 数据处理及控制单元 此处采用at89c51,它所需要实现的功能,一是将模数转换后的数据经过处理并显示于4位一体的led上,二是提供led的位控信号,选择所应显示数据的一位8段数码管,三是提供高电平将adc0808的锁存器打开,使得数字信号能够输出给单片机。图7 at89c51的引脚at89c51的引脚说明如下:(1)vcc:电源电压; (2)gnd:接地; (3)p0口:p0口是一组8位漏极开路双向i/o口,每位引脚可驱动8个ttl逻辑门路口管脚写“1”时,被定义为高阻抗输入。在访问外部数据存储器或程序存储器时,它可以被定义为数据总线和地址总线的低八位。在flash编程时,p0 口作为原码输入口;当flash进行校验时,p0输出原码,此时p0外部必须接上拉电阻。(4) rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。(5)/psen:外部程序存储器的选通信号(6)xtal1:片内高增益反向放大器的输入及内部时钟工作电路的输入。(7)xtal2:片内高增益反向放大器的输出端。3.3 4位一体七段数码管本实验的显示模块主要由一个4位一体的7段led数码管构成,用于显示测量到的电压值。它是一个共阴极的数码管,每一位数码管的原理图如图所示。每一位数码管的a,b,c,d,e,f,g和dp端都各自连接在一起,用于接收at89c51的p0口产生的显示段码。1,2,3,4引脚端为其位选端,用于接收at89c51的p1口产生的位选码。图8为一位数码管的原理图。图8一位数码管的原理图。4 电路原理说明 4.1 模数转换如图1电路原理图所示,三个地址位adda,addb,addc均接高电平+5v电压,因而所需测量的外部电压可由adc0808的in7端口输入。由于adc0808在进行a/d转换时需要有clk信,本设计中利用at89c51的定时中断产生一个100khz的脉冲,由p1.4口送给adc0808的时钟端,通过软件给其输入一个正脉冲,可立即启动a/d转换。在软件设计中,由于我们对单片机知识还没能很熟练的掌握,用中断方式较复杂,且这个程序cpu工作量不大,查询方式对速度不会产生影响,所以我们采用查询方式,确保仿真的进度和准确度。在a/d转换开始之前,逐次逼近寄存器的sar的内容为0,在a/d转换过程中,sar存放“试探”数字量,在转换完毕后,它的内容即为a/d转换的结果数字量。逻辑控制与定时电路在start正脉冲启动后工作,没来一个clk脉冲,该电路就可能告知向sar中传送一次试探值,对应输出u0与u1比较,确定一次逼近值,经过8次逼近,即可获得最后转换的结果数字量。此处,eoc端口的信号显示adc0808的状态,开始a/d转换时,eoc为低电平,转换结束后,输出高电平。4.2 数据处理及控制a/d转换完毕后,单片机的p1.6口接收到一高电平,立马通过p1将oe置1,adc0808的三态输出锁存器被打开,转换完的数字信号经过与d0d7相连的p0口进入at89c51。at89c51根据公式1-1将数字信号转换为模拟量,然后利用程序获取模拟量的每一位,分别通过p0口输出到led上。与此同时,at89c51会通过p1.0p1.3口选择用哪一段led显示所传出的数据。例如,当p1.0p1.3=1110,则led接收到的数据会在第四段led上显示。 另外,at89c51一旦获得了数据后便会将st置0,即模数转换器停止转换,知道led获得新的数据并显示出来,st才会重新置1.由于at89c51转换速率很快(微妙量级),所以不会影响其接收新的数据。最终显示如下图所示。图9 运行中的电路图5 参考文献1 胡乾坤,李广斌,李玲,喻红.单片微型计算机原理与应用.华中科技大学出版社,2005 2 朱清慧,张凤瑞,翟天嵩,王志奎.proteus教程.清华大学出版社,2008 3 李广弟.单片机基础.北京航空航天大学出版社,1994 4 谭运光.单片机开发手册.华龄出版社,19946 结论及心得我选择的是简易直流电压表,这个所用到的芯片都是我们比较熟悉的,89c52和0808模/ 数转换器。总的来说,这次课设完成得还算顺利,因为老师给的题目都很经典,加之所要实现的功能也很简单,因而我们能够获得的资源就比较丰富。在网上看了许多相关的电路和程序,也试过直接复制,但是由于程序不全而泡汤,于是决定自己设计电路和编写汇编程序。在编写汇编程序时,循环显示部分是用以往课程设计时编写的程序的,直接复制到这个设计中来时,忘记了删除一个命令,导致最后一位在仿真的时候总是显示有问题,甚至显示不了。后来经过仔细检查,终于发现了问题的所在并及时进行了修正。在编写程序过程中还出现了一个比较有趣的问题,这也算是汇编程序的一个弊端,就是做乘除的时候,结果很容易超出八位,如果不加以处理的话,很容易导致显示不正常。下面是一段用于中断处理显示数据的程序。由于模数转换之后得到的是0255的八位二进制数,所以要通过中断程序将之化为05.00的十进制小数。从前面分析我们知道,只要将得到的二进制数除以51,便可以直接得到个位。由于汇编不能处理小数,所以只能将所得的余数乘以10,再除以51,得到十分位,以此类推,可以继续得到百分位。但是问题就出现在这里,以十分位的计算为例。得到个位后,当余数超过25,比如是26时,乘以10的话得到260,就会溢出,而很难进行除法操作得到正确的十分位结果。所以一开始我们就把乘数减小,变为5,这样的话即使余数是50(除数为51,50是最大的余数,余数保存在b),乘以5,得到的是250,也不会溢出,然后再除以51,这样可以得到十分位的一半,最后把结果乘以2,就能得到正确的十分位了。于是我们就这样进行编程进行仿真,结果当测量电压十分位为偶数时,可以部分正常显示,当测量电压十分位为奇数时,则依然显示的是偶数。这是显而易见的,因为最后我们是用商乘以2得到的结果,还是由于汇编只能进行整数除法的问题,导致结果只能是偶数。最后通过思考,想出了几个方案,一是利用溢出标志位来决定结果是否进行加1操作,二就是下面程序所示的方法,对余数进行判断,当余数超过51的一半26时,则对余数进行减26操作,并对十分位进行加1操作。这两种方法实际效果是一样的,不过下面这种方法可以得到更精确的百分位的结果。inser:push psw;push acc;现场保护push dph;push dpl;setb p3.1clr eamov a,p2;mov b,#33h;给b及时数55div ab;mov r0,a;以上可得到个位 ;mov a,bmov b,#5;给b及时数5,与a相乘,避免得数超过八位mul ab;mov b,#33h;div ab;mov r4,b;mov b,#2h;再乘以2,以达到目的mul ab;mov r1,a;mov a,r4;clr cy;cjne a,#26,loop1;判断余数,以确定a是否少加了1subb a,#26;超过51的一半则减去26或者25,并使上一位加1inc r1;loop1:jc loop2;subb a,#25;等于26也进行加1操作inc r1;loop2:mov b,#2;余数乘以2,以达到实际的余数mul ab;以上可得到十分位;mov b,#5h给b及时数5,与a相乘,避免得数超过八位mul ab;mov b,#33h;给b及时数51div ab;mov r4,b;mov b,#2; 再乘以2,以达到目的mul ab;mov r2,a;mov a,r4;clr cy;cjne a,#26,loop3;同上面的操作,以得到百分位inc r2;loop3:jc loop4;inc r2;以上得到百分位loop4:;pop dpl;恢复现场pop dph;pop acc;pop psw;reti7 附录7.1 调试报告 由于此次设计的程序较简单,因而其在keil里运行的时候很顺利。但是当将程序加入连接好的电路中并开始仿真时,就遇到了上述的问题。通过思考解决了这些问题之后,仿真就完全没问题了。 在焊实际元件的过程中,第一次把电路焊好了,但是完全没有显示。第二次重新焊了电路,终于实现了功能。电压的调节是通过电位器来实现的,如果要测量其他电压,只需要把电位器的两端拆下来即可。不过在过程中还是遇到了单片机的输出电流不足以驱动数码管的为题,导致显示的时候亮度不够,于是利用反相器来放大电流,就可以在白天也有比较好的亮度用于观察了。实际电路图及工作状态图如下:源程序如下:org 0000hljmp clockorg 0003hljmp inser;跳转到外部中断0org 000bhljmp inser1;org 0030hclock:mov dptr,#tab;把tab的首地址给dptrmov r0,#00h;赋初值mov r1,#00h;mov r2,#00h;mov tl0,#0feh;setb et0;mov th0,#0ffhmov tl0,#0e0hsetb it0setb tr0setb px0setb ex0;打开中断0setb ea;打开中断开关connect:mov r7,#10setb p3.0clr p3.0setb eadisplay:;循环显示程序段clr p1.1mov a,#0fh;给a赋值,用来和时进行逻辑运算,以达到分别显示时的十位和个位anl a,r0;逻辑与,把r0的值给amovc a,a+dptr;查表得到电压个位的位选码mov p0,a;送出显示clr p0.7lcall delaysetb p1.1;clr p1.2mov a,#0fh;anl a,r1;逻辑与,把r1的低四位给amovc a,a+dptr;查表得到十分位的位选码mov p0,a;送出显示lcall delaysetb p1.2;clr p1.3mov a,#0fh;anl a,r2;把r2低四位给amovc a,a+dptr;查表得百分位的位选码mov p0,a;送出显示setb p0.7lcall delaysetb p1.3;djnz r7,l3clr p3.1setb p3.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论