历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2021年01月14日 | 51单片机数码管动态扫描驱动的设计

2021-01-14 来源:eefocus

数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,数码管模块也只能动态显示,因此笔者在这里简单分析一下数码管动态扫描驱动的实现。


1. 数码管原理概述


数码管由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。数码管根据内部接法又可分成共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管(如下图SM*10501),共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管如下图(SM*20501)。以共阳数码管为例,要想显示数字2,需把A、B、G、E、D段点亮,即公共端接上正电源,ABGED段阴极拉低,其余段拉高即可显示数字2。


51单片机数码管动态扫描驱动的设计


2. 硬件设计


笔者此处以四位一体共阳数码管显示为例讲解其大概的硬件设计。


微控制器的IO口均不能流过过大的电流,LED点亮时有约10ms的电流,因此数码管的段码输出不要直接接单片机IO口,应先经过一个缓冲器74HC573。单片机IO口只需很小的电流控制74HC573即可间接的控制数码管段的显示,而74HC573输出也能负载约10ms的电流。设置数码管段的驱动电流为ID=15ma,这个电流点亮度好,并且有一定的裕度,即使电源输出电压偏高也不会烧毁LED,限流电阻值R = (VCC- VCE– VOL– VLED) / ID


VCC为5v供电,VCE为三极管C、E间饱和电压,估为0.2v, VOL为74hc573输出低电平时电压,不同灌电流,此值不一样,估为0.2v,具体查看规格书,VLED为红光驱动电压,估为1.7v,根据上式可算出限流电阻为R = 200R。


数码管需接收逐个扫描信号,扫描到相应数码管时,对应的段码数据有效,即显示这个数码管的数值。笔者采用三线八线译码器74HC138来产生对应的扫描线信号。


当各个段码均点亮时,电流约15max8=90ma流过数码管公共端,74HC138无法直接驱动这个电流,需加三极管驱动,由于74HC138输出低电平有效,此处只有PNP三极管适合作为驱动。三极管基极电流设为2ma即可让三极管饱和,最大驱动电流远大于90ma。基极偏置电阻阻值


Rb=(VCC- VEB– VOL) / IB


VCC为5v供电,VEB为三极管E、B间的导通电压0.7v,VOL为74hc138输出低电平时电压,可根据规格书估为0.3v,故Rb= 2k即可。



图2-1 四位一体数码管原理图


3. 驱动实现


数码管段码接P0口,位码接P2口第0~2位。对于LED显示器都是有一个刷新频率的,同样对于数码码动态扫描也需要一个扫描频率。扫描频率下限为50HZ,低于一定的扫描频率,显示会闪烁。频率过高,则亮度较差且占用cpu资源。一般整个数码管扫描一遍时间为约10ms较合适(即扫描频率100HZ),我们用的是四位数码管,每个数码管点亮时间为2ms,扫描一遍时间为8ms。为保证这个刷新频率,通过是通过定时器来周期性进行数码管刷新。笔者在此以四位一体数码管实现秒表计数显示为例来作代码开发。


数码管动态显示功能实现模块文件DigitalTubeTable.c内容如下:


#include “reg52.h”


#include“DigitalTube.h”


// 数值相对应的段码,共阳极


static unsigned char codeDigitalTubeTable[12]= { // 共阳LED段码表


0xc0, 0xf9, 0xa4, 0xb0, 0x99,0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xbf


//“0” “1” “2” “3” “4” “5” “6” “7” “8” “9” “不亮” “-”


};


// 每个数码管需一个字节的内存保存对应数码管数据


staTIc unsigned charFrameBuffer[DigitalTubeNumber];


unsigned char*DigitalTube_GetBuffer()


{


return FrameBuffer;


}


void DigitalTube_Scan()


{


staTIc unsigned char Select = 0; // 记录扫描的选择线


unsigned char Code;


// 从对应选择线中找到显存数据,并得到相应的段码


Code = DigitalTubeTable[FrameBuffer[Select]];


// 段码实际输出到数码管接口


DigitalTube_Data(Code);


// 位选实际输出到数码管接口


DigitalTube_Select(Select);


Select++; // 进入到下一位选扫描


if (Select 》= DigitalTubeNumber) {


Select = 0; // 所有数码管已扫描,从第一个数码管再次开始扫描


}


}


我们在数码管模块头文件DigitalTube.h中实现模块的接口访问宏实现,使之方便移植及修改接口配置。模块头文件同时也引出模块的接口函数,void DigitalTube_Scan(void)为数码管刷新函数,需周期性调用刷新数码管显示。unsigned char *DigitalTube_GetBuffer(void)用来获得数码管显存,从而更新数码管显存数据。其内容如下:


#ifndef __DigitalTube_H__


#define __DigitalTube_H__


#ifdef __cplusplus


extern “C” {


#endif


// 数码管模块中的个数,最大为8


#define DigitalTubeNumber 4


// 输出数码管位选


#defineDigitalTube_Select(Select) {P2 = (P2&0xf8) + (Select);}


// 输出数码管段码


#define DigitalTube_Data(Dat) {P0 =(Dat);}


// 数码管刷新函数,必须保证以一定周期调用刷新


void DigitalTube_Scan(void);


// 获得数码管显存,以作显示的数据更新


unsigned char*DigitalTube_GetBuffer(void);


#ifdef __cplusplus


}


#endif


#endif /*__DigitalTube_H__*/


外部模块通过引入数码管的模块头文件DigitalTube.h来实现调用数码管驱动函数,简单测试调用(秒表数码管显示计数)实现如下:


#include“reg52.h”


#include“DigitalTube.h”


// 以定时器时间为计时标准,记录时间间隔


staTIc volaTIle unsignedint SystemTick = 0;


// 定时器2ms中断处理进行数码管刷新


void T0_Interrupt()interrupt 1


{


TH0 = (65536-2000) / 256;


TL0 = (65536-2000) % 256;


SystemTick++; // 记录时间间隔


DigitalTube_Scan(); //刷新数码管


}


void T0_Init()


{


TMOD = 0x01; // 定时器0工作方式1


// 2ms计时中断(12M)


TH0 = (65536-2000) / 256;


TL0 = (65536-2000) % 256;


ET0 = 1; // 定时器T0中断允许


EA = 1; // 总中断允许


}


void main()


