51单片机数码管静态显示和动态显示原理及实验 夜猫子

发布者:创新驿站最新更新时间:2023-01-12 来源: zhihu关键字:51单片机  数码管  静态显示  动态显示 手机看文章 扫描二维码
随时随地手机看文章

数码管

多位数码管,即是两个或两个以上单个数码管并列集中在一起形成一体的数码管。当多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”有了这两个线后,通过单片机及外部驱动电路就可以控制任意的数码管显示。一般一位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚。

为了更方便区分段选和位选,请看下原理图:

如图为两个4位一体的数码管,可以看到与8个com相连的是两个数码管的位选,位选与引脚相连,所以位选控制那个灯亮。段选可以看到a,b,,,,,g并联到一起。因为是并联,所以点亮的数码管显示的数字相同。


共阴极数码管和共阳极数码管

图a数码管管脚图,图b是共阳极数码管,图c是共阴极数码管。

由图b可知共阳极数码管阳极连接在一起,接高电平,阴极对应的各段分别控制。比如要想显示1,则阴极对应的bc段低电平,其它接高电平,即可显示。

由图C可知,共阴极数码管将各个二极管的阴极连接在一起(阴极为低电平),而阳极控制各段,比如要显示1,则bc为高电平,其它各段低电平即可显示。


共阳极和共阴极数码管对照表:

共阳极数码管对照表(位选位高电平,各段选低电平控制数字显示)


