您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第五节-七段数码管的使用
第五节数码管的使用5.1数码管简介同学们!相信你的流水灯也做的不错了吧,现在能玩出几种花样了?但是工程师们设计这么一个单片机,并不是只为了让它做流水灯的,那样也太浪费点了吧...^_^。数码管的一种是半导体发光器件,7段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛,数码管可以分为一位和多位它的外观如图5-1所示。图5-15.2数码管的显示原理数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,使用时com接正5伏电源,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,使用时com要将其接地。而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),8个LED的分布方式如图5-2所示。图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。那么,实际的数码管的引脚是怎样排列的呢?对于单个数码管来说,从它的正面看进去,左下角那个脚为1脚,以逆时针方向依次为1~10脚,左上角那个脚便是10脚了,上面两个图中的数字分别与这10个管脚一一对应。注意,3脚和8脚是连通的,这两个都是公共脚。它对应的引脚分布为图5-3所示。图5-2图5-3数码管的8段,对应一个字节的8位,a对应最低位,dp(小数点)对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两个编码的各位正好相反。如图5-4所示。图5-4那么,一位数码管要显示字符0~F,则对应的编码如表2所示。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。5.3一位数码管的显示请实现:让一位数码管依次显示字符0~F,每个字符显示1秒,如此反复。一般情况下,为了计算或取码的方便,我们把a-dp依次接到单片机某个口上的Px.0--Px.7上。x表示0,1,2,3其中的一个。这样我们只要给某个口,赋一个值,则相应的LED段就被点亮,但是在硬件连接上要注意了:单片机可能不能直接驱动LED,所以我们可以通过控制三级管的导通或截止,或者使用共阳极数码管(以灌电流的方式)、或者使用锁存器来驱动。来控制LED的亮与灭!5.3.1硬件的选择与仿真电路的设计1.打开Proteus,选择“File/NewDesign”菜单选项,新建一个“设计项目”。并将项目保存为“SEG7_1”。2.选择“P”按钮或菜单“Library/PickDivice/Symbol…P”菜单,从“元件库”中选取元件。依次添加其他元件。其名称和位置见下表。元件名称CategorySub-CategoryResultsAT89C52MicroprocessorICs8051FamilyAT89C527SEG-MPX1-CA(注1)Optoelectronics7-SegmentDisplays7SEG-MPX1-CARX8(注2)ResistorsResistorPacksRX8RESPACK-8(注3)ResistorsResistorPacksRESPACK-8注1:7SEG表示7段数码管(Proteus还提供了14段和16段数码管)MPX1表示1位(Proteus还提供了2位、4位、6位和8位数码管)CA表示共阳极(CC表示共阴极)注2:RX8表示电阻排,它实际相当于8个电阻并排摆放在一个容器内。在这里是作为限流电阻来使用的。注3:RESPACK-8表示电阻排,它实际相当于8个电阻并排摆放在一个容器内,但是这8个电阻的一段是连接在一起作为公共端的。在这里是作为P0口的上拉电阻来使用的。依次从备选元件库中摆放器件,连线,画出仿真电路图,如图5-5所示。图5-5注意:在Proteus中,实际上,51单片机是不需要晶振、复位电路和电源就可以仿真的,因此,为了方便我们教学,以后,我们将不再画上述51的外围电路。5.3.2程序的设计1.新建一个keil项目,并命名为“SEG7_1”并添加一个名为“main.c”的源代码文件,然后键入如下代码。如代码5.1所示。//代码5.1#includereg52.h#defineSegPortP0//定义数码管连接的端口#defineucharunsignedchar//宏定义将unsignedchar替换为较为简单的uchar写法#defineuintunsignedint//宏定义将unsignedint替换为较为简单的uint写法//用一个数组来定义字符0~f共阳极数码管编码ucharcodeseg7ca[]={0xc0,0xf9,0xa4,0xb0,//0~30x99,0x92,0x82,0xf8,//4~70x80,0x90,0x88,0x83,//8~b0xc6,0xa1,0x86,0x8e//c~f};//延时函数ms毫秒voidDelayMs(uintms){uinti,j;for(i=0;ims;i++){for(j=0;j124;j++);}}voidmain(){while(1)//无限大循环{//这段代码将字符0~F轮流显示一遍,每个字符显示1秒uchari=0;//从数组第一个元素开始显示for(i=0;i16;i++){SegPort=seg7ca[i];//按次序显示字符0~FDelayMs(1000);//延时1秒}}知识点:数组seg7ca[]的定义格式:数据类型(数组位置)数组名称[]={数组元素1,数组元素2,……};知识点:code关键字“code”是C51所定义的关键字,他的含义是定义将代码放在ROM中,由于51的RAM很小,因此,为了节约有限的RAM,我们通常会把一些不会变化的数据(比如数码管的编码、参数表等等)放在ROM中,这样,我们就可以多空出一些RAM供程序来使用。那么怎样把这些常量放在ROM中呢,即给定义语句前添加一个“code”关键字,告诉编译器,这些常量要放在ROM中,如果没有添加“code”,那么这些编码就会放在RAM中。同学们可以通过删除“code”关键字,重新build程序,然后查看程序占用RAM的大小,来验证“code”关键字的作用。知识点:数组元素的访问数组元素是通过他的序号来访问的。例如数组seg7ca[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}一共有16个元素,其中0xc0的序号为0(请记住,数组中的第一个元素序号为0),0xf9的序号为1,……,0x8e的序号为15,以此类推。那么当我们想要使用0xc0时,我们可以使用“seg7ca[0]”这种方式。因此,代码“SegPort=seg7ca[i]”;//按次序显示字符0~F程序代码说明uchari=0;//从数组第一个元素开始显示for(i=0;i16;i++){SegPort=seg7ca[i];//按次序显示字符0~FDelayMs(1000);//延时1秒}这段代码将字符0~F轮流显示一遍,每个字符显示1秒当for循环开始时,i=0,因此,SegPort=seg7ca[0];由于SegPort是P0,seg7ca[0]=0xc0,因此,P0=0xc0,即P0口送出0xc0,由于0xc0是共阳极数码管字符“0”的编码,因此,数码管显示字符“0”。当for第二次循环时,i=1,因此,SegPort=seg7ca[1];即,P0=0xf9,即P0口送出0xf9,由于0xf9是共阳极数码管字符“1”的编码,因此,数码管显示字符“1”。以此类推,随着for循环,P0口送出数组seg7ca所定义的16个元素,从而在数码管上显示对应的十六个字符。5.4多位数码管的显示想必大家已经可以把0-F显示出来了吧!但是如果要你显示两位数,三位数呢?让我们实现如下功能:让两位数码管显示数字“15”。或许,有的朋友会这么想:在P0口上接一个数码管,再在P1口上接个数码管!但是,如果要显示4位、5位的数字呢?那岂不是一块AT8951都接不过来!难到就不能接4位或5位以上的吗?肯定不是的!说到这里,我们来讲讲数码管的显示方式,可分为两种:动态扫描和静态显示。上面我们所说的即为静态显示。但是如果我们采用动态扫描显示,那么就可以解决上面的问题,动态扫描是指每隔一段时间循环点亮每个数码管,每次只有一个数码管被点亮。细心的朋友会问这样的问题:是让数码管一个一个亮,那还是不能控制数码管一起亮或灭嘛!怎么解决?其实,人的眼睛有视觉暂留效应,黑夜里,拿着一支烟,在你面前快速的晃动,你会发现什么样的现象?是不是原本不连续的点变成了一条看上去连续的曲线或者直线!再回过头来,仔细想想我们的数码管!原理是一样的,只要我们快速的循环显示每个数码管,人的眼睛看起来就好像是它们同时被点亮了,关键是速度。比如点亮6位数码管,硬件连接可以这样解决:a--dp还是接至P0.0--P0.7上,还有6个COM脚再接至另外口的P2.0--P2.5。P0口作段选(控制数字字符),P2口作位选(选通哪个数码管被点亮)这样我们控制P0和P2口就可以控制6个数码管了。5.4.1硬件的选择与仿真电路的设计1.打开Proteus,选择“File/NewDesign”菜单选项,新建一个“设计项目”。并将项目保存为“SEG7_2”。2.选择“P”按钮或菜单“Library/PickDivice/Symbol…P”菜单,从“元件库”中选取元件。依次添加其他元件。其名称和位置见下表。元件名称CategorySub-CategoryResultsAT89C52MicroprocessorICs8051FamilyAT89C527SEG-MPX2-CC(注1)Optoelectronics7-SegmentDisplays7SEG-MPX2-CCRX8ResistorsResistorPacksRX8RESPACK-8ResistorsResistorPacksRESPACK-874HC573(注2)TTL74HCseriesFlip-Flops&latches74HC573注1:7SEG表示7段数码管、MPX2表示2位、CC表示共阴极(CC表示共极)注2:74HC573是一个8位锁存器,在这里主要是提供锁存和驱动功能。依次从备选元件库中摆放器件,连线,画出仿真电路图,如图5-6所示。图5-61.连线的标号连接法:由于某些连线不太方便直接连接,或者由于美观原因,我们可以采用标号连接。例如,我们想将51的P1.2引脚和74HC573的“LE”引脚相连,方法如下:(1)先将51的P1.2引脚和74HC573的“LE”引脚各用鼠标延长一段。(2)点击Proteus侧边工具栏的“LBL(WireLabelMode)”按钮,如图5-7所示。图5-7图5-8(3)将鼠标移动到51的P1.2引脚点一下,出现如下“EditWireLabel”窗口,在“EditWireLabel”窗口的“string”编辑框中填入该引脚的名称,比如“P12”,然后点击“OK”。如果5-8所示。(4)再将将鼠标移动到74HC573的“LE”引脚点一下,再在“EditWireLabel”窗口的“string”编辑框中填入该相同的名称,比如“P12”,然后点击“OK”。WireLabelMode按钮(5)这样,引脚标号相同的引脚就会被物理的连接在一起了。2.74HC573的使用74HC573为8位3态非反转透明锁存器。数据从D0~D7引脚输入,从Q0~Q7引脚输出。他的真值表如图5-9所示。图5-9OE为输出使能端,低电平有效,当OE为高电平时,D和Q不通,即
本文标题:第五节-七段数码管的使用
链接地址:https://www.777doc.com/doc-2147078 .html