51单片机学习篇-- --静态数码管的显示(74HC138译码器,74HC245锁存器,74HC573锁存器)

本文介绍了数码管的工作原理,包括共阴极和共阳极接法,并详细解析了74HC138译码器和74HC245锁存器在数码管控制中的作用。通过实例代码展示了如何用单片机控制数码管显示数字0,帮助初学者理解数码管显示的电路设计和编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇先说一句废话····
本旺名字叫萨摩耶,,Please 叫我旺财,,,哈哈,招财进宝嘛!

数码管的介绍

啥是个数码管呢?先来看一些数码管的照片。
在这里插入图片描述

其实数码管就是通过点亮里面的发光二极管来发光的。接着来看看数码管的电路图。
图片来自百度根据上图,我们想要用数码管来显示内容,就是点亮对应的发光二极管,比如想要让数码管显示一个数字0,那么我们只需要点亮发光二极管ABCDEF即可。 而这八个二极管的连接方式有两种:共阴极接法和共阳极接法

共阴极接法:顾名思义就是把这几个二极管的阴极连接在一起,通常情况下,连接在一起接地(低电平)。所以我们想要点亮那个二极管只需要在对应二极管的阳极接上高电平即可点亮。

共阳极接法:同样,这就是把这几个二极管的阳极连接在一起,通常情况下,连接在一起之后一起接VCC(高电平)。所以我们要想点亮那个二极管就需要在对应二极管的阴极接上低电平即可。

每个人的板子不一样,所以共阴极还是共阳极请自行判断。比如我的就是共阴极接法。 这两个接法刚好相反,后面的高低电平应该是相反的。

接下来先看看在实际电路中数码管。
51单片机
乍一看,这点路对于像我这样的新手是有点复杂的,而且还出现一个之前没有见过的一个芯片 74HC245锁存器.还另外有一个芯片是74HC138译码器

有两个词,就是位选和段选
位选:其实就是控制哪一个数码管显示
段选:其实就是控制数码管显示的内容

74HC138译码器和74HC245锁存器

74HC138译码器也叫3-8译码器,简单来说就是三通道输入,八通道输出,通过对三通道的操作实现对八通道的控制。看原理图。
74HC138译码器在上面的原理图中,
左边的输入通道有六个,上面的ABC分别接P2.2口,P2.3口,P2.4口,下面的G1接VCC,G2A和G2B接GND.
右边的输出通道有八个,Y0–Y7
所以通过对左边ABC的输入来控制右边Y0–Y7的输出。

重要的一点,就是这些Y0–Y7上面都有一个杠,就是Y0非,为什么要专门说一下,就是因为加个非意思就是只对低电平有效,对于高电平是截至。说这些的目的就是在位选的时候想点亮哪个数码管就必须译码器对应的输出口是低电平。

接下来就有了真值表。
真值表而在我们单片机里面G1接VCC,G2A和G2B接GND,所以我们能用到的真值就是上表里的下面的八组数据

比如只想右边Y0输出低电平,其余输出高电平,则左边ABC必须输入低电平(见真值表数据第四行)

74HC245锁存器原理图如下
74HC245其实看这个电路图不能很好的表述锁存器的作用。应该这个电路图里1接高电平,19接低电平 锁存器是直接打开的,只需要把对应的数据从P0口输入就好。

这里有74HC573芯片的在单片机的原理图作为对锁存器的一种学习。

图片是从郭天祥的 新概念51单片机教程,入门,提高,开发。这本书的P58截图这本书作为对51单片机讲解非常好,我也下载了电子版作为一种辅助学习,有兴趣的可也以下载使用。
74HC573锁存器
根据上面的原理图,可以看出在这里,锁存器有两部分U1和U2,。而这两部分也很相似,

对于左边,1口都接地,下面的D0–D7都接P0口,11口U1接MCU的P2^6,U2接P2 ^7.
对于右边,U1的Q0–Q7接数码管里面的发光二极管(段选),U2的Q0–Q5接数码管(位选)。

首先先位选,控制哪个数码管来显示,接着段选,控制数码管显示的内容。要想先位选,必须打开U2锁存端,然后把位选信号送入端口,然后关闭U2。同理,接着段选,先必须打开U1锁存端,然后把段选信号送入端口,然后关闭U1。而打开和关闭锁存器的锁存端,因为两个元件的1端口都接地,则打开就是在11端口接高电平,关闭就是接低电平。

上代码方便理解。

#include "reg52.h"
sbit dula = P2^6;   //声明U1锁存器的锁存端  段选
sbit wela = P2^7;   //声明U2锁存器的锁存端  位选
void main(){
	wela = 1;       //打开U2锁存端
	P0 = 0xfe;      //送入位选信号
	wela = 0;       //关闭U2锁存端
	
	dula = 1;       //打开U2锁存端
	P0 = 0x3f;      //送入段选信号
	dula = 0;       //关闭U2锁存端

	while(1);
}

