仪器设计实践课程设计1616动画点阵屏设计Word文件下载.docx
《仪器设计实践课程设计1616动画点阵屏设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《仪器设计实践课程设计1616动画点阵屏设计Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
附录二原件清单21
附录三程序代码22
1设计方案及硬件组成
1.1设计方案
LED点阵显示屏在我们的日常生活中随处可见,广泛应用于车站、商场、医院、宾馆、银行、和其它公共场所。
它的优点是:
亮度高、工作电压低、功耗小、微型化、易与集成电路匹配、驱动简单、寿命长、耐冲击、性能稳定。
我们已经学习了单片机及相关的课程,可以利用单片机来控制LED,以达到我们所需要的显示效果。
此次设计的是16×
16点阵显示屏,一共有256个LED灯构成,因为只有256个像素点,因此一次只能显示一个汉字,通过51单片机的I/O口及外围电路来控制16行和16列,通过编程来显示我们想要想要显示的汉字或图形。
课程设计能够提高我们的动手能力与解决实际问题的能力。
对于单片机我们已经学习了很多与之相关的理论知识,但是我们还没有机会来实际操作它,课程设计给我们提供了一个很好的机会,让我们更深入的去学习它,掌握它。
通过课程设计我们能基本掌握单片机硬件与软件相关的知识,掌握16X16LED点阵的工作原理。
1.2主要组成部分
设计的点阵显示屏是基于STC89C52RC设计的,硬件搭接完成后,通过编程控制单片机I/O口的输出。
其电路原理框图如图1.2-1所示:
由框图可以看出,点阵的驱动主要是行驱动和列驱动,其中LED的行是共阴极的,列是共阳极的,行驱动主要是用到了3线-8线译码器,用两个译码器接成4线-16线译码器,控制端接在了单片机的P1.0到P1.3口,通过编程来控制行选,列选用74HC595串入并出的移位寄存器来控制,从而显示出我们要显示的文字或图形。
2电路各单元设计
2.1STC89C52单片机介绍
2.1.1STC89C52功能介绍
STC89C52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM—Flash
Programmable
and
Erasable
Read
Only
Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,STC的STC89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
·
工作电压:
5.5V~3.3V(5V单片机)
与MCS-51兼容
8K字节可编程闪烁存储器
寿命:
1000写/擦循环
数据保留时间:
10年
全静态工作:
0Hz-24Hz
三级程序存储器锁定
128*8位内部RAM
32可编程I/O线
三个16位定时器/计数器
6个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
2.1.2单片机最小系统
STC89C52的最小系统包括时钟电路和复位电路,其电路原理图如图2.1-2所示:
图2.1-251单片机最小系统
2.216×
16点阵灯的结构
16×
16点阵灯的结构和8×
8点阵等的结构原理一样,由于空间有限,只画了8×
8点阵灯的结构,如图2.2-1所示:
图2.2-18×
8点阵灯的结构
由图我们可以看出,所有行的LED都是共阴极的,所有列的LED都是共阳极的,16×
16点阵也是完全一样。
2.3点阵行的控制74HC138
74HC138译码器可接受3位二进制加权地址输入(A0,A1和A2),并当使能时,提供8个互斥的低有效输出(
至
)。
74HC138特有3个使能输入端:
两个低有效(E1和E2)和一个高有效(E3)。
除非E1和E2置低且E3置高,否则74HC138将保持所有输出为高。
74HC138作用原理于高性能的存贮译码或要求传输延迟时间短的数据传输系统,在高性能存贮器系统中,用这种译码器可以提高译码系统的效率。
将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由肖特基钳位的系统译码器所引起的有效系统延迟可以忽略不计。
HC138按照三位二进制输入码和赋能输入条件,从8个输出端中译出一个低电平输出。
两个低电平有效的赋能输入端和一个高电平有效的赋能输入端减少了扩展所需要的外接门或倒相器。
因此可以用两片74HC138通过如图2.3-1链接,就可以构成4线-16线的译码器,通过控制四个输入端来控制输出。
图2.3-14线-16线译码器
其中a、b、c、d四个输入端分别与单片机的的P1.0-P1.3口相连接,一共有16个输出,分别控制点的16行。
74HC138的真值表如表一所示:
表一74HC138真值表
输入
输出
X
H
L
说明:
H为高电平,L为低电平,X为任意电平;
、
为输入使能端,
为二进制数据输入端;
-
为八个输出信号,字母上的“-”说明该输入或输出为低电平有效。
2.4点阵列的控制74HC595
图2.4-174HC595引脚图(左)和实物图(右)
74HC595是硅结构的CMOS器件,兼容低电压TTL电路。
它具有8位移位寄存器和一个存储器,三态输出功能,移位寄存器和存储器有相互独立的时钟。
数据在SRCK(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在RCK(存储器时钟输入)的上升沿输入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(SER),和一个串行输出(QH1),和一个异步的低电平复位,存储寄存器有一个并行8位的输出端,具备三态的总线输出,当使能
为低电平时,存储寄存器的数据输出到总线。
表二引脚功能说明
符号
引脚
描述
QA-QH
第15脚,第1-7脚
8位并行数据输出
GND
第8脚
接地
QH1
第9脚
串行数据输出
第10脚
主复位(低电平)
SRCK
第11脚
数据输入时钟线
RCK
第12脚
输出存储器锁存时钟线
第13脚
输出有效(低电平)
SER
第14脚
串行数据输入
VCC
第16脚
电源
2.5显示单个汉字和汉字的上移
先来看看4选16的译码器是如何工作的,这里有4个输入端a、b、c、d,16个输出端H1~H16,如图2.4-2连线后即可完成类似于38译码器一样的工作。
只不过扩展到了16行选。
列的控制使用了两个595进行了级联,即第二个595的数据输入端连接了第一个595的级联输出口QH1。
也就是说,我们只需要从第一个595的输入端串行输入数据,便可以实现把数据送入第二个595的功能。
而且595的数量可以进行无限的级联,而不管有多少个595,我们只需要一个数据输入端就可以实现了,这样就大大节省了I/O资源。
下面我们看程序输出一个赢字:
#include<
reg52.h>
sbitR=P2^0;
//数据输入端口
sbitCLK=P2^1;
//时钟信号
sbitSTB="
P2"
^2;
//锁存端
charcodetable[]={
0x80,0x00,0xFF,0x7F,0x04,0x00,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x04,0x10,0xFC,0x1F,
0x00,0x00,0xEE,0x3B,0x2A,0x2A,0xAE,0x2A,0xAA,0x3A,0xAE,0x6A,0x4A,0x69,0x2D,0x46};
/*"
赢"
0*/
voiddelay(intz)
{
intx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
110;
y++);
}
voidWriteByte(chardat)//写一个字节的数据
chari;
for(i=0;
i<
8;
i++)//循环8次把编码传给锁存器
{
dat=dat>
>
1;
//右移一位,取出该字节的最低位
R=CY;
//将该字节的最低位传给R
CLK=0;
//将数据移入595,上升沿
CLK=1;
}
voidmain()
intnum;
while
(1)
for(num=0;
num<
16;
num++)
{
WriteByte(table[2*num]);
//送出一个字节
WriteByte(table[2*num+1]);
P1=num;
//行选
STB=1;
//输出锁存器中的数据,下降沿
STB=0;
delay
(2);
}
这里首先定义了R、CLK、STB,分别对应于74HC595的SER、SRCK、RCK用以实现串行数据输入、数据移位以及并行数据输出。
然后来看WriteByte(chardat)函数,该函数实现了串行向595中输入一个字节数据的功能。
来看for循环,首先dat=dat>
1,把要输入的数据右移一位,这样最低位便进入移位寄存器CY中,紧接着我们让R=CY,把该位传给595的输入端,CLK一个上升沿的跳变就实现了把该位数据移入595的功能。
8次循环便可以将一个字节的数据送出。
重点还是看while循环内,同样也是16行的扫描,然后就是WriteByte(table[2*num])等同于上面的P2=table[2*num],WriteByte(table[2*num+1])等同于P3=table[2*num+1],完成列选,接着行选,然后有一个STB的下降沿的跳变,这个变化能够实现并行输出移位寄存器中的数据。
这样就完成了整个过程。
其显示效果如图2.5-1所示。
图2.5-1显示单个汉字
上移和上述显示单个汉字的程序没多大区别,主要就是加入了一个move变量来控制移动,具体程序见附录四所示,WriteByte(table[2*num+move*32])中当move变量变化的时候更改了写入595中的数据,正好实现了移动显示的效果。
一次向上移动16行,而speed变量的if判断语句能够控制移动速度的大小。
3程序流程图
图3.1程序流程图
如程序流程图所示,首先对单片机初始化,然后从第1行扫描到16行,重复执行,当每一行扫描完成后,通过595送入列选信号,延时X毫秒后显示下一行。
4软件调试
当刚焊成的时候,上电后只有上半部分会显示,并且当手一碰到138的时候灯就会灭,检查了好大一会才发现原来两个38译码器的地没有接电源的地,接上之后下面就是软件的调试。
所用的程序是改别人的程序,原来的程序是显示两个汉字并且上移,上移的时候是依次上移一行,其实上移就是每隔一个固定的时间刷一次屏,每次刷屏的时候将数组中的元素向后移动两个,当每秒刷新3到4个字符或图形的时候我们看上去的感觉就好像是字向上移动了。
下面重点分析一下上移的程序,上移的运算程序如下:
voidshangyi()
intnum,move,speed;
if(++speed>
8)
//移动速度控制
speed=0;
move++;
//移位
if(move>
16)
//是否完成移位一个汉字
move=0;
//从头开始
for(num=0;
WriteByte(table[2*num+move*2]);
//送出一个字节
WriteByte(table[2*num+1+move*2]);
}
从程序可以看出,speed是控制移动速度,也就是延迟,++speed是speed先自加一然后判断是否大于某个数,如果成立则执行下面的语句,否则就一直循环,所以++speed后面的数越大,延迟越多,移动速度就慢了,当满足条件后,又有个变量move,是用来判断是否移位完一个汉字,一个汉字是16×
16像素的,所以如果move大于16,就可以判断移位完成一个汉字,然后从头开始,这个程序是移动两个汉字。
再看num变量,num=0,然后判断num<
16的话自加,WriteByte是上面定义的写一个字节,里面的变量送的是数组,数组是通过取模软件获得的,当num=0的时候,2*num+move*2=0,送的是数组中的第0个元素,2*num+1+move*2=1,送的是第一个元素,然后P1口赋值num=0,选中第一行,给595一个下降沿,将16位数据输出,延时一定时间后循环。
数组每个元素是八位,一行是16位,所以送了第0个和第1个元素之后显示的就是第一行。
改程序的思路:
原本是依次上移一行,如果依次上移16行,再设定何时的移动速度,就可以用取模软件制作几张简单的图片,每隔500ms显示一张图片,就可以做类似动画的效果。
改动的地方如下:
voidtuxing()
if(++speed>
70)//移动速度控制
35)//是否完成移位36个图形和汉字
WriteByte(table[2*num+move*32]);
WriteByte(table[2*num+1+move*32]);
delay(10);
移动速度变慢来了,++speed>
70的话才执行下面的语句。
if(move>
35)这个是判断是否移动35个汉字和图形,因为想实现一次上移16行,一共有36个图形和汉字,所以只用判断移动35个的话就回到第一个汉字重新开始循环。
上移算法的改动:
WriteByte(table[2*num+move*32]),WriteByte(table[2*num+1+move*32]),
当move=1的时候,num从0自加到15,num=0,2*num+move*32=32,2*num+1+move*32=33,也就是下一个要显示图形或者文字的第一行,循环16次之后,显示出第二个文字,依次类推。
这样,通过延时时间的合理调整,就可以实现要显示的“动画效果”。
软件编译是用keil编译的,编译界面如图4.1-1所示:
图4.1-1keil编译界面
然后生成hex文件,用STC-ISP软件将生成的hex文件打开,通过下载器,下载到单片机,下载成功如图4.1-2所示:
图4.1-2STC-ISP下载界面
5实物展示
图5.1正面连接图
图5.2背面连接图
图5.3显示效果图一
图5.4显示效果图二
如上图所示,下载程序后,打开电源开关,点阵屏首先动态显示心形画面,紧接着显示一个小人的动画,并慢慢上移,再接着以此显示“牛延利仪器设计实践课程设计”字样。
总结
这次课程设计,让大家得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼,也在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧,特别是C语言的掌握方面都能向前迈了一大步。
本次课程设计的过程是艰辛的,但是收获却是巨大的。
在设计过程中,也遇到了很多问题,尤其是在焊接电路时,因为之前的好多课程设计并没有做实物,所以也没有什么经验,在整体电路的布局方面就存在欠缺。
焊接完成后,还要测试,从刚开始只有四分之一的点阵屏可以工作,到检查后二分之一屏可以工作再到最后可以全部工作,这个过程很不容易,但也学到很多东西。
像各个模块必须共地,否则就会存在很大的干扰,LED灯会一直闪烁,还有就是实物的焊接和仿真也存在很大的区别,仿真中可以用网络标号代替导线进行连接,但是焊接时如果布局不好就会造成很多跳线。
总的来说,通过这次课程设计,掌握了LED点阵屏的原理,以及显示程序的编写,自己的实际动手能力也有了很大的提高。
参考文献
【1】新概念51单片机C语言教程,郭天祥著,电子工业出版社;
【2】数字电子技术基础(第五版),阎石主编,高等教育出版社;
【3】单片微型计算机原理、应用及接口技术(第二版),张迎新等编著,国防工业出版社;
【4】电子技术课程设计与综合实训[M],陈光明,北京航空航天出版社;
【5】电子技术基础(模拟部分)(第5版),康华光,高等教育出版社。
附录一主电路图
附录二原件清单
序号
名称
规格/型号
数量
1
单片机
STC89C52
2
译码器
74HC138
3
移位寄存器
74HC595
4
晶振
11.0592MHz
5
瓷片电容
30pF
6
电阻
330K,1K,10K
7
电解电容
100uF
8
雾状蓝色LED
3mm
256
9
自锁开关
10
红色LED
附录三程序代码
sbitSTB=P2^2;
0x00,0x00,0x00,0x00,0x30,0x18,0x48,0x24,0x84,0x42,0x04,0x41,0x04,0x40,0x08,0x20,
0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x90,0x12,0x10,0x11,0x10,0x10,
0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*2*/
0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*3*/
0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*4*/
0x10,0x10,0x20,0x08,0x40,0x04,0x80,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/*5*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x08,0x08,0x28,0x0A,0x08,0x08,
0x08,0x08,0x28,0x0A,0xC8,0x09,0x08,0x08,0xF0,0x07,0x80,0x00,0xFC,0x1F,0xC0,0x01,/*6*/
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x08,0x08,0x28,0x0A,0x08,0x08,0x08,0x08,
0x28,0x0A,0xC8,0x09,0x08,0x08,0xF0,0x07,0x80,0x00,0xE0,0x03,0xD0,0x05,0xC8,0x09,/*7*/
0x00,0x00,0x00,0x00,0xF0,0x07,0x08,0x08,0x28,0x0A,0x08,0x08,0x08,0x08,0x28,0x0A,
0xC8,0x09,0x08,0x08,0xF0,0x07,0x80,0x00,0xFC,0x1F,0xC0,0x01,0x40,0x01,0x40,0x01,/*8*/
0x00,0x