16x16点阵课程设计1616点阵LED电子显示屏的设计文档格式.docx
《16x16点阵课程设计1616点阵LED电子显示屏的设计文档格式.docx》由会员分享,可在线阅读,更多相关《16x16点阵课程设计1616点阵LED电子显示屏的设计文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
理论设计、调试与仿真、撰写设计报告等。
其中理论设计又包括选择总体方案,硬件系统设计、软件系统设计;
硬件设计包括单元电路,选择元器件及计算参数等;
软件设计包括模块化层次结构图,程序流程图。
程序设计是课程设计的关键环节,通过调试进一步完善程序设计,使之达到课题所要求的指标,使理论设计更接近于实际产品。
课程设计的最后要求是写出设计总结报告,把理论设计内容,调试的过程及性能指标的测试结果进行全面的总结
指导教师:
田野
日期:
2013.7.5
三、课程设计进度计划及检查情况记录表
序号
日期
计划完成内容
实际完成内容
1
6-25
实训动员、准备工作及选题
全部完成
2
6-27
总体方案设计
完成
3
硬件设计及仿真
4
6-28
软件设计与调试
5
整机测试及撰写报告
6
7-5
答辩与总结
四、成绩评定与评语
指导教师:
日期:
专业设计的主动性与平时表现(20%)
独立思考能力与动手能力(40%)
专业设计完成情况(40%)
专业设计成绩
一、总体设计方案
1.1总体设计
1.1.1工作原
(5)实现利用AT89S51单片机控制的LED图文屏正常工作。
1.1.2硬件部分总体设计
根据功能要求,采用AT89C51单片机,动态显示的设计方法,同时为简化设计,减少硬件数量,显示数据的传输采用串行传输方式,列扫描地址用P1口控制,
总体结构框图如下:
图1-1系统总体结构框图
1.2硬件设计
系统的组成,硬件的选用,芯片的特点
1.2.18051系列的单片机
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图片见下图:
图1-289C51管脚图
(1).管脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
(2)P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出
1.2.2单片机AT89C51最小系统
单片机采用12M晶振作为时钟源,复位采用上电复位和按键复位两种方式
仿真原理图如下:
图1-3最小系统
1.2.3串行口扩展I/O口
为了减少对I/O口的占用,数据传送采用AT89C51串行口方式0中断外接同步移位寄存器74HC595扩展出一个8位并行口实现8位数据并行传输。
图1-4I/O口扩展
74HC595管脚说明:
74595的数据端:
QA--QH:
八位并行输出端,可以直接控制数码管的8个段。
QH'
:
级联输出端。
我将它接下一个595的SI端。
SI:
串行数据输入端。
74595的控制端说明:
/SCLR(10脚):
低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):
上升沿时数据寄存器的数据移位。
QA-->
QB-->
QC-->
...-->
QH;
下降沿移位寄存器数据不变。
(脉冲宽度:
5V时,大于几十纳秒就行了。
我通常都选微秒级)
RCK(12脚):
上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚):
高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
1.2.416*16点阵行、列驱动
为实现16*16点阵移动显示功能,在显示时采用逐列扫描、2*8数据行输入方式进行显示,列驱动采用两个74HC138级联为4译16译码器,并用P1.0~P1.3进行完成译码,实现逐列扫描,行数据输入采用两个74HC373数据锁存器实现16位异步输出,仿真原理图如下:
图1-5行驱动
图1-6列驱动
1.2.516*16点阵制作
设计时必须掌握点阵工作原理方能进行更深层设计。
16x16LED点阵其实就是4块8x8点阵LED级联而成的,因此特给出8×
8点阵LED的工作原理。
图
(1)为8×
8点阵LED外观及引脚图,其等效电路如图
(2)所示,只要其对应的X、Y轴顺向偏压,即可使LED发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
应用时限流电阻可以放在X轴或Y轴。
而16x16就是在8x8原理的基础上将四块8x8级联而成,如图:
图1-78×
8点阵LED外观及引脚图
图1-88×
8点阵LED等效电路
图1-9(a)四块8x8点阵LED级联16*16连接示意图
图1-9(b)四块8x8点阵LED级联成16x16点阵
LED点阵的显示文字图形原理:
LED驱动显示采用动态扫描方法,动态扫描方式是逐行轮流点亮,这样扫描驱动电路就可以实现多行的同名列共用一套列驱动器。
以16×
16点阵为例,把所有同一行的发光管的阴极连在一起,把所有同一列的发光管的阳极连在一起(共阴的接法),先送出对应第1列发光管亮灭的数据并锁存,然后选通第1列使其燃亮一定的时间,然后熄灭;
再送出第2列的数据并锁存,然后选通第2列使其燃亮相同的时间,然后熄灭;
….第16列之后,又重新燃亮第1列,反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形。
该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。
显示数据可通过单片机的P0,,P2口接驱动电路传输到点阵行引脚。
点阵的移动
以下以16×
16点阵为例介绍点阵的移动。
要显示一个字符,该字符的点阵数据可以列向(纵向)16点组字,又可以行向(横向)16点组字。
无论哪一种组字方法,都既可以显示字符的水平方向的移动,又可以显示竖直方向的移动。
本设计主要采用汉字的左移,所以以下只作左移显示的解释
列扫描方式左移动:
列向组字显示字符水平方向的移动(左滚动)
延长数组法。
将原来字符点阵数组的16个数据重复一遍延长,点阵数组的数据个数为32个。
每扫描一帧取8个数据显示,下一帧取数要在数组中后移一个数取数。
循环一遍扫16帧。
可以假想有两块16×
16的点阵模块(共32帧)水平平行排列,用一个恰好能罩住16列点阵的中空方框去罩这个点阵,第1(第1帧)罩住最左边数起第一列开始的16列,就扫描显示这16列;
第2次(第2帧)使方框右移一列,罩住做左边数起第2列开始的16列,就扫描显示这16列;
·
;
这样每扫描完一帧使方框右移一列,最后第16次(第16帧)时,罩住左边数起的第16列开始的16列,就扫描显示这16列。
如此完成16帧画面的扫描显示,也就完成了整个一次移动循环扫描、之后反复循环,即可呈现显示字符沿水平向左移动的图像
因为是列向组字(列扫描方式,点阵数据为行码,上边为低位下面为高位),希望显示移动的一个字符,第1次扫描从行码的点阵数组中取第1~16个数据,送行码输出口,对应于这8个数据,同时用列码输出口输出列码,分别控制第1~16列。
扫描完前16个数据之后,第2次扫描从点阵数组中取第3~18个数据(第18个数据与第1个数据同),送行码输出口,对应于这16个数据,同时用列码输出口输出列码,仍分别控制扫第1~16列。
第3次扫描从点阵数组中取第5~20个数据(第20个数据码与第2个数据码相同)扫描·
如此实现字符向左移动。
以上完成一个图形移动的方法,也可以看成是移动16个不同的字形。
如图2.13所示,首先扫描第一个字型,同样是16行,16次扫描,16次显示;
完成一个字型的扫描以后,再扫描第二个字型;
完成第二个字型的扫描之后,再扫描第三个字型·
依此类推,即可产生该文字的左移的感觉。
1.3软件设计
1.3.1静态显示流程
静止显示是所有显示方式中最简单的一种。
单片机上电复位,先调用显示程序,在发送点阵数据给单片机时,根据已经制作好的显示屏的结构特征,即一屏能显示1个汉字,显示时是将按组顺序存储的点阵数据,按列扫描依次取出,逐列亮LED。
在一屏汉字显示完毕后,循环显示一段时间后,字符数据地址偏移32个字节,接着显示下一屏数据,其流程图如图所示。
图1-10静态显示流程图
1.3.2动态显示流程
先调用显示程序,显示“培养”一个字符,显示之后马上熄灭,接着调用延时程序,延时约1秒钟,然后以左移的方式显示事先写在芯片里的2个字节,等到全都显示完毕,转向while死循环,又从显示“培养”开始一个新的周期。
程序流程图如图4-1所示
是
否
图1-11动态显示流程图
1.3.3列扫描显示流程:
首先准备一个要显示的字符(32字节数据),扫描一列输出2字节(16位)数据,延时显示100us,然后熄灭本列,防止窜行显示,逐列扫描完16列后重复扫描10次以上以保证能有足够显示时间。
扫描一列显示一列点阵
延时1毫秒
是否移完15列
灭本列点阵
移到下一列,字符数据地址加2
准备一个字符数据
程序入口
移到第一列,重新加载本字符数据首地址
字符数据首地址是否重新加载20次
返回
图1-12显示子程序流程图
二、设计内容
2.1系统硬件原理图与仿真
系统总体原理图如图2-1;
图2-1系统总体原理图
系统仿真截图如图2-2;
图2-2系统部分仿真截图
动态移动显示字符如图2-3
图2-3动态显示字符截图
静态闪动显示图案如图2-4;
图2-4静态闪动显示字符截图
2.2程序清单
文件一:
16161.c
/*************************
文件名:
16161.c
文件描述:
16*16点阵显示
处理器:
AT89C51
编译环境:
keilv4
修改时间:
2013.6.28
****************************/
#include<
reg51.h>
#include"
ziku.h"
#defineY_portP1
#defineC373_LE_LOW(){HC373_LE1=0;
HC373_LE2=0;
}
sbitHC595_SCLK=P2^1;
//同步移位寄存器锁存控制端
sbitHC373_LE1=P3^3;
//#1锁存器锁存控制端
sbitHC373_LE2=P3^2;
//#2锁存器锁存控制端
ucharflag=1;
uchari;
codeucharY[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
/**********************
函数说明:
串口方式0配置
***********************/
voidUART_init()
{
SCON=0x00;
//串口工作方式0
IE=0x90;
//串口中断使能
/***********************
端口初始化
*************************/
voidPORT_init()
HC595_SCLK=0;
HC373_LE1=0;
HC373_LE2=0;
/************************
程序总初始化
voidinit()
UART_init();
PORT_init();
延时
voiddelay10u(intus)
uintb;
while(us--)
for(b=0;
b<
2;
b++)
{;
}
显示16*16点阵
**************************/
voiddisplay(uchar*word)
{
uchara;
ucharj;
uchartime=25;
while(time--){//单个字符闪烁显示循环
a=0;
for(j=0;
(j<
=15);
j++){//行扫描
Y_port=Y[j];
for(i=0;
(i<
=1);
i++){///列8*2扫描,点亮一行点阵
flag=0;
SBUF=word[a++];
delay10u(3);
//传送到串口缓冲区
}
i++){//灭一行点阵
SBUF=0x00;
}
函数说明:
入口函数
************************/
intmain()
{uintk;
init();
while
(1){
for(k=0;
k<
=160;
k=k+2)
display(word+k);
for(;
200;
k++)
{
display(xiao);
delay10u(100);
display(space);
}
/********************************
串口ISR
*********************************/
voidUARTISR(void)interrupt4using3
SCON&
=0xfd;
//HC373_LE1=0;
C373_LE_LOW();
HC595_SCLK=1;
if(i==0)
HC373_LE1=1;
else
HC373_LE2=1;
HC595_SCLK=0;
文件二:
ZIKU.h
/******************************
文件名:
文件说明:
定义要显示的字符
*******************************/
#ifndef_ZIKU_H
#define_ZIKU_H
#defineuintunsignedint
#defineucharunsignedchar
codeucharword[160]={0x00,0x00,0x00,0x00,0x7F,0xFE,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x3F,0xFE,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,//"
田"
00x04,0x00,0x04,0x00,0x04,0x7E,0x04,0x92,0x0C,0x92,0x34,0x92,0x04,0x92,0x04,0x92,0x44,0x92,0x84,0x92,0x7F,0x92,0x04,0x9E,0x04,0x80,0x04,0xE0,0x04,0x00,0x00,0x00,//"
导"
10x00,0x40,0x04,0x40,0x04,0x44,0x04,0x44,0x04,0x54,0x04,0x64,0x04,0x45,0xFF,0xC6,0x04,0x44,0x04,0x64,0x04,0x54,0x04,0x44,0x04,0x44,0x04,0x40,0x00,0x40,0x00,0x00,//"
辛"
20x00,0x84,0x00,0x84,0x00,0x84,0xFC,0x84,0x44,0x9F,0x44,0x84,0x44,0x84,0x47,0xF4,0x44,0x84,0x44,0x84,0x44,0x9F,0xFC,0x84,0x00,0x84,0x00,0x84,0x00,0x84,0x00,0x00,//"
苦"
30x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x40