找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5019|回复: 7
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
单片机与接口技术
课程设计(论文)
点阵LED显示屏设计

院(系)名称
电子与信息工程学院

摘要

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

目 录

第1章 绪论
1.1 点阵LED显示屏的应用意义
1.2 本文研究内容
第2章 方案设计与论证
2.1 核心控制电路设计与论证
2.2 点阵LED显示模块论证
2.3 系统设计要求
2.4 总体设计
第3章 单元电路设计
3.1 单片机最小系统
3.1.1 最小系统
3.1.2 时钟电路
3.1.3 复位电路
3.2 按键控制模块
3.3 断电储存模块
3.4 驱动模块
3.4.1 行驱动
3.4.2 列驱动
3.5 点阵LED模块
第4章 系统软件设计
4.1 主程序的设计
4.2 按键程序设计
4.3 编程C语言代码
第5章 系统仿真与调试
第6章 总结
参考文献
附录I
附录II

第1章 绪论1.1 点阵LED显示屏的应用意义
随着现代电子技术的快速发展,各类智能电子产品的功能日益强大,与人们日常生活的联系也日益紧密。电子产品向小型化,精密化的趋势快速发展。在任何的电子系统中,显示电路都是实现人机交互、信息显示的重要组成部分,所以对点阵LED显示技术的研究具有广泛的意义。
目前应用最广的是红色、绿色、黄色。LED显示屏可以显示变化的数字、文字、图形图像;不仅可以用于室内环境还可以用于室外环境,具有投影仪、电视墙等无法比拟的优点。LED点阵显示屏以高亮度、工作电压低、功耗小、小型化、寿命长和性能稳定的优点迅速的发展。在信息显示领域得到广泛的应用,例如证券交易、金融信息的显示、机场航班动态的显示等服务领域的业务宣传及信息显示。未来的LED显示屏会向着标准化、规范化,产品结构多样化的方向发展。
采用LED点阵屏与AT89C51单片机作为主要器件设计的64x16点阵LED显示屏,通过不同的模块相互联系,其中每个模块之间只需要极少的联系,极大的提高了系统的稳定性、可靠性。调试、维护的难度大大降低。显示部分被分为不同的单元独立进行扫描,每个单元之间的信号采用信号锁存进行同步控制。整个点阵LED显示屏具有反应灵敏度高、抗干扰能力强、显示精准度高和电路稳定性良好等优点,完全满足常规室内环境下的使用需要。
1.2 本文研究内容
设计分辨率为64x16点的点阵LED显示屏,能够输出四个汉字或8个字母,具有静止显示、滚动显示等显示方式,同时具有断电储存的功能。采用AT89C51单片机作为控制模块的主要器件,设置独立按键,可通过控制独立按键使输出状态在滚动或静止之间切换,LED显示模块由16块8x8的单色点阵、74159芯片和8块74HC595移位寄存器芯片组成,在默认状态下采用滚动方式显示字符,可通过按键进行状态转换。显示电路采用行扫描和列扫描的方法,各单元之间的信号进行同步控制。整个系统达到了输出4个汉字或字母具有滚动、静止显示的设计要求且电路稳定工作。


