51单片机(十)—— 8位数码管-数码管扫描
2021-07-16 来源:eefocus
一、原理介绍
关于数码管的控制电路,在《51单片机(八)》中有详细的介绍,硬件电路如下图所示。

在这个实验中,我们对数码管进行扫描。在进行实验时,需要将单片机的P00~P07引脚与J44相连。接口的对应关系是(P00—D0),……,(P07—D7)。将单片机的P10和P11引脚与J45相连,P10与J45上的DM对应,P11与WM对应。
二、实例介绍
这个实验的代码如下所示
#include #define DATA P0 //定义数据端口 程序中遇到DATA 则用P0口 替换 sbit DM = P1^0; //定义锁存使能端口 段锁存 sbit WM = P1^1; //定义锁存使能端口 位锁存 unsigned char BJTY_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0123456789 unsigned char BJTY_WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char m=0; /********************************************************************/ /* 延时函数 */ /* 延时时间的计算对应单片机12MHz的晶振 */ /* x为延时的ms数,例:x为10时,延时时间约为10ms */ /********************************************************************/ void delay1ms(unsigned int x) { unsigned int i,j; for(j=0;j } /********************************************************************/ /* 主函数 */ /********************************************************************/ void main(void) { for(;;) { DATA=0; //清空显示以防重影 DM=1; //段锁存 DM=0; DATA=BJTY_WeiMa[m]; //取位码 WM=1; //位锁存 WM=0; DATA=BJTY_DuanMa[m]; //取段码 DM=1; //段锁存 DM=0; delay1ms(2); //延时2ms m++; if(m==8) //检测8位扫描是否结束 m=0; //如扫描完成则从第一个开始再次扫描8位 } } 将程序烧写到单片机中运行,效果如下所示。 1、需要多位数码管显示不同数据时就需要用动态扫描。扫描的方式是,先点亮数码管的第一位,之后点亮第二位,并以此点亮其它位,点亮第八位之后,在转回来点亮第一位,如此反复点亮。动态扫描速度很快,由于人眼的视觉暂留,看到的效果是八位数码管都是同时点亮的。所谓“视觉暂留”是指人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。 由程序中可以看出,向数码管赋值一位数据后,延时2ms, delay1ms(2); //延时2ms 显示8位数据,总共耗时16ms,人眼的视觉暂留时间约为100ms,因此,虽然单一时刻只有一个数码管点亮,但是人看到的效果是8位数码管全部点亮,并且显示不同的数字。 2、if语句 在这个程序中使用了if语句。 if(m==8) //检测8位扫描是否结束 m=0; //如扫描完成则从第一个开始再次扫描8位 这个if语句的作用是判断m是否等于8,如果是则,点亮了第八位数码管,则令m=0,下一个周期点亮第一位数码管。 if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。 第一种形式为基本形式: if(表达式) 语句 其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图。 第二种形式为: if-else if(表达式) 语句1; else 语句2; 其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。其过程可表示为下图。 第三种形式为if-else if-else形式 前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else if-else语句,其一般形式为: if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; … else if(表达式m-1) 语句m-1; else 语句m; 其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句m。然后继续执行后续程序。if-else if-else语句的执行过程如下图所示。 关于锁存器的操作代码,可以参考《51单片机(九)》中的讲解。



- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




