基于51单片机16*64LED电子显示屏设计论文加仿真工程与源码

本文介绍了一种基于51单片机的16*64LED显示屏的设计,通过AT89C51控制核心电路、74HC595移位寄存器和74159编码器,实现了4个汉字或8个字母的显示,支持静止和滚动显示。设计考虑了I/O资源优化和系统可靠性,使用Proteus进行仿真验证。
摘要由CSDN通过智能技术生成

目录

1、摘要

2、方案设计与论证

2.1 核心控制电路设计与论证

2.2 点阵LED显示模块论证 

2.3 系统设计要求

2.4 总体设计

3、仿真图

4、程序


资料下载地址:基于51单片机16*64LED电子显示屏设计论文加仿真工程与源码

1、摘要

        随着单片机技术的快速发展,现如今LED点阵广告牌随处可见,它的应用领域极其广泛。像证券交易实时信息的显示,LED显示屏需求量都是非常大的,而这些LED的基本单元都是8x8的点阵,它是组成汉字及其它图形的基础,可通过单片机的控制实现显示功能,因此具有广泛应用的意义。
        设计的点阵LED显示屏包括两个部分电路。一是单片机控制部分电路,包括AT89C51单片机、时钟电路、复位电路和按键控制电路等,通过Keil软件编程实现控制LED显示的功能;二是点阵LED显示电路,由LED点阵、74HC595移位寄存器芯片和74159编码器芯片构成。以74HC595移位寄存器芯片为主要器件,设计的点阵LED显示屏要求分辨率为64x16点,可显示4个汉字或8个字母,具有静止显示、滚动显示等显示方式。整体电路结构紧凑、参数设置合理,具有断电储存,控制灵敏度高,电路稳定性好,抗干扰能力强等优点。
        整体电路设计采用Proteus仿真软件进行绘图和测试。经过仿真测试,LED显示屏能够静止或滚动显示4个汉字,分辨率达到64x16点,满足可显示4个汉字或8个字母,具有静止显示、滚动显示等显示方式的设计要求。

2、方案设计与论证

2.1 核心控制电路设计与论证

        方案一:采用由51单片机实现控制功能,由74138译码器和74LS273地址锁存器进行16块8x8单色LED点阵的行扫描和列扫描。但是多片锁存器的控制极为困难,而且51单片机的I/O资源有限。这种方法的单片机编程控制较为困难,在调试过程中有可能出现信号不同步、扫描出现延时错误等情况,电路结构复杂,可靠性不高。
        方案二:采用AT89C51单片机和独立按键构成控制电路,采用74159芯片对LED显示屏进行行扫描,同时使用74HC595移位寄存器芯片进行显示屏的列扫描。因为74HC595采用串行控制,大大节约了单片机的I/O口资源,同时降低了编程和调试的难度。这种方法控制较为方便,输出稳定性好,可靠性高。
        与方案一相比,本系统选用方案二作为设计方案。独立按键能有效控制输出状态,使输出能在静止和滚动之间切换,单片机的I/O口资源能够大大的节约,工作稳定可靠,抗干扰能力高,实用性强。

2.2 点阵LED显示模块论证 


方案一:采用74LS273地址锁存器与8x8点阵构成列扫描,采用两级74138译码器级联构成显示屏的行扫描。为实现动态扫描单片机的控制较为复杂,编程难度较高。
方案二:选用74HC595移位寄存器构成显示屏的列扫描。I/O口资源得到大大节约,同时各级之间的信号能够实现同步控制。采用74159 4-16线译码-多路分配器作为行扫描。单片机的控制编程难度大大降低,可靠性大大提高,实用性更强。
综上所述,选择方案二做点阵LED显示。

2.3 系统设计要求

        设计一个点阵LED显示屏,其分辨率为64x16点,基于单片机控制能够实现显示屏的输出状态的控制。整体电路包括单片机最小系统,按键控制电路,点阵LED显示电路,断电储存电路。其中单片机编程要求程序结构简单调试方便,可移植性强,可靠性高。按键控制电路要求控制灵敏度高、控制精准度高。显示电路要求达到分辨率为64x16点的输出稳定的要求。整体系统能够满足在一般室内环境下的使用要求。

 任务要求:

