智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx

上传人:b****2 文档编号:23513712 上传时间:2023-05-17 格式:DOCX 页数:38 大小:197.50KB
下载 相关 举报
智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx_第1页
第1页 / 共38页
智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx_第2页
第2页 / 共38页
智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx_第3页
第3页 / 共38页
智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx_第4页
第4页 / 共38页
智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx

《智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx》由会员分享,可在线阅读,更多相关《智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx(38页珍藏版)》请在冰豆网上搜索。

智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文.docx

智能仪器设计报告基于单片机和fpga的矩阵键盘控制系统设计学位论文

目录

1.概述-1-

2.89C51单片机简介-1-

3.FPGA简介-2-

4.矩阵键盘控制系统-3-

4.1.FPGA设计框图-3-

4.2.单片机硬件实现-4-

4.3.键盘控制系统子模块-4-

4.3.1矩阵键盘原理-4-

4.3.2时钟分频模块-5-

4.3.3键盘扫描模块-6-

4.3.4译码转换及三态门输出模块-6-

4.3.5单片机及液晶显示模块部分-7-

5.仿真及结果分析-9-

5.1分频模块时序仿真-9-

5.2键盘扫描模块-9-

5.3译码输出模块-9-

5.4单片机与液晶显示器模块-10-

6.参考文献-11-

致谢-12-

附录-13-

1.概述

随着可编程逻辑器件及EDA技术的发展,在系统设计中经常会用到FPGA来扩展单片机的相关资源。

单片机具有性价比高、功能灵活、易于人机对话、强大的数据处理能力等特点;而FPGA则具有高速、高可靠性以及开发便捷、规范等特点,因此两类器件相结合的电路结构应在许多高性能仪器仪表和电子产品中将被广泛应用。

根据两者的特点,设计一种基于89C51单片机与FPGA的总线接口逻辑电路,实现对机械式键盘按键的检测和译码输出。

本系统主要分为四大部分:

89C51芯片、FPGA模块、矩阵键盘和液晶显示器。

其中FPGA模块主要实现与矩阵键盘接口并发信号对其扫描并得到信号等复杂的逻辑功能,89C51芯片实现将FPGA芯片传来的信号并将其对其信号识别然后将其传给显示器,驱动液晶显示器显示。

2.89C51单片机简介

89C51是Intel公司生产的一种单片机,在一小块芯片上集成了一个微型计算机的各个组成部分。

每一个单片机包括:

一个8位的微型处理器CPU;一个256K的片内数据存储器RAM;片内程序存储器ROM;四个8位并行的I/O接口P0-P3,每个接口既可以输入,也可以输出;两个定时器/记数器;五个中断源的中断控制系统;一个全双工UART的串行I/O口;片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。

最高允许振荡频率是12MHZ。

以上各个部分通过内部总线相连接。

中央处理器CPU是单片微型计算机的指挥、执行中心,由它读人用户程序,并逐条执行指令。

有的指令涉及到各个寄存器之间的关系;有的指令涉及到单片机核心电路内部各功能部件之间的关系;有的则与外部器件如外部程序存储器发生联系。

89C5l单片机的一个执行周期由6个状态(s1—s6)组成,每个状态又持续2个振荡周期,分为P1和P2两个节拍。

这样,一个机器周期由12个振荡周期组成。

若采用12MHz的晶体振荡器,则每个机器周期为1us,每个状态周期为1/6us;在一数情况下,算术和逻辑操作发生在N期间,而内部寄存器到寄存器的传输发生在P2期间。

89C5l单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。

由于单片机功能多,引脚数少,因而许多引脚具有第2功能;单片机对外呈3总线形式,由P2、P0口组成16位地址总线;由P0口分时复用作为数据总线。

3.FPGA简介

FPGA(FieldProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。

它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个新概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。

FPGA的基本特点主要有:

1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片;

2)FPGA可做其它全定制或半定制ASIC电路的中试样片;

3)FPGA内部有丰富的触发器和I/O引脚;

4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一;

5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。

FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。

用户可以根据不同的配置模式,采用不同的编程方式。

加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。

掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。

FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。

当需要修改FPGA功能时,只需换一片EPROM即可。

这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。

因此,FPGA的使用非常灵活。

4.矩阵键盘控制系统

5.FPGA设计框图

FPGA电路的设计,包括对时钟进行分频,对键盘进行连续扫描,再进一步通过译码等操作,确定按键的位置,译码输出。

并进一步将译码得到的8位二进制数经过一个三态门,通过中断信号和RD信号的控制,实现单片机和FPGA的8位数据信号的互连。

