基于单片机的LED数码管循环移位显示

单片机系统基础实验——LED数码管循环移位显示

  • 第一部分 前言
  • 第二部分 数码管的原理构成
    • LED数码管的结构
    • LED数码管的工作原理
    • LED数码管的字形编码
    • LED数码管的控制方式
  • 第三部分 设计项目
    • Protues仿真图
    • 仿真动态结果
    • 代码

第一部分 前言

  本次单片机基础实验将会通过在Proteus软件中画原理图,然后Keil软件下编写源程序并编译形成可执行文件.hex,下载源程序,进行Protues和Keil的联合仿真运行,最终对单片机仿真有初步的认识。

  • 通过本篇文章了解并熟悉8位数码管的电路结构、与单片机的连接方法及其应用原理
  • 学习proteus构建LED数码管显示电路的方法,掌握C51中单片机控制LED数码管动态显示的原理与编程方法

第二部分 数码管的原理构成

LED数码管的结构

  由8个发光二极管构成,按照一定的图形及排列封装在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点。如图1所示。
基于单片机的LED数码管循环移位显示_第1张图片

图1 引脚定义及1位数码管实物图

  只要控制数码管各段LED的亮灭即可显示相应的数字、字母或符号。

LED数码管的工作原理

  1. 共阳极数码管工作原理
    8个发光二极管的阳极共用一个电源的正极,阴极低电平点亮。数码管显示字符的条件:
  • 在VT端加正电源
  • (a,b,c,d,e,f,g,dp)端接低电平或“0”电平
    如图2所示
    基于单片机的LED数码管循环移位显示_第2张图片
图2 共阳极LED数码管的内部结构原理图
  1. 共阴极数码管工作原理
    8个发光二极管的阴极共用一个电源的负极,阳极高电平点亮。数码管显示字符的条件:
  • 在VT端接地;
  • (a,b,c,d,e,f,g,dp)端接高电平。
    如图3所示
    基于单片机的LED数码管循环移位显示_第3张图片
图3 共阴极LED数码管的内部结构原理图

LED数码管的字形编码

  要显示各种数字或字符,只需要将不同高低的电平信号送至不同的发光二极管的引脚上,将其点亮。这些用来控制LED显示的不同电平的代码称为字符的字段码。如图所示。
基于单片机的LED数码管循环移位显示_第4张图片

  共阴极与共阳极显示器的字段码是逻辑非的关系。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,因此可以得到如下图所示的原理图。
基于单片机的LED数码管循环移位显示_第5张图片

仿真动态结果

  通过两个4位LED数码管实现数字的循环,利用74HC573和ULN2804对单片机的结果进行输出锁存,然后将结果通过数码管进行显示,其动态结果如下图所示。
基于单片机的LED数码管循环移位显示_第6张图片
  如图所示,通过在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数码管显示的全部内容,希望通过本次的讲解能够加深大家对于数码管的理解。文章的内容可能存在部分不足之处,如有错误,请在评论区指出,谢谢。

你可能感兴趣的:(单片机,编程语言)