跳到主要内容

8051微控制器与七段显示器接口

七段显示器用于显示数字信息。七段显示器可以显示从0到9的数字,甚至可以显示部分字符,如A、b、C、H、E、e、F等。它们非常流行,且有许多应用。在本项目中,我将展示如何通过将七段显示器与8051微控制器接口来工作。

在开始本概念之前,先了解如何将LED与8051微控制器接口。

本文描述了如何将七段显示器与AT89C51微控制器接口。该系统以预定延迟连续显示0到9的数字。在此过程中,我将设计两个电路:一个是单数位七段显示器电路,另一个是4位七段显示器电路。

1. 电路原理

七段显示器内部由8个LED组成。在这8个LED中,7个用于表示0到9的数字,1个用于表示小数点。通常七段显示器有两种类型:共阴极和共阳极。

在共阴极型中,所有LED的阴极连接在一起,标记为com,而阳极单独引出。在共阳极型中,所有LED的阳极连接在一起,阴极单独引出。下图显示了七段显示器的内部连接。

alt text

在第一个电路中,我将一个共阴极单数位七段显示器与8051微控制器接口,而在第二个电路中,我将一个共阳极型4位七段显示器与8051微控制器接口。

2. 电路原理图

2.1 电路1:8051与单数位七段显示器接口(共阴极)

在第一个电路中,我将单数位七段显示器与8051接口。该七段显示器为共阴极型。

alt text

2.2 电路2:8051与4位七段显示器接口(共阳极)

在第二个电路中,我将4位七段显示器与8051接口,显示器类型为共阳极型。

alt text

3. 电路元件

  • AT89C51微控制器
  • AT89C51编程板
  • 编程线缆
  • 12V直流电池或适配器
  • 共阴极七段显示器
  • 共阳极4位七段显示器
  • 电阻 – 10KΩ X 2,330Ω,1KΩ X 8,470Ω X 4
  • 1KΩ X 8电阻包
  • 33pF陶瓷电容 X 2
  • 11.0592 MHz晶振
  • 10μF电解电容
  • 2N2222 NPN晶体管 X 4
  • 按键
  • 连接导线

4. 电路设计

4.1 电路1

在这里,使用共阴极七段显示器显示数字。在此电路中,七段显示器的a到h引脚连接到微控制器的PORT2,com引脚通过330Ω电阻接地。该电阻用于降压。由于我们使用的是共阴极七段显示器,需要发送逻辑1信号给各段才能点亮。

下图显示了共阴极七段显示器结构。点用于表示小数点。所有LED的阴极连接到GND引脚。LED工作电压为2~3V,但控制器输出为5V,因此需要通过电阻连接a到g引脚以降低电压。

alt text

4.2 电路2

由于第二个电路使用的4位七段显示器为共阳极型,因此需要通过公共端驱动LED段。我使用了4个NPN晶体管来驱动4个公共阳极,并由8051控制。

a到h段连接到8051的PORT0引脚。

5. 数字驱动模式

在七段显示器上显示数字,需要点亮不同逻辑组合的段。例如,要显示数字3,需要点亮a、b、c、d和g段。下表显示了从PORT2发送的十六进制值,以显示0到9的数字。

数字Dpgfedcba十六进制值
0001111100x3f
1000001100x06
2010110110x5b
3010011110x4f
4011001100x66
5011011010x6d
6011111010x7d
7000001110x07
8011111110x7f
9011001110x67

**注意:**这些值仅适用于共阴极显示器。如果驱动共阳极显示器,则需要取每个位的补码,并在代码中替换十六进制值(在第二个电路代码中已处理)。

6. 算法

6.1 电路1

首先在数组中初始化所有数字的段十六进制值:

unsigned char arr[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

然后使用for循环,将数组值赋给PORT2,并延迟一定时间:

for (i=0;i<10;i++)
{
P2=arr[i];
delay_ms(500);
}

6.2 电路2

首先在数组中初始化数字的段十六进制值:

unsigned char ch[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

根据值切换各位显示:

void display (unsigned long int n)
{
led=ch[n/1000];
sw1=1;
sdelay(30);
sw1=0;

led=ch[(n/100)%10];
sw2=1;
sdelay(30);
sw2=0;

led=ch[(n/10)%10];
sw3=1;
sdelay(30);
sw3=0;

led=ch[n%10];
sw4=1;
sdelay(30);
sw4=0;
}

7. 代码

7.1 电路1(单数位)

代码及仿真文件可从下载链接获取。

下载项目代码

7.2 电路2(4位)

#include<reg51.h> 
#define led P0
sbit sw1=P2^0;
sbit sw2=P2^1;
sbit sw3=P2^2;
sbit sw4=P2^3;
unsigned char ch[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//void delay (int);
void display (unsigned long int);
void sdelay (char);

/*void delay (int d)
{
unsigned char i;
for(;d>0;d--)
{
for(i=250;i>0;i--);
for(i=248;i>0;i--);
}
}*/

void sdelay (char d)
{
for(;d>0;d--);
}

void display (unsigned long int n)
{
led=ch[n/1000];
sw1=1;
sdelay(30);
sw1=0;

led=ch[(n/100)%10];
sw2=1;
sdelay(30);
sw2=0;

led=ch[(n/10)%10];
sw3=1;
sdelay(30);
sw3=0;

led=ch[n%10];
sw4=1;
sdelay(30);
sw4=0;
}

void main()
{
unsigned long int i=1;

while(1)
{
i=++i;
display(i);
if(i==9999)
i=0;
}
}

8. 操作方法

  • 将程序烧录到微控制器
  • 按电路图连接
  • 确保第一个电路中七段的a到g引脚分别连接到P2.0到P2.6,第二个电路连接到PORT0引脚
  • 打开电源,第一个电路上将以一定延迟连续显示0到9,第二个电路上显示0到9999
  • 关闭电源

9. 应用

  • 七段显示器广泛用于数字时钟显示时间
  • 用于电子仪表显示数字信息
  • 用于仪表盘
  • 用于数字读数显示

10. 限制

  • 显示大量信息时复杂度增加
  • 无法在七段显示器上显示符号