第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所示。
图2.1 系统结构框图
第3章 单元电路设计3.1 单片机最小系统3.1.1 最小系统
采用的AT89C51单片机利用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。它作为一种高性能的微处理器带有4K字节闪烁可编程可擦除只读存储器。AT89C51由于将多功能8位CPU和闪烁存储器组合在单个芯片中,因此AT89C51是一种高效微控制器得到广泛的应用。由AT89C51单片机,时钟电路和复位电路共同组成了单片机最小系统,可以上电手动复位,同时集成4个I/O端口,资源丰富满足一般控制系统设计的需求。单片机最小系统如图3.1所示。
图3.1 单片机最小系统
3.1.2 时钟电路
为了保证各部件的同步工作,单片机内部电路应在唯一的时钟信号下严格地按照时序进行工作。MCS-51系列单片机内部有一个高增益反相放大器,用于构成振荡器,但要形成时钟脉冲,外部还需要附加电路。这里采用内部时钟方式,单片机的两个引脚XTAL1和XTAL2两端跨接晶体振荡器。外接晶振选择12MHz,电容C1和C2选择30pF独石电容,同时为了减小寄生电容,更好的保证振荡器稳定、可靠的工作,振荡器和电容应尽量安装的靠近单片机的XTAL1和XTAL2引脚。时钟电路图如图3.2所示。
图3.2 时钟电路图
3.1.3 复位电路
复位是单片机的初始化操作,单片机系统在上电启动运行时,都需要先复位。其作用是使CPU和系统中其它部件都处于一个确定的初始状态,但是单片机本身是不能自动进行复位的,必须配合相应的外部复位电路才能实现。
利用电容器的充电实现,在单片机的RST端连续给出两个机器周期的高电平就可以完成复位操作。选择22μF的电解电容与电源Vcc和复位端相连,10K的电阻与复位端和地相连构成复位电路,也可通过按键复位。复位电路图如图3.3所示。
图3.3 复位电路图
3.2 按键控制模块
独立按键具有结构简单控制方便,但是在实际使用中必须去抖。按键在按下和松开的时候都存在抖动问题,不能将抖动误认为多次按键,通常可以采用软件去抖的方法,也可以采用硬件去抖的方法。这里选择软件去抖的方法。按键控制电路要求控制灵敏度高、控制精准度高。选择单片机P3.2端口和按键相连,在编程中可采用外部中断0进行判断控制,使输出在滚动和静止的状态之间切换。按键电路图如图3.4所示。
图3.4 按键电路图
3.3 断电储存模块
采用AT24C512作为主要的断电储存模块,它是ATMEL公司生产的64KB串行电可擦的可编程存储器,内部有512页,每一页为128字节,任一单元的地址为16位,地址范围为0000-0FFFH。采用8引脚封装,具有结构紧凑,存储容量大等特点,可以在2线总线上并接4片芯片,特别适用于具有大容量数据存储要求的数据采集系统,因此完全满足输出数据的存储且其存储容量完全满足要求。断电存储电路图如图3.5所示。
图3.5 存储电路图
3.4 驱动模块
3.4.1 行驱动
采用74159 4-16线译码-多路分配器芯片进行行扫描。它抗噪声能力强,功耗低且与低电压TTL电路兼容。只要扫描频率设置合适,点阵屏就可以看成是稳定平滑过渡,
没有闪烁的感觉,给人以正常的视觉效果。将芯片的使能端均接地让其正常工作,通过单片机的P1口的低四位输出0000B-1111B即十进制的0-15的数值,通过一次译码后74159的输出端有唯一引脚输出为低电平信号,其它引脚的输出均为高电平信号。通过
软件编程循环就可实现对LED显示屏的行扫描。行驱动电路图如图3.6所示。
图3.6 行驱动电路图
3.4.2 列驱动
采用74HC595移位寄存器作为列驱动的主要器件。74HC595是一款漏极开路输出的CMOS移位寄存器,输出端口为可控的三态输出端,也能串行输出控制下一级的级联芯片,而且功耗低、高速移位时钟频率Fmax>25MHz,满足设计的需要。
74HC595芯片的SDI为串行数据输入端接单片机的P2.0端口;SH_CP为移位寄存器的时钟输入端,上升沿时移位寄存器的数据依次移动一位,下降沿保持寄存器的数据不变,接单片机的P2.1端口;ST_CP为存储寄存器的时钟输入端,上升沿时移位寄存器中的数据进入存储寄存器,下降沿保持存储寄存器中数据不变。
应用时通常ST_CP置为低电平,移位结束后再在ST_CP端产生一个正脉冲更新显示数据,接单片机的P2.2端口。用AT89C51的三个I/O分别控制SDI、SH_CP和ST_CP,将RST和OE分别接Vcc和地。各级之间通过上一级芯片的第9脚即SQH串行数据输出管脚和下一级的SDI串行数据输入引脚相连。可通过编程实现对字符数据表的移位输出,同时各单元之间的信号能够同步进行控制。列驱动电路图如图3.7所示。

