基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

目录

仿真效果图

仿真图

代码

系统论文

资源下载


设计的内容和要求

熟悉51系列(兼容)单片机软件开发系统Keil C51集成开发环境(u Vison系列编译器)和Proteus电路分析与实物仿真软件。

了解点阵LED显示器结构及字符字模(字符代码),熟悉点阵LED显示器驱动的基本原理。设计16×16点阵LED显示器的驱动电路,并编写程序实现在16×16点阵LED显示器上的字符滚动显示。16×16点阵LED显示器可由4块8×8点阵LED显示器构成。可采用单片机并行端口、移位寄存器、译码器或锁存器等4种驱动方式中的组合实现对16×16点阵LED显示器的驱动。电路方面主要包括以下3部分。

(a)设计单片机的最小系统(包括复位电路和外接的晶振电路),并确定相关元器件参数。

(b)采用动态驱动的方式,设计单片机并行端口、移位寄存器、译码器或锁存器等与16×16点阵LED显示器的驱动电路,主要包括控制点阵LED行和列的连线。

(c)采用移位寄存器、译码器或锁存器驱动点阵LED显示器时,设计单片机与移位寄存器、译码器或锁存器间的控制连线。  编写16×16点阵LED显示器字符(串)滚动显示程序,实现数字(0—9)或英文字符的滚动显示。        

仿真效果图


仿真图


代码(部分)


#include <reg51.h>		  //头文件//
#define  u8	  unsigned char  //定义无符号字符型变量//
#define  u16  unsigned int     //定义无符号整数型变量//
#define  SPEED   10       
//端口定义//
sbit DS=P2^0;
sbit SH=P2^1;
sbit ST=P2^2;

