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

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

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

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

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

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

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

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

原理图绘制如下:

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

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

//添加头文件,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++);
	}
}

效果:

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

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

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

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

字符 dp g f e d c b a 十六进制
0 1 1 0 0 0 0 0 0 0xC0
1 1 1 1 1 1 0 0 1 0xF9
2 1 0 1 0 0 1 0 0 0xA4
3 1 0 1 1 0 0 0 0 0xB0
4 1 0 0 1 1 0 0 1 0x99
5 1 0 0 1 0 0 1 0 0x92
6 1 0 0 0 0 0 1 0 0x82
7 1 1 1 1 1 0 0 0 0xF8
8 1 0 0 0 0 0 0 0 0x80
9 1 0 0 1 0 0 0 0 0x90
A 1 0 0 0 1 0 0 0 0x88
b 1 0 0 0 0 0 1 1 0x83
C 1 1 0 0 0 1 1 0 0xC6
c 1 0 1 0 0 1 1 1 0xA7
d 1 0 1 0 0 0 0 1 0xA1
E 1 0 0 0 0 1 1 0 0x86
F 1 0 0 0 1 1 1 0 0x8E
L 1 1 0 0 0 1 1 1 0xC7

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

//添加头文件,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++);
	}
}

 效果如下所示:

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

你可能感兴趣的:(51单片机,单片机,51单片机,proteus,mcu,嵌入式硬件)