单片机驱动数码管显示设计关键词:数码管显示单片机摘要:数码管是非常常见的东西,他能显示数字,以及字母,应用非常的广泛,本文和大家谈谈如何用单片机来驱动数码管数码管是非常常见的东西,他能显示数字,以及字母,应用非常的广泛,本文我来和大家谈谈如何用单片机来驱动数码管数码管的结构数码管由7个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极.通过解码电路得到的数码接通相应的发光二极而形成相应的字,这就是它的工作原理.基本的半导体数码管是由7个条状的发光二极管(LED)按图1所示排列而成的,可实现数字0~9及少量字符的显示。另外为了显示小数点,增加了1个点状的发光二极管,因此数码管就由8个LED组成,我们分别把这些发光二极管命名为a,b,c,d,e,f,g,dp,排列顺序如下图1。图1:数码管引脚图及外形图数码管的分类数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种。 共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。共阴数码管内部连接如图3所示。 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阳数码管内部连接如图2所示。图2:共阳数码管内部连接图图3:共阴数码管内部连接图数码管的显示方式 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 ①动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。 ②静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 前面我们学习了数码管的基础知识,现在马上来看看S51增强型实验板的数码管吧(图4),S51实验板上有5位高亮度共阳数码管DG1~DG5,可以用来做计数器(最大计数值99999)、温度显示、电子钟等显示实验,掌握数码管的静态显示驱动和动态显示驱动。图4S51 增强型实验板的数码管驱动原理图如下图5所示。图5 从原理图可以看出,S51增强型实验板中数码管的段码a,b,c,d,e,f,g,dp分别与单片机的P0.0~P0.7相连,控制数码管中显示的字形;数码管的位选通由5个PNP三极管控制,分别接到单片机的P2.0、P2.1、P2.2、P2.3、P2.4端口上,程序中通过控制P2.0~P2.4端口的输出电平就可以控制数码管的显示与关闭。如P2.0输出低电平时,三极管T1导通,+5V电源加到第一个数码管的COM端,那么第一个数码管DG1就会显示出相应的数字,显示的数字由单片机P0.0~P0.7输出段码决定,当P2.0输出高电平时,三极管T1截止,数码管DG1就不显示,从而实现数码管位选通控制。同理,当P2.1输出低电平时,则数码管DG2显示。。。单片机驱动数码管的静态显示编程 上面我们学习了一大堆的理论知识,对数码管已经有了较全面的认识,是否跃跃欲试了呀!马上动手编一个简单的程序验证一下理论吧,现在我们编程让实验板上的第一个数码管DG1显示数字“6”,最终的实验效果见上面图4所示。 启动KeilC51单片机集成开发环境,新建一个工程,工程命名为smg1.uv2,(不懂如何建立新工程的初学者请看网页手把手教你建立Keil工程),打开一个文本编辑窗,在文本编辑窗中输入如下代码:;********** 下面是数码管显示6的程序**********MAIN:CLRP0.0;P0.0 输出低电平,点亮数码管段码aSETBP0.1;P0.1 输出高电平,熄灭数码管段码bCLRP0.2;P0.2 输出低电平,点亮数码管段码cCLRP0.3;P0.3 输出低电平,点亮数码管段码dCLRP0.4;P0.4 输出低电平,点亮数码管段码eCLRP0.5;P0.5 输出低电平,点亮数码管段码fCLRP0.6;P0.6 输出低电平,点亮数码管段码gSETBP0.7;P0.7 输出高电平,熄灭数码管小数点段码dpCLRP2.0;P2.0 输出低电平,选通数码管DG1SETBP2.1;P2.1 输出高电平,不选通数码管DG2SETBP2.2;P2.2 输出高电平,不选通数码管DG3SETBP2.3;P2.3 输出高电平,不选通数码管DG4SETB P2.4;P2.4 输出高电平,不选通数码管DG5AJMPMAIN; 跳转到开始重新进行END; 程序结束 注:程序中分号“;”后面的中文为每一行程序的注释,是方便我们阅读程序的,可以不输入。 上面的源程序输入完毕后,保存为smg1.asm,然后添加到工程smg1.uv2中,最后源程序经过编译得到目标文件smg1.hex(见下面的图6所示),不熟悉Keil工程建立、设置及源程序编译等详细操作的初学者请参考网页手把手教你建立Keil工程。图6:点击放大该图 现在让我们把目标文件smg1.hex烧写到单片机中去,看看实际的效果吧,将ISP编程器硬件连接好(见下图7)。图7:ISP将产品配套光盘中的“ISP编程器驱动软件”文件夹复制到你电脑硬盘的D盘根目录下,并将其目录下的所有文件的只读属性去掉,具体操作如下:全选文件夹中的文件,鼠标右键单击出现文件属性对话框,单击“只读”属性前面复选框中的勾,使其只读属性去掉即可。然后双击文件夹中的“ISP编程器驱动软件.exe”启动编程软件,点击文件,在打开文件的对话框中找到工程文件夹中的目标文件smg1.hex打开即可,然后点击“AUTORUN”将程序烧写到单片机内部(如下图8)。图8:将程序烧写到单片机内部烧写完成了,把单片机从编程器中取出,然后插到S51增强型实验板上,插上USB电源,看看显示效果是不是和上面图4显示一样,是否有一点点的成就感呀!初学者也许会问:数码管显示一个数字“6”就要15行程序,太复杂了?的确有点复杂了,在上面程序中为了显示数字“6”,数码管的段码b、段码dp输出的是高电平,其它引脚输出的是低电平,实际上从单片机的P0.0~P0.7输出的是二进制码“10000010”,转换成十六进制为82H。因此,我们只要把所有要显示的数字和字符的段码根据硬件连接编制一个字形表,显示时直接把相应的字形码送到P0口就可以了。共阳LED数码管字形(段码)表显示数字(字符)P0.7dpP0.6gP0.5fP0.4eP0.3dP0.2cP0.1bP0.0a二进制代码十六进制代码01100000011000000C0H11111100111111001F9H21010010010100100A4H31011000010110000B0H4100110011001100199H5100101101001011092H6100000101000001082H71111100011111000F8H8100000001000000080H9100100001001000090HA100010001000100088HB100000111000001183HC1100011011000110C6HD1010000110100001A1HE100001101000011086HF10001110100011108EHH100010011000100189HO1100000011000000A3HP10000100100001008CHN1100100011001000C8H从上面表格中可以看到,显示“6”的十六进制段码值为82H,因此我们把刚才的程序修改一下,修改后的完整程序如下:MAIN:MOVP0,#82H; 将数字6的段码输出到P0口MOVP2,#0FEH; 从P2口输出数码管选通代码,即输出二进制“11111110”AJMPMAIN; 跳转到开始重新进行END; 程序结束看看修改后的程序将变得更加简洁,直观了,程序代码从原来的15行减少到仅4行,一样实现了相同的功能。这也就是我们要学习的编程技巧哦!在编程中尽量用最少的代码实现相同的功能。程序第1行的功能是将要显示的数字“6”的十六进制段码82H送到P0口,程序第2行的功能就是将数码管的选通代码#0FEH(即二进制11111110)送到P2口,从而控制第一位数码管显示,其它数码管熄灭。把修改过的程序编译后的目标文件写到单片机上看到显示效果是一样的。程序中用一行代码MOVP0,#82H 就输出了字形,因此我们要显示其它字形时只要从上面的数码管段码表中查出对应的十六进制字形码,用同样的方法把段码输出到P0口就可以了。比如我们要显示一个数字“8”,只需将程序中的MOVP0,#82H 语句改成MOVP0,#80H 即可,至此,我们终于可以随心所欲地控制数码管要显示的字形了,是不是很简单呀:)。另外,如果想让第二位数码管DG2显示,其它熄灭怎么办呢?其实很简单,只要把对应数码管的选通端口输出低电平就可以使该位数码管显示了,如指令CLRP2.1就可以让第二个数码管显示。。。程序中如果使P2.0~P2.4都输出低电平,那么实验板上的5个数码管都会被选通,显示出相同的字形,即显示“66666”。下面就是5位数码管显示出“66666”的程序,初学者可以实验一下,以加深对数码管显示位选通(使能)控制的理解。MAIN:MOVP0,#82H; 将数字6的段码输出到P0口MOVP2,#0E 0H; 从P2口输出数码管选通代码,使5位数码管均选通,即输出二进制“11100000”AJMPMAIN; 跳转到开始重新进行END; 程序结束单片机驱动数码管的动态显示编程 上面我们已经学习了数码管静态显示,接下来我们就学习数码管动态显示编程,编程让实验板上的数码管显示“89C51”。从原理图中(图5)我们可以看到,5个数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端是2连在一起的,那么当程序从P0口输出字形码时,在同一个时间所有数码管都会接收到相同的字形码。你一定会问,这样不是5个数码管都显示相同的数字了吗?如何显示出5个不同的字符“89C51”