单片机应用技术课程设计Word文件下载.docx

上传人:b****6 文档编号:18040810 上传时间:2022-12-13 格式:DOCX 页数:19 大小:340.17KB
下载 相关 举报
单片机应用技术课程设计Word文件下载.docx_第1页
第1页 / 共19页
单片机应用技术课程设计Word文件下载.docx_第2页
第2页 / 共19页
单片机应用技术课程设计Word文件下载.docx_第3页
第3页 / 共19页
单片机应用技术课程设计Word文件下载.docx_第4页
第4页 / 共19页
单片机应用技术课程设计Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机应用技术课程设计Word文件下载.docx

《单片机应用技术课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机应用技术课程设计Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

单片机应用技术课程设计Word文件下载.docx

第二章硬件方案设计

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

00

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1