单片机数字电压表课程设计报告

               

电压表是测量仪器中不可缺少的设备,目前广泛应用的是采用专用集成电路实现的数字电压表。本系统以增强型8051单片机为核心,设计了一款简易的数字电压表,能够测量0~5V的直流电压,最小分辨率为0.02V。

该设计大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:

1、单片机部分。使用增强型8051单片机,同时根据需要设计单片机电路。

2、测量部分。该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。

3、键盘显示部分。利用4×6矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。

索引关键词:增强型8051  模数转换  LED显示  矩阵键盘

                        

                          目   录

一 概    述    …………………………………………………………………4

二 方案设计与论证 ……………………………………………………………4

三 单元电路设计与参数计算 …………………………………………………4

  3.1. A∕D转换器

 ……………………………………………………5

  3.1. LED数码显示  ………………………………………………………7                                                 

四 总原理图及参考程序 ………………………………………………………9

五 结论 …………………………………………………………………………10

六 心得体会 ……………………………………………………………………14

七 参考文献 ……………………………………………………………………15

         

 

一、概述

数字电压表的基本工作原理是利用A/D转换电路将待测的模拟信号转换成数字信号,通过相应换算后将测试结果以数字形式显示出来的一种电压表。较之于一般的模拟电压表,数字电压表具有精度高、测量准确、读数直观、使用方便等优点。

电压表的数字化测量,关键在于如何把随时连续变化的模拟量转化成数字量,完成这种转换的电路叫模数转换器(A/D)。数字电压表的核心部件就是A/D转换器,由于各种不同的A/D转换原理构成了各种不同类型的DVM。一般说来,A/D转换的方式可分为两类:积分式和逐次逼近式。

积分式A/D转换器是先用积分器将输入的模拟电压转换成时间或频率,再将其数字化。根据转化的中间量不同,它又分为U-T(电压-时间)式和U-F(电压-频率)式两种。

逐次逼近式A/D转换器分为比较式和斜坡电压式,根据不同的工作原理,比较式又分为逐次比较式及零平衡式等。斜坡电压式又分为线性斜坡式和阶梯斜坡式两种。

在高精度数字电压表中,常采用由积分式和比较式相结合起来的复合式A/D转换器。本设计以增强型8051单片机为核心,构造了一款简易的数字电压表,能够测量1路0~5V直流电压,最小分辨率0.02V。

二、方案设计与论证

该设计是基于增强型8051的数字电压表,大体分为以下几个部分,同时,各部分选择使用的主要元器件确定如下:

(1)单片机部分  使用增强型8051单片机,同时根据需要设计单片机电路。

(2)测量部分  该部分是实验的重点,要求将外部采集的模拟信号转换成数字信号,通过单片机的处理显示在显示器上,该部分决定了数字电压表的精度等主要技术指标。

   (3)键盘显示部分  利用4×6矩阵键盘的一个按键控制量程的转换,3或4位LED显示。其中一位为整数部分,其余位小数部分。

三、单元电路设计与参数计算

 

3.2  LED数码显示

(1)LED显示器

LED是由若干个发光二极管组成的。当发光二极管导通时,相应的一个点或一个笔划发亮。控制不同组合的二极管导通,就能显示出各种字符。这种笔划式的七段显示器,能显示的字符数量少,但控制简单、使用方便。

发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器

(2)LED结构及显示原理

通常的七段LED显示块中有八个发光二极管,故也有人叫做八段显示块。其中七个发光二极管构成七笔字形“8”。一个发光二极管构成小数点。七段显示块与单片机接口非常容易。只要将一个8位并行输出口与显示块的发光二极管引脚相连即可。8位并行输出口输出不同的字节数据即可获得不同的数字或字符。通常将控制发光二极管的8位字节数据称为段选码或段数据。

(3)LED的结构及其工作原理

点亮显示器有静态和动态两种方法。

   1)静态显示:当显示某一个字符时,相应的发光二极管恒定地导通或截止。例如七段显示器的a、b、c、d、e、f导通,g、dp截止,显示0。

静态显示的特点是:

每一位都需要一个8位输出口控制,用于显示位数较少(仅一、二位)的场合。

较小的电流能得到较高的亮度,可以由8255的输出口直接驱动。

2)动态显示:一位一位地轮流点亮各位显示器(扫描)。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也和点亮时间与间隔时间的比例有关。    

若显示器的位数不大于8位,则控制显示器公共极电位只需一个8位并行口(称为扫描口或位选口)。控制各位显示器所显示的字形也需一个共用的8位口(称为段数据口),用于显示位数稍多的场合,需编写扫描程序。

