Proteus + Keil单片机仿真教程(四)数码管0-9动态显示

本文介绍了数码管的工作原理,包括7段和8段数码管的区别,以及共阳极和共阴极的连接方式。通过Proteus展示了数码管的封装类型,并使用51单片机编写了程序,演示了数码管动态显示数字和字母的效果。程序中详细列出了0到9及一些字母的二进制表示,提供了数码管显示的动态代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        数码管就是将发光二极管(LED)封装成“8”字样的电子元件,目前常用的就是7段和8段的,7段和8段区别就是有无小数点,可以进行自由组合,如下图所示:

       在连接方式上可以分为共阴数码管和共阳数码管,共阴数码管就是共用负极,共阳则相反,共用一个正极。在封装形式上可以分为7段、8段、米字等,在Proteus里面搜索seg就可以看到所有的数码管,如下图所示:

 注:标有CA的为共阳极数码管,标有CC的为共阴极数码管

这里我们使用共阳极数码管,即7SEG-MPX1-CA,添加对应的电子元件,列表如下所示:

AT89C51      ----> 51单片机
BUTTON       ----> 按钮
CAP          ----> 普通电容
CAP-ELEC     ----> 电解电容要分正负极
CRYSTAL      ----> 晶振
7SEG-MPX1-CA ----> 八位数码管,共阳极
RESISTOR     ----> 电阻

原理图绘制如下:

 沿用上节代码,如下所示:

//添加头文件,C51必要文件,主要定义的是51/52系列单片机
#include "reg52.h"
#include "intrins.h"
//引用延时函数
void Delay1MS(unsigned int t);
unsigned char tmp,i;
int main(void){
	//进入循环
	while(1){
		//点亮并熄灭P00,P00点亮0.5s
		tmp = 0xfe; //对应的二进制为0111 1111
		Delay1MS(500);
		for(i=0;i<8;i++){
			P0 = tmp;
			tmp = _crol_(tmp,1);//每隔0.2s向左位移一位
			Delay1MS(200);
			
		}
		//所有LED发光二极管闪烁两次
		P0 = 0xFF;
		Delay1MS(200);
		P0 = 0x00;
		Delay1MS(200);
		P0 = 0xFF;
		Delay1MS(200);
		P0 = 0x00;
		Delay1MS(200);
 
	}
}
//1m延时程序
void Delay1MS(unsigned int t){
	unsigned char i;
	while(--t != 0){
		for(i = 0; i < 125; i++);
	}
}

效果:

       上节程序就是依次点亮发光二极管,通过这种方式就可以看到数码管相关的封装顺序,同样,查询对应数码管文档即可知道封装的顺序,根据说明文档如下图所示:

        根据文档就可以定义出0、1、2、3、4、5、6、7、8、9、A、b、c、d、E、F等常用数字字母的二进制1,如下表所示:

字符dpgfedcba十六进制
0110000000xC0
1111110010xF9
2101001000xA4
3101100000xB0
4100110010x99
5100100100x92
6100000100x82
7111110000xF8
8100000000x80
9100100000x90
A100010000x88
b100000110x83
C110001100xC6
c101001110xA7
d101000010xA1
E100001100x86
F100011100x8E
L110001110xC7

 根据对应字符的进制表可以写一个数码管动态显示的小程序,具体代码如下所示:

//添加头文件,C51必要文件,主要定义的是51/52系列单片机
#include "reg52.h"
#include "intrins.h"
//引用延时函数
void Delay1MS(unsigned int t);
//定义0~9,AbCcdEFL的数组字典
unsigned char code numhex[18]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA7,0xA1,0x86,0x8E,0xC7};
int main(void){
	unsigned char i;
	i=0;
	//进入循环
	while(1){
		//每隔0.5P0重新显示一次,显示内容从字典中获取
		P0 = numhex[i];
		Delay1MS(500);
		i++;
		if(i==18){
			i=0;
		}
	}
}
//1m延时程序
void Delay1MS(unsigned int t){
	unsigned char i;
	while(--t != 0){
		for(i = 0; i < 125; i++);
	}
}

 效果如下所示:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个爱折腾的小人物

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

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

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

打赏作者

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

抵扣说明:

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

余额充值