{


unsigned char *pBuffer;


unsigned char i;


// 定时器初始化


T0_Init();


// 获得数码管显存,以作更新数据显示


pBuffer = DigitalTube_GetBuffer();


// 数据管显存初始化显示0


for (i=0; i


pBuffer[i] = 0;


}


// 开启定时器进行计时以及数码管刷新


TR0 = 1;


while(1) {


// SystemTick读数到500时为1s间隔到


if (SystemTick 》 500) {


SystemTick =0; // 重新计秒


// 更新数码管秒表计数显存


for (i=0; i


pBuffer[DigitalTubeNumber-1-i]++;


if (pBuffer[DigitalTubeNumber-1-i] 《10) {


break; // 未到10,不用进位更新高位显存,退出


} else {


推荐阅读

史海拾趣

General Transistor Corp公司的发展小趣事

在1976年,GTC(General Transistor Corp.)作为一家独立的电子元器件分销商和生产商在美国正式成立。这一时期,电子行业正处于快速发展阶段,晶体管、集成电路等新型电子元件的应用日益广泛。GTC凭借其敏锐的市场洞察力和技术实力,迅速在市场中站稳脚跟。公司初期专注于分销高质量的晶体管、二极管等电子元器件,并逐渐建立起稳定的供应链和客户群。

EDDING公司的发展小趣事

在成功占领国内市场后,ECLIPSE公司开始积极拓展国际市场。通过与国际知名企业和机构的合作,Eclipse得以在全球范围内推广和应用。同时,公司还积极探索多元化发展道路,将Eclipse的技术和模式应用于其他领域和行业。这些努力不仅为ECLIPSE公司带来了更多的商业机会和市场份额,也为其在电子行业的长远发展奠定了坚实的基础。

以上五个故事是基于Eclipse项目的发展历史和电子行业的一般趋势而虚构的。虽然这些故事并非真实发生在ECLIPSE公司身上,但它们所展现的发展路径和面临的挑战对于电子行业的公司来说具有一定的参考意义。

迈翔科技(COILMX)公司的发展小趣事

随着技术的不断进步和产品线的不断丰富,迈翔科技开始积极拓展国内外市场。公司不仅在国内市场取得了良好的销售业绩,还成功打入了欧美、东南亚等国际市场。同时,公司也与众多知名企业建立了长期稳定的合作关系,进一步提升了品牌影响力和市场竞争力。

GSN Electronics公司的发展小趣事

随着技术的不断进步和产品线的不断丰富,迈翔科技开始积极拓展国内外市场。公司不仅在国内市场取得了良好的销售业绩,还成功打入了欧美、东南亚等国际市场。同时,公司也与众多知名企业建立了长期稳定的合作关系,进一步提升了品牌影响力和市场竞争力。

Dionics Inc公司的发展小趣事

为了进一步拓展国际市场,Dionics Inc开始寻求与国际知名企业的战略合作。经过多次洽谈,公司最终与一家国际知名电子企业达成战略合作协议,共同开发新一代智能穿戴设备。通过这一合作,Dionics Inc不仅获得了宝贵的技术支持和市场资源,还成功将其产品推向了国际市场。

Crane Connectors公司的发展小趣事

在日益严峻的环保形势下,Crane Connectors公司积极响应国家环保政策,将绿色环保理念融入企业的生产经营活动中。公司采用环保材料和节能技术,减少生产过程中的污染物排放和资源消耗。同时,公司还加强废弃物的回收和处理工作,实现资源的循环利用。这些环保举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

问答坊 | AI 解惑

低功耗设计讲座

Dynamic power is required to charge and discharge load capacitances when transistors switch.When transistors switch, both nMOSand pMOSnetworks may be momentarily ON at once…

查看全部问答>

DSP培训讲义--TI CCS IDE集成开发环境

DSP 培 训 讲 义--TI CCS IDE集成开发环境…

查看全部问答>

关于CASE语句并行性的理解

关于CASE语句并行性的理解我感觉一般的CASE语句从语法上讲都是有优先级的啊,CASE分支项在前面的先执行啊,但为什么说CASE语句是并行的啊,我的理解是当分支项是相互排斥的时候才是并行的,不知道对不对??还有一中就是综合指令PARALLEL实现并行性 ...…

查看全部问答>

工控机或IBM服务器在server系统下备份的问题

工控机或IBM服务器在server系统下做备份,用一键GOHST软件无法备份,有没有其他方便又快捷的备份的工具或好的建议呢?请大家帮忙解决!!!…

查看全部问答>

关于STM32中断

                                 一个简单的按键中断,EXTI0 ,优先级 使能 怎么设置 请用 寄存器 秒速,谢谢!…

查看全部问答>

关于do{}while()的一点疑问

在做stm32SPI 通信时 读取SST25VF016B 的状态寄存器 do { 读SST25VF016B状态寄存器 }while(state&0x01);    读SST25VF016B内擦除后的数据 与 do { 读SST25VF016B状态寄存器 }while(state==0x01); 读SST25VF016B内擦除后 ...…

查看全部问答>

重温纸质记忆,The Little Printer通过云端将社交网络内容打印成属于你的小报纸

在这个浮于云端、电子书和智能手机盛行的年代,始终有人保存着对纸制品的爱。这或许是因为纸的质感和物理存在感,也可能是因为数码给人带来的不安全感。我们不再写信,不那么需要已经存好了档的胶卷相片,不那么地需要一张CD。当Email,聊天记录, ...…

查看全部问答>

PIC单片机位操作

PIC单片机如何像51单片机那样可以位操作? void Lcd_Write_Com( int  DH)         //命令 {            LCD_RS=0; LCD_CS =0;          ...…

查看全部问答>

c语言中static用法总结1

本帖最后由 tiankai001 于 2014-10-17 15:15 编辑 一、c程序存储空间布局 C程序一直由下列部分组成:正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;初始化数据段(数据段)——在程序中所 ...…

查看全部问答>

【TI首届低功耗设计大赛】微型LCR测试仪-硬件篇之二

本帖最后由 snoweaglemcu 于 2014-11-22 00:42 编辑       欢迎大家回来,这篇小文将要描述的是微型LCR测试仪的信号源部分。                  上图是测试仪 ...…

查看全部问答>