完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用8086,要求系统电路含有4个及以上led灯(或1位以上数码管)和按键(盘),在PROTEUS上仿真实现。要求如下:
1、系统功能自定,要求使用中断功能。 2、汇编语言实现。 3、在PROTEUS上仿真实现。 4、系统功能越复杂,作业得分越高。 一、 系统设计说明 本系统核心部件为8086CPU。 左上方电路由8086微处理器、74273锁存器和74154译码器组成。由于8086CPU地址和数据复用,所以需三片地址锁存器引出稳定的地址信号,经由74154译码器生成端口译码信号。 右上方电路由地址锁存器74LS373、74LS148和7SEG-BCD组成。在系统执行写操作时,AD0-AD7通过锁存器引出稳定的地址信号,由74LS148译码器生成BCD码供给数码管输出。 右下方电路由八个按键和八个锁存器构成。按下按键后,系统执行NMI中断,同时形成数据Q0-Q7。 左下方电路主要由74LS245组成。在系统执行读操作时,将Q0-Q7的数据传输到AD0-AD7。 二、系统功能说明 本系统的功能是:通过按一下按键(不是长按),识别按键所代表的数字,锁存,然后输出到数码管上,当再按一下按键,且所代表的数字比原来的高时,锁存,并输出更高的数字。在按下R8对应的按键后,再按下RX(X可取0-7)对应的按键,数码管输出X。 具体说明:未按下按键时,T0-T7为高电平,所有按键通过八输入与门再连上一个非门,接到NMI中断上。通过按下按键,使8086进入NMI中断,同时D锁存器接收到T0-T7中某一个变化,进而更新Q0-Q7。NMI中存在延时电路,因此有足够的时间等待Q0-Q7的数据更新,而后进行读写操作,最后输出到数码管上,数码管显示出所按键的数字。在按下R8对应的按键后,8086CPU的RESET端为高电平,使CPU复位,同时八个D触发器的R端为低电平,使Q0-Q7全为1,及初始化Q0-Q7。 先按下R8所对应的按键,再按下R0所对应的按键,实现数码管的复位(即数码管显示为0) 三、软件设计说明 软件设计部分利用EMU8086仿真系统实现汇编语言程序的编写和编译。 系统控制程序采用程序段CODE和数据段DATA两段结构组成。程序段包括段寄存器的初始化、中断向量寻址、IO口设置、MAIN主程序、中断程序ints1以及其中的延时子程序NEXT。主程序的功能是循环等待。当按钮被点击时,就触发了NMI中断,CPU执行中断服务子程序。因为硬件电路中存在时序问题,在未加入延时程序之前,D触发器还未更新Q0-Q7,CPU就已经完成了读写操作,导致数据无法传输,因此增加了延时程序NEXT。等到D触发器更新完Q0-Q7,系统再进行读写操作,输出,显示管显示出数字。 四、调试及运行结果 1.数据的锁存问题 在刚刚开始设计电路的时候,写入数据没有使用74LS373锁存器,导致数码管显示器会因为CPU内部AD0-AD7的改变而改变,无法准确的反应按键的数据。在读取数据的时候数据同样需要锁存,这可以用D触发器实现。D触发器的D脚接高电平,把按键的输出信号作为D触发器的CLK,再把D触发器的Q(一)作为锁存后的按键的输出信号。 2.时序问题 在加入了D触发器之后(未使用延时程序NEXT),发现按一次按键后,数码管不会改变,再按下一次按键后,数码管才会改变。通过设置系统的动画选项,减小每帧的时间,观察到:在D触发器还未更新Q0-Q7的数据之前,系统已经完成了读写操作。我通过改变硬件电路,给NMI中断接受到中断信号前,串联了十二个非门,仍然无法解决此问题,且过多的增加非门,会使硬件电路变得庞大且消耗成本。因此我改变了软件,在系统执行读写操作前,执行延时程序NEXT,语句如下: MOV CX,10000 ;10000→CX NEXT: ;延时程序 MOV DX,PORT0 IN AX,DX LOOP NEXT ; CX-1→CX 令CX从10000开始,执行一次后减1,最后解决了这个时序的问题。 3.运行结果 仿真开始 左下角的74LS245的B端全为1,即Q7-Q0为:0000 0000。显示管显示为0, 按下R1下方的按键 Q1变为0,Q7-Q0为:1111 1101。显示管显示为1 按下R3下方的按键 Q3也变为0,Q7-Q0为:1111 0101。显示管显示为3 五、心得体会 1.运用Proteus 进行 8086处理器的应用仿真让我学到了许多,从硬件电路的设计,到软件的编程,再到调试。只有通过理解和掌握接口芯片的引脚和芯片的端口寻址,才能设计出所需的电路图。这不仅让我加深了对8086处理器的使用、理解,也让我学习并且明白汇编语言的重要性。在一次次实验中提高动手能力,把理论知识转化为实践成果。 2.在仿真运行时,通过单步调试,可以观察到每一条指令执行后的效果,也能直观的观察实时仿真的结果,方便对程序的调试。 3.硬件电路的设计可能会存在时序的问题,如果存在问题,就需要运用所学的知识解决,既可以改变硬件电路的设计,也可以想办法通过软件编程解决。 六、结语 作品实际上就是实现一个锁存的功能,明显用个芯片就能完成的,硬是被我做成这样,为了复杂而复杂。这个作品是我刚开始学习的作品,因此有很多地方做得不好,还希望各位批评指正。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1113浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 05:07 , Processed in 1.027170 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号