【嵌入式成长7】STC89C51数码管|共阴/共阳原理,74HC245、74HC595级联、动态扫描、定时器中断刷新实战

发布时间:2026/10/17 7:00:35

【嵌入式成长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/10/17 7:00:10

初识linux(day 06)

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

2026/10/17 6:59:52

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

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

2026/10/16 4:57:02

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

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

2026/10/17 7:00:01

iOS地图定位Demo拆解:CoreLocation+MapKit权限、坐标系与调试避坑指南

简介:这是一份iOS地图定位示例工程,专门面向刚接触Core Location与MapKit的移动开发初学者,帮助解决在iOS应用中获取用户当前位置、并将定位结果标注到地图上的基础需求,适合作为入门练习和功能演示的参考模板。压缩包共23个文件&…

2026/10/17 7:00:01

C++五子棋源码解析:人机/人人双模式与AI博弈实现

简介:一套用C实现的五子棋对战程序源码包,同时支持人机与人人两种模式,适合C初学者和游戏开发入门者学习类的设计、AI决策算法以及图形界面交互,可作为第一个完整的游戏练手项目。压缩包共收录7个文件,整体仅106KB&…

2026/10/17 7:00:01

Java学生宿舍管理系统毕设:JSP+Servlet+MySQL设计与实现详解

简介:这套基于Java的学生宿舍管理系统以SpringBoot为后台框架,采用Bootstrap构建前端界面,搭配MySQL数据库,适合高校毕业设计、课程实训以及刚接触后台管理系统的Java开发者。系统按角色划分三个入口:管理员可对学生、…

2026/10/17 7:00:01

模糊控制不再玄学:自适应模糊器从设计到调参避坑指南

简介:面向控制工程学习者与研究人员,围绕模糊控制及自适应模糊器设计,提供MATLAB Simulink环境下的完整实现方案,解决非线性系统智能控制建模与参数自整定问题,适用于课程设计、毕业设计及工程预研等场景。压缩包共426…

2026/10/17 7:00:01

Windows版Hydra实战:从环境配置到弱口令检测的完整指南

简介:面向Windows平台的Hydra暴力破解工具及配套密码字典合集,专为渗透测试人员、安全运维及口令安全研究者在授权环境下进行登录口令强度检测而准备。包内含完整可运行的hydra.exe及全套DLL运行库,另附密码检查工具、辅助脚本、示例文件等&a…

2026/10/17 6:55:01

AI辅助科研:赋能学术创新与高效科研成果产出的新路径探索

很多2026级新生刚入学或刚转博,就被开题报告这四个字整得心力交瘁。最崩溃的不是写不出来,而是你辛辛苦苦熬夜半个月翻出来的创新点,导师看一眼就冷冷地抛回一句:这个方向十年前就有人做透了,前沿性在哪?或…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