单片机应用技术课程设计Word格式文档下载.docx
《单片机应用技术课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机应用技术课程设计Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
第二章硬件方案设计
2.1方案设计
2.2设计论证
图文显示一般有静态和动态显示两种方案,静态方案虽然设计简单,但其使用的管脚太多,如本设计中16x16的点阵共有256个发光二极管,显然单片机没有这么多的端口,如果我采用锁存器来扩展端口,按8位的锁存器来计算,16x16的点阵需要256/8=32个锁存器。
这个数字很庞大,因为我们仅仅是16x16的点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。
因此在实际应用中的显示屏几乎都不采用这种设计,而采用另外一种称为动态扫描的显示方法。
动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套驱动器。
具体就16x16的点阵来说,把所有同1行的发光管的阳极连在一起,把所有同1列的发光管的阴极连在一起(共阳极的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第1行使其燃亮一定时间,然后熄灭;
再送出第二行的数据并锁存,然后选通第2行使其燃亮相同的时间,然后熄灭;
以此类推,第16行之后,又重新燃亮第1行,反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能够看到显示屏上稳定的图形了。
采用扫描方式进行显示时,每一行有一个行驱动器,各行的同名列共用一个驱动器。
显示数据通常存储在单片机的存储器中,按8位一个字节的形式顺序排放。
显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。
从控制电路到列驱动器的数据传输可以采用并列方式或串行方式。
显然,采用并行方式时,从控制电路到列驱动器的线路数量大,相应的硬件数目多。
当列数很多时,并列传输的方案是不可取的。
采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。
但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都以传输到位之后,这一行的各列才能并行地进行显示。
这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两部分。
对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下留给行显示的时间就太少了,以致影响到LED的亮度。
解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。
即在显示本行各列数据的同时,传送下一列数据。
为了达到重叠处理的目的,列数据的显示就需要具有所存功能。
经过上述分析,就可以归纳出列驱动器电路应具有的功能。
对于列数据准备来说,它应能实现串入并处的移位功能;
对于列数据显示来说,应具有并行锁存的功能。
这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。
2.3硬件设计
(1)单片机系统及其管脚
常用的时钟电路设计有两种方式,一种是内部时钟方式,一种是外部时钟方式。
本实验采用内部时钟方式,将XTAL1与XTAL2之间跨接一个石英晶振和微调电容,从而构成一个稳定的自激震荡器。
电容值取30pF左右,其大小将影响震荡频率的高低、振荡器的稳定性和起振的快速性。
为减少线间的寄生电容,晶振和电容应尽能安装得与单片机靠近,保证晶振稳定可靠的工作。
另一部分是复位部分。
上电自动复位电路是最简单的复位电路,只需要一个1K左右电阻、一个22pF左右的电容及12MHZ的晶振。
有时还需要按键手动复位,此时只要在电容上并联一个按键即可。
单片机信号输出采用串行输出,因此在下一模块的移位寄存器要与该部分的串行口P3.0(RXD)及P3.1(TXD)相连
其图形如下图
图一单片机接线图
图二单片机管脚图
(2)点阵及其驱动部分
点阵显示用是动的态扫描来实现的。
在采用扫描方式显示时,由于每行要带动十六个二极管,每行电流较大。
若每个二极管安5mA计算,十六个二极管就得80mA电流,超出单片机管脚的承受范围,因此每行都加有一个驱动器,本设计的行驱动用的是十六个pnp型三极管。
三极管的发射极接5V电压,集电极接点阵的行线,而其基级本应接单片机,但该接线方式占用为了16个单片机管脚,为了节省单片机管脚,用了一片74LS154译码器,这样就只需要3个管脚了。
74LS154的管脚图及其说明如图三。
点阵及其驱动部分总体接线图如图五(未画完整)
各行的同名列共用一个列驱动,数据通常存储在单片机的存储器中,按8位一个字节的形式存放。
由于列线过多,故多采用串行传输。
由于每次要传输16位,而且数据要逐位输给驱动器,只有当一行中各列数据都已传输到位后,这一行的各列才能进行并行显示,耗时较长。
为了满足以上要求,驱动选择74LS595移位寄存器。
74HC595是硅结构的CMOS器件,。
74HC595是有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
其特点:
8位串行输入/8位串行或并行输出存储状态寄存器,三种状态;
输出寄存器可以直接清除100MHz的移位频率。
输出能力:
并行输出,总线驱动;
串行输出;
标准中等规模集成电路。
74LS595的管脚图及其说明如图四。
对3个输入信号进行译码。
得到8个输出状态。
G1,G2A,G2B,为数据允许输出端,G2A,G2B低电平有效。
G1高电平有效。
A,B,C为译码信号输出端,Y0~Y7为译码输出端,低电平有效
图三74LS154管脚图
管脚及其说明:
QA--QH:
八位并行输出端。
QH'
:
级联输出端。
SI:
串行数据输入端。
74595的控制端说明:
/SCLR(10脚):
低点平时将移位寄存器的数据清零。
SCK(11脚):
上升沿时数据寄存器的数据移位。
QA-->
QB-->
QC-->
...-->
QH;
下降沿移位寄存器数据不变。
(脉冲宽度:
5V时,大于几十纳秒就行了)
RCK(12脚):
上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
(5V时,大于几十纳秒就行了),更新显示数据。
/G(13脚):
高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
图四:
74LS595管脚图
图五点阵及其驱动
2.4总体设计方案
方案一:
本设计所使用的16×
16的点阵,EDA实验箱上有其接口电路,列选信号为SEL0,SEL1,SEL2,SEL3,经4线16线译码器输出16列,从左起为第一列,列选信号是由一个4位向量SEL[3..0]控制;
行选信号为H0~H15,是由16个行信号组成的,每一行由一个单独的位来控制,高电平有效。
例如“0000”表示第0列,“0000000000000001”表示第一行的点亮。
由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。
例如要使第一列的2,4,6,8,行亮,则列为“0001”、行为“0000000010101010”就可以实现了。
方案二:
VHDL程序设计的是硬件,他和编程语言的最大区别是它可以“并发执行”。
本设计可以将LED显示屏要的显示内容抽象成一个二维数组(数组中的‘1’对映点阵显示屏上面的亮点),用VHDL语言设计一个进程将这个数组动态显示在LED显示屏上,再利用另一个进程对这个数组按一定频率进行数据更新,更新的方式可以有多种。
因为两个进程是同时进行的(并发执行),如果对数组中的汉字数据按滚动的方式更新,则可实现汉字的滚动显示。
如图2-1为该方案原理图。
图六方案二原理图
2.5LED的显示原理
16×
16扫描LED点阵的工作原理同8位扫描数码管类似。
它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。
通过时钟的每列扫描显示完整汉字。
图七LED灯红绿信号图八16×
16点阵LED等效电路
点阵LED一般采用扫描式显示,实际运用分为三种方式:
(1)点扫描
(2)行扫描
(3)列扫描
若使用第一种方式,其扫描频率必须大于16×
64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×
8=128Hz,周期小于7.8ms即可符合视觉暂留要求。
此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
第三章软件设计
3.1汉字的存储
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是获得数据并保存,即在存贮器中建立汉字数据库。
第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成16×
16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×
16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。
以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
图2-416×
16LED点阵模块
3.2汉字显示
汉字显示使用的是16×
下面是各个部分的程序设计:
3.2.1列循环扫描
列循环扫描
通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。
因此要控制扫描的频率,不能太低,否则,就会造成视觉上的不连续,本设计的扫描频率不得低于50Hz,扫描程序如下:
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
Entitydz_xsis
Port(enable,clk:
instd_logic;
--端口定义输入信号
Sel:
outstd_logic_vector(3downto0));
--端口定义输出信号
Enddz_xs;
Architecturecountofdz_xsis
Signallie:
std_logic_vector(3downto0);
Begin
Process(clk,enable)--脉冲、使能信号
begin
Ifclk'
eventandclk='
1'
then
Ifenable='
then
Iflie>
"
0000"
Lie<
=lie-"
0001"
;
Else
="
1111"
Endif;
Endif;
Sel<
=lie;
Endprocess;
3.2.2字符样式设计
字符样式设计
本环节是建立一个数据库,使之能在扫描的同时读取所需要的信息,从而完成汉字的显示。
本次设计“王、日、田、口”汉字样式设计程序如下:
--端口定义输入信号
h0,h8:
outstd_logic_vector(7downto0));
--端口定义输出信号(h0-列数据输出,h8-代表行数据输出)
--信号标志
Signalpast1:
std_logic_vector(1downto0);
Process(enable,clk)--脉冲、使能信号
Caselieis
When"
00"
=>
Caselieis--“王”字设计
0011"
h0<
00010001"
h8<
00010000"
0100"
0101"
0110"
0111"
1000"
00011111"
11110000"
1001"
1010"
1011"
1100"
1101"
Whenothers=>
00000000"
Endcase;
01"
Caselieis--“日”字设计
When"
10"
Caselieis--“田”字设计
Endcase;
11"
Caselieis--“口”字设计
11100000"
00100000"
Endif;
3.2.3字母循环扫描及期间的延时环节
为使字母不断地循环显示,并且使每个字母之间有停顿,就需要在中间加一定的延时和循环环节。
在这一环节中,可以通过修改其数值来控制每个字母的显示时间。
其程序如下:
process(clk)
variableint:
integerrange0to10000;
ifclk’eventandclk=’1’then
ifint<
10000then
int:
=int+1;
else
int:
=0;
ifnext1=”11”then
next1<
=”00”;
else
=next1+’1’;
endif;
endif;
endprocess;
3.3整个完整的程序
libraryieee;
entityyz_okis
port(enable,clk:
sel:
outstd_logic_vector(3downto0);
h0,h8:
endyz_ok;
architecturecountofyz_okis
signallie:
signalnext1:
std_logic_vector(1downto0);
a1:
process(clk,enable)
a2:
process(enable,clk)
Casenext1is
Caselieis
00010001