单片机课程设计报告数字电压表.docx
单片机课程设计报告数字电压表 单 片 机 课 程 设 课题名称:数字电压表 课程原理: 1、模数转换原理: 试验中,我们选用ADC0809作为模数转换的芯片,其为逐次逼近式AD转换式芯片,其工作时需要一个稳定的时钟输入,根据查找资料,得到ADC0809的时钟频率在10KHZ1200KHZ,我们选择典型值640KHZ。课题要求测量电压范围是0到5V,又ADC0809的要求:V ref+=GND,故我们取V ref+=+5V,V ref-=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作为的连接端。IN0为输入端,而ADC0809的IN1到IN7悬空,不作连接。单片机接高电平。 而口从ADC0809的输出端输入数据。 实验程序代码: 本次实验我用到的是最底层的汇编语言。 ORG0000H LJMP ST ART ORG000BH CPL P3.2 MOV TH0,#0FFH MOV TL0,#0FFH RETI ORG0014H ST ART: 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,#DT AB 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,#DT AB 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,#DT AB 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口来驱动数码管,这就导致最开始的时候数码管在位选为低电平(我们没有采用三极管作为开关管),段选为高电平时没有任何显示,也就是没有考虑到单片机口驱动负载的能力,后面我们在P0口加上上拉电阻之后情况有所转变。但是我们又发现了新的问题:当数码管扫描显示时,数码管的显示会出现乱码。当然这是我们的程序有点问题。开始我们将得到的数据边处理边显示,然后轮流点亮,但是发现数码管根本就没有一点反应,全部是黑的。后面将程序改为先将数据全部处理完,然后再依次显示,这样数码管便可以显示。后面总结得知:边处理数据边显示由于显示时间短的原因导致数码管不能显示。 2、焊完板子以后,通电后不加芯片对板子的各个引脚进行电压检测后,下载程序运行后发 现,数码管有显示,但是显示的很暗,不是很明亮,开始以为是上拉电阻的阻止太大,后面尝试性的将程序中显示做适当的延时后发现数码管的显示变的很亮了,总结得知:数码管轮流显示时,若显示时间很短,即会造成平均电流很小直接使得数码管的亮度不够。