四、总原理图及参考程序

1、总原理图

2、程序流程图及参考程序

(1)程序流程图

 

七、结论

本设计以增强型8051单片机为控制核心,经单片机内部程序处理后,由LED八段数码管显示测量结果。

仿真测试表明,系统性能良好,测量读数稳定易读、更新速度合理,直流电压测量范围为0~5V,最小分辨率为0.02V,满足任务书指标要求。但是,该系统也存在一定程度的不足,例如:

1、若能将测量的电压值实时保存,使用时将更方便。

2、本设计仅仅使用了其中一个通道,造成了较大的资源浪费。若能对电路稍加改进,实现对多路信号的轮流测量并自动保存相应结果,其应用价值将会更大。

八、心得体会

在这次单片机课程设计实习里,通过对单片机的学习与应用明白实际操作和课本上的知识有很大联系,但又高于课本,体会到了理论与实践相结合的重要性,同时查阅相关文献资料、组织材料、团队合作等的能力都得到了相应的提高。

在这次实习中,在收获知识的同时,还收获了阅历。在此过程中,通过查找相关资料,请教老师,不仅培养了独立思考、动手操作的能力,组织材料、团队合作等能力也得到了相应的提高,而且在与老师和同学的交流过程中,互动学习,能更好的将知识融会贯通,达到了事半功倍的效果。

    更重要是我从中学到:要面对社会的挑战,只有不断的学习、实践,再学习、再实践。不管怎样,这些都是一种锻炼,只有不断的积累这些最基础的,才可以更进一步,取得更好的成绩。

    总之,这次实习巩固了单片机这门课程的知识,并且对提高自己的动手能力与设计能力有了很大帮助。

九、参考文献

胡辉 单片机原理与应用 中国水利水电出版社

 

第二篇:单片机课程设计报告数字电压表

课题名称:    数字电压表

课程原理

1、  模数转换原理:

       试验中,我们选用ADC0809作为模数转换的芯片,其为逐次逼近式AD转换式芯片,其工作时需要一个稳定的时钟输入,根据查找资料,得到ADC0809的时钟频率在10khz~1200khz,我们选择典型值640khz。课题要求测量电压范围是0到5V,又ADC0809的要求:Vref+<=Vcc,Vref->=GND,故我们取Vref+=+5V,Vref-=0V。由于ADC0809有8个输入通道可供选择,我们选择IN0通道,直接使ADC0809的A、B、C接地便可以了,在当ADC0809启动时ALE引脚电平正跳变时变可以锁存A、B、C上的地址信息。ADC0809可以将从IN0得到的模拟数据转换为相应的二进制数,由于ADC0809输出为8位的二进制数,转换时将0到5V分为255等分,所以我们可以得到转换公式为x/255*5化简为:x/51,x为得到的模拟数据量,也就是直接得到的电压量。在AD转换完成后,ADC0809将在EOC引脚上产生一个8倍于自身时钟周期的正脉冲,以此来作为转换结束的标志。然后当OE引脚上产生高电平时,ADC0809将允许转换完的二进制数据输出。

2、  数据处理原理:

       由ADC0809的转换原理可以知道我们从其得到数据还只是二进制数据,我们还需要进一步处理来的到x的十进制数,并且对其进行精度处理,也就是课题要求的的精确到小数点后两位,在这里我们用51单片机对数据进行处理。我们处理数据的思路是:首先将得到的二进制数直接除以十进制数51,然后取整为x的整数部分,然后就是将得到的余数乘以10,然后再除以51,再取整为x的十分位,最后将得到的余数除以5得到x的百分位。

3、  数据显示原理:

       试验中我们用到四位一体的七段数码管,所以我们只能考扫描显示来完成数码管对x的显示,我们用的是四位数码显示管,但是x只是三位的,故我们将将第四位显示为单位U,通过程序的延时,实现四位数码管的稳定显示。

课程电路和仿真图:

    实验中我们采用的protus仿真。

    我们将单片机得P0口接上拉电阻后与数码管的8位段选相连,若不接上拉电阻将无法驱动数码管,用P2口得4到7位连接数码管的段选,考虑到整体的PCB布线,我选用 P3.2口作为ADC0809的时钟输出端,并用到单片机的定时器。用P3.5传输ADC0809的START启动信号,用P3.6作为ALE的信号传输,P3.3作为OE的连接端。IN0为输入端,而ADC0809的IN1到IN7悬空,不作连接。单片机EA接高电平。而P3口从ADC0809的输出端输入数据。

