发布时间:2026/8/25 14:26:43
【嵌入式成长7】STC89C51数码管|共阴/共阳原理,74HC245、74HC595级联、动态扫描、定时器中断刷新实战 一、数码管基础简介数码管可以理解为8个LED封装在一起7段笔画a‑g加上小数点dp。点亮对应段LED就可以显示数字、部分字母。数码管分两大类共阴极、共阳极。类型公共端接法点亮逻辑共阴极全部LED阴极接GND段引脚输出高电平点亮笔画共阳极全部LED阳极接VCC段引脚输出低电平点亮笔画本教程实验硬件使用共阴极数码管。共阴极段码表十六进制显示字符二进制点亮段0x3F000111111abcdef0x06100000110bc0x5B201011011abdeg0x4F301001111abcdg0x66401100110bcfg0x6D501101101acdfg0x7D601111101acdefg0x07700000111abc0x7F801111111abcdefg0x6F901101111abcdfg0x77A01110111abcefg0x7CB01111100cdefg0x39C00111001adef0x5ED01011110bcdeg0x79E01111001adefg0x71F01110001aefg0x00熄灭00000000全部熄灭二、单片机驱动数码管两大问题问题1IO口驱动电流不足51单片机IO拉电流能力弱约1mA直接驱动数码管亮度很低。解决方案三极管放大多路数码管会需要大量分立元件布线繁琐。使用74HC245双向缓冲芯片增强输出驱动电流最高可达7.8mA。74HC245简要说明DIR方向引脚接VCCA输入→B输出。OE#输出使能低电平有效直接接GND一直使能。A0‑A7接单片机IOB0‑B7接数码管a‑dp段脚。简单单数码管代码P2口经过74HC245驱动共阴极数码管#include reg52.h void main(void) { P2 0x06; //输出段码显示数字1 while(1); }循环0‑9静态显示示例#include reg52.h unsigned char seg_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay_ms(unsigned int xms) //12MHz { unsigned int i, j; for(ixms;i0;i--) { for(j124;j0;j--); } } void main(void) { unsigned char num; while(1) { for(num0;num10;num) { P2 seg_table[num]; delay_ms(500); } } }问题2IO引脚数量不够直接并行驱动多位数码管每增加一位就要占用8根IOIO资源消耗巨大。解决方案74HC595串行转并行移位寄存器。只用3根IO就可以输出8路并行信号芯片支持级联驱动多位数码管。三、74HC595芯片详解关键引脚引脚名称功能14DS串行数据输入11SHCP移位寄存器时钟上升沿移位12STCP锁存寄存器时钟上升沿锁存输出13OE#输出使能低电平有效硬件直接拉低10MR#主复位硬件拉高禁止复位1‑7、15Q0‑Q7并行输出9Q7S串行级联输出接到下一片595的DS工作流程SHCP上升沿把DS引脚数据移入移位寄存器全部8bit移位完成STCP上升沿把移位寄存器数据锁存输出到Q0‑Q7。单块74HC595基础代码引脚定义DS → P0^3STCP → P0^4SHCP → P0^5#include reg52.h sbit ds_pin P0^3; sbit stcp_pin P0^4; sbit shcp_pin P0^5; //共阴极段码表 unsigned char seg_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //向74HC595发送1字节 void hc595_send_byte(unsigned char byte) { unsigned char i; for(i0;i8;i) { if(byte 0x80) ds_pin 1; else ds_pin 0; shcp_pin 0; shcp_pin 1; //移位时钟上升沿 byte 1; } stcp_pin 0; stcp_pin 1; //锁存上升沿 } void main(void) { while(1) { hc595_send_byte(seg_table[0]); //显示数字0 } }四、74HC595级联驱动两位数码管动态扫描硬件方案两片74HC595级联第一片输出段选数据a‑dp笔画第二片输出位选选择哪一个数码管点亮Q7S级联输出接到后一片DS引脚先发段码再发位选码。人眼视觉暂留原理快速轮流点亮每一位数码管肉眼看上去多位同时亮。注意简单while循环里面用delay做动态扫描一旦主循环有耗时任务数码管就会严重频闪。轮询动态扫描代码阻塞版#include reg52.h sbit ds_pin P0^3; sbit stcp_pin P0^4; sbit shcp_pin P0^5; unsigned char seg_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void hc595_send_byte(unsigned char byte) { unsigned char i; for(i0;i8;i) { if(byte 0x80) ds_pin 1; else ds_pin 0; shcp_pin 0; shcp_pin 1; byte 1; } } //seg段码addr位号0/1 void hc595_display(unsigned char seg,unsigned char addr) { hc595_send_byte(seg); if(addr 0) hc595_send_byte(0xFE); //选中第0位 else if(addr 1) hc595_send_byte(0xFD); //选中第1位 stcp_pin 0; stcp_pin 1; } void delay_ms(unsigned int xms) { unsigned int i,j; for(ixms;i0;i--) for(j124;j0;j--); } void main(void) { while(1) { hc595_display(seg_table[0],0); //第一位显示0 delay_ms(1); hc595_display(seg_table[3],1); //第二位显示3 delay_ms(1); } }五、进阶定时器中断实现数码管动态扫描推荐工程写法问题上面阻塞版动态扫描依赖delay延时如果主循环执行按键、传感器读取等耗时业务数码管就会频闪。✅解决把数码管扫描放到定时器中断里面执行定时自动刷新不受主循环业务代码影响。逻辑定时器每隔1‑2ms进一次中断每次只点亮1位数码管中断内部切换扫描下标。#include reg52.h sbit ds_pin P0^3; sbit stcp_pin P0^4; sbit shcp_pin P0^5; //共阴极段码 unsigned char seg_table[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char disp_buf[2] {0,3}; //显示缓存两位数码管显示数字0、3 unsigned char scan_idx 0; //扫描下标 void hc595_send_byte(unsigned char byte) { unsigned char i; for(i0;i8;i) { if(byte 0x80) ds_pin 1; else ds_pin 0; shcp_pin 0; shcp_pin 1; byte 1; } } //定时器0初始化1ms中断 11.0592M #define TIM_1MS (65536-922) void Timer0_Init(void) { TMOD | 0x01; TH0 TIM_1MS 8; TL0 TIM_1MS; ET0 1; EA 1; TR0 1; } //定时器中断执行数码管动态扫描 void Timer0_ISR(void) interrupt 1 { TH0 TIM_1MS 8; TL0 TIM_1MS; if(scan_idx 0) { hc595_send_byte(seg_table[disp_buf[0]]); hc595_send_byte(0xFE); stcp_pin 0; stcp_pin 1; scan_idx 1; } else { hc595_send_byte(seg_table[disp_buf[1]]); hc595_send_byte(0xFD); stcp_pin 0; stcp_pin 1; scan_idx 0; } } void main(void) { Timer0_Init(); while(1) { //此处可以自由写其他业务按键、传感器读取不会干扰数码管显示 } }六、开发踩坑总结区分共阴极、共阳极两者段码表完全不一样段码写反数码管乱码。51单片机IO拉电流弱直接驱动数码管亮度不足需要74HC245或者三极管驱动。74HC595级联先发段选数据再发位选数据Q7S接到下一级DS引脚。简单whiledelay动态扫描主循环有耗时任务会出现频闪产品项目优先定时器中断刷新数码管。动态扫描刷新频率建议50‑100Hz人眼无明显闪烁中断间隔1‑2ms比较合适。MR#复位引脚、OE#使能引脚硬件电平要正确否则595无输出。七、本章小结数码管本质多个LED组合分清共阴极、共阳极掌握段码表。74HC245用来增强IO驱动电流解决51拉电流不足。74HC595串行转并行少量IO扩展多路输出支持级联节省单片机IO资源。动态扫描利用人眼视觉暂留快速轮询点亮每一位数码管。工程推荐定时器中断做数码管刷新主循环不受阻塞兼容按键、传感器等其他业务。

