【Proteus仿真】数码管控制系列仿真——单个数码管控制/多数码管控制
目录
0案例视频效果展示
0.1例子1:控制单个数码管显示0-9
0.2例子2:8个数码管控制显示
0.3例子3:8只数码管闪烁显示数字串
0.4例子4:数码管滚动显示数字串
1基础知识补充
1.1 数码管基础知识
1.1.1外观与引脚
1.1.2 共阴(CC) vs 共阳(CA)
1.1.3段码表(以数字1为例)
1.1.4驱动方式
1.1.5 多连排数码管动态扫描
1.1.6 快速排查清单
2例子1:控制单个数码管显示0-9
2.1电路原理图
2.1.1电路组成及接线
2.2控制程序
2.2.1控制程序步骤
2.2.3源代码
3例子2:8个数码管控制显示
2.1电路原理图
2.1.1电路组成及接线
3.2控制程序
3.2.1控制程序步骤
3.2.2源代码
4例子3:8只数码管闪烁显示数字串
4.1电路原理图
4.1.1电路组成及接线
4.2控制程序
4.2.1控制程序步骤
4.2.2源代码
5例子4:数码管滚动显示数字串
5.1电路原理图
5.2.2源代码
7 硬件工程师笔试面试相关文章链接(部分链接)
摘要:本文系统介绍了7段数码管的原理与应用,重点讲解了共阴/共阳数码管的区别、段码表生成方法及四种典型控制案例。内容包括:单个数码管0-9循环显示(直连IO)、8位数码管动态扫描(0-7滚动显示)、数字串闪烁显示和左移滚动显示三种效果实现。每个案例均提供完整的电路原理图、控制流程和51单片机C语言源代码,涉及动态扫描、环形队列等关键技术。文章还详细介绍了数码管驱动方式选择、常见问题排查方法等实用知识,为电子设计初学者提供了全面的数码管应用参考方案。
0案例视频效果展示
0.1例子1:控制单个数码管显示0-9
例子10:控制单个数码管显示0-9
0.2例子2:8个数码管控制显示
例子11:8个数码管控制显示
0.3例子3:8只数码管闪烁显示数字串
例子12:8只数码管闪烁显示数字串
0.4例子4:数码管滚动显示数字串
例子13:数码管滚动显示数字串
1基础知识补充
1.1 数码管基础知识
7段数码管(7-segment display)是最常见的数字显示器件之一,广泛用于仪表、时钟、计数器等场合。
1.1.1外观与引脚
如上图所示,7个发光段分别命名为 a、b、c、d、e、f、g(顺时针方向排列),再加一个小数点 dp。
引脚排列没有统一标准,务必看数据手册或用万用表「二极管档」量:红笔固定接公共端,黑笔依次碰其它脚,某一段亮就说明该脚对应段。
1.1.2 共阴(CC) vs 共阳(CA)
共阴:所有 LED 阴极并在一起 → 公共脚接 GND,要点亮某段就给该段阳极送高电平(+V)。
共阳:所有 LED 阳极并在一起 → 公共脚接 +V,要点亮某段就给该段阴极送低电平(GND)。
记忆口诀:
共阴 = “给1亮”
共阳 = “给0亮”
1.1.3段码表(以数字1为例)
数字1需要点亮 b、c 两段。
类型 | a b c d e f g dp | 十六进制 | 说明 |
共阴 | 0 1 1 0 0 0 0 0 | 0x06 | b、c=1,其余=0 |
共阳 | 1 0 0 1 1 1 1 1 | 0xF9 | b、c=0,其余=1 |
完整段码速查:
0 1 2 3 4 5 6 7 8 9
共阴:0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x6F
共阳:取反即可(~共阴 & 0xFF)
1.1.4驱动方式
A. 直连IO(最简单,占用IO多)
一个段一根线,共阴或共阳公共端固定接GND/VCC。
适合单个数码管、教学实验。
B. 译码/驱动芯片
74HC47(BCD→7段,共阳)
CD4511(BCD→7段,带锁存,共阴)
TM1637、MAX7219(集成扫描与亮度调节)
C. MCU+三极管/MOS(动态扫描多个位)
节省IO:段线共用,位选线轮流导通。
需要定时刷新(>100 Hz 无闪烁)。
1.1.5 多连排数码管动态扫描
以4位共阴为例:
12个IO:8段+4位选
流程:
关所有位(位选高)
送第N位段码
打开第N位(位选低)
延时1~2 ms
回到1,循环
伪代码:
const uint8_t seg_cc[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void display_4digit(uint16_t val){for(uint8_t pos=0; pos<4; pos++){set_digit_OFF();output_SEG(seg_cc[val%10]); // 输出段码set_digit_ON(pos); // 打开位delay_ms(2);val /= 10;}}
1.1.6 快速排查清单
不亮:检查公共端电压、限流电阻(每段330 Ω~1 kΩ)。
乱亮:段码高低反了(把共阴/共阳搞反)。
闪烁:动态扫描频率太低,提高刷新或加定时器中断。
2例子1:控制单个数码管显示0-9
实现功能:循环显示0-9
本质:控制I/O口高低电平点亮数码管对应的LED灯段
2.1电路原理图
2.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>连接数码管/排阻 |
复位电路 | |
晶振电路 | |
排阻 | |
单个数码管 |
2.2控制程序
2.2.1控制程序步骤
库文件
数字(0-9)对应16进制
延时函数
主程序(0-9循环显示)
2.2.3源代码
//循环显示0-9#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i=0;P0=0x00;while(1){ /* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);}}
3例子2:8个数码管控制显示
实现功能:数码管从左到右依次滚动显示0~7,每次仅循环选通一只数码管
本质:控制I/O口高低电平点亮数码管对应的LED灯段
2.1电路原理图
2.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>数码管段(ABCDEFG/DP) P2.0-P2.7—>三极管数码管驱动电路 1-8(数码管位)—>三极管数码管驱动电路 |
复位电路 | |
晶振电路 | |
8数码管 | |
三极管数码管驱动电路 |
3.2控制程序
3.2.1控制程序步骤
库文件
引脚输出对应16进制码值
主程序(数码管从左到右依次滚动显示0~7,每次仅循环选通一只数码管)
3.2.2源代码
//功能:数码管从左到右依次滚动显示0~7,每次仅循环选通一只数码管#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff; //关闭显示wei=_crol_(wei,1);P0=DSY_CODE[i]; //发送数字段码P2=wei; //发送位码DelayMS(300);}}}
4例子3:8只数码管闪烁显示数字串
实现功能:8只数码管闪烁显示数字串(数码管闪烁显示由0~7构成的一串数字)
本质:控制I/O口高低电平点亮数码管对应的LED灯段
4.1电路原理图
4.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>数码管段(ABCDEFG/DP) P2.0-P2.7—>三极管数码管驱动电路 1-8(数码管位)—>三极管数码管驱动电路 |
复位电路 | |
晶振电路 | |
8数码管 | |
三极管数码管驱动电路 |
4.2控制程序
4.2.1控制程序步骤
库文件
段码表和位码表定义
延时函数
主程序(8只数码管闪烁显示数字串)
4.2.2源代码
//功能:8只数码管闪烁显示数字串(数码管闪烁显示由0~7构成的一串数字)本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。#include<reg51.h>#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//位码表uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j;while(1){for(i=0;i<30;i++){ for(j=0;j<8;j++){P0=0xff;P0=DSY_CODE[j]; //发送段码P2=DSY_IDX[j]; //发送位码DelayMS(2);}}P2=0x00; //关闭所有数码管并延时DelayMS(1000);}}
5例子4:数码管滚动显示数字串
实现功能:数码管向左滚动显示3个字符构成的数字串
本质:控制I/O口高低电平点亮数码管对应的LED灯段
5.1电路原理图
5.1.1电路组成及接线
名称 | 接线 |
AT89C51单片机 | XTAL1/XTAL2—>连接晶振电路 RST—>连接复位电路 P0.0-P0.7—>数码管段(ABCDEFG/DP) P2.0-P2.7—>三极管数码管驱动电路 1-8(数码管位)—>三极管数码管驱动电路 |
复位电路 | |
晶振电路 | |
8数码管 | |
三极管数码管驱动电路 |
5.2控制程序
5.2.1控制程序步骤
库文件
段码表定义
延时函数
主程序(8只数码管闪烁显示数字串并进行移位)
5.2.2源代码
//功能:数码管向左滚动显示3个字符构成的数字串#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)uchar Num[]={10,10,10,10,10,10,10,10,2,9,8};//延时void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//主程序void main(){uchar i,j,k=0,m=0x80;while(1){ //刷新若干次,保持一段时间的稳定显示for(i=0;i<15;i++){ for(j=0;j<8;j++){ //发送段码,采用环形取法,从第k个开始取第j个P0=0xff;P0=DSY_CODE[Num[(k+j)%11]]; m=_crol_(m,1);P2=m; //发送位码DelayMS(2);}}k=(k+1)%11; //环形队列首支针k递增,Num下标范围0~10,故对11取余}}
7 硬件工程师笔试面试相关文章链接(部分链接)
更多文章可前往主页观看
1、硬件工程师笔面试真题汇总(2025版本)_硬件工程师面试题-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程师笔试面试高频考点汇总——(2025版)_电容或者电感对锁存器的影响-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程师笔试面试汇总(2025版本)_硬件工程师面试题-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)_【【硬件工程师炼成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程师笔记——电子器件汇总大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程详尽版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331