图3.7 列驱动电路
3.5 点阵LED模块
为了到达分辨率64x16点的设计要求,采用16块8x8的LED单色点阵组成LED显示屏。将显示屏的列控制引脚分别对应并联至74HC595移位寄存器的输出端。将上半屏和下半屏的行控制引脚对应连接至74159 4-16线译码-多路分配器的输出端。通过单片机控制行扫描和列扫描实现输出4个汉字的功能。点阵LED电路如图3.8所示。
图3.8 点阵LED电路
第4章 系统软件设计4.1 主程序的设计
单片机上电后自动复位,开始执行程序初始化程序,进行行扫描和列扫描,默认状态是循环向左滚动显示“爱我中华”4个汉字。若独立按键则执行状态切换,此时LED屏静止显示“爱我中华”4个汉字。当按键再次按下则再次切换为循环向左滚动的状态,否则一直保持显示状态。主程序流程如图4.1所示。
图4.1 主程序流程图
4.2 按键程序设计
单片机通过检测独立按键的状态,若独立按键被按下开始执行去抖程序,如果按键有效则在向左滚动或者静止显示状态之间切换,控制LED显示屏输出的状态,否则不会执行切换程序保持原来的状态,一直维持在行扫描和列扫描的状态。同时继续检测是否有按键按下,实时根据按键控制显示屏的显示模式。按键程序流程图如图4.2所示。
图4.2 按键程序设计流程图



第5章 系统仿真与调试
使用Proteus软件绘制原理图,然后将编程软件Keil生成的hex程序文件载入到AT89C51单片机中,点击仿真运行:
1、默认LED显示屏显示4个汉字“爱我中华”,循环向左滚动显示。左滚动显示仿真结果如图5.1所示。
图5.1 左滚动显示
2、当独立按键按下,若经过去抖程序,判断为有效则在向左滚动或静止显示两种状态之间进行转换,控制LED显示屏输出显示的模式。在默认左滚动状态下,按下按键,LED输出静止状态下的“爱我中华”4个汉字。静止显示仿真结果如图5.2所示。
图5.2 静止显示
综合以上仿真结果分析:设计的点阵LED显示满足输出4个汉字的功能,且可以进行静止状态和滚动状态之间的切换,满足设计的要求。

第6章 总结
本次课程设计的题目是点阵LED显示屏设计。设计过程包括理解设计要求,查阅相关资料,到Proteus软件设计和仿真。要求达到输出4个汉字或8个字母,且具有静止或滚动显示等显示模式的设计要求。
设计的点阵LED显示屏包括单片机控制部分电路和LED显示电路。其中单片机控制部分电路,包括AT89C51单片机、时钟电路、复位电路和按键控制电路,可以通过软件编程实现对整个系统的控制功能。由多块LED 8x8点阵构成LED显示屏,通过行列控制引脚分别与74159 4-16线译码-多路分配器芯片和74HC595移位寄存器芯片进行相应的连接。其中以74HC595芯片为主要器件,设计的点阵LED显示屏要求分辨率为64x16点,可显示4个汉字或8个字母,具有静止显示、滚动显示等显示方式,且满足一般室内环境下的使用需求。整个系统结构紧凑、参数设置合理,具有控制灵敏度高,电路稳定性好,抗干扰能力强等优点。
但是设计点阵LED显示屏需要结合实际综合考虑很多因素,因此该点阵LED显示屏设计需要在实际应用中进一步改进和完善。另外,在单片机控制程序方面,该设计只实现了显示4个汉字,具有静止显示或滚动显示两种显示方式的控制。要想在现实生活中推广,还必须针对实际应用场合的需要,进一步完善LED显示屏的其它功能。