FPGA总体设计框图如图4-1所示。

图4-1FPGA总体设计框图

6.单片机硬件实现

89C5l单片机接收从FPGA模块传送过来的信号,并对信号进行识别,然后驱动液晶显示器显示信号所代表的按键。

单片机硬件接线图如图4-2所示。

图4-2单片机硬件接线图

7.键盘控制系统子模块

4.3.1矩阵键盘原理

矩阵键盘又叫行列式键盘。

用带IO口的线组成行列结构,按键设置在行列的交点上。

例如用3×3的行列式结构可以构成9个键的键盘。

这样,当按键数量平方增长时,I/O口只是线性增长,这样就可以节省I/O口。

按键设置在行列线交叉点,行列线分别连接到按键开关的两端。

列线通过上拉电阻接3.3V电压,即列线的输出被默认设置为高电平状态,对应的二进制代码即为1。

判断键盘中有无按键按下式通过行线送入扫描信号然后从列线读取状态得到的。

其方法是依次给行线送低电平,检查列线的输入。

如果列线全是高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下。

矩阵键盘的原理图如图4-3所示。

图4-3矩阵键盘的原理图

4.3.2时钟分频模块

时钟电路主要产生系统所需要的时钟信号,由FPGA时钟分频得到系统工作时钟,然后采用计数器分频方法得到所需要的键盘扫描信号。

本次设计中循环的发送3种数值,即011,101,110。

具体的分频过程是将原来的f=50Mhz分频到现在的f=50hz。

本程序中采用了计数器分频的思路,把一个计数周期内的约定个数定为1000000,在每次计数到约定个数的一半时,实现1、0之间的跃变。

这样,就实现了对原频率1/1000000的分频。

分频模块视图如图4-4所示。

图4-4分频模块视图

4.3.3键盘扫描模块

键盘扫描电路用来产生键盘扫描信号,根据矩阵键盘工作原理,需要产生从第一列到第四列的周期性扫描信号。

采用Verilog硬件语言设计扫描模块。

键盘扫描模块可以周期性的得到行扫描信号Keydry0~Keydry2:

011→101→110→011…..周而复始的扫描。

触发信号的周期是20ms,就是上一分频模块的的输出周期。

键盘扫描模块如图4-5所示。

图4-5键盘扫描模块

4.3.4译码转换及三态门输出模块

矩阵键盘所产生的扫描回复信号(按键输入给FPGA的信号),是无法直接在FPGA内部作为信号进行使用,在使用前需要根据定义的不同功能将扫描回复信号译码为可供FPGA识别的BCD编码,完成矩阵键盘输入的译码,同时区分不同按键的功能。

译码电路的主要功能是:

判断是否有键按下,然后根据扫描的信号确认所按下的键是数字键还是功能键,将所按下的键编写成BCD码。

BCD码的编码表4-1如下所示:

表4-1BCD码编码表

键盘输出

按键

译码

键盘输出

按键

译码

011_011

1

0001

101_110

6

0110

011_101

2

0010

110_011

7

0111

011_110

3

0011

110_101

8

1000

101_011

4

0100

110_110

9

1001

101_101

5

0101

000_000

无按键

0000

在完成BCD码转换后,要进一步通过中断控制,发送信号给单片机。

并在三态门的控制作用下,实现不同状态的输出。

具体即在无键盘按下时,输出为高阻状态;有键盘按下时,按相应的键码输出8位数据给单片机。

在三态门的控制实现过程中,要注意,RD信号的0和1状态转换的条件,从0到1和从1到0是依据不同的变量来进行判断的。

从1到0,是判断Y发生变化,且当前状态不是全为1;从0到1是根据列向量KEYO的状态进行判断的,一旦KEYO为全1,则进行中断信号从0到1的转换。

这样能够实现三态门有效的对数据输出的控制。

译码输出模块如图4-6所示。

图4-6译码输出模块

4.3.5单片机及液晶显示模块部分

点阵LCD的显示原理:

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。

对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。

对于中文,将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。

而剩下的低128位则留给英文字符使用,即英文的内码。

字模是用数字的各位信息来记载英文或汉字的形状,通过字模将汉字在屏幕上显示出来。

12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。

可完成图形显示,也可以显示8×4个(16×16点阵)汉字。

12864LCD的引脚说明如表4-2所示。

表4-2液晶模块12864的管脚说明

管脚号

管脚名称

LEVER

管脚功能描述

1

VSS

0

电源地

2

VDD

+5.0V

电源电压

3

V0

-

液晶显示器驱动电压

4

D/I(RS)

