设计与开发

单片机数码管的位选 单片机驱动数码管设计详解(用74HC595实现)

小编 2024-10-08 设计与开发 23 0

单片机驱动数码管设计详解(用74HC595实现)

简单设计了一个单片机驱动数码管的电路,该设计中只使用了4位数码管,占用了单片机3个IO口,如果驱动芯片全用满可以驱动8位数码管。仅供初学者分享学习。

1. 数码管显示设计

本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。74HC595部分电路图如下:

与单片机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。两片595采用级联方式,即U2的第9脚接到U3的第14引脚。

2. 74HC595简介

74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。其管脚介绍如下:

15:数据输出A-接数码管数据A段;

1:数据输出B-接数码管数据B段;

2:数据输出C-接数码管数据C段;

3:数据输出D-接数码管数据D段;

4:数据输出E-接数码管数据E段;

5:数据输出F-接数码管数据F段;

6:数据输出G-接数码管数据G段;

7:数据输出H-接数码管数据H段;

16:电源正脚-接电源正;

8:电源负脚-接电源负;

14:数据输入脚-接单片机管脚;

12:数据锁存时钟-接单片机管脚;

11:数据输入时钟-接单片机管脚;

13:使能输出脚-低电平有效,接低电平;

10:数据清零-不清零,接高电平;

9:数据级联输出-接下一片595的数据输入脚;

74HC595的真值表如下:

知道了74HC595的引脚定义和真值表,那该如何编程呢?下面重点来了,通过时序图来编程。看重点!!!

3. 74HC595时序图

我是重点!我是重点!我是重点!

通过时序可以看出:

SCK是上升沿的时候要把数据写入;

RCK是上升沿的时候数据才能锁存显示;

有数据操作的过程中RESET必须是高电平;

EN必须是低电平,595才能工作;

知道了以上4点就可以写程序了。其中3、4条是硬件连接上的事情(也可以用单片机的IO口来连接,这样的话可以随时控制74HC595的工作与否情况)。写程序主要靠1、2条。下面具体操作。

4. 程序实例

看下面一段程序:

第39行:HC595_CLK(0)的原型如下:

HC595_CLK(0)是让CLK处于低电平,即上升沿还没有来到;

HC595_DAT(1)就是要把写入的数据准备好;

temp<<1是将数据移位,即一个字节分八次写入;

HC595_CLK(1)是让CLK处于高电平,即上升沿来了;

以上几句解释一下就是:

在CLK时钟上升沿来临之前把要写入的数据准备好,等上升沿来了就把准备好的数据写入。 这就是对时序图的解释。

记住,这仅仅是把数据写入到了74HC595中,但是还没有让74HC595锁存,即没有让数据显示出来,如果让数据显示的话,必须要给RCK一个上升沿(即时序图中的第2条),操作如下:

单片机执行完这个程序后,数据才会在数码管上显示出来。

这一节内容的难度较大,主要是因为时序图这个东西是很模糊的一个内容,大家可以慢慢理解体会。

本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。公众号:micropoint8

实战之8051驱动8位数码管

8051驱动共阴极

过年有点时间,整理电脑,翻到一个之前的小作品,应一位刚入门的朋友的要求做的,控制8位数码管,依次显示0~9。发出来给大家瞧瞧。

由于当时手上没有开发板,就用Proteus来做电路仿真了。

工作环境:

Keil uVision5

Proteus 8 Professional

数码管

首先了解下数码管的相关知识

数码管的基本单元是发光二极管,按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位、8位等数码管。

>数码管内部原理

上图是一个数码管的内部示意图,一个数码管的显示部分由8个二极管构成,刚好是一个字节,51单片机也是8位单片机。

根据内部发光二极管的公共连接端不同,可以分为共阳极接法和共阴极接法,共阳极接法就是发光二极管的正极共同接电源VCC,通过控制每个发光二极管的负极是否接地来显示数字。共阴极接法就是每个发光二极管的负极共同接地GND,通过控制每个发光二极管的正极是否接电源来显示数字。

图中a~g管脚分别控制着每个发光二极管的亮灭,所以,如果要显示1的话,只需要点亮b,c两段即可(把单片机对应端口输出0x06即可);如果要显示数字5,则只需要点亮a,f,g,c,d段即可组成数字5的显示(0x6d)。

>多位数码管内部原理图

上图是4位数码管的内部接线,每位数码管的阳极(或阴极)相连,其他相同引脚的引脚相连,一共有12个控制引脚,也可以得出8位的数码管有16个控制引脚,8个共阳(或共阴)端,8个控制a~g显示内容。

74LS138译码器

从数码管的显示原理来看,一个数码管要显示不同的字符,就要对数码管中的每个二极管进行不同控制,每个二极管要用到单片机的一个控制引脚,比如在实际应用中八位的共阴极或共阳极数码管,共有16个引脚,如果都使用单片机引脚进行控制,这就太浪费了,本来单片机的资源就很紧张。

