51单片机入门02--数码管

Catalogue
  1. 1. 51单片机入门02–数码管
  2. 2. 实验环境
  3. 3. 数码管结构和原理
  4. 4. 数码管的显示方式
  5. 5. 示例1:循环显示0~9(静态显示)
    1. 5.1. 电路图及源码
  6. 6. 示例2:用多位数码管显示selph字样(动态显示)

51单片机入门02–数码管

实验环境

  • Protues
  • Keil

数码管结构和原理

原理图:

image-20200512164114318

不同字符对应16进制断码为:

image-20200512164342327

数码管的显示方式

显示方式分为静态显示和动态显示,其中:

  • 静态显示

    • 每个数码管的段选线与一组I/O接口线连接
    • 每个数码管一直显示
    • 公共端接地或电源
  • 动态显示

    • 所有数码管的段选线与一组I/O接口线并联
    • 每个数码管的公共端由一根I/O线控制
    • 显示为逐个显示

只显示一位的话,那就不做区分了,因为都一样

示例1:循环显示0~9(静态显示)

电路图及源码

image-20200512171852130

代码如下:通过数组来控制依次显示的字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "reg51.h"
unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};

void delay(int n){
int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}

void seg(){
int i=0;
for(i=0;i<10;i++){
P2 = s[i];
delay(1000);
}
}

void main(){
while(1){
seg();
}
}

示例2:用多位数码管显示selph字样(动态显示)

电路图&效果图如下:

image-20200512173832213

代码如下:通过一个数组来定义显示的字符,另一个数组来定义显示的顺序,从而实现动态显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "reg51.h"
unsigned char anode[]={0x92,0x86,0xc7,0x8c,0x89};//SELPH
unsigned char nu[]={0x01,0x02,0x04,0x08,0x10};

void delay(int n){
int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}


void seg(){
int i=0;
for(i=0;i<5;i++){
P3 = nu[i];//P2和P3的顺序不能反,不然残留的内容会出问题
P2 = anode[i];
delay(10);//利用视觉残留产生同时显示多位不同的字符的效果
}
}


void main(){
while(1){
seg();
}
}

简化版电路图&效果图:

image-20200512192750129

这里使用74LS137译码器(74LS138也可以)进行译码操作(功能表及使用方法自行百度),通过P3.1-P3.3 的3个端口来表示全部8位的内容,有效节约了单片机的端口使用。

这里使用的是共阴的数码管,如果使用共阳则需要在译码器的8个输出端口加一个反相器

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "reg51.h"
unsigned char cathode[]={0x6d,0x79,0x38,0x73,0x76};
unsigned char ym[]={0x00,0x01,0x02,0x03,0x04};

void delay(int n){
int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}


void seg(){
int i=0;
for(i=0;i<5;i++){
P3 = ym[i];
P2 = cathode[i];
delay(5);
}
}


void main(){
while(1){
seg();
}
}