u8 code table1[]={	          //定义高八位数组//	 

//字模定义//
/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x10,0x10,0x10,0x11,0x0E,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x03,0x04,0x08,0x1F,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1F,0x10,0x11,0x11,0x10,0x10,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x11,0x11,0x18,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x1C,0x10,0x10,0x13,0x1C,0x00,0x00,
/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

u8 code table2[]={            //定义低八位数组//

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x18,0x04,0x04,0x04,0x88,0x70,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0xE0,0x20,0x24,0x24,0xFC,0x24,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x98,0x84,0x04,0x04,0x88,0x70,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0xF0,0x88,0x04,0x04,0x88,0x70,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/

0x00,0x00,0x8C,0x44,0x44,0x88,0xF0,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

void senddata(u8,u8);        //定义函数//
void delay(u8);

void main()
{
	u8	i,j,k,m,n=0;          //定义无符号字符型变量//
	while(1)
	{
	 	for(i=0;i<168;i++)        //i确定16列的起点,一共2323*8-16=168//
		{
			for(j=0;j<SPEED;j++)  //控制显示速度,每一幅循环显示几次,达到稳定作用//
			{
				for(k=0;k<16;k++)       //K确定列,控制每个屏幕//
				{
					m=i+k;
					P1=k;					 //控制ABCD端口//
					senddata(table1[m],table2[m]);   //发送数据,第一行高8 位,低8位全部移入595//
					delay(70);
				  	senddata(0,0);     //清屏//
				}
			}
		}
	}
}

系统论文(由于论文字数太多,在这里只介绍部分)


1选题背景

LED显示屏是一种通过控制半导体发光二极管的显示方式, 用来显示文字、 图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。图文显示屏可与计算机同步显示汉字、英文文本和图形;视频显示屏采用微型计算机进行控制,图文、图像并茂,以实时、同步、清晰的信息传播方式播放各种信息,还可显示二维、三维动画、录像、电视、 VCD节目以及现场实况。

LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法[1]

2 方案论证

2.1 课题要求

 了解点阵LED显示器结构及字符字模(字符代码),熟悉点阵LED显示器驱动的基本原理。设计16×16点阵LED显示器的驱动电路,并编写程序实现在16×16点阵LED显示器上的字符滚动显示。16×16点阵LED显示器可由4块8×8点阵LED显示器构成。        

电路方面主要包括以下3部分。设计单片机的最小系统(包括复位电路和外接的晶振电路),并确定相关元器件参数。采用动态驱动的方式,设计单片机并行端口、移位寄存器、译码器或锁存器等与16×16点阵LED显示器的驱动电路,主要包括控制点阵LED行和列的连线。采用移位寄存器、译码器或锁存器驱动点阵LED显示器时,设计单片机与移位寄存器、译码器或锁存器间的控制连线。 

编写16×16点阵LED显示器字符(串)滚动显示程序,实现数字(0—9)或英文字符的滚动显示。

2.2 设计方案

2.2.1硬件设计方案

以PC机作为上位机存储和处理显示内容用串行通信的方式将显示内容和控制指令传输到单片机系统,单片机根据上位机传输来的内容和指令通过端口译码扩展后驱动4块8×8LED点阵模块构成的16×16的LED点阵显示屏。题目将以此方案为指导思想展开具体的硬件电路设计。

图2-1  硬件设计方案

2.2.1软件设计方案

(1)单片机编程语言选择

现在主要运用的单片机编程语言为汇编语言和C语言。

两种语言相比较各有优点汇编语言是面向机器的程序设计语言,是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。其具有执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。

C语言是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生压缩代码。C语言结构是以括号{ }而不是子和特殊符号的语言。C可以进行许多机器级函数控制而不用汇编语言。与汇编相比,有如下优点:对单片机的指令系统不要求了解,仅要求对51的存储器结构有初步了解;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,可分为不同的函数。这种方式可使程序结构化;将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;编程及程序调试时间显著缩短,从而提高效率;提供的库包含许多标准子程序,具有较强的数据处理能力;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术。C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片机的不同较快地移植过来。

基于以上理由决定采用C语言为该显示系统的编程语言。

(2)系统软件编译工具选择

C语言编写的程序并不能被单片机直接执行还需要编译为单片机可执行的机器语言。因此在系统软件设计中,编译器必不可少。支持MCS-51用C语言编程的编译器主要有两种:Franklin C51编译器和KEILC51编译器。目前在单片机开发中普遍都是使用KEIL C51来进行编译。

因此软件设计最终方案为采用C语言为程序语言,KELC为编译工具按照控制、通信、显示等几个功能模块来编写程序。

3 设计过程

3.1 系统框图

 图3-1  硬件原理图

3.2  控制单元设计

控制电路设计中采用的是单片机系统,该系统必须要是工作在一个最小系统(指单片机的可以的最小配置系统)。根据功能选择一定的单片机端口添加外围的器件在该系统中,P1各口主要用作LED显示数据的控制输出。具体接法为:P1.0,P1.1,P1.2,P1.3分别接74HC138的A端,B,CD端。C端向74HC138送入串行数据经过其转换后并行输出;P2各口主要用作LED显示数据的控制输出P2.1,P2.2接595的SH_CP端,ST_CP端,P2.0接DS端控件系统的输入

图3-2  控制部分电路图

3.3  行驱动单元设计

驱动电路由74HC595构成,它可以实现在显示本数据的同时,传送下一数据。数据在SH_CP的上升沿输入,在ST_CP的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线

图3-3  行驱动部分电路图

3.4. 列驱动单元设计

译码电路的功能是为了解决单片机I/O端口不足。译码所用器件为串并转换器74HC138如果不采用译码电路完全依靠单片机的端口输出来控制16×16的LED点阵屏显示,需要32个端口。而采用了译码电路后仅仅需要7~9个端口便可实现控制显示。大大减少了I/O口的占用数目,为单片机扩展其他功能预留下来了空间。两个74HC138联成4线-16线译码器,三级管接显示屏可以解决显示屏供电不足的问题。锁存器74HC59574HC138的使能端,实现对74HC138的使能控制,达到锁存功能,A,B,C为138译码器的三个地址输入。

图3-4  列驱动部分电路图

3.5  元器件清单

电路设计需要的元器件包括电阻、电容、单片机、8×8点阵LED、74HC138、74HC595等,具体元器件数量及规格如下表所示。

表3-1 元器件清单

元器件型号

规格参数

数量

电阻

电容

电容

单片机

8×8点阵LED

74HC138

74HC595

10KΩ

30uf

30pf

AT89C51

1个

1个

2个

1个

4个

2个

2个

3.6 系统软件设计

3.6.1 程序框图简介

程序主要由头文件、端口定义、字模定义、函数等组成。根据程序的设计原理,主函数流程如图3-5所示。

图3-5  流程图


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 07:42:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 07:42:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 07:42:01       58 阅读
  4. Python语言-面向对象

    2024-07-13 07:42:01       69 阅读

热门阅读

  1. Tinker集成备忘录

    2024-07-13 07:42:01       18 阅读
  2. TypeScript学习笔记

    2024-07-13 07:42:01       26 阅读
  3. MIME 类型

    2024-07-13 07:42:01       24 阅读
  4. 35、php 实现构建乘积数组、正则表达式匹配

    2024-07-13 07:42:01       22 阅读
  5. django ninja get not allowed 能用 put delete

    2024-07-13 07:42:01       22 阅读
  6. 【算法】删除链表的倒数第 N 个结点

    2024-07-13 07:42:01       21 阅读
  7. 力扣-bfs

    2024-07-13 07:42:01       22 阅读
  8. 访问本地SQL Server:巴比达内网穿透的又一妙用

    2024-07-13 07:42:01       23 阅读