51单片机【三】静态与动态驱动数码管

发布者:BlissfulSunrise最新更新时间:2020-03-15 来源: eefocus关键字:51单片机  静态  动态  驱动数码管 手机看文章 扫描二维码
随时随地手机看文章

数码管结构及分类


数码管是发光器件之一,内部由七个条形发光二极管(a,b,c,d,e,f,g)和一个小圆点发光二极管(dp)构成,51单片机开发板上为八段数码管,如下图所示,根据各段的组合不同,显示的字符也就不同。

按八个数码管的公共端接线不同,数码管又可分类为共阴极数码管和共阳极数码管两种。共阴极数码管的公共端接地,而共阳极数码管的公共端接电源,接线如下图所示(左为共阴极,右为共阳极)。当连接的单片机接口为高电平时共阴极数码管亮;反之,连接的接口为低电平时则共阳极数码管亮。

void DigDisplay(void)

{

unsigned char i = 0;

 

// 首先确定位码,选中最左侧数码管,注意查38译码器的真值表,gagbgc为38译码器的ABC端口

gA = 0;

gB = 0;

gC = 0;

// 依次显示0-F

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

{

DIG_PORT = gDuanMa[i];/*这个数组已经定义16个元素对应0-f的段码,DIG_PORT是共阴极数码管段码经74HC573接P0端口*/

//Delay();

delay800ms();

J6是一个跳线 当接LE和P10时可以通过软件调节P10电压从而影响LE从而影响数码管的效果(设置这个主要是因为p0会接入多个原件) 而接VCC始终保持高电压

上面是38译码器简单点说就是输入三个信号输出八种信号,因为三种0或1可以有八种组合

上面是74HC573是将电压放大使二极管发亮强度更大,逻辑上并不存在。


上面是38译码器的真值表可以通过查找此表判断输入那三个值使8个led中的那个亮

驱动过程是这样的


1.选择哪一组led亮(同一时间只有一组LED会亮)


使用38译码器选择一组led灯使之一侧电压为低 其他全部为高


2.使这组显示确切的数字


从CPU引脚到73再到数码管 给的全是高电压因此只有选中的那组可以亮 下面通过p0端口将段码输入产生确切的高低电压使每颗正确的led发光出确切的数字 


下面是动态驱动数码管


其基本原理不变 本质上也是一个一个去点亮数码管 但是运用了人眼的视觉暂留 导致视觉上看是始终存在的


void DigDisplay1(void)

{

// 第1个数码管上显示1

gA = 1; gB = 1; gC = 1; // 位选第1个数码管

DIG_PORT = gDuanMa[1]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第2个数码管上显示2

gA = 0; gB = 1; gC = 1; // 位选第2个数码管

DIG_PORT = gDuanMa[2]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第3个数码管上显示3

gA = 1; gB = 0; gC = 1; // 位选第3个数码管

DIG_PORT = gDuanMa[3]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第4个数码管上显示4

gA = 0; gB = 0; gC = 1; // 位选第4个数码管

DIG_PORT = gDuanMa[4]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第5个数码管上显示5

gA = 1; gB = 1; gC = 0; // 位选第5个数码管

DIG_PORT = gDuanMa[5]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第6个数码管上显示6

gA = 0; gB = 1; gC = 0; // 位选第6个数码管

DIG_PORT = gDuanMa[6]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第7个数码管上显示7

gA = 1; gB = 0; gC = 0; // 位选第7个数码管

DIG_PORT = gDuanMa[7]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第8个数码管上显示8

gA = 0; gB = 0; gC = 0; // 位选第8个数码管

DIG_PORT = gDuanMa[8]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

}

 

 

 

消隐的原因是当程序在执行位选下一个数码管时但是传输的还是上一个数码管的段码导致在显示上会闪动一下


void DigDisplay2(void)

{

u8 i;

 

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

{

switch (i) //位选,选择点亮哪个数码管

{

case 0:

gA = 1; gB = 1; gC = 1; 

break; //显示第0位

case 1:

gA = 0; gB = 1; gC = 1; 

break; //显示第1位

case 2:

gA = 1; gB = 0; gC = 1; 

break; //显示第2位

case 3:

gA = 0; gB = 0; gC = 1; 

break; //显示第3位

case 4:

gA = 1; gB = 1; gC = 0; 

break; //显示第4位

case 5:

gA = 0; gB = 1; gC = 0; 

break; //显示第5位

case 6:

gA = 1; gB = 0; gC = 0; 

break; //显示第6位

case 7:

gA = 0; gB = 0; gC = 0; 

break; //显示第7位

default:

break;

}

DIG_PORT = gDuanMa[i+1]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

}

}

关键字:51单片机  静态  动态  驱动数码管 引用地址:51单片机【三】静态与动态驱动数码管

上一篇:51单片机【二】LED闪烁及流水灯附带c语言位操作
下一篇:51单片机点亮LED点阵

推荐阅读最新更新时间:2024-11-09 02:37

51单片机~继电器,续流二极管相关原理
继电器: 继电器上标识:AC表示交流电,最下面一行05V是5V额定电压。下面的30VDC表示直流电压30V。 继电器电路图接:如下图中间部分; (1) 4,5口是D,E; (2)2常开,3常闭; (3)1,3组成闭合,1和2组成开启; 使用衔铁的原因:衔铁不会被磁化。 续流二极管: 》工作原理:(用感应电动势相关知识理解)所以续流二极管需要在电路截至后迅速打开。
[单片机]
<font color='red'>51单片机</font>~继电器,续流二极管相关原理
51单片机之T2定时器串口通信
52芯片,比51要多一个定时器。所以我在网上也是看了很多资料,许多都不能运行,我在进行部分修改后,终于在keli和proteus上实现了仿真测试。以下是我的代码和设计的电路。 /*----------------------------------------------------------------------------- * 实 验 名 : RS232串口试验 * 实验说明 : 单片机串口接收数据控制灯亮灭 * 连接方式 : * 注 意 : 该试验使用的晶振是11.0592 ****************************************************
[单片机]
89C51单片机的中断基础
INT0表示interrupt 0即外部中断0 INT1表示interrupt 1即外部中断1 这是对应的锁存器控制,因为包含在头文件中所以不需要单独定义。 INT0位于TCON锁存器中的最后一位 EX0位于IE锁存器的最后一位 ET0位于IE锁存器的倒数第二位 #include reg52.h sbit led=P3^0; void main() { IT0=1; //设置外部中断0的触发方式为下降沿 EX0=1; //开启外部中断0 //中断的设置,首先设置中断的触发方式,再设置开启终端,最后开启总中断。 IT1=1; //设置外部中断1的触发方式为下降沿
[单片机]
89C<font color='red'>51单片机</font>的中断基础
51单片机烧写芯片无法工作的故障分析
故障现象: 做了一个单片机温度监测系统,仿真机上一切正常,烧写芯片无法工作。 相关电路框图: 用51做处理器,外围电路如图,一片双积分转换芯片ICL7135做AD,它的时钟需要125K,用51的ALE经过一片CD4024分频得到。1403提供基准源。另外,一片7660提供7135工作所需要的负压。 为了省电,把所有模拟电路部分电源用一个晶体管管理起来,由P1.0来控制。(上图为示意图,省去了电阻没画)P1.0为地的时候,模拟系统才上电 现在怪现象如下: 仿真机正常运行,烧写芯片后无反应。 仿真正常,说明外围芯片完全正常,电路也没有错误。 经过检查,晶体正常,复位可靠,EA高,程序堆栈都没有溢出,并排除其它一切低级错
[单片机]
<font color='red'>51单片机</font>烧写芯片无法工作的故障分析
蜂鸣器播放DOREMI+普中51单片机+江科大自化协
现象 在无源蜂鸣器上循环演奏低音“DO、RE、MI、FA、SO、LA、SI”这7个音调。 参考程序 1 主函数 #include REGX52.H #include delayms.h #include timer0.h sbit Buzzer = P2^5; //音调与频率对照表,低中高:1,1#,2,2#,3,4,4#,5,5#,6,6#,7 //unsigned int FreqTable ={ // 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528, // 64580,64633,64684,647
[单片机]
51单片机存储器内存的讲解
  51单片机当中的存储器从功能性上来划分可以分为程序存储器与数据存储器。一般来说单片机存储器的存储空间是能够进行存储空间拓展的,但是如何进行拓展则需要根据不同的存储器类型进行选择,本文就将为大家针对这个问题进行讲解。   访问存储空间时,需要用到两个指针变量,为DPTR和PC。其中pc为程序计数器,指向下一条需要执行的指令的地址,DPTR为数据指针寄存器,这两个变量的长度都为16位,这是51单片机内部结构决定的,无法改变。所以这两个指针的寻址能力都为64K。这样看来,两类存储器的扩展能力都为64K。但是,如果实际扩展过存储器,就可以发现程序存储器的扩展能力并没有64K。   为什麽会这个样子呢?这得从51单片机的存储空间
[单片机]
51单片机——LED发光二极管、蜂鸣器C语言入门编程
最近在哔站学完了51单片机,准备复习的时候却发现找不到比较适合自己的一些资料,所以就想自己总结一个适合已入门学者基于51单片机的资料。 接下来将参考江科大的代码风格根据普中51单片机开发攻略在A2开发板编写程序。 LED发光二极管: 长脚为正,短脚为负。由原理图可以知道,LED的正极都接了VCC,我们需要控制的引脚就约等于LED的负极,只需给低电平,LED两端有电压差就会点亮。(低电平点亮) 1.点亮第一个LED:P2_0亮 #include REGX52.H void main() { while(1) { P2_0=0; } } 2.LED闪烁:P2_0以1S为周期
[单片机]
<font color='red'>51单片机</font>——LED发光二极管、蜂鸣器C语言入门编程
80C51单片机模仿实例100—2 从左到右的流水灯
废话不多说,直接上图。 /* Main.c file generated by New Project wizard * * Created: 周六 11月 25 2017 * Processor: 80C52 * Compiler: Keil for 8051 * Author: Chenchong */ #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; void DelayXms(uint x) { uchar i; whil
[单片机]
80C<font color='red'>51单片机</font>模仿实例100—2 从左到右的流水灯
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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