1.1 设计目的
1.掌握单片机8031的性能及使用方法 2.掌握使用单片机编程的方法; 3了解七段数码显示数字的原理; 4.掌握多位数字的显示技术;
5.掌握ADC0809模/数转换的应用; 1.2设计的内容
由于日常电压都是模拟量,要把他们的输出变为数字量就需要有模/数转换器。本次实验选用的是八位模/数转换器ADC0809。其次,计算机中的数字都是十六进制数,而我们习惯于十进制数的读写,因此,在软件设计中则要把十六进制数转换成十进制数。在显示的时候也是如此。本装置的输出用三位LED显示,因此在软件设计中还要解决数字输出与LED的接口问题。硬件则需要将输出线接到八段数码管上。
原理框图 分压 模拟量输入 A/D转换 电路 8031 LED显示
1.3设计要求
1.可测量0~99V的模拟电压; 2.精确到0.1V;
3.结果用LED动态显示; 硬件电路设计 8031单片机
8031为字长8位的单片微型计算机,由中央处理器、内部RAM、内部ROM、
两个16位的定时计数器、四个8位的I/O口(P0、P1、P2、P3)、一个全双工的串行口、五个中断源以及时钟等组成。它具有速度快、功能强、功耗底、抗干扰性好、价格低廉等特点。它是标准的40引脚双列直插封装(DIP)形式。 八位模/数转换器 ADC0809,
ACD0809是典型的8位8通道逐次逼近式A/D转换器,为28引脚双列直插式封装。可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存译码电路,其转换时间为100微秒左右。A/D转换用于实现模拟量到数字量的转换。按转换原理可分为四种,即:计数式A/D转换器、双积分式A/D转换器、逐次逼近式A/D转换器和并行式A/D转换器。目前使用较多的为后三种。双积分式A/D转换器具有高精度、抗干扰性好、价格低廉等特点,但速度较慢,经常应用于对速度要求不高的仪表中;逐次逼近式A/D转换器在精度、速度和价格上都适中,是目前最常用的A/D转换器;并行式A/D转换器是一种用编码技术实现的高速A/D转换器其速度最快,价格也最高,使用于要求较高的场合。
综上,本设计选用逐次逼近式8位A/D转换芯片ADC0809。 ADC0809的主要技术特性和指标: ·分辨率:8位。
·转换时间:取决于芯片时钟频率。 ·单一电源:+5V。
·模拟输入电压范围:单极性0~5V,双极性+5V或+10V。 ·具有可控三态输出锁存器。
·启动转换控制脉冲式(正脉冲),上升沿使内部所有寄存器清“0”,下降沿使A/D转换器开始。 LED显示器
通常所说的LED显示器有七个发光二极管组成,因此也称之为七段LED显示器。此外,显示器中还有一个圆点型发光二极管,用于显示小数点。
a
f b
gy
g
e c
3.软件电路设计 3.1 设计思路
本题要求输入0~99v的模拟电压,结果用LED显示。由于计算机读入的只能是数字量,因此首先要用模/数转换器ADC0809将采集到的数据转换成数字量送入8031进行处理。再者,用LED显示结果时就要考虑8031与LED的接口问题。在程序中要完成的还有输入量于输出量的对应问题。ADC0809是八位的模/数转换器,数字范围为0~255,而输出要求0~100。因此,模拟量与数字输出的变化比为100/255。
在计算机乘法中不能给一个数直接乘以0.4,所以在处理输入值时就必须计算输入值*4/10。
算得的值不必再进行其他转换便可通过LED显示。
3.2 程序流程图
开始 采集数据 A/D转换
结果乘以0.4
是否溢出
显示99.9 LED显示
结束
显示程序 led:
mov dptr,#9002h ;位控口部分 movx @dptr,a
jnb acc.1,b1 ;是否有小数点 mov dptr,#outseg mov a,@r0
call table1 jmp show
b1: mov dptr,#outseg mov a,@r0 call table
show:movx @dptr,a mov r6,#01h acall delay inc r0 mov a,r3 rl a
jb acc.3,ld1
mov r3,a ajmp led
mov dptr, #outbit mov a, #0
movx @dptr, a
ld1: ljmp start table: inc a
movc a,@a+pc ret
db 3fh 06h 5bh 4fh 66h 6dh db 7dh 07h 7fh 6fh table1: inc a
movc a,@a+pc ret
db 0bfh 86h 0dbh 0cfh 0e6h
db 0edh 0fdh 87h 0ffh 0efh
Delay: mov r7, #0 DelayLoop:
djnz r7, DelayLoop djnz r6, DelayLoop ret
3.3 程序清单
outbit equ 9002h outseg equ 9004h
start:mov dptr, #outbit mov a, #0
movx @dptr, a mov dptr,#8000h
; 关所有八段管 ;返回 ; 延时子程序 ; 关所有八段管 mov a,#00
movx @dptr, a ; 起动 A/D
jisuan:movx a, @dptr ;把ADC的输出赋给a mov b, #04h mul ab
mov 30h,b ;积的高位存入30h 单元 mov 31h,a ;积的低位存入31h 单元 mov a,#0ffh ;15-51是进制转换问题 mov b,#0ah div ab
mov 32h,a mov 33h,b mov b,30h mul ab
mov 32h,a mov a,33h mov b,30h mul ab add a,30h mov 33h,a mov a,31h mov b,#0ah div ab add a,32h mov 32h,a mov a,33h add a,b mov b,#0ah
div ab add a,32h mov 32h,a mov a,b
mov 70h,a mov a,32h mov b,#0ah div ab mov 72h,a
cjne a,#0ah,a1 mov 70h,#09h mov 71h,#09h mov 72h,#09h jmp xianshi a1: mov a,b
mov 71h,a ; 商存入32 h单元 ;余数存入33h单元 ;高位的总商 ;b中放总后的余数 ;把小数位存入缓存区 ; 把十位 存入缓存区 ;溢出处理部分 ; 把个位数存入缓存区
xianshi:mov r0,#70h mov r3,#01h mov a,r3 led:
mov dptr,#9002h ;位控口部分 movx @dptr,a
jnb acc.1,b1 ;是否有小数点 mov dptr,#outseg mov a,@r0 call table1 jmp show
b1: mov dptr,#outseg mov a,@r0 call table
show:movx @dptr,a mov r6,#01h acall delay inc r0 mov a,r3 rl a
jb acc.3,ld1
mov r3,a ajmp led
mov dptr, #outbit mov a, #0
movx @dptr, a ; 关所有八段管
ld1: ljmp start ;返回 table: inc a
movc a,@a+pc ret
db 3fh 06h 5bh 4fh 66h 6dh db 7dh 07h 7fh 6fh table1: inc a
movc a,@a+pc ret
db 0bfh 86h 0dbh 0cfh 0e6h db 0edh 0fdh 87h 0ffh 0efh
Delay: ; 延时子程序 mov r7, #0 DelayLoop:
djnz r7, DelayLoop djnz r6, DelayLoop
ret
end
4.调试程序
通过单步执行检测程序的运行情况。在调试计算程序的时候,由电位器给输入一个值,通过计算的到它经过A/D转换后的数字量。设置PC,单步执行。每执行一步,在数据监测窗口和程序监测窗口观察它的变化情况,看是否与自己计算出的结果相符。如不同,则思考是哪个地方出现了问题,修改后继续执行,知道输出结果与计算结果相同为止。
当程序中有跳转指令时,通过单步执行可以看到条件满足时它跳到哪一步,条件不满足时程序跳到哪一步,从而达到想要的结果。
LED的显示程序在调试中出错是相对较少的。给输出分配好段控口和位控口之后,它基本就能按8031的处理结果显示。
5.结论
通过本次设计,我们更好地掌握了单片机编程和调试。熟悉了汇编语言的使用方法,将即将遗忘的知识得到了巩固。
这次的题目并不是很难,但它有一个非常复杂的计算程序,是我们以前所没接触过的,因此在编程和调试过程中也遇到了一些麻烦。克服困难的办法就是想尽一切办法去解决它,通过不懈的努力和老师同学们的帮助,我们的问题很快就解决了。
这次设计总体来说还是比较顺利的,从中学到的知识也是相当丰富的,这为我们今后的课程设计和毕业设计积累了知识和经验,丰富了我们的大学生活。
因篇幅问题不能全部显示,请点此查看更多更全内容