H/L

D/I=“H”,表示DB7∽DB0为显示数据

D/I=“L”,表示DB7∽DB0为显示指令数据

5

R/W

H/L

R/W=“H”,E=“H”数据被读到DB7∽DB0

R/W=“L”,E=“H→L”数据被写到IR或DR

6

E

H/L

R/W=“L”,E信号下降沿锁存DB7∽DB0

R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0

7

DB0

H/L

数据线

8

DB1

H/L

数据线

9

DB2

H/L

数据线

10

DB3

H/L

数据线

11

DB4

H/L

数据线

12

DB5

H/L

数据线

13

DB6

H/L

数据线

14

DB7

H/L

数据线

15

CS1

H/L

H:

选择芯片(右半屏)信号

16

CS2

H/L

H:

选择芯片(左半屏)信号

17

RET

H/L

复位信号,低电平复位

18

VOUT

-10V

LCD驱动负电压

19

LED+

-

LED背光板电源

20

LED-

-

LED背光板电源

显示模块电路如图4-7所示,液晶模块的1管脚接电源地,15管脚用于接电源地,19管脚用于接电源地。

2管脚接电源给液晶显示器供电,3管脚接电源用于提供液晶显示器显示驱动电压,17管脚接电源,20管脚接电源用与提供背景光。

4管脚接单片机的P1.3用于接收数据或者指令,5管脚接单片机的P1.4选择数据被读写到什么位置,6管脚接单片机的P1.5用于提供锁存信号。

图4-7显示模块电路

当FPGA模块周期性地对键盘进行扫描的时候,也会周期性地给单片机发送中断信号,在单片机程序中加入中断信号比较简单,代码如下:

EA=1;//打开总中断

EX0=1;//打开外部中断0

IT0=0;//将中断0设置为电平触发

然后单片机对输入管脚进行扫描,如果输入信号是0x01,单片机就驱动液晶显示器显示数字1,如果输入信号是0x02,单片机驱动液晶显示器显示数字2。

8.仿真及结果分析

5.1分频模块时序仿真

分频模块时序仿真结果如图5-1所示:

图5-1分频模块时序仿真结果

结果分析:

如图所示,CLK频率是50Mhz,分频以后CLK_OUT的周期是20ms(图中的140ms和120ms之间即为一个周期,20ms)。

5.2键盘扫描模块

键盘扫描模块仿真结果如图5-2所示:

图5-2键盘扫描模块仿真结果

结果分析:

如图所示,每过一个周期,键盘行扫描信号就变化一次,并且按照Keydrv[2:

0]:

011→101→110→011…的顺序周而复始的扫描。

5.3译码输出模块

译码输出结果如图5-3所示:

图5-3译码输出结果

结果分析:

如图所示,Y1[7:

0]即为输出。

如黄线所示位置,KEYI_KEYO为110_101,对应于键盘上的“8”。

再来看输出Y1[7:

0]为1111_0111,取反以后为0000_1000,对应于BCD码,也是对应着“8”。

所以,仿真结果正确。

即当按下相应的键时(通过相应的仿真激励来实现,即对KEYO的控制),会输出相应的BCD码。

在无键盘按下时,输出为高阻状态。

5.4单片机与液晶显示器模块

单片机对输入管脚进行扫描,然后进行输出,可以由proteus软件对单片机程序进行仿真,仿真结果如图5-4所示,由于Proteus软件对单片机模块有许多默认的输入,例如晶振电路,故没有在软件中进行连线,从而简化布局。

图5-4Proteus软件仿真结果

9.参考文献

[1]李华.MCS251系列单片机接口技术[M].北京:

北京航天航空大学出版社,1993.

[2]游志宇,张洪,董秀成等.MCS251与FPGA_CPLD总线接口逻辑设计[J].单片机与嵌入式系统应用,2008,1:

29-32.

[3]徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:

电子工业出版社,2002.

[4]郭文川.单片机原理与接口技术[M].北京:

中国农业出版社,2007.

[5]夏宇闻.Verilog数字系统设计教程[M].北京:

北京航天航空大学出版社,2008.

[6]吴继华,王诚.设计与验证VerilogHDL[M].北京:

人民邮电出版社,2006.

[7]栗彩霞,武一等.MCS251单片机与FPGA接口的逻辑设计[J].山西电子技术,2009,5.

致谢

通过这次《智能仪器设计》大作业——基于单片机和FPGA的矩阵键盘控制系统设计,我收获了许多。