这三个芯片在百度搜也有简介,单片机芯片资料里面也有,有兴趣的可以去看看呢。

让最后面的数码管显示数字0

了解了上面的内容,接下来写一个小程序,就是让最后的数码管显示数字0.

首先找到原理图中最后一个数码管就是LED1,而LED1对应74HC138译码器里面右边得Y0口,所以位选时必须让LED1对应的Y0口输出低电平。而显示0,则让数码管里的abcdef发光二极管亮,g,dp不亮,所以让P0口输出0x3f即可。

#include "reg52.h"
//段选
#define DULA P0
//位选
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void main(){
	LSA = 0;
	LSB = 0;
	LSC = 0;
	DULA = 0x3f;
	
	while(1);
}

仿真电路
在这里插入图片描述

### 使用74HC595驱动八位数码管的连接方式 为了实现使用74HC595驱动八位数码管的功能,需要理解74HC595移位寄器的工作原理以及其与数码管之间的接口设计。 #### 1. 硬件连接说明 74HC595是一种8位串入并出(SIPO)移位寄器芯片,具有储寄器和三态输出功能。该器件可以用来扩展微控制器的GPIO引脚数量,在此应用中用于控制多位数码管的段选信号[a-g, dp]或者位选信号[^2]。 对于八位数码管而言,通常有两种不同的连接方法: - **静态显示模式**:每一位数码管都需要独立的一组段选线(a-g及dp),这样会占用较多的IO资源; - **动态扫描模式**:采用分时复用技术,所有数码管共享同一套段选线路,而每位数码管单独由一个使能端控制亮灭状态。这种方式节省了大量IO口,并且只要刷新频率足够高就可以让人眼感觉不到闪烁现象[^1]。 当选用后者作为设计方案时,则可以通过一片或多片级联起来的74HC595来负责传输数据给各个数码管对应的段选线上;另外还需要额外增加一些逻辑元件比如3到8线译码器(如74LS138),以便于完成对不同位置上的数码管的选择操作[^5]。 具体的连线关系如下所示: | 功能 | 描述 | | --- | --- | | DS (Data Serial input) | 接单片机的数据发送引脚(P0.x), 负责向74HC595输入要显示的内容| | SH_CP (Shift Register Clock) | 单片机提供脉冲信号触发内部移位过程 | | ST_CP (Storage Register Clock) | 当SH_CP上升沿到来之后再给出一次跳变使得当前已进入缓冲区内的数值被至输出端口中去 | | OE (Output Enable) | 控制是否允许输出,默认低电平有效 | 此外还需注意的是如果想要达到更好的视觉效果应该适当调整上述三种同步时序的关系以确保每次只有一位数码管处于导通状态下工作[^4]。 ```c // 定义74HC595所需的操作函数 void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val){ pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); for(int i=0; i<8; ++i){ digitalWrite(clockPin, LOW); // 下降沿准备写入新bit if(bitOrder == LSBFIRST){ // 小端优先则先送最低位 digitalWrite(dataPin, ((val >> i) & 0x01)? HIGH : LOW ); }else{ // 大端优先则相反顺序处理 digitalWrite(dataPin, ((val << i) & 0x80)? HIGH : LOW ); } digitalWrite(clockPin,HIGH); // 上升沿实际执行转移动作 } digitalWrite(clockPin,LOW); // 结束后恢复初始条件 } ``` 以上代码片段展示了如何利用Arduino平台下的`shiftOut()`库函数简化针对74HC595设备的数据传送流程。 #### 2. 编程实例 这里给出一段简单的C语言源程序示范怎样让八个共阳极型七段显示器依次循环滚动显示出数字'0'-‘9’: ```c #include <reg52.h> sbit latch = P2^0; sbit clk = P2^1; sbit dat = P2^2; unsigned char code segCode[]={ 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int ms){ while(ms--); } void sendTo74HC595(unsigned char value){ unsigned char i; latch=0; for(i=0;i<8;i++){ if(value&0x01) dat=1; else dat=0; clk=0; clk=1; value=value>>1; } clk=0; latch=1; } void main(){ unsigned char num,i; while(1){ for(num=0;num<=9;num++){ for(i=0;i<8;i++){ sendTo74HC595(~segCode[num]); // 发送到74HC595 delay(60000); // 延迟一段时间保持稳定显示 sendTo74HC595(0xFF); // 关闭当前位数码管 } } } } ``` 这段代码实现了通过74HC595驱动多个数码管逐个点亮的效果,其中包含了基本的时间延迟机制以保证足够的持续时间供肉眼识别所呈现出来的字符形状。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值