解决办法是用一个译码器作为数码管的位选择器,需要哪一位显示就控制哪一位数码管的共阳(或共阴)端。

74LS138译码器1~3为输入端,由高到低为CBA; 7~15为输出端,由高到低为Y7-Y0。

工作过程:输入端输入三位二进制数,转成十进制,经过译码器后,输出端对应该十进制数的引脚(对应的Y)为低电平,其余为高电平,比如:

输入000,十进制为0,输出端的0位引脚为低电平,其余为高,也就是1111 1110;

输入101,十进制为5,输出端的5位引脚为低电平,其余为高,也就是1101 1111。

三位二进制数刚好可以表示0~7,8个数字,也就是可以控制8位数码管。

Proteus电路图

程序设计

#include <REGX51.H>

//延时函数

void delay(unsigned int ms){

int k,l;

for(k=0;k<ms;k++)

for(l=0;l<120;l++);

}

//一个数码管显示 0~f 十六进制数组

char numHex[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

/**

选择数码管,并显示出对应的十进制数

index :数码管位下标

num :char numHex[] 数组对应十进制数的下标

*/

void setIndexNum(unsigned char index,unsigned char num){

switch(index){//数码管位选,74LS138译码器的输入

case 0:

P1_2=0;

P1_3=0;

P1_4=0;

break;

case 1:

P1_2=1;

P1_3=0;

P1_4=0;

break;

case 2:

P1_2=0;

P1_3=1;

P1_4=0;

break;

case 3:

P1_2=1;

P1_3=1;

P1_4=0;

break;

case 4:

P1_2=0;

P1_3=0;

P1_4=1;

break;

case 5:

P1_2=1;

P1_3=0;

P1_4=1;

break;

case 6:

P1_2=0;

P1_3=1;

P1_4=1;

break;

case 7:

P1_2=1;

P1_3=1;

P1_4=1;

break;

}

P3=numHex[num];//数码管显示字符

}

void main(){

//proteus 不用while即可循环,不明白

unsigned char i,j;

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

for(j = 0;j < 16;j++){

setIndexNum(i,j);

delay(300);

if(j >= 15) break;

}

if(i >= 7) break;

}

}

想要一起学习单片机的朋友,评论我要入门,有惊喜,加入我们,就可以与导师一对一互动,快速成长

相关问答

51 单片机数码管 怎么 位选 ?

51单片机数码管的位选可以通过设置相应的位选信号来实现。一般来说,数码管的位选是通过多路选择器(如74HC138)来实现的。通过设置选择器的控制端,可以选择要...

单片机数码管 程序,是如何定义段选和 位选的 ,完全看不懂,求教,谢谢?

没用锁存器,应该是IO端口为0选中该数码管如0xef0xdf0xbf0x7f高4位用二进制表示分别是1110110110110111每次只有一个0段选分共阳和共...没用锁存器,...

单片机 定时器程序里的 数码管 为什么不用 位选 ?

数码管的显示程序逻辑理一下很简单,说白了它就是7个条状的LED灯拼成了一个数字8。你用单片机的io去驱动这些条状的LED的亮灭就可以表示出想要的数码类型数字。...

单片机数码管 如何从右往左?

关于这个问题,单片机数码管从右往左的方法取决于使用的具体数码管模块和控制方法。通常,可以通过改变控制信号的输出顺序来实现从右往左的显示。具体而言,可...

单片机数码管位 码是0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf...

[最佳回答]0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f这是共阴极的位码不是共阳极阳极就是段码写1阴极就是位码写0二极管才能亮这是共阴极比如0xfe是11...

单片机 一般用 数码管 还是LCD1602?

单片机的显示设备可以选择使用数码管或LCD1602两种。数码管具有显示数字、字母、符号等的优势,而且价格便宜,电源消耗小,是一种比较常用的显示方式。但数码管...

13、51系列 单片机 地址总线是 ,数据总线是位.14、89C51 单片 ...

[最佳回答]数据总线是8位.14、89C51单片机有2个16位可编程定时器/计数器,有4种工作方式.15、80C51单片机片内ROM的容量...13、51系列单片机地址总线是...

单片机 数码管的 连接?

拿8段1位数码管做例子。8段指有8个LED,如果是共阴极的,那这8个LED的负极连在一起,正极不连。8个LED的8个正极分别连一个限流电阻,再接到单片机一个IO引脚上。...

单片机 数码管的 共阴极和共阳极是怎么回事?

数码管是共阴极,意思是几段数码管的阴极都接在一起。这样只要给阴极一个高电平,所有的段码都不会亮,如果给低电平,则看对应阳极的电平高低,所以共阴极就是位...

你好,问下4位8段共阴 数码管 ,段选接 单片机 P0口时为什么要加上拉电阻,电阻加多大的合适?

一般的单片机的输出电流都不大,不足以直接点亮数码管,加上拉电阻是为了提高数码管亮度,除了用上拉电阻,还可以加三极管,电路如图所示。数码管可以是共阴的也...

猜你喜欢