整体电路原理图

单片机源码:
  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define I2Cdelay() {_nop_();_nop_();_nop_();_nop_();}
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar flag=1,yid,h;        //YID为移动计数器,H为行段计数器
  7.                                //flag=1 左移显示 flag=0静态显示  
  8. uint zimuo;                               //字模计数器
  9. uchar BUFF[10];                           //缓存
  10. void in_data(void);                       //调整数据
  11. void rxd_data(void);               //发送数据
  12. void Scan(void);                           //扫描
  13. void I2CStart(void);
  14. void I2CWrite(uchar dat);
  15. sbit R=P2^0;                       //数据输入端口
  16. sbit CLK=P2^1;                       //时钟信号
  17. sbit STB=P2^2;                       //锁存端
  18. sbit key=P3^2;                                   //定义按键
  19. sbit I2C_SCL = P3^7;
  20. sbit I2C_SDA = P3^6;
  21. uchar code table[]={
  22. /*前4位无显示*/
  23. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  24. …………
  25. …………
  26. …………限于本文篇幅 余下代码请从51黑下载附件…………

  27. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

  28. void delay(int z)                               //延时
  29. {
  30.      int x,y;
  31.      for(x=0;x<z;x++)
  32.                 for(y=0;y<50;y++);
  33. }

  34. void main(void)
  35. {
  36.      uchar i,speed=2;
  37.      yid=0;
  38.      zimuo=0;
  39.          I2CStart();
  40.      I2CWrite(0xA0);         //10100001读10100000写        
  41.          EA=1;EX0=1;IT0=1;                          //全局中断开,中断0初始化                                                           
  42.      
  43.          while(1)
  44.      {
  45.             if(flag==1)
  46.                 {
  47.                   while(zimuo<8*32)
  48.              {   if(flag==1)
  49.                      {
  50.                             while(yid<16)                                //数据移位。
  51.                            {        if(flag==1)
  52.                               {
  53.                                          for(i=0;i<speed;i++)       //移动速度
  54.                                          {        
  55.                                             if(flag==1)
  56.                                             {Scan();}
  57.                                                 else break;
  58.                                          }
  59.                                          yid++;                                    //移动一步
  60.                               }
  61.                                 else  break;
  62.                        }
  63.                    yid=0;
  64.                    zimuo=zimuo+32;                                //后移一个字,
  65.                     }
  66.                         else break;
  67.              }
  68.              zimuo=0;                               //到最后从头开始,有字数决定
  69.         }
  70.             else
  71.              {  
  72.                 zimuo=128;                                                //静态扫描从第一个中文字开始
  73.                     Scan();
  74.              }
  75.          }
  76. }

  77. /*----------中断0的服务子程序-----------*/
  78. void int_0s() interrupt 0 using 0
  79. {
  80.             if(key==0)
  81.           {
  82.              delay(2);                                                                //去抖
  83.                  if(key==0)
  84.                  flag=~flag;
  85.                  while(key==0);                                                    //等待按键释放
  86.           }
  87.          
  88. }

  89. /*-------------扫描函数-----------------*/
  90. void Scan()
  91. {
  92.       for(h=0;h<16;h++)                                //16行扫描
  93.       {
  94.                    in_data();                                        //调整数据
  95.                    rxd_data();                                    //串口发送数据
  96.                P1=h;                                            //送行选
  97.                    STB=1;
  98.                    STB=0;
  99.                    delay(2);                        
  100.           }
  101. }

  102. void in_data(void)
  103. {
  104.           uchar s;
  105.       for(s=0;s<5;s++)                                       
  106.           {
  107.                    BUFF[2*s]=table[zimuo+32*s+2*h];     /*把第一个字模的第一个字节放入BUFF0
  108.                                                     中,第二个字模的第一个字节放入BUFF2中*/
  109.                    BUFF[2*s+1]=table[zimuo+1+32*s+2*h]; /* 把第一个字模的第二个字节放入BUFF1
  110.                                                                                                 中,第二个字模的第二个字节放入BUFF3中*/                          
  111.           }         
  112. }

  113. /**********74HC595输出函数*************/
  114. void rxd_data(void)                                        //串行发送数据
  115. {
  116.           char s;
  117.           uchar inc,tempyid,temp;
  118.           uchar k;
  119.           R=1;
  120.           if(yid<8)
  121.             inc=0;
  122.           else
  123.             inc=1;
  124.           for(s=0+inc;s<=7+inc;s++)                                //发送2字节数据
  125.                 {
  126.                         if(yid<8)
  127.                     tempyid=yid;
  128.                     else
  129.                     tempyid=yid-8;
  130.                 //字模左边字节右移tempyid位,右边字节左移8-tempyid位,2者相或
  131.                     temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));
  132.                           for(k=0;k<8;k++)
  133.                         {
  134.                               I2C_SCL =1;          //拉高SCL
  135.                                   CLK=0;
  136.                                 //R=(bit)(temp&0x80);
  137.                                    temp=temp>>1;
  138.                                   R=CY;
  139.                                   CLK=1;
  140.                                   I2C_SDA =R;
  141.                                   I2C_SCL =0;          //再拉低SCL,完成一个位周期
  142.                         }
  143.                 }
  144. }


  145. /*----------AT24C512-------------*/
  146. /* 产生总线起始信号 */
  147. void I2CStart()
  148. {
  149.                 I2C_SDA=1; //首先确保SDA、SCL都是高电平
  150.                 I2C_SCL=1;
  151.                 I2Cdelay();
  152.                 I2C_SDA=0; //先拉低SDA
  153.                 I2Cdelay();
  154.                 I2C_SCL=0; //再拉低SCL
  155. }


  156. /* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */
  157. void I2CWrite(uchar dat)
  158. {
  159.                
  160.                 uchar mask;  //用于探测字节内某一位值的掩码变量
  161.                 for (mask=0x80;mask!=0;mask>>=1) //从高位到低位依次进行
  162.                 {
  163.                         if ((mask&dat)==0)  //该位的值输出到SDA上
  164.                         I2C_SDA=0;
  165.                         else
  166.                         I2C_SDA=1;
  167.                         I2Cdelay();
  168.                         I2C_SCL=1;          //拉高SCL
  169.                         I2Cdelay();
  170.                         I2C_SCL=0;          //再拉低SCL,完成一个位周期
  171.                 }
  172.                 I2C_SDA=1;   //8位数据发送完后,主机释放SDA
  173.                                 
  174. }
复制代码




全部资料51hei下载地址:
16X64.zip (4.64 MB, 下载次数: 98)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:423237 发表于 2018-11-10 22:06 | 只看该作者
厉害优秀
回复

使用道具 举报

板凳
ID:12348 发表于 2018-12-3 01:49 | 只看该作者
非常感谢,正是要找的资料
回复

使用道具 举报

地板
ID:437480 发表于 2018-12-3 07:53 来自手机 | 只看该作者
简单有效
回复

使用道具 举报

5#
ID:535325 发表于 2019-5-11 14:35 | 只看该作者
找了这么久终于找到啦
回复

使用道具 举报

6#
ID:535325 发表于 2019-5-15 15:22 | 只看该作者
请问有没有扩展到16*128点阵显示屏的C语言代码
回复

使用道具 举报

7#
ID:538578 发表于 2019-5-15 16:02
这周刚好用到这个,写课设给了我很大启发

8#
ID:666160 发表于 2019-12-17 15:26 | 只看该作者
你好,这个怎么在proteus里打开啊
回复

使用道具 举报

9#
ID:666160 发表于 2019-12-17 15:28 | 只看该作者
下载好的压缩包,怎么用proteus打开这个仿真啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表