搜索
您的当前位置:首页正文

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

来源:尚佳旅游分享网


课题名称:

单片机课程设 数字电压表

课程原理:

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

//启动定时器

清零并启动ADC0809

SETB TR0

LOOP1: CLR P3.5 // CPL P3.5 CPL P3.5

CLR P3.6 SETB SETB LOOP2: JNB SETB

//初始化ALE,并启动

P3.6 P3.4

P3.4 , LOOP2 //扫描EOC P3.3 // 允许输出

MOV P1,#0FFH

MOV A,P1

MOV B,#51 DIV AB

LOOP3: LOOP4:

LOOP5: LOOP6: 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 MOV B,#51 DIV AB MOV R0,B

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

MOV B,#51 DIV AB

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、 焊完板子以后,通电后不加芯片对板子的各个引脚进行电压检测后,下载程序运行后发

现,数码管有显示,但是显示的很暗,不是很明亮,开始以为是上拉电阻的阻止太大,

后面尝试性的将程序中显示做适当的延时后发现数码管的显示变的很亮了,总结得知:数码管轮流显示时,若显示时间很短,即会造成平均电流很小直接使得数码管的亮度不够。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top