单片机系统基础实验——LED数码管循环移位显示
第一部分 前言
本次单片机基础实验将会通过在Proteus软件中画原理图,然后Keil软件下编写源程序并编译形成可执行文件.hex,下载源程序,进行Protues和Keil的联合仿真运行,最终对单片机仿真有初步的认识。
- 通过本篇文章了解并熟悉8位数码管的电路结构、与单片机的连接方法及其应用原理
- 学习proteus构建LED数码管显示电路的方法,掌握C51中单片机控制LED数码管动态显示的原理与编程方法
第二部分 数码管的原理构成
LED数码管的结构
由8个发光二极管构成,按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点。如图1所示。
只要控制数码管各段LED的亮灭即可显示相应的数字、字母或符号。
LED数码管的工作原理
- 共阳极数码管工作原理
8个发光二极管的阳极共用一个电源的正极,阴极低电平点亮。数码管显示字符的条件:
- 在VT端加正电源
- (a,b,c,d,e,f,g,dp)端接低电平或“0”电平
如图2所示
- 共阴极数码管工作原理
8个发光二极管的阴极共用一个电源的负极,阳极高电平点亮。数码管显示字符的条件:
- 在VT端接地;
- (a,b,c,d,e,f,g,dp)端接高电平。
如图3所示
LED数码管的字形编码
要显示各种数字或字符,只需要将不同高低的电平信号送至不同的发光二极管的引脚上,将其点亮。这些用来控制LED显示的不同电平的代码称为字符的字段码。如图所示。
共阴极与共阳极显示器的字段码是逻辑非的关系。LED字码段与引脚之间的对应关系如下表所示
字码段 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
LED字段 | dp | g | f | e | d | c | b | a |
共阴极数码管显示字段码如下表所示
显示字符 | dp | g | f | e | d | c | b | a | 十六进制 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 3F |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 06 |
2 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 5B |
3 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 4F |
4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 66 |
5 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 6D |
6 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 7D |
7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 07 |
8 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 7F |
9 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 6F |
A | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 77 |
B | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 7C |
C | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 39 |
D | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 5E |
E | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 79 |
F | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 71 |
共阳极数码管显示字段码如下表所示
显示字符 | dp | g | f | e | d | c | b | a | 十六进制 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | C0 |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | F9 |
2 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | A4 |
3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | B0 |
4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 99 |
5 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 92 |
6 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 82 |
7 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | F8 |
8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 80 |
9 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 90 |
A | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 88 |
B | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 83 |
C | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | C6 |
D | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | A1 |
E | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 86 |
F | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 8E |
LED数码管的控制方式
LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位。LED数码管的驱动方式有:静态驱动、动态驱动。
- 静态显示驱动
也称直流驱动。每个数码管的每一个段码都由一个单片机的I/O口进行驱动。
优点:编程简单,显示亮度高;
缺点:占用I/O口多。 - 动态显示驱动
将所有数码管的段选端“a,b,c,d,e,f,g,dp ”的同名端连在一起,每个数码管的公共
极COM增加位选通控制电路,位选通由各自独立的I/O线控制。
优点:占用I/O口少;
缺点:电路设计和编程更复杂。
第三部分 设计项目
Protues仿真图
基于上述实验项目,将会设计一单片机控制的8位数码管(共阴极或是共阳极数码管均可)显示电路,编程实现一段数字的循环左移显示,本次设计将采用共阴极数码管,在Protues中为7SEG-MPX4-Cathode,因此可以得到如下图所示的原理图。
仿真动态结果
通过两个4位LED数码管实现数字的循环,利用74HC573和ULN2804对单片机的结果进行输出锁存,然后将结果通过数码管进行显示,其动态结果如下图所示。
如图所示,通过在keil中输出2020 0111 CC的16进制结果从而得到相应的结果,数码管进行移位显示。
代码
Keil代码如下:
#include<reg51.h>
#define uchar unsigned char
#define uint signed int
sbit seg=P2^0;
sbit wei=P2^1;
uchar code LED_D[]={0x5B,0x3F,0x5B,0x06,0x3F,0x06,0x06,0x06,0x39,0x39}; //改变需要输入的字段码即可改变输出的数值
uchar code LED_W[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//延时函数,消抖
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<150;i++);
}
//主函数
void main()
{
uchar a,b;
P0=0x00;
seg=0;wei=0;
while(1)
{
for(a=0;a<10;b++,a++)
{
P0=LED_D[a];
seg=1;seg=0;
P0=LED_W[b];
if(b==7)
b=-1;
wei=1;wei=0;
delay(150);
P0=0x00;
seg=1;seg=0;
wei=1;wei=0;
}
}
}
以上就是本次LED数码管显示的全部内容,希望通过本次的讲解能够加深大家对于数码管的理解。文章的内容可能存在部分不足之处,如有错误,请在评论区指出,谢谢。