51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
数码显示实验
发布时间:2009/7/5  阅读次数:2053  字体大小: 【】 【】【

作者: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

关于数码管的静态显示及动态显示原理,我们在后面会单独的实验讲解。这里只是给大家一个基础的认识。

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号