作者:mcukf.com
实验任务
学会数码管的显示原理及编程。
实验设备:
本实验可在本站的:成功一号、新动2005、精简型2004、ISP下载型等学习套件上直接操作。
相关常识说明:
用单片机进行数码显示应具有显示器件;应用最广泛的是7段数码管。习惯上说是7段,实际含小数点是8段;下面我们称其为段数码管。
段数码管的段排列和内结构见下图:
段数码管从内部接线上分共阳和共阴两种;上图左为共阴,右为共阳。在电路设计时应根据情况决定采用共阳或共阴,其基本原则是:若单片机io口直接驱动数码管个段,最好采用共阳数码管,因为51单片机io口输出高电平时输出的电流很小,数码管不会太亮;若数码管是通过驱动芯片与单片机相连的,就要看驱动芯片对数码管极性的要求啦。
电路原理图:(单片机没画出)
这里的数码管直接用单片机p0口驱动,v2、v3是各数码管公共阳极的控制三极管,r3~r5和r13~r16是数码管个段LED的限流电阻。当A、B、C、D、E、F、G、DP 端接低电平,p2.0也为地电平时,L9 数码管各段全部点亮;若p2.0=1,p2.1=0则LED10各段全部点亮。
下面我们来写一段程序,让一位数码管显示数字
star: mov dptr,#numtab ;指定查表启始地址
mov a,#3 ;显示3,你可以改变该数显示
MOVC A,@A+DPTR
mov p0,a
clr p2.0 ;开个位显示
ljmp $
;段数码管各划的数字排列表
numtab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;显示内容的对应代码
;0 1 2 3 4 5 6 7 8 9 ;显示内容
db 88h,83h,0c6h,0a1h,86h,8eh
; a b c d e f
end
在前一节讲过,数码管各段加的电平不同,会显示不同的图形;那么,要想数码管显示“1”,就必须使数码管“B”“C”段点亮,其他段熄灭;由于共阳数码管是0电平点亮段,高电平熄灭段。即:
“DP G F E D C B A” 也就是说,将数码管从 DP--A 各段按顺序排列,其高低电平应呈现二进制“11111001”状态,换算成十六进制就是“F9H”;显然,你想显示的所有数字和字符,都必须这样一一对应的转换成十六进制数据。其他数字字符的hex代码见程序的 numtab 表。
遗憾的是,这些hex代码是没有规律可寻的,我们只有先将所希望显示的数字字符的hex代码制成表格,在需要显示某个数字字符时进行表格查询,查询到对应代码后再将代码送数码管显示,这样,我们希望显示并能理解的数字字符就显示了出来。
本实验程序在开始就将显示代码表的基地址赋给dptr,第二句是准备查找数字“3”的段代码,也就是准备让数码管显示“3”。“MOVC A,@A+DPTR”是将累加器acc中当前的数据加上dptr的数据,作为查表地址,并将这个地址中的数据传送到累加器acc覆盖原数据。acc中现在的数据就是“3”的段代码数据。
第4句是将“3”的段代码数据送p0驱动数码管显示;第5句是打开LED9的公共阳极;第6句是跳转到当前行,也就是说程序一直在本行循环。
改变第二句 #号后面的数,将更改显示内容。但#号后的数不能大于15,因numtab表中不包括“0”只有15格可查的数据!
通过前面的学习,大家对数码管的显示原理已很清楚,下面这段程序请大家自行分析:
a_bit equ 20h ;个位数存放处
b_bit equ 21h ;十位数存放处
temp equ 22h ;计数器寄存器
star: mov temp,#0 ;初始化计数器
stlop: acall display
inc temp
mov a,temp
cjne a,#100,next ;=100重来
mov temp,#0
next: ljmp stlop
;显示子程序
display: mov a,temp ;将temp中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr p2.0 ;开个位显示
acall d1ms ;显示1ms
setb p2.0
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr p2.1 ;开十位显示
acall d1ms ;显示1ms
setb p2.1
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret
;1MS延时(按12MHZ算)
;====================================================
D1MS: MOV R7,#80
DJNZ R7,$
RET
;7段数码管各划的数字排列表
numtab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
;0 1 2 3 4 5 6 7 8 9
db 88h,83h,0c6h,0a1h,86h,8eh
;a b c d e f
end
关于数码管的静态显示及动态显示原理,我们在后面会单独的实验讲解。这里只是给大家一个基础的认识。