uchar code table[]={

0xc0,//0

0xf9,//1

0xa4,//2

0xb0,//3

0x99,//4

0x92,//5

0x82,//6

0xf8,//7

0x80,//8

0x90,//9

0x88,//A

0x83,//B

0xc6,//C

0xa1,//D

0x86,//E

0x8e, //F

0x8c, //P

0xc1,//U

0x91,//Y

0x7c,//L

0x00,//全亮

0xff  //熄灭


共阴极数码管对照表(位选为低电平,段选为高电平)


uchar code leddata[]={

0x3F,  //"0"

    0x06,  //"1"

    0x5B,  //"2"

    0x4F,  //"3"

    0x66,  //"4"

    0x6D,  //"5"

    0x7D,  //"6"

    0x07,  //"7"

    0x7F,  //"8"

    0x6F,  //"9"

    0x77,  //"A"

    0x7C,  //"B"

    0x39,  //"C"

    0x5E,  //"D"

    0x79,  //"E"

    0x71,  //"F"

    0x76,  //"H"

    0x38,  //"L"

    0x37,  //"n"

    0x3E,  //"u"

    0x73,  //"P"

    0x5C,  //"o"

    0x40,  //"-"

    0x00  //熄灭

};


数码管显示原理

1.静态显示

多位数码管依然可以静态显示,但是显示时要么只显示一位数码管,否则一体的多位同时显示必须时显示相同内容。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选的信号都是相同的,那么他们显示的数字必定一样。(换言之,你可以通过位选控制那个数码管亮,但是亮的同时显示的数字必定相同)

2.动态显示

位选控制亮不亮,而段选控制显示数字,那怎样显示不同的数字呢?这就利用了人体肉眼观察的能力。

举个例子,假设段选1控制第一位数码管数字显示1,那么在显示第二个数码管是段选控制数码管显示2,而位选控制灯第二位数码管亮,第一位数码管灭。但是给人的感受是第一位数码管并没有灭(实际已经灭了),因为时间太短人体肉眼无法识别。这样就会发现数码管动态显示是向左或向右一位一位点亮。

静态数码管工作原理

静态数码管原理图:

因为共阳极数码管,所以位选接的是高电平,要想正常显示通过控制低电平来控制段选即可。


静态数码管代码实现:

#include

#include

typedef unsigned char u8; //重定义全局字符型变量

typedef unsigned int u16; //重定义全局整型变量

u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/*利用数组引用数码表(注次数码表为阴极数码表,因为是共阳极数码管,本应使用刚阳极数码管,

为了方便直接将共阴极数码表取反来使用)。code是将数组从ram调到ROM节省空间*/


/*延时函数*/

void dealy(u16 i)

{

while(i--);

}


void main()

{ int i=0;

  for(i=0;i<9;i++){

  P0=~table[i];//取反是因为使用的是阴极数码表,而取反得阳极数码表

  dealy(50000);

  }

  //p0=~table[0];  该写法是固定显示数字不变的写法,~table[0]显示的就为0

 

}

动态数码管工作原理

如图,位选的控制通过连接J16的管脚连接138译码器,利用138译码器控制位选。段选不是有单片机IO直接驱动,而是通过连接74HC25芯片连接管脚,利用芯片来实现段选。

因为是共阴极数码管,所以位选应接低电平,段选接高电平时,数码管正常显示。


译码器工作原理

可以有真值表观察,当使能控制都为低电平的情况下,A0A1A2输入不同电平控制输出。

例,A0A1A2为000(二进制为0,A为低位,C为高位)对应Y0就输出低电平,为001(二进制为1)输出Y1就位高电平。所以就相当于二进制十进制,十进制对应输出。

74HC25看自己的原理图即可,不再阐述。


动态数码管代码实现

#include

#include

typedef unsigned char u8; //重定义全局字符型变量

typedef unsigned int u16; //重定义全局整型变量


u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/*利用数组引用数码表(该数码管是共阴极数码管,所以使用共阴极数码表)。code是将数组从ram调到ROM节省空间*/


sbit LSA=P2^2;    //ABC分别连接单片机的P2^2,P2^3,P2^4管脚

sbit LSB=P2^3;

sbit LSC=P2^4;


/*延时函数*/

void dealy(u16 i)

{

while(i--);

}


/*动态显示函数

*参数说明

*ABC分别为138译码器的输入端,通过控制输入端来控制输出端的高低电平,从而实现对位选的控制

且A为二进制中的低位,C为高位*/

void Display()

{  u16 i=0;

for(i=0;i<8;i++)

{

 switch(i)

 {

 case 0:LSA=0;LSB=0;LSC=0;break; //利用138译码器来控制位选,当ABC都等于0时,y0为低电平,其余为高电平

 case 1:LSA=1;LSB=0;LSC=0;break; //Y1输出低电平

 case 2:LSA=0;LSB=1;LSC=0;break; //Y2输出低电平

 case 3:LSA=1;LSB=1;LSC=0;break; //Y3输出低电平

 case 4:LSA=0;LSB=0;LSC=1;break; //Y4输出低电平

 case 5:LSA=1;LSB=0;LSC=1;break; //Y5输出低电平

 case 6:LSA=0;LSB=1;LSC=1;break; //Y6输出低电平

 case 7:LSA=1;LSB=1;LSC=1;break; //Y7输出低电平

 }

 P0=table[i];  //第i个为低电平决定位选则跳出switch循环,P0提供段选(原理图可以看出)

 dealy(100);  // 短暂的延时,达到肉眼看不到的速度,以达到同时显示效果

 P0=0x00;     //清零,作用为了下一个显示不会产生重影

}

}


void main()

  while(1)

  {

  Display();

  }  


关键字:51单片机  数码管  静态显示  动态显示 引用地址:51单片机数码管静态显示和动态显示原理及实验 夜猫子

上一篇:51单片机独立按键和矩阵按键实现
下一篇:单片机点灯(点亮、闪烁、流水灯)

推荐阅读最新更新时间:2024-11-10 13:25

51单片机与蓝牙模块连接
不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手和我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。 此次学习用到模块是HC-06蓝牙模块,如下图: 该模块某宝有售,价格约为20RMB。某宝上的HC-06有两种,分别是带引脚和不带引脚的,建议新手购买带引脚的。我从试验开始到成功,一共使用了四块蓝牙模块。第一次买的是带引脚的,但是模块本身是坏的;第二次买的是不带引脚的,但是由于自身的焊功有限,导致模块损坏,无法使用;第三次是朋友送的蓝牙4.0,由于某些原因无法使用,在此也特别感谢朋友送我蓝牙;第四次购买,就是上图所示的蓝牙,才最终完成了试
[单片机]
<font color='red'>51单片机</font>与蓝牙模块连接
采用二维模糊控制器和C8051单片机实现室内自然采光系统的设计
1、 引言 从远古的篝火、油灯到蜡烛、白炽灯,再到今天千家万户的荧光灯,人类已经基本适应了人工光源的室内照明环境。但是由于千万年来的环境影响,自然光仍然是人类最习惯、感觉最舒适的光源,自然采光一直受到建筑师和照明设计师的高度重视。当今社会建筑的节能环保需求更对自然采光照明提出了进一步的要求。《建筑采光设计标准》 中的国家技术经济政策指出: 建筑设计要充分利用天然光,创造良好的光环境。 对室内照明自然采光的研究具有重要的意义: (1) 资料表明,照明用电占整个商业建筑能耗的25 - 40% ,而自然采光在特定的情况下可以节省52% 的照明用电,大大节约了能源。 (2) 相关研究表明,人在自然光条件下工作,可以增加满意度和提高工作
[单片机]
采用二维模糊控制器和C80<font color='red'>51单片机</font>实现室内自然采光系统的设计
51单片机串口收发字符串源程序
想要通过串口控制led,但是串口每次中断只能发送一个字符,这样在控制的时候不太容易清楚各个命令是控制哪一部分,所以参考网上的资料,写了个简单的字符串收发函数。本程序的功能是:电脑串口助手发送数据给单片机,单片机接收后返回给电脑,在发送的时候,需要空两格再输入想要传送的内容,不然的话传输的数据会丢失,因为这个情况不影响串口控制LED,所以就没管了。 单片机源程序如下: #include reg52.h typedef unsigned char uchar; typedef unsigned int uint; sbit led=P2^0; void Usart_Init() { TMOD=0X20; PCON=0X80; S
[单片机]
<font color='red'>51单片机</font>串口收发字符串源程序
51单片机的边沿触发及电平触发简介及测量
51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。 这个原理很好理解。但应用时需要特别注意的几点: 1)电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外
[单片机]
<font color='red'>51单片机</font>的边沿触发及电平触发简介及测量
AT89S51单片机串行口的内部结构及功能介绍
AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。 串行口的控制寄存器共有两个:特殊功能寄存器SCON和PCON。下面介绍这两个特殊功能寄存器各位的功能。 1、串行口控制寄存器SCON 串行口控制寄存器SCON,字节地址988H,可位寻址,位地址为98H~9FH。SCON的格式如下图所示。 下面介绍SCON中各位的功能。 (1) SM0、SMl:串行口4种工作方式选择位。 SM0、SM1两位的编码所对应的4种工作方式见下表。 表
[单片机]
AT89S<font color='red'>51单片机</font>串行口的内部结构及功能介绍
51单片机系列知识9--定时器、计数器(2)
二 1. 我们在对某一脉冲用单片机进行计数时,如何确定该脉冲允许的频率上限? 设置为计数工作方式时,通过管脚T0(P3、4)或T1(P3-5)对外部脉冲信号计数。当输入脉冲信号产生负跳变(或正跳变,具体情况要根据你对寄存器的设置),定时器的值加1。每个机器周期的S5P2期间,对外部输入进行采样,如在第一个周期中采得的值为1,而在下一个周期中采得的值为0,则在紧跟着的再下一个周期的S3P1期间,即24个振荡周期,因此外部输入的计数脉冲的最高频率为振荡频率的1/24。 对外部输入信号的占空比并设有什么限制,但为了确保某一给定的电平在变化之前至少被采样一次,则这一电平至少要保持一个机器周期。(Tcy为机器周期) △ 结论
[单片机]
PIC单片机实例二:基于I2C的SAA1064数码管显示
一.原理图 实现功能:四个数码管分为两组,四个按键也对应分为两组,每组控制对应数码管显示数据的加减,数据在0--99间循环显示,并具有掉电保护功能,通过24LC01B保存掉电前的数据.程序简单易读,是初学者的福音(因为我也是菜鸟)! 二.器件介绍 1.概述 SAA1064是Philips公司生产的4位LED驱动器,为双极型电路,具有I2C接口。该电路是特别为驱动4位带有小数点的七段显示器而设计的,通过多路开关可对两个2位显示器进行切换显示。该器件内部带有I2C总线从发送接收器,可以通过地址引脚ADR的输入电平编程为4个不同的从器件地址。内部的模式控制器可以控制LED的各个位以使其能够工作于静态模式、动态模式、熄灭模式
[单片机]
PIC单片机实例二:基于I2C的SAA1064<font color='red'>数码管</font><font color='red'>显示</font>
什么是堆栈?MCS-51单片机的堆栈怎样设置的?
程序设计时,往往需要一个后进先了的RAM区,以保存CPU的现场。这种后进先出的缓冲区,就称为堆栈。 MCS-51单片机的堆栈原则上设在内部RAM的任意区域内 。但是,一般设在31H~7FH的范围之间,栈顶的位置由栈指针SP指出。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved