8051单片机实战分析(以STC89C52RC为例) | 06 - 动态数码管驱动

STC89C52RC单片机原理图详解 左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里。74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展。由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时, 阅读详情

从上一博文《8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动》,我们可以了解到数码管一些驱动原理,实际上静态扫描在项目中基本不会用到,在项目中我们经常用动态扫描,所以便有了本文。如果不懂数码管的段选与位选请先看这篇:《3分钟带你彻底弄懂数码管的段选与位选》

1 动态扫描

那什么是动态扫描呢?

举个例子:有 2 个数码管,我们要显示“12”这个数字,可以先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制段选让其显示“2”。把这个流程以一定的速度循环运行就可以让数码管显示出“12”,由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。

在多个数码管显示数字的时候,我们可以轮流点亮数码管(一个时刻内只有一个数码管是亮的),利用人眼的视觉暂留现象(也叫余辉效应),就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。

那么一个数码管需要点亮多长时间呢?也就是说要多长时间完成一次全部数码管的扫描呢(很明显:整体扫描时间=单个数码管点亮时间*数码管个数)?答案是:10ms 以内。

当电视机和显示器还处在 CRT(电子显像管)时代的时候,有一句很流行的广告语——“100Hz无闪烁”,没错,只要刷新率大于 100Hz,即刷新时间小于 10ms,就可以做到无闪烁,这也就是我们的动态扫描的硬性指标。那么你也许会问,有最小值的限制吗?理论上没有,但实际上做到更快的刷新却没有任何进步的意义了,因为已经无闪烁了,再快也还是无闪烁,只是徒然增加 CPU 的负荷而已(因为 1 秒内要执行更多次的扫描程序)。

所以,通常我们设计程序的时候,都是取一个接近 10ms,又比较规整的值就行了。

2 原理图

① 数码管原理图:

② 数码管的位选使用138译码器进行解析,关于这块我们可以参考这篇文章:《数字器件认识 | 74HC138三八译码器的应用》。

③ MCU原理图:

3 代码

了解原理之后,我们就可以写个Demo让数码管从右至左显示0-7:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code LedChar[]={
	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"
    0xff, //全亮
    0x00  //熄灭
};


/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigitalDisplay()
{
	u8 i;
	for(i=0;i<8;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=0;LSB=0;LSC=0; break;//显示第0位
			case(1):
				LSA=1;LSB=0;LSC=0; break;//显示第1位
			case(2):
				LSA=0;LSB=1;LSC=0; break;//显示第2位
			case(3):
				LSA=1;LSB=1;LSC=0; break;//显示第3位
			case(4):
				LSA=0;LSB=0;LSC=1; break;//显示第4位
			case(5):
				LSA=1;LSB=0;LSC=1; break;//显示第5位
			case(6):
				LSA=0;LSB=1;LSC=1; break;//显示第6位
			case(7):
				LSA=1;LSB=1;LSC=1; break;//显示第7位	
		}
		P0=LedChar[i];//发送段码
		delay(100); //间隔一段时间扫描:大约1ms
		P0=0x00;//消隐
	}
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	while(1)
	{	
		DigitalDisplay();  //数码管显示函数	
	}		
}

简要分析:

① main函数单纯给DigitalDisplay子函数进行无限循环。

② DigitalDisplay子函数通过for循环语句在每一次循环指定一个位选与段选。

例如i=0;时,通过LSA=0;LSB=0;LSC=0;语句控制138译码器选择Y0端口输出0,从而选定LED1网络的位选。

然后通过P0=LedChar[i];给P0端口发送段选值,i=0的时候发送的是'0'字符的段选值,每次for循环中间只延时大约1ms。

③ 注意这句话:P0=0x00;//消隐。如果没有这句话就会产生“鬼影”,这个动态扫描的一个bug。

“鬼影”的出现,主要是在数码管位选和段选产生的瞬态造成的。

举个简单例子,我们在数码管动态显示的那部分程序中,实际上每一个数码管点亮的持续时间是1ms的时间,1ms后进行下个数码管的切换。

在进行数码管切换的时候,比如我们从 case 7 要切换到 case 0 的时候,case 7的位选用的是LSA=1;LSB=1;LSC=1;。

==》假如此刻case 7也就是最高位数码管对应的值是0,我们要切换成的 case 0 的数码管位选是LSA=0;LSB=0;LSC=0;,而对应的数码管的值假如是1。

==》又因为C语言程序是一句一句顺序往下执行的,每一条语句的执行都会占用一定的时间,即使这个时间非常非常短暂。

==》但是当我们把“LSA=1”改变成“LSA=0”的时候,这个瞬间存在了一个中间状态 LSA=0; LSB=1; LSC=1;在这个瞬间上,我们就给 case 6 对应的数码管LED7网络位选瞬间赋值了0。

==》当我们全部写完了LSA=0;LSB=1; LSC=0;后,这个时候,我们的 P0 还没有正式赋值,而 P0此刻却保持了前一次的值,也就是在这个瞬间,我们又给case 4对应的数码管 LED5 网络位选赋值了一个 0。。。

==》直到我们把 case 0后边的语句全部完成后,我们的刷新才正式完成。而在这个刷新过程中,有 3个瞬间我们给错误的数码管赋了值,虽然很弱(因为亮的时间很短),但是我们还是能够发现。

搞明白了原理后,我们只要避开这个瞬间错误就可以了。不产生瞬间错误的方法是,在进行位选切换期间,避免一切数码管的赋值即可。方法有两个,一个方法是刷新之前关闭所有的段选,改变好了位选后,再打开段选即可;第二个方法是关闭数码管的位选,赋值过程都做好后,再重新打开即可。这里用到了第一种方法!!

51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED) 在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作。比如本节我们用到了下面几个,我们把针脚P34、P35、P36定义用对应申明,在使用时不在写针脚地址寄存器(当然也可以继续使用针脚,作用一样)。DP上的HEX=0x80=1000 0000(二进制) 阅读详情

相关推荐

51单片机(STC89C52RC版本)学习笔记(更新中...)

B站江协科技《51单片机入门教程-2020版 程序全程纯手打 从零开始入门》课程学习笔记,包含LED,独立按键,数码管,LCD1602,矩阵键盘,定时器,串口通信,蜂鸣器等模块。

weixin_43364551的博客 2569

stc89c52rc最小系统板原理图及PCB(贴片式,带流水灯)

stc89c52rc最小系统板原理图及PCB(贴片式,带流水灯)

STC89C52R单片机以及CF85911的AD转换

51单片机AD转换,单片机大作业可用

m0_51232939的博客 3173

STC89C52RC最小系统原理图介绍

在数字电子学的背景下,我们知道现代CPU的运作需要依靠时序波动的电压信号来捕捉上升沿,并在这些上升沿到达时推动芯片内部指令的执行。降低工作电压可以显著减少功耗和发热,这是非常重要的,尤其是在现代高性能计算设备中,如CPU和内存条,这些设备通常只需要1V多点的电压即可正常工作。需要注意的是,开关仅管理MCU最小系统的供电,并不影响CH340N的供电。(3)按下开关后,RST引脚相当于直接接到VCC,此时RST引脚将是高电平,这个状态维持几十us,MCU就会清空当前状态,重新回到第一行代码开始执行。

qq_74918626的博客 2737

STC89C52RC单片机实战:手把手教你用数码管和矩阵键盘DIY一个会唱卡农的闹钟

本文详细介绍了如何使用STC89C52RC单片机制作一款能演奏卡农的音乐闹钟,涵盖硬件选型、系统设计、音乐引擎实现及优化技巧。通过数码管显示和矩阵键盘控制,结合DS1302实时时钟模块,实现了一个功能完整的电子闹钟项目,特别适合51单片机入门者和电子爱好者实战练习。

weixin_33737774的博客 1551

Proteus仿真实战:用51单片机驱动6位数码管做个简易计时器(附完整源码)

本文详细介绍了如何使用Proteus仿真软件和51单片机驱动6位数码管实现高精度计时器。从元器件选型、电路设计到动态扫描编程和定时器中断优化,提供了完整的源码和调试技巧,帮助开发者快速掌握嵌入式系统中的数码管驱动技术。

weixin_33675507的博客 577

8051单片机实战分析(以STC89C52RC为例) | 07 - 独立按键驱动

按键是比较常用的也是比较简单的人机交互操作,按键实际上是一个非自锁的轻触开关,按下时触点会闭合,松开是触点断开。 1 独立式按键 常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接,如图所示。 4 条输入线接到单片机的 IO 口上,当按键 K3 按下时,K3两边的线路将会导通,P32这个单片机IO口直接接到GND,此时P32这个引脚就是低电平了。当松开按键后,当松开按键后,线路断开,就不会有电流通过,那么P32引脚就会是默认的电平状态,是一个高电平,.

Systemcall名屋 3382

STC89C52RC单片机实验板使用手册与实战指南

STC89C52RC或许不再是最先进的MCU,但它依然是最好的入门老师。它教会我们:如何在资源极度受限的情况下进行工程取舍如何理解底层硬件的工作原理如何写出高效、稳定的嵌入式代码这些能力,远比学会某个具体框架更重要。当你有一天转向STM32甚至RISC-V平台时,会发现很多思想是一脉相承的。而这一切的起点,也许就是你现在点亮的那一盏LED灯 💡🚀本文还有配套的精品资源,点击获取。

weixin_35649491的博客 1083

8051单片机实战分析(以STC89C52RC为例) | 11 - 定时器中断的使用

在第一篇到第九篇博文中,我们认识到了一些基于IO口输入与输出的基础电子器件使用: 《8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED》 《8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s闪烁》 《8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯》 《8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动》 《8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数.

Systemcall名屋 3289

基于STC89C52RC单片机的LED时钟设计与实现(含程序、仿真图、电路图)