学习了89C51单片机的结构组成、各个组成部分的功能,并且掌握了一定的单片机编程技能;学习了Verilog语言的编写规范,利用Xilinx的ISE工具,用Verilog语言完成电路的设计;初步了解了可编程逻辑器件对硬件系统的控制,并且对89C51单片机与FPGA逻辑控制和接口连接有了一定的认识。

在这里要感谢曾翔君老师对我的指导。

我们几个同学共同完成这个大作业,但是在机械学院我们接触单片机和FPGA控制方面知识的机会较少,因此刚开始接触大作业时遇到了很多问题,曾老师都对我们的问题耐心的指导,老师渊博的知识和悉心的教导深深地感染了我们,我们衷心祝愿曾老师在未来的生活工作里,一帆风顺,心想事成!

附录

1.单片机程序

//LCD_12864.c

//-----------------------------------------------------------------

//名称:

12864LCD(KS0108)显示驱动程序(不带字库)

//-----------------------------------------------------------------

#include

#include

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

#defineLCD_DB_PORTP1//液晶DB0-DB7

#defineLCD_START_ROW0xC0//起始行

#defineLCD_PAGE0xB8//页指令

#defineLCD_COL0x40//列指令

//液晶引脚定义

sbitDI=P2^0;//数据/命令选择线

sbitRW=P2^1;//读/写控制线

sbitE=P2^2;//使能控制线

sbitCS1=P2^3;//片选1

sbitCS2=P2^4;//片选2

sbitRST=P2^5;//复位

//-----------------------------------------------------------------

//LCD忙等待

//-----------------------------------------------------------------

voidLCD_Busy_Wait()

{

do

{

LCD_DB_PORT=0xFF;//液晶端口置高电平

RW=1;

_nop_();

DI=0;//设置为读,选择状态寄存器

E=1;

_nop_();

E=0;//E置高电平读取,随后置为低电平

}while(P0&0x80);

}

//-----------------------------------------------------------------

//向LCD发送命令

//-----------------------------------------------------------------

voidLCD_Write_Command(INT8Uc)

{

LCD_Busy_Wait();//液晶忙等待

LCD_DB_PORT=0xFF;//液晶端口置高电平

RW=0;

_nop_();

DI=0;//设置为写,选择命令寄存器

LCD_DB_PORT=c;//一字节命令放置到液晶端口

E=1;

_nop_();

E=0;//E置高电平读取,随后置为低电平

}

//-----------------------------------------------------------------

//向LCD发送数据

//-----------------------------------------------------------------

voidLCD_Write_Data(INT8Ud)

{

LCD_Busy_Wait();//液晶忙等待

LCD_DB_PORT=0xFF;//液晶端口置高电平

RW=0;

_nop_();

DI=1;//设置为写,选择数据寄存器

LCD_DB_PORT=d;//一字节数据放置到液晶端口

E=1;

_nop_();

E=0;//E置高电平读取,随后置为低电平

}

//-----------------------------------------------------------------

//初始化LCD

//-----------------------------------------------------------------

voidLCD_Initialize()

{

CS1=1;

CS2=1;//左右半屏片选

LCD_Write_Command(0x3F);//显示开

LCD_Write_Command(LCD_START_ROW);//设置起始行

}

//-----------------------------------------------------------------

//

//通用显示函数

//

//从第P页第L列开始显示W个字节数据,数据在r所指向的缓冲

//每字节8位是垂直显示的,高位在下,低位在上

//每个8*128的矩形区域为一页

//整个LCD又由64x64的左半屏和64x64的右半屏构成

//-----------------------------------------------------------------

voidCommon_Show(INT8UP,INT8UL,INT8UW,INT8U*r)

{

INT8Ui;

//显示在左半屏还是右半屏

if(L<64)

{

CS1=1;

CS2=0;

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL+L);

//全部显示在左半屏

if(L+W<64)

{

for(i=0;i

LCD_Write_Data(r[i]);

}

//如果越界则跨越左右半屏显示

else

{

//左半屏显示

for(i=0;i<64-L;i++)

LCD_Write_Data(r[i]);

//右半屏显示

CS1=0;

CS2=1;

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL);

for(i=64-L;i

LCD_Write_Data(r[i]);

}

}

//全部显示在右半屏

else

{

CS1=0;

CS2=1;

LCD_Write_Command(LCD_PAGE+P);

LCD_Write_Command(LCD_COL+L-64);

for(i=0;i

LCD_Write_Data(r[i]);

}

}

//-----------------------------------------------------------------

//显示一个8×16点阵字符

//-----------------------------------------------------------------

voidDisplay_A_C

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

当前位置:首页 > 小学教育 > 学科竞赛

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

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