实验程序代码:

  本次实验我用到的是最底层的汇编语言。

            ORG   0000H

         LJMP  START

         ORG   000BH

            CPL   P3.2

              MOV   TH0,#0FFH

              MOV   TL0,#0FFH

         RETI

              ORG   0014H

START:  MOV   PSW,#0FFH

         MOV   R1,#00H       

         MOV   R2, #00H

            MOV   R3,#00H      //清零寄存器

              MOV   IE ,#82H     //设置IE,开启定时器,关闭其他中断

              MOV   TMOD ,#01H    //定时器T0,方式1,给ADC0809时钟信号

              MOV   TH0, #0FFH      

              MOV   TL0, #0FFH      

            SETB  TR0                //启动定时器 

LOOP1:  CLR   P3.5      //      清零并启动ADC0809

              CPL   P3.5

              CPL   P3.5

         CLR   P3.6              //初始化ALE,并启动

              SETB  P3.6

              SETB  P3.4

LOOP2:  JNB   P3.4 , LOOP2          //扫描EOC

         SETB  P3.3          // 允许输出

         MOV   P1,#0FFH                      

              MOV   A,P1  

            MOV   B,#51

              DIV   AB                       

              MOV   DPTR,#DTAB

              MOVC  A,@A+DPTR

              ORL   A,#20H  

              MOV   R1,A                 //得到个位和小数点存于R1

         MOV   A,B

              MOV   B,#10

              MUL   AB

              JNB   PSW.2,LOOP3

              CLR   PSW.2

              INC   A

              MOV   B,#51

              DIV   AB

              ADD   A,#5    

              MOV   R0,B

              AJMP  LOOP4

LOOP3:  MOV   B,#51

         DIV   AB

         MOV   R0,B

LOOP4:  MOV   DPTR,#DTAB

              MOVC  A,@A+DPTR   

              MOV   R2,A      //得到十分位存于R2

            MOV   A,B     // MOV   A,R0          

              MOV  B,#10// MOV   B,#5

              MUL  AB //DIV   AB

              JNB  PSW.2,LOOP5

              CLR  PSW.2

              INC  A

              MOV  B,#51

              DIV  AB

            ADD   A,#5

              AJMP LOOP6

LOOP5:  MOV  B,#51  

            DIV  AB

LOOP6:  MOV   DPTR,#DTAB 

              MOVC  A,@A+DPTR

              MOV   R3,A                 //得到百分位存于R3

DIS:         CLR   P2.4                     //显示单位

         MOV   P0,#5EH

              MOV   R5,#0FH

              DJNZ  R5,$

              SETB  P2.4

         CLR   P2.5            //显示百分位

         MOV   P0,R3

              MOV   R5,#0FH

              DJNZ  R5,$

              SETB  P2.5

              CLR   P2.6               //显示十分位

         MOV   P0,R2

            MOV   R5,#0FH

              DJNZ  R5,$

              SETB  P2.6

              CLR   P2.7                  //显示个位和小数点

            MOV   P0,R1

              MOV   R5,#0FH

              DJNZ  R5,$

              SETB  P2.7

              JB    P3.4,LOOP7

              AJMP  DIS

LOOP7:  LJMP  LOOP1

DTAB:   DB  5FH ,44H ,9DH,0D5H,0C6H

         DB  0D3H,0DBH,45H,0DFH,0D7H

              END

              END

总结:

1、  仿真时,也就是写程序时,为了硬件的简单,我们没有采用74LS244来驱动数码管,而是直接用IO口来驱动数码管,这就导致最开始的时候数码管在位选为低电平(我们没有采用三极管作为开关管),段选为高电平时没有任何显示,也就是没有考虑到单片机IO口驱动负载的能力,后面我们在P0口加上上拉电阻之后情况有所转变。但是我们又发现了新的问题:当数码管扫描显示时,数码管的显示会出现乱码。当然这是我们的程序有点问题。开始我们将得到的数据边处理边显示,然后轮流点亮,但是发现数码管根本就没有一点反应,全部是黑的。后面将程序改为先将数据全部处理完,然后再依次显示,这样数码管便可以显示。后面总结得知:边处理数据边显示由于显示时间短的原因导致数码管不能显示。

2、 焊完板子以后,通电后不加芯片对板子的各个引脚进行电压检测后,下载程序运行后发现,数码管有显示,但是显示的很暗,不是很明亮,开始以为是上拉电阻的阻止太大,后面尝试性的将程序中显示做适当的延时后发现数码管的显示变的很亮了,总结得知:数码管轮流显示时,若显示时间很短,即会造成平均电流很小直接使得数码管的亮度不够。  

相关推荐