相关新闻

2026/8/25 14:26:43

初识linux(day 06)

今天介绍的有以下五个内容: 1.printf 的缓冲区问题 2.静态库的创建和使用 3.共享库的创建和使用 4.静态库与共享库的区别 5.各种命令,库等文件的标准存放位置一,printf 的缓冲区问题 printf ( )的输出原理:将需要打印在屏幕上的东…

2026/8/25 14:26:43

dede php做网站?别被忽悠了!网页和网站差个十万八千里

对很多人而言, 对于网页究竟是什么, 一下子就处于那种完全摸不着头脑好似丈二和尚一般的状态。那网页到底是什么? 是效果图? 是代码? 是编程? 我表示 , 网页其实是它们融合而成的综合体 , 它里面的任何单独一项 , 都没办法称其为完整的情况。要是想要学会网页相关知识 , 那…

2026/8/25 14:26:43

2026-08-24:检查相邻数字差。用go语言,给定一个纯数字字符串,你需要检查其中任意两个紧挨着的数字,它们数值上的差距是否都不会超过 2。 如果整串数字中所有相邻位置都满足这个条件,就返回“是”

2026-08-24:检查相邻数字差。用go语言,给定一个纯数字字符串,你需要检查其中任意两个紧挨着的数字,它们数值上的差距是否都不会超过 2。 如果整串数字中所有相邻位置都满足这个条件,就返回“是”(true&…

2026/8/25 16:47:38

MSPM0G3507 Keil环境搭建:版本锁死与Flash算法定制

1. 为什么MSPM0G3507的开发环境搭建不是“装几个软件”那么简单你搜“MSPM0G3507 KEIL环境搭建”,页面刷出来几十个教程,点开一看——全是“下载Keil、安装驱动、新建工程、编译烧录”四步走。我去年带三个实习生做MSPM0G3507电机控制项目时,…

2026/8/25 16:47:38

Altium Designer21 PCB设计官方指南

本书是一部系统论述 AltiumDesigner21PCB基础设计的实战教程。全书共8章,*章为 Altium Designer21软件概述,介绍了 AltiumDesigner21软件的特点及新增功能、软件的运行环境、软件的安装和 激活、常用系统参数的设置,以及系统参数的导出/导入方法等;第2章为PCB设计流程与工程创建…

2026/8/25 16:47:38

深入解析RGB与CMYK色彩模型:从原理到Python图像处理实践

1. 项目概述:从“两种三原色”说起如果你对设计、摄影或者任何与数字图像打交道的工作感兴趣,那么“三原色”这个概念你一定不陌生。但你是否想过,为什么我们常说的三原色不止一种?为什么屏幕上用的是红绿蓝(RGB&#…

2026/8/25 16:47:38

C语言基础运算符:从赋值到自增自减

一、C语言基础运算符概览C语言提供了丰富的运算符来处理数据运算&#xff0c;初学者需要掌握以下几类基础运算符&#xff1a;算术运算符&#xff1a;、-、*、/、%赋值运算符&#xff1a;、、-、*、/、%关系运算符&#xff1a;、!、>、<、>、<自增自减运算符&#x…

2026/8/25 16:47:38

24G显卡免费体验 Qwen3.8-27B-Q4 端侧大模型

Qwen3.8-27B 是2026 年 8 月新出的开源模型&#xff0c;支持多模态&#xff0c;可识别图片视频。通过后训练比前代Qwen系列模型提升非常大&#xff0c;甚至在多项测试中超过了半年前的 Claude Opus 4.6 Max。4比特量化后&#xff0c;能达到FP16 原版95.59% 的能力&#xff0c;本…

2026/8/25 16:37:13

【非标自动化】3、AutoShop快速理解(软件介绍)

AutoShop是汇川面向小型PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制 器&#xff09;产品的编程组态软件&#xff0c;具有友好的编程和调试环境&#xff0c;拥有丰富、强大的通信和控 制功能。支持梯形图&#xff08;LD&#xff09;、顺序功能图&a…

2026/8/25 1:04:19

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/25 11:48:27

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 0:04:14

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地&#xff1a;GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description&#xff1a;GetQzonehistory 是一个QQ空间历史说…

2026/8/25 0:04:14

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子&#xff0c;从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/25 1:08:14

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…