目录
1 选题背景1
2 方案论证1
2.1 课程设计的内容和要求1
2.2 设计方案2
3 设计过程3
3.1 系统框图3
3.2 控制单元设计3
3.3 行驱动单元设计3
3.4 列驱动单元设计4
3.5 元器件清单5
3.6系统软件设计5
3.6.1程序框图简介5
3.6.2 程序分析5
4 结果分析13
4.1程序调试与仿真13
4.2仿真结果13
5 设计总结14
参考文献15
4 结果分析 4.1 程序调试与仿真 软件程序编写后,将KEIL软件中输出文件载入PROTEUS软件进行仿真。按照显示的结果进行程序调试。多次调试后,不再出现错误显示,并且显示稳定清晰。说明此方案可行。 4.2 仿真结果 运行程序,在16×16点阵显示屏上依次显示0-9十个字符,并且循环显示。运行结果如图4-1、图4-2所示。 
图4-1 仿真图1 图4-2 仿真图2
5 设计总结 经过一段时间的工作,终于完成了基于51单片机的LED显示系统的设计,项目所要求的功能全部达到。通过这次设计收获颇多,不仅是所作题目涉及到的软硬件知识还有更为重要的实际经验和过程中所发现的问题。 接手题目之后从互联网上对LED进行了详细的资料收集,从技术和产业的两方面对LED进行了了解。通过了解我认识到LED是一门当今应用非常广泛的技术,整个产业每年都会有巨大的产值而且技术还在不断发展和创新。 从设计之初就确定了参照大屏幕显示屏的实现方法和实际情况设计一款小屏幕的LED点阵显示屏。在查阅了大量的大屏幕显示屏资料后确定了题目的设计方案。整个设计采用AT89C51做核心控制器,74HC138和74HC595组成译码电路。在实现这一设计的过程中所遇到的问题和困难给我留下了宝贵的经验和深刻教训。 随着课程设计的进行,对LED的了解也越来越深入。认为LED技术也会进一步发展,LED应用将会更加广泛。 设计结束了,但学习还在继续。我相信通过此次设计所得到的知识、心得、经验乃至感受都会让我在以后的日子里受益匪浅。
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端,C端,D端。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线译码器,三级管接显示屏可以解决显示屏供电不足的问题。锁存器74HC595接74HC138的使能端,实现对74HC138的使能控制,达到锁存功能,A,B,C为138译码器的三个地址输入。 
图3-4 列驱动部分电路图 3.5 元器件清单电路设计需要的元器件包括电阻、电容、单片机、8×8点阵LED、74HC138、74HC595等,具体元器件数量及规格如下表所示。 表3-1 元器件清单 | | | 电阻 电容 电容 单片机 8×8点阵LED 74HC138 74HC595 | | |
3.6 系统软件设计 3.6.1 程序框图简介 程序主要由头文件、端口定义、字模定义、函数等组成。根据程序的设计原理,主函数流程如图3-5所示。 图3-5 流程图(见附件) 3.6.2 程序分析 程序主要由头文件、端口定义、字模定义、函数、循环等组成,实现数字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,
-
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
-
- /*-- 文字: --*/
- /*-- 宋体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); //清屏//
- }
- }
- }
- }
- }
-
- //* 将每行数据送至74HC595
- * m为高8位,n为低8位
- * SH为移位时钟,ST为锁存时钟 *//
- void senddata(u8 m,u8 n)
- {
- u8 i;
- ST=0;
- for(i=0;i<16;i++) // i=0到15,循环16次,16位数据全部移入芯片//
- {
- SH=0;
- if(i<8)
- {
- DS=0X80&(m<<i); //16进制10000000进行位与运算//
- }
- else
- DS=0X80&(n<<(i-8)); //16进制10000000进行位与运算//
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-105745-1.html
|