数码管就是将发光二极管(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,如下表所示:
字符 | 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++);
}
}
效果如下所示: