微机原理课程设计报告.docx
《微机原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
![微机原理课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/10/1d3eab52-b02d-442f-98d8-f129c6fa8b29/1d3eab52-b02d-442f-98d8-f129c6fa8b291.gif)
微机原理课程设计报告
江苏大学京江学院
JIANGSUUNIVERSITY
微机原理课程设计
电子钟
学院名称:
京江学院
专业班级:
J计算机1401
学号:
**********
*******
********
2017年1月
一、实验目的
•掌握综合使用基本输入输出设备、通用接口芯片、专用接口芯片的方法;
•掌握实时处理程序的编制和调试方法;
•掌握8253、8259、8255的使用
•掌握小键盘、LED八段式发光二极管和蜂鸣器的使用
二、实验内容
•利用8253的定时功能,产生0.5S的定时中断;
•在F5区的数码管上显示时间格式为“时:
分:
秒”(24小时)
•允许通过键盘的按键设置时钟的初值;
•允许通过键盘的按键控制时钟的启停;
•分秒值为59分55秒时开始报时,每秒钟蜂鸣器鸣叫一声,到整点报时停止。
三、使用的芯片及占用端口地址
•8253芯片:
主要用于产生定时中断,定时时间为0.5S
•端口地址:
0260H~0263H
•8255芯片:
主要用于控制键盘输入和LED数码管输出
•端口地址:
0270H~0273H
•8259芯片:
主要用于产生中断管理
•端口地址:
0250H~0251H
四、硬件连接方案
•键盘的控制——由8255的B口控制;
•LED显示模块——由8255的B口和A口控制;
•时间的精确定时——用8254定时器0产生50ms的中断信号;
•整点报时控制——用8255的某一位信号控制8254的GATE1。
GATE=1时,OUT1信号控制蜂鸣器鸣叫;GATE=0,蜂鸣器停止蜂鸣。
五、设计的系统连接总逻辑图
键盘与LED(F5)
A:
按键的列线
B:
数码管段码
C:
数码管选择脚
D:
按键的行线
蜂鸣器(F8)
Ctrl:
控制接口,0-蜂鸣
8253(C4)
CS:
片选信号,低电平有效;
A0、A1:
地址信号;
8255(D3)
8259(B3)
六、程序模块划分及各模块程序流程图
•主程序模块:
对8254、8259A等芯片进行初始化,设置中断向量,扫描键盘,根据按键值作相应的处理。
流程图参见图
。
•注意:
设置初始时间时要考虑边界,时间的最大值为23:
59:
59,不能超出此范围。
•8254中断服务程序:
刷新一遍数码管,计时时间到一秒,修改当前时间,整点报时。
流程图参见图
七、实验中遇到的问题,解决办法及实验心得体会
这次课程设计有一定的难度,期间遇到了种种困难,卡住了很久,比如在做显示的时候,先要全熄数码管,然后扫描按键,还要很好地控制延时去抖动,这是件挺繁琐的事,另外,按键之后需要给按键一个扫描码,接着转化成字形码,能够识别并在数码管上显示,也花了很多时间,再比如在设置时间的时候,对于延时时间的拿捏也很难,需要在buf缓冲区存放值,修改时,让修改位熄灭,其余位为0,若超出规定位数,则不修改,显示原值。
老师在我完成规定任务后也设下了一个小挑战,将8255的一根接线调换了位置,要求仍正确显示,最后我想出的解决的方法是段位码改共阳极,键盘扫描里修改相应端口,开头输入部分修改8255初始化控制字即可。
这次课程设计对于这门课的认知的提升很有帮助,本来只是理解了理论,对于亲自动手实现还是感到茫然,甚至不相信自己能完成,但是在一步一步实现各个功能模块后,发现点连成了线,线动成面,知识点是能够串联起来的,只要自己愿意动手,愿意思考,没有什么是做不成的,当然期间必然会遇到各种各样的问题,只要肯向老师或同学请教,他们也一定会给你的思维一些启发。
这次的课程设计虽然只是做了一个看似简单的电子钟,但是它几乎涵盖了我们这学期所学的大部分内容,完成这项课程设计必然要深入理解课本上的知识,这就起到了查漏补缺,融会贯通的作用,我想这对日后学习其他硬件方面的知识都是很有益的,也很大程度上激发了我对硬件方面课程的更大热情。
八、源程序清单
.MODELTINY
C0_8253EQU260H;计数器0的端口地址
C1_8253EQU261H;计数器1的端口地址
C2_8253EQU262H;计数器2的端口地址
CTRL_8253EQU263H;控制端口的端口地址
PA_8255EQU270H;端口A的地址
PB_8255EQU271H;端口B的地址
PC_8255EQU272H;端口C的地址
CTRL_8255EQU273H;控制端口的端口地址
EVEN_8259EQU250H
ODD_8259EQU251H
.STACK100
.DATA
BUFFERDB0,0,0,0,0,0;数码上显示的内容
KEYDB0
FLAGDB1
BUFDB0,?
SEG_TABDB03FH,06H,05BH,04FH,66H,6DH,7DH,07H,7FH,6FH;0~9的段码表
SEG_TAB2DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
.CODE
START:
MOVAX,@DATA
MOVDS,AX
MOVES,AX
NOP
MOVAL,30H;00110000B,计数器0,方式0,二进制计数
MOVDX,CTRL_8253
OUTDX,AL
MOVDX,C0_8253
MOVAL,0DH;Fout=1/25ms=40Hz,Fclk=31250Hz,N=Fclk/Fout=31250Hz/40Hz=781,N=781
OUTDX,AL
MOVAL,03H
OUTDX,AL
MOVDX,CTRL_8253
MOVAL,76H;01110110B,计数器1,方式3,二进制计数
OUTDX,AL
MOVDX,C1_8253
MOVAL,12H;31250Hz
OUTDX,AL
MOVAL,7AH
OUTDX,AL
CALLSET_VECTOR;设置中断向量
CALLINIT_8259
MOVAL,11111110B;开放IR0请求的屏蔽位
MOVDX,ODD_8259
OUTDX,AL
L1:
STI
MOVDX,CTRL_8255;8255初始化
MOVAL,80H;10000000B,端口A方式0输出,端口B方式0输出,C输出
OUTDX,AL
LEASI,BUFFER
MOVCX,8
LP:
CALLDIR
LOOPLP
MOVDX,CTRL_8255;8255初始化
MOVAL,82H;10000010B,端口A方式0输出,端口B方式0输入,C输出
OUTDX,AL
L2:
CALLKEYSCAN
JMPL1
JMP$
DIRPROCNEAR
PUSHAX
PUSHBX
PUSHDX
MOVAL,BUFFER[0]
CMPFLAG,0
JNZQ0
CMPKEY,0
JNZQ0
LEABX,SEG_TAB2
JMPW0
Q0:
LEABX,SEG_TAB;BX置为段码表首址
W0:
XLAT;转换成七段码
MOVDX,PA_8255;段码端口
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,7FH;小时的十位
OUTDX,AL
CALLDELAY;延时
MOVAL,BUFFER[1]
CMPFLAG,0
JNZQ1
CMPKEY,1
JNZQ1
LEABX,SEG_TAB2
JMPW1
Q1:
LEABX,SEG_TAB
W1:
XLAT;转换成七段码
MOVDX,PA_8255;段码端口
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,0BFH;小时的个位
OUTDX,AL
CALLDELAY;延时
MOVAL,BUFFER[2]
CMPFLAG,0
JNZQ2
CMPKEY,2
JNZQ2
LEABX,SEG_TAB2
JMPW2
Q2:
LEABX,SEG_TAB
W2:
XLAT;转换成七段码
MOVDX,PA_8255
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,0EFH;分钟的十位
OUTDX,AL
CALLDELAY;延时
MOVAL,BUFFER[3]
CMPFLAG,0
JNZQ3
CMPKEY,3
JNZQ3
LEABX,SEG_TAB2
JMPW3
Q3:
LEABX,SEG_TAB
W3:
XLAT;转换成七段码
MOVDX,PA_8255;段码端口
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,0F7H;分钟的个位
OUTDX,AL
CALLDELAY;延时
MOVAL,BUFFER[4]
CMPFLAG,0
JNZQ4
CMPKEY,4
JNZQ4
LEABX,SEG_TAB2
JMPW4
Q4:
LEABX,SEG_TAB
W4:
XLAT;转换成七段码
MOVDX,PA_8255;段码端口
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,0FDH;秒的十位
OUTDX,AL
CALLDELAY;延时
MOVAL,BUFFER[5]
CMPFLAG,0
JNZQ5
CMPKEY,5
JNZQ5
LEABX,SEG_TAB2
JMPW5
Q5:
LEABX,SEG_TAB
W5:
XLAT;转换成七段码
MOVDX,PA_8255;段码端口
OUTDX,AL
MOVDX,PB_8255;位码端口
MOVAL,0FEH;秒的个位
OUTDX,AL
CALLDELAY;延时
POPDX
POPBX
POPAX
RET
DIRENDP
KEYSCANPROCNEAR
PUSHAX
PUSHCX
PUSHBX
PUSHDX
MOVBL,KEY
MOVDX,PC_8255
MOVAL,11111110B
OUTDX,AL
MOVAH,AL
MOVAL,00H
MOVDX,PB_8255
INAL,DX
CMPAL,0FFH
JZL4
JMPL3
L4:
MOVDX,PC_8255
MOVAL,11111101B
OUTDX,AL
MOVAH,AL
MOVAL,00H
MOVDX,PB_8255
INAL,DX
L3:
CMPFLAG,0
JNZD4
CMPBX,4
JZD1
CMPBX,2
JZD1
CMPBX,0
JZD0
CMPAX,0FDFDH;按键9
JZBUFF9
CMPAX,0FDFEH;按键8
JZBUFF8
CMPAX,0FE7FH;按键7
JZBUFF7
CMPAX,0FEBFH;按键6
JZBUFF6
D1:
CMPAX,0FEDFH;按键5
JZBUFF5
CMPAX,0FEEFH;按键4
JZBUFF4
CMPAX,0FEF7H;按键3
JZBUFF3
D0:
CMPAX,0FEFBH;按键2
JZBUFF2
CMPAX,0FEFDH;按键1
JZBUFF1
CMPAX,0FEFEH;按键0
JZBUFF0
CMPAX,0FD7FH;按键F
JZBUFFF
D4:
CMPAX,0FDFBH;按键A
JZBUFFA
CMPAX,0FDF7H;按键B
JZBUFFB
JMPOUTPUT
BUFF9:
MOVBUFFER[BX],9
JMPOUTPUT
BUFF8:
MOVBUFFER[BX],8
JMPOUTPUT
BUFF7:
MOVBUFFER[BX],7
JMPOUTPUT
BUFF6:
MOVBUFFER[BX],6
JMPOUTPUT
BUFF5:
MOVBUFFER[BX],5
JMPOUTPUT
BUFF4:
MOVBUFFER[BX],4
JMPOUTPUT
BUFF3:
MOVBUFFER[BX],3
JMPOUTPUT
BUFF2:
MOVBUFFER[BX],2
JMPOUTPUT
BUFF1:
MOVBUFFER[BX],1
JMPOUTPUT
BUFF0:
MOVBUFFER[BX],0
JMPOUTPUT
BUFFA:
MOVFLAG,1
JMPOUTPUT
BUFFB:
MOVFLAG,0
JMPOUTPUT
BUFFF:
CMPBUF[0],1
JNZA7
MOVDL,BUF[1]
MOVBL,KEY
MOVBUFFER[BX],DL
MOVBUF[0],0
A7:
CALLDELAY1
CMPBL,0
JZL5
A8:
MOVBL,KEY
CMPBX,5
JNZL5
MOVBX,0
JMPL6
L5:
INCBL
L6:
MOVKEY,BL
OUTPUT:
POPDX
POPCX
POPBX
POPAX
RET
KEYSCANENDP
SET_VECTORPROCNEAR
PUSHAX
PUSHBX
MOVAX,0
MOVES,AX;中断向量表段基址为0000H
MOVBX,40H*4;BX中预置中断向量地止,中断类型号为40H
MOVAX,OFFSETINTRPROC;向量表中低地址存放偏移地址,
MOVES:
[BX],AX
MOVAX,SEGINTRPROC
MOVES:
[BX+2],AX;向量表中高地址存放段基地址
POPBX
POPAX
RET
SET_VECTORENDP
INIT_8259PROCNEAR
PUSHAX
PUSHDX
MOVAL,13H;ICW1:
边沿触发,单片系统,需要ICW4
MOVDX,EVEN_8259
OUTDX,AL
MOVAL,40H;ICW2:
类型号从40H开始
MOVDX,ODD_8259
OUTDX,AL
MOVAL,01H;ICW4:
完全嵌套方式,非缓冲,非自动结束
MOVDX,ODD_8259
OUTDX,AL
POPDX
POPAX
RET
INIT_8259ENDP
INTRPROCPROCFAR
PUSHAX
PUSHBX;保护现场
PUSHDS
PUSHDX
STI
MOVAL,FLAG
CMPAL,1
JNZD5
CALLCHANGE
D5:
MOVAL,30H
MOVDX,CTRL_8253
OUTDX,AL
MOVDX,C0_8253
MOVAL,12H;31250Hz
OUTDX,AL
MOVAL,7AH
OUTDX,AL
CLI
MOVAL,20H
MOVDX,EVEN_8259;发送EOI命令
OUTDX,AL
POPDX
POPDS
POPBX;恢复现场
POPAX
IRET;中断返回
INTRPROCENDP
CHANGEPROCNEAR
PUSHAX
PUSHDX
MOVBL,BUFFER[5]
CMPBL,9
JLL7
MOVBL,0
MOVBUFFER[5],BL
MOVBL,BUFFER[4]
CMPBL,5
JLL9
MOVBL,0
MOVBUFFER[4],BL
MOVBL,BUFFER[3]
CMPBL,9
JLL10
MOVBL,0
MOVBUFFER[3],BL
MOVBL,BUFFER[2]
CMPBL,5
JLL11
MOVBL,0
MOVBUFFER[2],BL
MOVBL,BUFFER[1]
CMPBL,9
JLL12
MOVBL,0
MOVBUFFER[1],BL
MOVBL,BUFFER[0]
CMPBL,2
JLL13
MOVBL,0
MOVBUFFER[0],BL
JMPL8
L7:
INCBL
MOVBUFFER[5],BL
JMPL8
L13:
INCBL
MOVBUFFER[0],BL
JMPL8
L12:
INCBL
MOVBUFFER[1],BL
JMPL8
L11:
INCBL
MOVBUFFER[2],BL
JMPL8
L10:
INCBL
MOVBUFFER[3],BL
JMPL8
L9:
INCBL
MOVBUFFER[4],BL
JMPL8
L8:
POPDX
POPAX
RET
CHANGEENDP
DELAYPROCNEAR
PUSHCX
MOVCX,500
LOOP$
POPCX
RET
DELAYENDP
DELAY1PROCNEAR
PUSHCX
MOVCX,25000
LOOP$
POPCX
RET
DELAY1ENDP
DELAY2PROCNEAR
PUSHCX
MOVCX,50
LOOP$
POPCX
RET
DELAY2ENDP
ENDSTART