1、设计一个单片机控制的室内用点阵LED显示屏。
2、点阵LED显示屏分辨率为64x16点,可显示4个汉字或8个字母。
3、具有静止显示、滚动显示等显示方式。

2.4 总体设计

本设计采用以AT89C51单片机控制方案。 利用单片机灵活的编程设计和丰富的I/O口资源,可通过按键复位单片机。通过独立按键控制使输出的状态在滚动和静止显示之间切换,通过分辨率为64x16点的点阵LED显示屏不仅能实现基本的输出显示4个汉字的控制功能,整体电路具有断电储存的功能,还能根据实际需要添加控制按键实现更多的功能。系统结构框图如图2.1所示。

3、仿真图

4、程序

#include <reg51.H>
#include <intrins.h>
#define I2Cdelay() {_nop_();_nop_();_nop_();_nop_();}
#define uchar unsigned char
#define uint unsigned int
uchar flag=1,yid,h;			   //YID为移动计数器,H为行段计数器
                               //flag=1 左移显示 flag=0静态显示  
uint zimuo;		               //字模计数器 
uchar BUFF[10];		           //缓存
void in_data(void);		       //调整数据
void rxd_data(void);	       //发送数据
void Scan(void);			   //扫描
void I2CStart(void);
void I2CWrite(uchar dat);
sbit R=P2^0;	               //数据输入端口 
sbit CLK=P2^1;	               //时钟信号 
sbit STB=P2^2;	               //锁存端 
sbit key=P3^2;				   //定义按键
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;
uchar code table[]={
/*前4位无显示*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字:  爱  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=16x16   --*/

0x00,0x00,0x00,0x1E,0xFC,0x09,0x48,0x08,
0x90,0x04,0xFE,0x3F,0x42,0x20,0xFC,0x1F,
0x20,0x00,0xF0,0x0F,0x50,0x04,0x88,0x02,
0x04,0x01,0xC2,0x06,0x38,0x38,0x00,0x00,
/*--  文字:  我  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x60,0x02,0x1C,0x0A,0x10,0x12,
0x10,0x02,0xFE,0x3F,0x10,0x02,0x10,0x12,
0x70,0x12,0x18,0x0A,0x16,0x0A,0x10,0x24,
0x10,0x2A,0x10,0x31,0x9C,0x20,0x00,0x00,

/*--  文字:  中  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=16x16  --*/
0x00,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,
0x84,0x10,0x84,0x10,0x84,0x10,0x84,0x10,
0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,
/*--  文字:  华  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x10,0x01,0x10,0x11,0x08,0x09,
0x0C,0x07,0x8A,0x01,0x68,0x21,0x08,0x21,
0x08,0x3E,0x88,0x00,0x80,0x00,0xFE,0x3F,
0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,
/*后4位无显示*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

void delay(int z)                               //延时
{
     int x,y;
     for(x=0;x<z;x++)
		for(y=0;y<50;y++);
}
 
void main(void)
{
     uchar i,speed=2;
     yid=0;
     zimuo=0;
	 I2CStart();
     I2CWrite(0xA0);	 //10100001读10100000写	
	 EA=1;EX0=1;IT0=1;                          //全局中断开,中断0初始化							   
     
	 while(1)
     {
	    if(flag==1)
		{
		  while(zimuo<8*32)
	     {   if(flag==1)
		     {
		    	while(yid<16)			        //数据移位。 
			   {	if(flag==1)
			      {
					 for(i=0;i<speed;i++)       //移动速度 
					 {	
					    if(flag==1)
					    {Scan();}
						else break;
					 } 
					 yid++;			            //移动一步 
			      }
				else  break;
		       }
	           yid=0; 
	           zimuo=zimuo+32;			        //后移一个字,
		    }
			else break;
	     } 
	     zimuo=0;                               //到最后从头开始,有字数决定 
        } 
	    else
	     {  
	        zimuo=128;					        //静态扫描从第一个中文字开始
		    Scan();
	     }
	 }
}

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值