2021 —2022 学年第 2 学期
《微机原理与汇编语言》期末考试试卷(A卷)
考试形式:综合设计与报告
专业: | 计算机科学与技术 | 班级: | 计算机 | 任课教师: | X老师 |
---|---|---|---|---|---|
学号: | 209923567896 | 姓名: | 小王 | 总分: | 100分 |
阅卷人:
全卷得分统计:
毕业要求指标点与课程目标 毕业要求指标点1.2 毕业要求指标点2.3 总分
课程目标1 课程目标2
得分
组号 | 开始地址 | 结束地址 | hex 文件名 |
---|---|---|---|
2 | A0000H | B1000H | ASMT2.hex |
3 | A2000H | B3000H | ASMT3.hex |
4 | A4000H | B5000H | ASMT4.hex |
5 | A6000H | B7000H | ASMT5.hex |
6 | A8000H | B9000H | ASMT6.hex |
7 | AA000H | BB000H | ASMT7.hex |
8 | AC000H | BD000H | ASMT8.hex |
9 | AE000H | BF000H | ASMT9.hex |
题 目:基于Proteus和MASM的微机接口应用演示系统设计与实现
学 院: 计算机科学与工程
专 业: 计算机科学与技术
班 级:
姓 名:
学 号:
教师姓名:
本设计以8086微处理器为基础,为了研究并行通信的概念,为了研究I\O数字接口芯片,并且掌握可编程接口芯片的应用。选用8253、8255、8259等芯片,集成实现了存储器扩展应用、液晶显示器应用、交通灯控制系统、简易密码锁功能。在 Proteus 中设计出硬件连接及布局,在 EMU 8086 编译环境下编写程序进行仿真,仿真实验结果表明:该电路设计正确,程序编写符合要求,各部分协作运行效果良好。
关键字: 8086微处理器,8086微机设计,交通灯,密码锁
设计简易电子密码锁。最低要求:可以通过输入装置如按键等设定三位十进制数字密码。客户使用时须输入三位十进制数字编码,如果与预设密码一致则给出开锁信号,否则不给出对应信号。所需器材、功能、工作逻辑等自行设定。密码锁工作期间交通灯和LCD的工作不受影响。
在本项目中,只有交通灯需要严格的控制时序,1秒时间要发生一次变化,密码锁、液晶屏对时序的要求不严格,可以将交通灯放在中断,准备随时打断正在执行的密码锁。
由于本设计中只有交通灯这一中断,最简单的方法就是将交通灯当作NMI不可屏蔽中断,将中断向量放在NMI特定的向量区域。另一种方法是使用8255A芯片对中断进行管理。相比于直接使用NMI不可屏蔽中断,8255A使用较为复杂,使用8255A能更好的训练对该芯片的熟悉程度,同时一片8255A芯片可以管理8个可屏蔽中断源,可以便于设计后期需要时进行功能扩展。
由于单纯的硬件系统能实现的功能十分有限,需要软件配合硬件进行需求实现。编写代码,通过软件控制8086 CPU 向外设芯片发出信号,以到达控制外设的目的。
系统硬件模块包含:微处理器控制模块,采用8086芯片;存储器扩展模块,由2732 4KB8芯片、6116 2KB8芯片构成;LCD液晶显示模块,采用HDG12864F-3液晶屏;交通灯模块,采用8255A芯片,组合LED和7SEG数码管构成;密码锁模块,键盘输入采用4×4矩阵键盘,开锁模块使用LM016芯片,系统总框架如下图所示。
LCD液晶显示模块使用HDG12864F-3液晶屏,仿真元件图为图 3-2 所示。
它是一种专门用来显示字母、数字、符号的点阵型液晶模块,显示能容为16×4即可以显示四行,每行16个字符液晶显示方阵。
屏幕从左到右分成128列,分别是column0 - column127,后面简称c0~c127,每一列对应着屏幕上纵向的一串点,相当于屏幕的x坐标值;同时,屏幕从上到下分成8个Page,每个Page对应着一个字节,恰好8个bit,每个bit对应着屏幕上横向的一串点,8个Page一共8 * 8=64个点,每个bit的位置相当于屏幕的y坐标值。这样,就将屏幕分成了128 * 64个点。如下图 3-4 所示:
因为写数据的时候是从右边开始,所以字模数组的顺序也是从右边开始的。例如右上角8*8点阵形成的数组为:N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7]。
写完一个Byte后,控制器将列坐标自动加1,因此按0~7的顺序写完这个数组后,在屏幕的右上角就完成了一个汉字右上四分之一的显示。
接着连续写汉字左上四分之一,就是写N[8]~N[15]共8个字节。到这里一个汉字的上半部分就写完了。
接下来就是更改Page了(相当于更改纵向位置)。刚才写汉字的上半部分时,纵坐标是在Page=0的位置,现在需要将纵坐标设置成Page=1;同时,也要将列重新设置为0。这样再连续写N[16]~N[31]共16个Byte后,一个完整的汉字就在屏幕上写好了。
电路如图 3-6 所示,交通灯由8片8255A芯片、24个七段数码管、32个LED灯、1片8253A芯片、4个单刀开关。
S1、S2控制东西方向的数码管,S3、S4控制南北方向的数码管。L1控制东向的LED灯,L2控制西向的LED灯,L3控制北向的LED灯,L4控制南向的LED灯。如下图所示:
现实中的十字路口由四个方向组成,本次设计中也有四个路口,通过生活经历得知,南北、东西方向交通灯的完全相同,主要是显示的时间不同。
将8253A的通道1输出口链接到8259A的IR0口,每1秒到达时,发生一次可屏蔽中断,中断发生后对数码管及LED灯的状态进行变化。
存储器的扩展分为位扩展和字扩展。位扩展是指存储芯片的字数满足要求而位数不够需要对每个存储单元的位数进行扩展,将地址线、控制线并联,数据线对应接到8086的数据线上。字扩展即地址扩展,用于存储芯片的位数满足要求而字数不够的情况,是对存储单元数量的扩展。根据片选信号产生的方法不同,字扩展分为线选法、局部译码法和全译码法。线选法是地址线与存储器的地址线连接,余下的高地址分别作为各个存储器的片选。局部译码法是将高地址的一部分进行译码,产生每个存储器的片选。全译码法是高地址全部进行译码产生各个存储器的片选。
(1)存储器连接部分:
本次设计中要求扩展16KB的ROM、16KB的RAM。2732 ROM芯片的规格为4KB8位,因此需要同时进行字扩展和位扩展,两片2732组成高低位,需要这样的两组,即可完成题目要求。6116 RAM芯片的规格为2KB8位,也需要同时进行为扩展和字扩展,先用两片6116芯片组成高低位完成字扩展,再需要这样的8组完成位扩展。具体的电路图见图 3-8 。
(2)存储器译码部分。
ROM译码部分:
本次设计中ROM的起始位置为:A2000H – A5FFFH。
表 3-1 ROM起始地址分析
ROM A19 A18 A17 A16 A15 A14 A13 A12 A11-A0
起始 1 0 1 0 0 0 1 0 00H
结束 1 0 1 0 0 1 0 1 FFH
对地址进行分析:
上表对芯片2732芯片的地址进行分析,先通过译码电路区分出两组,再通过A0和BHE每组内区分高低位。通过观察得知,第一组的开始地址为:A2000H,第二组的开始地址为:A4000H。
使用门电路进行译码,得到两组,再将两组与A0和(BHE) ̅相或,区分出每组内的高低位。具体的连线如下图 3-9 所示:
RAM译码部分:
本次设计中RAM的起始位置为:B3000H – B6FFFH。
表 3-4 RAM起始地址分析
ROM A19 A18 A17 A16 A15 A14 A13 A12 A11 A10-A0
起始 1 0 1 1 0 0 1 1 0 00H
结束 1 0 1 1 0 1 1 0 1 7FH
对地址进行分析:
上表对芯片2732芯片的地址进行分析,先通过译码电路区分出两组,再通过A0和BHE每组内区分高低位。通过观察得知,第一组的开始地址为:A2000H,第二组的开始地址为:A4000H,第三组的开始地址为:A2000H,第四组的开始地址为:A2000H,
通过对上表的观察,得知每组的A14、A13、A12三位在有规律的变化,所以使用
使用74LS138译码后,得到8组,再将两组与A0和(BHE) ̅相或,区分出每组内的高低位。具体的连线如下图 3-10 所示:
为了达到密码锁所需实现的基本要求,矩阵键盘作为输入设备,LCD液晶显示屏、七段数码管作为输出设备,同时也是该模块和用户的一个交互窗口,该锁还提供了密码的输入和报错功能,当使用该产品时,七段数码管会显示6个0,等待密码输入,当密码输入正确时,液晶显示屏会显示“You are right!!!”的提示信息,当密码输入错误时,液晶显示屏会显示“You are wrong!!!”的提示信息。
使用可编程并行I/O接口芯片8255A作为并行I/O接口电路,如下图 3-11 所示。
本系统中M1芯片A、B、C组都以工作方式0进行输出。分别连接LCD液晶屏的各个端口。
M2芯片A组以工作方式0输出;B组以工作方式0输出;C组端口高半字节、低半字节全为输入。A组连接七段数码管的8位数据线,B组的低6位连接七段数码管的位选信号,C口连接矩阵键盘,如下图 3-11 所示。
8086 CPU由于引脚数目的限制,数据地址信号等引脚是分时复用的,构成微型计算机系统必须外接总线配置芯片将复用的信号加以分离。利用74LS373将总线上的地址码暂存起来。在CPU与外部通信时,必须先发送存储器或I/O端口的地址才能正确地发送数据。通过74LS245分离的数据总线实现8086与外部接口芯片的双向数据传输,并行接口具有传送数据速度快、要求传输线较多的特点。
端口及编址方式。端口是指接口电路中能被微处理器直接访问的寄存器的地址。微处理器通过这些地址(端口)向接口电路中的寄存器发送命令、读取状态、和传送数据。
计算机给接口电路中的每一个寄存器都分配一个端口,CPU在访问的时候,只需要指明他们的端口地址,不需要知道是访问什么寄存器。这样,在输入输出程序中访问端口就是访问接口电路的寄存器,通常所说的IO操作就是对IO端口的操作,即CPU所访问的是与IO设备相关的端口,而不是IO设备本身。
因为8086微机系统中,外设的地址为16位(A0 - A15),本次设计中使用两片74LS138译码器,产生16个外设地址以供使用。具体如下图 3-13 所示:
在上图中0000H – 0700H、1000H – 1100H所有的8255A芯片使用;1200H供8253A芯片使用;1300H – 1600H当前空闲,以供其他功能扩展;1700H供8259A芯片使用。
本设计中交通灯模块需要通过发生中断进行执行,用8259A芯片对中断进行管理。8259A芯片是一个中断管理芯片,通过8259A可以对单个中断源进行屏蔽。中断的来源除了来自于硬件自身的NMI中断和来自于软件的INT n指令造成的软件中断之外,还有来自于外部硬件设备的中断,这些中断是可屏蔽的。这些中断也都通过PIC进行控制,并传递给CPU。一个8259A芯片最多可以接8个中断源,但由于可以将2个或多个8259A芯片级连(cascade),所以最多可以接64个中断源。
上图中的8253A芯片连接1KHz的时钟源,计数次数为1000次,所以会在一秒钟产生一个周期的高电平,产生的高电平连接到8259A芯片,进而向CPU提交中断申请,实现对中断程序的执行。
软件设计采用模块化设计方式,包括主程序、交通灯中断、液晶屏初始化子程序、液晶屏显示字符子程序、密码比较子程序、密码置零子程序等设计。整体代码段构成如下图 3-15所示:
上图所示,代码段主要由主程序部分、子程序部分、交通灯中断程序三大部分组成。具体的源代码文件见文件:202.asm。
利用8086CPU控制8255芯片,在LCD图形液晶显示器上显示学校名称、学院简称、个人姓名和学号。在LCD上显示汉字、数字时,首先要对需显示的汉字使用特定的软件取模,将字模数据提前定义好对应的一个数据区域,每次在LCD上显示一个数据,就从定义数据区域内获取,显示时在8255的PB口对LCD的状态进行控制,在8255的PA口给出要显示的数据信息。程序流程图如下图 3-16 所示:
执行交通灯控制中断程序时,需要对交警按钮状态判定,当前是第几秒判断,更具判断进行相应的变化。
代码段设置变量transpPOINT,用来记录当前交通的时间。在transpPOINT 0秒、53-57秒、55-59秒、58秒、60秒、93-97秒、98秒时,对需要发光的的交通灯,在对应的8255A控制端口输出高电平,使此交通灯发光。
对于直行、左右转的交通灯闪烁效果,可以通过前一秒送出低电平,后一秒送出1高电平,按照此方法实现功能。
存储器扩展模块将以A2000H开始的ROM区域数据,转移到以B3000H开始的RAM地址。
使用两个指针寄存器,分别指向ROM、RAM的偏移地址,每移动一个字节数据,指针就向后移动,在判断当前指针是否已经到达数据末尾。到达末尾时,结束此程序。
密码锁模块中,先进行矩阵键盘的扫描,等待数据输入。当有按键按下时,程序会检测到端口电平变化,然后遍历行,进而遍历列,再通过行列值计算目前的按键值,将键值保存到 NEWPASS 数组。
若当前输入未够6个数,则继续读键盘;反之,则与正确的密码进行比较,看输入的密码是否正确。如果密码正确,液晶屏显示“You are right !!”,密码错误时,液晶屏显示“You are wrong !!”。
本设计中,先执行内存数据转移代码,再液晶显示屏输出个人信息,之后是矩阵键盘代码死循环执行,监控键盘端口。
由于交通灯必须每分钟按时变化,时序不能有任何耽误,所以将交通灯代码作为中断进行执行,交通灯中断发生时会打断死循环的密码锁部分,当本次的交通灯代码结束时,继续返回执行被打断的密码代码。
xi DB :用于保存液晶屏需要显示的汉字(西)字模码。
RESET EQU 11100010B :用于保存液晶屏复位命令。
LINE0 EQU 01000000B :用于保存液晶屏列号。
对于交通灯直行方向的倒计时效果,提前将需要显示的数字保存到数据段的数组中,每次发生交通灯中断时,指针后移一位,将数字输出到对应8255A芯片的端口,数码管按照输出显示对应的数字,给人交通灯随着时间变化的感觉。
SEGDATA DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH
将数码管显示0-9数字的控制信号保存到此数组,需要输出某个阿拉伯数字时,将此阿拉伯数字作为SEGDATA1数组的偏移值,取出SEGDATA中对应的数据,送到七段数码管,以此实现了对阿拉伯数字的数码挂显示。
transpPOINT DB 0
此变量用作指针,用来记录当前的时间,用这个指针进行交通灯当前时间判断,进而在特定的时间对交通灯发光二极管、倒计时进行控制。
WEZXtranspXRtranspS DB ’ W E Z H I X I N G , X I N G R E N I S G R E E N - - - - -’
此变量保存东西方向的交通灯变为绿灯时,需要在内存记录的字符串。由于存储器扩展时,按照就奇偶片进行扩展的,所以在写内存时,方便同一片内存观察写入结果,在字符串之间填充空格,将空格写入到偶内存芯片,将字母写入到奇内存芯片。最终实现的效果是,奇内存芯片保存了连续的字符串。
以上两个变量保存正确密码、输入的密码。由于键盘每次只能读入一个数字(4位二进制),但8086微机中,最小的存储单位是字节(8位二进制),所以使用一个字节保存一位密码不需要移位操作,更加便利。其次在进行密码正确性比较时需要按字节比较,所以使用一个字节保存一位密码,更容易实现比较功能,不需要额外的移位操作。
以上程序片段实现输入密码正确性的比较。将正确密码、输入的临时密码取出第一位进行比较,如果二者不相等,就停止比较,直接输出密码错误,如果二者相等,则指针同时加1,再将第二位进行比较,当6位密码全部逐一比较完毕,没有发现错误,就认为密码完全正确。
以上代码片段实现将输入密码显示到6位七段数码管的功能。6位七段数码管中,每位共用8个数据引脚,每位各有一个控制引脚,工作时8个数据引脚将数据送到控制引脚有效的那一位进行显示。可以理解为在一个时刻,6位七段数码管只能显示一个数字,因此通过以上程序先输出第一位阿拉伯数字,紧接着在非常短的时间内,马上转变控制信号,输出第二位,同理输出后面的几位数字,导致人眼的刷新频率跟不上数码管变化的频率,所以就给人一种数码管连贯显示数字的感觉。
以上代码将DS:[SI]的数据按字节移动到ES:[DI]区域,移动的个数为通过寄存器CX进行指定。
首先将各部分整体运行,观察各模块间的整体协作运行是否正常,看全局功能是否能够正常运行。观查设计图中各芯片引脚,是否连线完全正确,各引脚输入、输出电平完全正确。
其次将依次详细查看内存数据移动、调试液晶屏显示器、交通灯控模块、密码锁模块,查看各部分具体的功能是否已经实现,是否在特定情况下发生系统奔溃现象,是否存在程序逻辑方面的错误。
图 4-1 项目整体调试思路
运行仿真平台,对全局功能的实现情况进行检查。
运行仿真设计,LCD液晶显示屏显示学校和学院简称“XX师大计工学院”、课程名“微机原理期末设计”、自己的汉语名字和学号。
液晶屏模块所有功能已完全实现,本模块各部分运行正常。
运行仿真设计,如图 4-6 所示,数码管倒计时显示正常,四个方向发光二极管显示正常。当按下交警控制按钮时,对应方向的交通灯按照要求变化,松开按钮后,每个方向交通灯恢复之前状态。每次交通灯变化时,成功将变化信息写到内存区域。
交警控制模块所有功能已完全实现,本模块各部分运行正常。
运行仿真设计,如图 4-7 所示,已经成功将ROM的数据读到RAM区域,表明存储器扩展部分实现正常。
存储器扩展模块功能已完全实现,本模块各部分运行正常。
运行仿真设计,如图 4-8 所示,密码错误时,会显示“You are wrong !!”,密码正确时,会显示“You are right !!”。表明密码锁部分实现正常。
密码锁模块功能已完全实现,本模块各部分运行正常。
运行仿真设计,如图 4-9 所示,8253A芯片的CLK0时钟信号累计到达1000次,OUT0引脚就会发出一个时钟周期的高电平,将高电平信号发送给8259A芯片的IRO引脚,触发一次不可屏蔽中断,执行一次交通灯代码。表明交通灯与各部分的协作实现正常。
各模块功能已完全整合在一起,整体运行正常。
本次设计实现非常成功,各部分功能已全部实现,整合起来后整体协作运行正常。
本次设计全部由本人亲自完成。本次的设计是微机原理与接口技术教程这门课收获最为丰富的一部分。
通过本次设计的实现,将许多课本的理论知识更加的清楚。上课时候由于课程任务重,课时少,对本门课的知识吸收并不是特别的好,在设计中凭着“逢山开路、逢水架桥”的精神,不断的翻书、不断的找资料、不断的模仿别人,不断的犯错、不断的改正,在一次次的报错中,经验不断的丰富,实力慢慢的提升。
在本次设计中,不光完成了自己的设计作业,同时也积极与身边的同学交流、探讨,解决自己问题的同时,帮助身边的同学解决了许多问题。在同学间互相进步的同时锻炼了我的人际交往能力。
通过本次设计,我也深深理解到,在未成为大佬前,先从模仿大佬开始。不管是翻阅课本,还是查找网络资料,都是对大佬的模仿,在不断的模仿中,将知识转化为自己的理解。
通过对本课程的学习,对计算机的组成部分、工作原理有了更深层次的认识。本次课程从最底层讲解了计算机的物理实现,对各位行业前辈的智慧深深折服,被计算机的精妙设计深深震撼。
通过对本课程的学习,打开了我对计算机硬件方面的一扇门,就像C语言对每个计算机初学的软件方面的启迪一样,已经在我的内心点下星星之火,虽然理想中没有从事硬件行业的想法,但是我相信如果以后迫不得已,从事硬件行业,有了这门课的基础,对于硬件方面更加的有信心。
通过对本课程的学习,使我对汇编语言有了进一步的了解。汇编语言不同于以前学过的任何高级程序语言,在程序结构上没有高级语言那么多的限制,可以自由自在的跳转程序,我认为这就是汇编语言最具有魅力的地方。
以上就是我对这节课的学习总结,向引领学习答疑解惑的老师、向提供帮助的各位同学致以深深的感谢,向推动计算机行业进步的各位行业前辈致以深深的敬佩。
我对本学期的教学情况非常满意。
我个人感觉,本课程知识量大,课时紧,很多理论知识很难完全记住,通过针对性的仿真实验,可以加强对理论知识的记忆、理解程度,可以同时加强理论知识和实践动手能力。我认为仿真实验的设计是本门课的一大亮点,可以继续实施下去。
[1]江琪.8086接口实验系统设计[J].电子与电脑,1994(02):30-36.
[2]马瑞,高美蓉.基于Proteus和8086的电子时钟设计与仿真[J].办公自动化,2021,26(19):46-47+21.
[3]刘文光,张铭铭.基于Proteus的电子时钟仿真设计调试[J].济南职业学院学报,2020(02):122-124.
[4]顾洁,刘芯言,朱东敏.“微机原理与接口技术”开放性实验建设——8259A硬件中断实验[J].科技促进发展,2011(S1):326+322.
[5]李璨,黄钊.微机交通灯模拟[J].中国科技信息,2013(05):58+61.
[6]项新建.微机交通灯控制系统[J].微型机与应用,1997(09):28-30.
[7]熊佩轩,万在红,贾宇琪,胡伟倩.基于8086微机的多功能密码锁项目分析[J].无线互联科技,2017(01):54-57.
由于本设计源代码较长,详细源代码见文件:202.asm