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

发布者:平安守护最新更新时间:2021-01-14 来源: eefocus关键字:51单片机  数码管 手机看文章 扫描二维码
随时随地手机看文章

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


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 {


关键字:51单片机  数码管 引用地址:51单片机数码管动态扫描驱动的设计

上一篇:51单片机对LCD液晶显示器的控制
下一篇:51单片机1s延时程序设计

推荐阅读最新更新时间:2024-11-13 04:25

51单片机快速入门指南】4.3.3: MPU6050使用Mahony AHRS算法实现六轴姿态融合获取四元数、欧拉角
STC89C516 32MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机:Vofa+ 1.3.10 移植自MPU6050姿态解算——Mahony互补滤波 —— 大写的小写字母 加入了输入数据范围的自动处理,即使更改量程也能正确解算。 源码 为了避免所用RAM超标,部分变量设为idata类型,移植时需注意。 所用MCU为STC89C516 晶振16MHz 6T模式 stdint.h见【51单片机快速入门指南】1:基础知识和工程创建 软件I2C程序见【51单片机快速入门指南】4: 软
[单片机]
【<font color='red'>51单片机</font>快速入门指南】4.3.3: MPU6050使用Mahony AHRS算法实现六轴姿态融合获取四元数、欧拉角
基于STC51单片机的自动门铃
设计要求:# 利用红外对管检测是否有人进出 在触发红外对管后,使用PWM驱动蜂鸣器,使其发出叮咚叮咚的声音 设计概述:# 按照设计要求,为了直观的说明脉冲宽度调制技术(PWM),所以门铃的声音效果为叮咚叮咚形式。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的红外探测模块和蜂鸣器模块,红外探测模块由P3口控制,蜂鸣器模块由P2口控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。 PWM是一种方波,可以实现数字信号控制模
[单片机]
基于STC<font color='red'>51单片机</font>的自动门铃
基于51单片机的等精度频率计设计
设计以51单片机为核心,显示采用1602液晶。频率测量方法采用等精度频率法测量,外部脉冲作为内部高速脉冲计数的启动信号,也是最后的计数的结束信号。保证外部脉冲计数的无误差,通过内部的高速计数保证测量精度。 等精度频率计ppt: 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载): 单片机源程序如下: #include STC12C5A60S2.H #include Intrins.h #include 1602.h unsigned char t0_hh,t1_hh; unsigned char dis_buf ; //unsigned char code frequence ={ frequence:
[单片机]
基于<font color='red'>51单片机</font>的等精度频率计设计
51单片机DS18B20温度传感四位数码管显示报警
仿真原理图如下 全部资料分享,可设置温度报警的上下限,5641四位共阳数码管显示温度,自己曾经做的设计,实测可行,提供给有需要的人 单片机源程序如下: #include AT89X52.h #define uint unsigned int #define uchar unsigned char //宏定义 #define SET P3_1 //定义调整键 #define DEC P3_2 //定义减少键 #define ADD P3_3 //定义增加键 #define BEEP P3_6 //定义蜂
[单片机]
<font color='red'>51单片机</font>DS18B20温度传感四位<font color='red'>数码管</font>显示报警
基于AT89C51单片机的ADC0808程序
AT89C51单片机介绍 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89C51管脚说明 ATMEL公司的AT89C51是一种高效微控制器。采用40引脚双列直插封装形式。AT89C51单片机是高
[单片机]
基于AT89C<font color='red'>51单片机</font>的ADC0808程序
利用51单片机做一个简易时钟
利用独立键盘,数码管完成一个简易的时钟,按键一可以修改时间,按键二可以设置闹钟,按键三进行加一操作,按键四进行减一操作。 主函数: void main() { bsp_init(); while(1) { TimeTim(); //正常时间在走 bsp_KeyScan(); //键盘扫描看哪个功能键被按下 bsp_KeyProc(keyvalue); //根据键值进行相应的功能处理 SetValueShow(); //数码管上显示的值 ShowSegCC(); //显示在数码管上 bsp_CheckAlarm(); /
[单片机]
如何使用AT89C51单片机控制LED显示屏的电路设计
LED显示屏广泛应用于工矿企业、学校、商场、店铺、公共场所等进行图文显示,广告宣传,信息发布。本文设计一种由4个16×16点阵LED模块组成的显示屏,由单片机作控制器,平滑移动显示任意多个文字或图形符号,本电路可级联扩展实现由任意多个16×16点阵LED模块组成的显示屏。 1 电路设计 控制电路由AT89C51单片机作控制器,显示屏由4个16×16点阵LED模块组成,每个16×16点阵LED模块由4个8×8点阵LED模块组成,用户可根据需要扩展增加任意多个16×16点阵LED模块。8×8点阵LED模块结构如图1所示,共8行8列,每个发光二极管放置在行线和列线的交叉点上,共64个发光二极管。当某一列为高电平,某一行为低电平时,则
[单片机]
如何使用AT89C<font color='red'>51单片机</font>控制LED显示屏的电路设计
MCS_51单片机与8255A的接口设计
所谓可编程的接口芯片是指其功能可由微处理机的指令来加以改变的接口芯片,利用编程的方法,可以使一个接口芯片执行不同的接口功能。目前,各生产厂家已提供了很多系列的可编程接口,MCS-51单片机常用的两种接口芯片是8255以及8155。 8255和MCS-51相连,可以为外设提供三个8位的I/O端口:A口、B口和C口,三个端口的功能完全由编程来决定。 1.  8255的内部结构和引脚排列 下图7为8255的内部结构和引脚图。 (1)A口、B口和C口。A口、B口和C口均为8位I/O数据口,但结构上略有差别。A口由一个8位的数据输出缓冲/锁存器和一个8位的数据输入缓冲/锁存器组成。B口由一个8位的数据输出缓冲/锁存器和一个8位的
[单片机]
MCS_<font color='red'>51单片机</font>与8255A的接口设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved