当前位置:首页 > 单片机 > 单片机
[导读]数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,数码管模块也只能动态显示,因此笔者在这里简单分析一下数码管动态

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

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。


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 {

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在嵌入式系统开发中,单片机是不可或缺的重要组成部分。其中,STM32单片机和51单片机是两种常见的单片机芯片。本文将对比分析这两种单片机的区别,并探讨STM32单片机的优势。

关键字: stm32单片 51单片机

51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了许多品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基...

关键字: 51单片机 串行通信

51单片机是一种常见的微控制器,它具有串行通信接口(Serial Communication Interface,SCI)。通过串口通信接口,51单片机可以与其他设备或系统进行串行通信,实现数据传输和控制。

关键字: 51单片机 串口通信

Pic单片机和51单片机是两种应用广泛的微控制器,它们各自具有不同的特点和优势,选择哪种单片机取决于具体应用需求。下面将对Pic单片机和51单片机进行详细的介绍和对比。

关键字: PIC单片机 51单片机 单片机

随着电子信息技术的快速发展,串行通信在各种应用中得到了广泛的应用。其中,51单片机作为一种常见的嵌入式系统,具有低功耗、高性能、易于编程等特点,常用于各种自动化控制、数据采集等系统中。而PC机具有强大的数据处理能力和丰富...

关键字: 51单片机 PC机 串行通信

51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。

关键字: 51单片机 串口通信 半双工

步进电机是一种无刷电机,可将电脉冲转换为机械旋转。顾名思义,它根据输入脉冲逐步旋转,是现代数字程序控制系统中的主要执行元件。

关键字: 51单片机 步进电机 无刷电机

1.ROM:只读存储器,单片机的只读存储区大多用于存储程序固又称程序存储器。

关键字: 51单片机 工作原理 电路

为增进大家对单片机的认识,本文将对各种类型的51单片机进行介绍。

关键字: 单片机 指数 51单片机
关闭
关闭