历史上的今天
今天是:2025年04月04日(星期五)
2020年04月04日 | 51单片机之数码管静态显示
2020-04-04 来源:eefocus
在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示,我们就拿带小数点的八段数码管来说 ,其实我们没必要说对数码管很陌生,因为数码管无非就是八块发光二极管集成在了一起,另外数码管有共阴极和共阳极数码管之分,说起共阴,共阳,大家可能会有所陌生,这里我们简单介绍一下:
共阴极数码管:将八只发光二极管的负极通过一根总线连接在了一起 , 然后每只二极管的正极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入高电平时,二极管点亮。(换句话说,也就是说想让哪一只二极管点亮,就给哪只二极管高电平。下面编程我们就以共阴数码管为例)
共阳极数码管:将八只发光二极管的正极通过一根总线连接在了一起 , 然后每只二极管的负极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入低电平时,二极管点亮。
好了,数码管的基本知识我们说完了,下面来说一些编程相关的,首先,我们知道数字数码管而言,那肯定是显示数字的,那么我们怎么编程实现呢?其实很简单,你想啊,数码管由八段发光二极管组成,那么我们就拿着上面的图,来画一画,比如说,显示数字 “1 ” ,那也就是让 b 和 c 亮,编程的话,即是0x06,0x06转换为二进制 ,是00000110,这样一来给了 b 和 c 段高电平,实现了点亮数字 “1”;下面我们就把数码管所能够显示的数字以及符号通过一个表格整理出来(以共阴极数码管为例);

这里附上一个LED代码查询小软件:(链接: https://pan.baidu.com/s/1lCDKtCwwabfYE7dWZ2iA-g 提取码: 5fgm),需要的可以下载使用,很方便。

接下来我们还要来介绍一款芯片,也就是74HC573锁存器。

你可能会问,我们静态显示数码管,直接对利用单片机的I/O口对数码管的引脚输出高低电平就好了嘛,为什么还要用到这款芯片?这里我们解释一下,单片机直接控制数码管确实很好,但是我们要明白一点,单片机一共也就 4 x 8 = 32个I/O口,而且我们单片机开发板上都不是只有单个数码管的,都是有六个八个数码管在一块的,如果都用单片机来控制,那一块单片机岂不是什么都干不了了吗,要知道,我们一块51单片机开发板上是由很多模块组成的,有很多功能需要实现,如果一个数码管显示模块就把我们的I/O口资源给用完了,那还有什么意义呢。相反,如果用上锁存器,我们只需要用到单片机的两个I/O口就可以了,完全足够了。
下面,我们来简单介绍一下这款芯片: 对于74HC573,形象一点,我们只需要将其理解为一扇大门,只不过这扇大门是单向的,其中11引脚(LE)控制着门的开、关状态,高电平为大门打开,低电平为大门关闭。D0-D7为输入,Q0-Q7为输出,在LE = 1,即输入高电平时,输入端=输出端,输入是什么,输出也就原封不动的输出;在LE = 0 ,即输入高电平时,大门关闭,实现锁存,不再输出。了解之后,我们按照电路图,来进行编程,代码实现。


如上图所示,在实现数码管的静态显示中,我们用到了两个锁存器,两个I/O口,P1.6和P1.7,分别是位选和段选。关于位选和段选我们解释一下:
位选,位选,也就是位置的选择,一块单片机开发板上,有8个数码管,依次是1、2、3.....8, 这样的话,比如说我们想让第三个亮,就可以通过位选锁存器来实现;
至于说段选,就很好理解了,就是我们常说的控制一个数码管中的 a,b,c...g 段,使其显示数字,这就是段选,即选择数码管的哪一笔段。好了,下面开始编程:
/* ***************************************************** */
// 工 程 : 51单片机开发板
// 文件名 : smg.c
// 处理器 : STC89C52RC
// 编译环境 : Keil4 C51
// 系统时钟 : 11.0592MHZ
// 版 本 : V1.0
// 设计者 :朱豪男
// 生成日期 : 2018-10-14
// 修改日期 :
// 简单描述 : 数码管静态显示程序
/* ***************************************************** */
#include #define uchar unsigned char #define uint unsigned int #define data P0 //P0口宏定义 /* ***************************************************** */ // 数码管位选数组定义 /* ***************************************************** */ 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, //熄灭 0x00 //自定义}; }; /* ***************************************************** */ // 位定义 /* ***************************************************** */ sbit du = P1^7; //段选定义 sbit we = P1^6; //位选定义 /* ***************************************************** */ // 函数名称:DelayMS() // 函数功能:毫秒延时 // 入口参数:延时毫秒数(ValMS) // 出口参数:无 /* ***************************************************** */ void delay(uint z) { uint x,y; for(x = 0; x < z; x++) for(y = 0; y < 113; y++); } /* ***************************************************** */ // 函数名称:main() // 函数功能:数码管静态显示 // 入口参数:无 // 出口参数:无 /* ***************************************************** */ void main(void) { uchar i; we = 1; //位选开 data = 0x00; //送入位选数据 we = 0; //位选关 while(1) { for(i = 0;i < 16 ; i++) { du = 1; //段选开 data = leddata[i]; //送入段选数据 du = 0; //段选关 delay(500); //延时 } } } 代码很好理解,我们简单介绍一下,首先我们定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,我们用 sbit 定义了位选和段选端口,分别是 P1.6 和 P1.7 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终,首先我们把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段选数据后,再次关闭段选,接下来,这个延时操作对于我们实际看到数码管的显示效果特别重要,因为程序在段选后之后,会马上消隐,显示的时间之后几个微秒,这显然不太合理,我们需要在关闭段选后加上延时,这样一来,才会让每位数码管亮度保持均匀。
史海拾趣
|
在Power层,只有一个电源网络吗?假设电路中有5V、+15V、-8V的电源,那么在电源层如何分配这些电源?电源层一般不都是直接大面积铺铜吗?我是新手,请各位前辈多多指教!谢谢!… 查看全部问答> |
|
我是个新手,最近领导让搞wince,买了一块友善之臂nano2410的板子,32m dram;64m flash。打算做一些wince 方面的开发。但是nano2410只有nk和eboot文件,不提供bsp和sdk。所以我打算找一个其他的bsp移植上去,同时在pb中生成sdk,用于vs中的开发。 ...… 查看全部问答> |
|
关于IAR4.42和STM32疑难杂症(已解决.使用IAR5.30) 请各位大虾诊断!开发平台 (IAR4.42(带补丁)+ JLINK + STM32 + uCOS-II v2.86)写的源代码在自己的PC上运行很正常, 但把整个工程到其他两个同事的PC上都出现了同一个问题!系统中有一个TIM6的定时中断, ...… 查看全部问答> |
|
今天要找一个B3F按键的3D模型,找了半天在这个网站上找到了,有需要3D模型的可以去看看,注册一下,不需要下载积分,全部免费下载。 好东西不好意思私藏,拿出来和大家分享一下 http://www.3dcontentcentral.cn/ 下面是我随便截的一个图片 ...… 查看全部问答> |
|
BZ534X PSAM卡Mifare接触式IC卡读写核心模块 主要特点: 支持IS07816标准 最多可操作2个PSAM卡和1个CPU接触式大卡 该ASIC芯片支持高速(38400)、低速(9600)PSAM卡和接触式CPU卡 尺寸:62*42*14mm 目前被广泛应用于交通一卡通等的密钥认证 型号间主要区别: 型号 ...… 查看全部问答> |




