单片机驱动数码管设计详解(用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;
}
}
想要一起学习单片机的朋友,评论我要入门,有惊喜,加入我们,就可以与导师一对一互动,快速成长
相关问答
用两个四位数码管弄成一个 8位数码管 做时钟,通过74hc573连接到 单片机 上,求大神用汇编写个程序?用74hc595控制数码管,也没有什么特别的,一片锁存段码,另一片锁存位码,这样可以控制8位数码管,如果数码管再多,就要增加74hc595。主要是多片595是串行连接...
单片机 与 数码管 的连接?拿8段1位数码管做例子。8段指有8个LED,如果是共阴极的,那这8个LED的负极连在一起,正极不连。8个LED的8个正极分别连一个限流电阻,再接到单片机一个IO引脚上。...
什么是8段 数码管 ?谁晓得?1.什么是数码管数码管是一类价格便宜使用简单经常使用的显示设备,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等...
51 单片机 ,用单独键盘控制静态 数码管 显示1-8,自学的,错误连篇...你先把下面这几行中sbitK8=P0^7;voidanjian()voidyanshi(uintnms);改为sbitK8=P0^7;voidanjian();//这里漏了...
AT89C51 单片机 怎么用汇编语言让4个 数码管 同时显示1234?按k1启动计时,按k2则暂停计时,再按k2则清零。5、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d...
51 单片机 max7219 数码管 使用方法?使用方法如下:1.接线:将Max7219引脚与MCU引脚相连,VCC和GND分别连接到正负电源上。2.初始化:编写初始化函数,包括设置控制口输出、设置扫描限制、设置亮度...
单片机数码管 如何把个位十位分开?把控制程序写进单片机驱动数码管,另外就是数码管的引脚不要接在一起把控制程序写进单片机驱动数码管,另外就是数码管的引脚不要接在一起
单片机 共阴极 数码管 名称?LED数码管指的是七段数码管,有共阳极和共阴极之分;(顺便说数码管可不是因单片机而生,所以不是单片机的数码管,是互不相干的不同元器件)共阳极就是把二极...
设计电子时钟 要用AT89S51 单片机 的定时器实现,用 4位数码管 ...用21134位数码管显示,用点的闪烁表示秒,就是共有52615位,7段;那么用一整个4102PIO口(8位)去对应7段数据,1653再用另外一个PIO口的部分(全部)管脚去...
设计电子时钟 要用AT89S51 单片机 的定时器实现,用 4位数码管 ...用21134位数码管显示,用点的闪烁表示秒,就是共有52615位,7段;那么用一整个4102PIO口(8位)去对应7段数据,1653再用另外一个PIO口的部分(全部)管脚去...