实验二 数码管显示.docx
- 文档编号:4566501
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:18
- 大小:649.05KB
实验二 数码管显示.docx
《实验二 数码管显示.docx》由会员分享,可在线阅读,更多相关《实验二 数码管显示.docx(18页珍藏版)》请在冰豆网上搜索。
实验二数码管显示
实验二数码管显示
本实验的目的是掌握数码管的工作原理与使用,实现数码管的静、动态显示。
静态数码管
我们先看看什么是数码管,
上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。
不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。
数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。
而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。
上图展出了常用的两种数码管的引脚排列和内部结构。
总所周知,点亮发光二极管就是要给予它足够大的正向压降。
所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。
如上图左(一共a、b、c、d、e、f、g、DP八段),如果要显示“1”则要点亮b、c两段LED;显示“A”则点亮a、b、c、e、f、g这六段LED;我们还知道,既然LED加载的是正向压降,它的两端电压必然会有高低之分:
如果八段LED电压高的一端为公共端,我们称之为共阳极数码管(如上图中);如果八段LED电压低的一段为公共端,则称之为共阴极数码管(上图右)。
所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反之点亮共阴极数码管,则要在非公共端给予较高电平。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。
当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。
如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第“g,dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。
想让它显示几,就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0-9十个数字编码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。
共阳极数码管其内部8个发光二极管的所有阳极全部连接在一起,电路连接时,公共端接高电平,因此我们要点亮的那个发光管二极管就需要给阴极送低电平,此时显示数字的编码与共阳极编码是相反的关系,数码管内部发光二极管点亮时,也需要5mA以上的电流,而且电流不可过大,否则会烧毁发光二极管。
由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方法或使用专门的数码管驱动芯片,本实验板上使用的是74HC573锁存器,其输出电流较大,电路接口简单,可借鉴使用。
一般共阳极数码管更为常用,为什么呢?
这是因为数码管的非公共端往往接在IC芯片的IO上,而IC芯片的驱动能力往往是比较小的,如果采用共阴极数码管,它的驱动端在非公共端,就有可能受限于IC芯片输出电流不够而显示昏暗(比如51单片机),要外加上拉电阻或者是三极管加大驱动能力。
所以使用共阳数码管的好处是:
将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大IC芯片IO口的驱动电流简单许多。
另一方面,这样也能减轻MCU的负担。
当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”,有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示任意的数字了。
一般单位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚,关于具体的引脚及段、位标号大家可以查询相关资料,最简单的办法就是用数字万用表测量,若没有数字万用表也可用5V直流电源串接1k电阻后测量,将测量结果记录,通过统计便可绘制出引脚标号。
知识点:
如何用万用表检浏数码管的引脚排列
对数字万用表来说,红色表笔连接表内部电池正极,黑色表笔连接表内部电池负极,当把数字万用表置于二极管档时,其两表笔间开路电压约为1.5V,把两表笔正确加在发光二极管两端时,可以点亮发光二极管。
如下图所示,将数字万用表置于二极管挡,红表笔接在①脚,然后用黑表笔去接触其他各引脚,假设只有当接触到⑨脚时,数码管的a段发光,而接触其余引脚时则不发光。
由此可知,被测数码管为共阴极结构类型,⑨脚是公共阴极,①脚则是数码管的a段.接下来再检测各段引脚,仍使用数字万用表二极管档,将黑表笔固定接在⑨脚,用红表笔依次接触②、③、④、⑤、⑥、⑦、⑧、⑩引脚时,数码管的其他段先后分别发光,据此便可绘出该数码管的内部结构和引脚排列图。
检测中,若被测数码管为共阳极类型,则需将红、黑表笔对调才能测出上述结果,在判别结构类型时,操作时要灵活掌握,反复试验,直到找出公共端为止,大家只要懂得了原理,检测出各个引脚便不在是问题了。
数码管静态显示
当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那么它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。
从电路图可以看出,本开发板使用的是共阴极数码管,在每段数码管端加上一个限流电阻。
C程序:
/*******************************************************************************
*实验名:
静态数码管实验
*使用的IO:
数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3
*实验效果:
按下K1键,显示0,按下K2键,显示9,按下K3键,显示减1,按下K4键,
*显示加1。
*******************************************************************************/
#include
#include
#defineGPIO_DIGP0
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
sbitK1=P3^1;
sbitK2=P3^0;
sbitK3=P3^2;
sbitK4=P3^3;
unsignedcharcodeDIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
voidDelay10ms();//延时10ms
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain(void)
{
unsignedinti,j;
LSA=0;
LSB=0;
LSC=0;
while
(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay10ms();//消除抖动
if(K1==0)
{
j=0;
}
while((i<50)&&(K1==0))//检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0)//检测按键K2是否按下
{
Delay10ms();
if(K2==0)
{
j=9;
}
while((i<50)&&(K2==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K3==0)//检测按键K3是否按下
{
Delay10ms();
if(K3==0)
{
j--;
if(j>9)
j=9;
}
while((i<50)&&(K3==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K4==0)//检测按键K4是否按下
{
Delay10ms();
if(K4==0)
{
j++;
if(j>9)
j=0;
}
while((i<50)&&(K4==0))
{
Delay10ms();
i++;
}
i=0;
}
GPIO_DIG=DIG_CODE[j];
}
}
/*******************************************************************************
*函数名:
Delay10ms
*函数功能:
延时函数,延时10ms
*输入:
无
*输出:
无
*******************************************************************************/
voidDelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
汇编程序:
ORG00H
LJMPINIT
ORG30H
DB03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH
;*************;
;主程序;
;*************;
INIT:
CLRP2.2
CLRP2.3
CLRP2.4
MOVR1,#00H
START:
MOVA,R1
MOVDPTR,#30H
MOVCA,@A+DPTR
MAIN:
MOVP3,#0FFH
MOVP0,A
JNBP3.1,K1
JNBP3.0,K2
JNBP3.2,K3
JNBP3.3,K4
SJMPMAIN
;*************************;
;K1按键按下处理程序;
;*************************;
K1:
ACALLDELAY10MS;延时消抖
JBP3.1,MAIN
MOVR1,00H
MOVR2,#030H
KEY1_UP:
ACALLDELAY10MS
DJNZR2,KEY1_UP;按键延时
LJMPSTART
;*************************;
;K2按键按下处理程序;
;*************************;
K2:
ACALLDELAY10MS
JBP3.0,MAIN
MOVR1,#09H
MOVR2,#030H
KEY2_UP:
ACALLDELAY10MS
DJNZR2,KEY2_UP
LJMPSTART
;*************************;
;K3按键按下处理程序;
;*************************;
K3:
ACALLDELAY10MS
JBP3.2,MAIN
DECR1
MOVR2,#030H
KEY3_UP:
ACALLDELAY10MS
DJNZR2,KEY3_UP
CJNER1,#0FFH,KEY3
MOVR1,#09H
KEY3:
LJMPSTART
;*************************;
;K4按键按下处理程序;
;*************************;
K4:
ACALLDELAY10MS
JBP3.3,MAIN
INCR1
MOVR2,#030H
KEY4_UP:
ACALLDELAY10MS
DJNZR2,KEY4_UP
CJNER1,#00AH,KEY4
MOVR1,#00H
KEY4:
LJMPSTART
;*************;
;延时程序;
;*************;
DELAY10MS:
MOVR6,#015H
DE1:
MOVR7,#0F8H
DE2:
DJNZR7,DE2
DJNZR6,DE1
RET
END
动态数码管
1.动态扫描的原理
在实际的单片机系统中,往往需要多位显示。
动态显示是一种最常见的多位显示方法,应用非常广泛。
所有数码管段选都连接在一起的时候,怎么让数码管显示不一样的数字呢?
动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。
首先我们来看一下开发板上的电路原理图:
本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。
/*******************************************************************************
*实验名:
动态显示数码管实验
*使用的IO:
数码管使用P0,P2.2,P2.3,P2.4
*实验效果:
数码管显示76543210。
*注意:
*******************************************************************************/
#include
#defineGPIO_DIGP0
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharDisplayData[8];
//用来存放要显示的8位数的值
voidDigDisplay();//动态显示函数
/*******************************************************************************
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
无
*******************************************************************************/
voidmain(void)
{
unsignedchari;
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[i];
}
while
(1)
{
DigDisplay();
}
}
/*******************************************************************************
*函数名:
DigDisplay
*函数功能:
使用数码管显示
*输入:
无
*输出:
无
*******************************************************************************/
voidDigDisplay()
{
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
{
switch(i)//位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;break;//显示第0位
case
(1):
LSA=1;LSB=0;LSC=0;break;//显示第1位
case
(2):
LSA=0;LSB=1;LSC=0;break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
j=10;//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
在用C语言编程时,编码定义方法如下:
unsignedcharcodeDIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字,code即表示编码的意思。
需要注意的是,单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间中,编译后编码占用的是程序存储空间,而非内存空间。
汇编程序:
ORG00H
LJMPINIT
ORG30H
DB03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH,077H,07CH,039H,05EH,079H,071H
;0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
DAT0EQU30H;要显示的八位数
DAT1EQU31H
DAT2EQU32H
DAT3EQU33H
DAT4EQU34H
DAT5EQU35H
DAT6EQU36H
DAT7EQU37H
LSAEQUP2.2
LSBEQUP2.3
LSCEQUP2.4
GPIO_DIGEQUP0
;*************;
;主程序;
;*************;
INIT:
MOVDAT0,#03FH
MOVDAT1,#006H
MOVDAT2,#05BH
MOVDAT3,#04FH
MOVDAT4,#066H
MOVDAT5,#06DH
MOVDAT6,#07DH
MOVDAT7,#007H
MAIN:
CLRLSA;显示第一位
CLRLSB
CLRLSC
MOVGPIO_DIG,DAT0
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#000H;消隐
SETBLSA;显示第二位
CLRLSB
CLRLSC
MOVGPIO_DIG,DAT1
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#000H
CLRLSA;显示第三位
SETBLSB
CLRLSC
MOVGPIO_DIG,DAT2
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
SETBLSA;显示第四位
SETBLSB
CLRLSC
MOVGPIO_DIG,DAT3
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
CLRLSA;显示第五位
CLRLSB
SETBLSC
MOVGPIO_DIG,DAT4
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
SETBLSA;显示第六位
CLRLSB
SETBLSC
MOVGPIO_DIG,DAT5
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
CLRLSA;显示第七位
SETBLSB
SETBLSC
MOVGPIO_DIG,DAT6
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
SETBLSA;显示第七位
SETBLSB
SETBLSC
MOVGPIO_DIG,DAT7
ACALLDELAY;显示持续时间
MOVGPIO_DIG,#00H
LJMPMAIN
;*************;
;延时程序;
;*************;
DELAY:
MOVR7,#0FFH
DJNZR7,$
RET
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 数码管显示 实验 数码管 显示