STC89C52RC继承了标准8051的寄存器架构,Keil已内置reg52.h提供大部分SFR定义。但某些特殊功能(如新増定时器模式或电源控制位)可能需手动扩展。例如:// config.h - 自定义寄存器映射// 定义P4口(部分STC型号支持)// 定义AUXR辅助寄存器(用于定时器速度切换)#define T0x12 0x00 // 定时器0传统12T模式#define T0x1 0x80 // 定时器0新型1T模式// 位定义// 控制定时器0运行速度#endif。

weixin_42356162的博客 1271

STC89C52RC驱动DS18B20与数码管:C51工程实战

在嵌入式开发中,单片机与传感器通信是核心技能。单总线协议通过一根IO实现双向数据传输,依赖精确的时序控制;动态扫描则利用视觉暂留实现多位数码管显示。掌握这些原理,能高效构建数据采集与显示系统,广泛应用于温度监控、工业控制等领域。本文以STC89C52RC、DS18B20和数码管为例,提供一套可直接烧录的C51工程,涵盖硬件连接、时序驱动和显示调试,助你快速上手。

weixin_29189373的博客 275

8051单片机实战分析(以STC89C52RC为例) | 10 - 外部中断的使用

在前面九篇博文中,我们认识到了一些基于IO口输入与输出的基础电子器件使用: 8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED 8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s闪烁 8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯 8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动 8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动 8051单片机.

Systemcall名屋 2973

STC89C52RC驱动DS18B20与四位数码管实战避坑指南

单总线温度传感器DS18B20与动态扫描数码管是嵌入式基础教学中的经典组合,其核心在于理解单总线严格时序与硬件资源协同原理。DS18B20依赖微秒级复位、读写脉冲控制,而四位共阴极数码管需精准1ms定时中断实现稳定显示,二者在STC89C52RC有限资源下易发生时序冲突与IO争抢。该方案技术价值在于透明可控、便于教学拆解,广泛应用于高校课程设计、技工实训及简易温控原型开发。实际落地需紧扣晶振频率、引脚定义、上拉电阻、Keil C51编译配置等工程细节,尤其关注DS18B20的85℃默认值异常与数码管抖动等高

weixin_29174141的博客 206

8051单片机实战分析(以STC89C52RC为例) | 12 - 串行口中断的使用

在第一篇到第九篇博文中,我们认识到了一些基于IO口输入与输出的基础电子器件使用: 《8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED》 《8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s闪烁》 《8051单片机实战分析(以STC89C52RC为例) | 03 - LED流水灯》 《8051单片机实战分析(以STC89C52RC为例) | 04 - 蜂鸣器驱动》 《8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数.

Systemcall名屋 2544

STC89C52RC+DS18B20温度采集数码管显示实战详解

在嵌入式开发入门中,单片机作为核心控制单元,常与各类传感器配合完成数据采集与显示任务。DS18B20数字温度传感器采用单总线协议,仅需一根数据线即可实现双向通信,理解其时序是掌握传感器驱动的关键。通过51单片机读取温度值,再利用数码管动态扫描显示,是工程实践中最经典的基础训练,涵盖了GPIO操作、定时器中断、数据编码等核心技能。该方案广泛应用于环境监测、智能家居、工业控制等领域。本文以STC89C52RC为例,从硬件选型、单总线时序逻辑到KEIL C51工程配置,详细剖析温度采集系统的完整实现过程,帮助读者

weixin_34391445的博客 447

STC89C52RC驱动DS18B20温度传感器数码管显示实战解析

在嵌入式开发与单片机入门中,DS18B20数字温度传感器是最经典的实践项目之一。它采用单总线协议,仅需一根数据线即可完成温度采集,配合STC89C52RC等51内核单片机与数码管动态扫描,便能构建一个直观的电子温度计。理解单总线的读写时序、上下拉电阻配置以及KEIL C51工程的编译优化设置,是解决温度显示异常(如固定85℃)的关键。从基础概念到时序原理,再到数码管扫描与原理图引脚对照,本文完整梳理了从工程复现到功能调试的全过程,并延伸到温控报警、多传感器扩展等应用场景,为单片机温度采集系统的开发提供可复用

weixin_34310369的博客 339

8051单片机实战分析(以STC89C52RC为例) | 08 - 矩阵按键驱动

前面我们学习了《8051单片机实战分析(以STC89C52RC为例) | 07 - 独立按键驱动》,但是在单片机系统中,若使用按键较多时如电子密码锁、电话机键盘等一般都至少有12到16个按键,通常采用矩阵式按键,即矩阵键盘。 1 矩阵键盘 矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4*4个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。 最常见的键盘布局如图所示。一般由16个按键组成,在.

Systemcall名屋 2040

STC89C52RC单片机开发板PDF原理图.pdf

STC89C52RC单片机开发板PDF原理图,包括常用的接口及外围电路,可以做为你的学习设计参考。

上一篇: 3分钟带你彻底弄懂数码管的段选与位选
下一篇: Linux配置篇 | Manjaro20.0.3解决“终端字体间隔过宽”问题
嵌入式逍遥
嵌入式逍遥 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄9年 7万+粉丝 237原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值