微机原理实时电子钟实验.docx
《微机原理实时电子钟实验.docx》由会员分享,可在线阅读,更多相关《微机原理实时电子钟实验.docx(17页珍藏版)》请在冰豆网上搜索。
微机原理实时电子钟实验
广州大学学生实验报告
开课学院及实验室:
2013年12月19日
学院
年级、专业、班
姓名
学号
实验课程名称
微机原理实验
成绩
实验项目名称
实时电子钟实验
指导
教师
一、实验要求
利用8253定时器、8259中断控制器和实验箱上提供的数码显示电路,设计一个万年历。
格式如下:
XXXXXX由左向右分别为:
年、月、日
二、实验目的
1、进一步掌握8253定时器的使用和编程方法。
2、进一步掌握8259中断控制器的编程方法。
3、进一步掌握数码显示电路的驱动方法。
三、实验电路及连线
连线
连接孔1
连接孔2
连线
连接孔1
连接孔2
1
KEY/LED_CS
CS0
6
8253的OUT1
右8259的IR0
2
8253_CS
CS4
7
8259_CS
CS5
3
8253的GATE1
+5V
8
右8259的INT
8088的INTR
(在CPU的左侧)
4
8253的CLK1
1MHZ
9
右8259的SP/EN
+5V
5
4MHZ
Fin
10
四、实验说明
定时器每100us中断一次,在中断服务程序中,对中断次数进行计数,100us计数10000次就是1秒(具体要做的是一天)。
然后再对秒(天)计数得到分(月)和小时(年)值,并送入显示缓冲区。
显示子程序模块可参照硬件实验六。
五、实验框图
六、实验步骤
(1)在实验箱断电的情况下连好线。
(2)输入自编程序并检查,保存程序。
(3)调试程序。
(4)记录实验结果及分析。
七、程序
DATASEGMENTAT0USE16
ORG1000H
HOURDW?
MINDW?
SECDW?
STDB?
COUNTDB?
DATAENDS
CODESEGMENTUSE16
ASSUMECS:
CODE,DS:
DATA
ORG1500H
BEG:
JMPSTART
TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,00H;0~F的共阴极七段译码表00H表示不显示任何东西
KEYCODDB0EEH,0DEH,0BEH,0EDH,0DDH,0BDH,0EBH,0DBH,0BBH,0E7H,0D7H,0B7H;行列编码值
KEYVALDB0,1,2,3,4,5,6,7,8,9,0AH,0BH;所有键的键面值
PORT1EQU340H;数码管段选端口
PORT2EQU360H;数码管位选端口,键盘矩阵的行列端口
START:
MOVEAX,60000000H
MOVCR0,EAX
MOVAX,DATA
MOVDS,AX
MOVHOUR,0203H;小时分钟以及秒的初始化
MOVMIN,0509H
MOVSEC,0502H
LEABX,TAB
MOVST,0;开始暂停标志位置0
MOVCOUNT,0;中断次数计数初始值为0
;8255初始化,用于产生报时的脉冲
MOVDX,20FH;利用左四的8255,控制口为20FH
MOVAL,10000000B;C口输出
OUTDX,AL
MOVDX,20BHL;C0输出1,蜂鸣器不响
MOVAL,0FFH
OUTDX,AL
;8254初始化,用于产生周期为25ms的中断
MOVAL,00110110B;计数器0,先低后高,方式三,二进制
MOVDX,32cH;写往控制口
OUTDX,AL
MOVDX,320H;计数器0写初值:
47KHz*25ms
MOVAX,1175
OUTDX,AL
MOVAL,AH
OUTDX,AL
;8259初始化
CLI:
关中断
MOVDX,300H;ICW1
MOVAL,00010011B
OUTDX,AL
MOVDX,308H;ICW2
MOVAL,08H;IR0中断类型号为08H
OUTDX,AL
MOVAL,00000001B;ICW4
OUTDX,AL
MOVAL,0FEH;IR0开屏蔽
OUTDX,AL
XORAX,AX;装载中断向量
MOVES,AX
MOVDI,08H*4
MOVAX,OFFSETINTSR
MOVES:
[DI],AX
MOVAX,SEGINTSR
MOVES:
[DI+2],AX
STI;开中断
JMP$
INTSRPROC;中断服务程序
CMPMIN,0509H;比较当前时间是否在59分55秒~00分00秒之间
JLNEXT1
CMPSEC,0505H
JLNEXT1
MOVDX,20BH
MOVAL,00H;蜂鸣器低有效,报时
OUTDX,AL
JMPNEXT2
NEXT1:
CMPMIN,0
JNENEXT3
CMPSEC,0
JNENEXT3
MOVDX,20BH
MOVAL,00H;蜂鸣器低有效,报时
OUTDX,AL
JMPNEXT2
NEXT3:
MOVDX,20BH
MOVAL,0FFH
OUTDX,AL
NEXT2:
CMPCOUNT,20;用8255产生0.5ms的蜂鸣
JLENEXT4
MOVDX,20BH
MOVAL,0FFH
OUTDX,AL
NEXT4:
CALLKEYCHECK;检测有无键按下
CMPAL,0AH;启停键按下,调用启停程序
JNZNEXT5
CALLTSTART
JMPNEXT6
NEXT5:
CMPAL,0BH;设置键按下,调用设置时间程序
JNZNEXT6
CALLSETTIME
NEXT6:
INCCOUNT;当COUNT直为40时,加一秒,之后置0
CMPCOUNT,40;25ms*40=1s
JBNEXT7
CALLADDONE
MOVCOUNT,0
NEXT7:
CALLSHOW;显示时间
MOVAL,20H;发EOI命令,结束中断
MOVDX,300H
OUTDX,AL
IRET
INTSRENDP
TSTARTPROC;控制暂停和开始
CMPST,00H
JNEL1
DECST
JMPL2
L1:
INCST
L0:
CALLKEYCHECK
CMPAL,0AH
JZL2
CALLSHOW
JMPL0
L2:
RET
TSTARTENDP
ADDONEPROC;加1秒子程序
MOVAX,SEC;当前秒个位为9,加1后变0,十位加1
CMPAL,9
JEN1
INCAL
MOVSEC,AX
JMPN6
N1:
INCAH
MOVAL,0
CMPAH,6;十位加1后为6,则秒变为00,分钟个位加1
JEN2
MOVSEC,AX
JMPN6
N2:
MOVAX,0
MOVSEC,AX
MOVAX,MIN;当前分钟个位为9,加1后变0,十位加1
CMPAL,9
JEN3
INCAL
MOVMIN,AX
JMPN6
N3:
INCAH
MOVAL,0
CMPAH,6;十位加1后为6,则分钟变为00,小时个位加1
JEN4
MOVMIN,AX
JMPN6
N4:
MOVAX,0
MOVMIN,AX
MOVAX,HOUR
INCAL
CMPAX,0204H;小时加1后与24比,相等,则变为0
JEN5
MOVHOUR,AX
JMPN6
N5:
MOVAX,0
MOVHOUR,AX
N6:
RET
ADDONEENDP
SETTIMEPROC;设置时间子程序
LEABX,TAB
MOVHOUR,0
MOVMIN,0
MOVSEC,0
NOP
NOP
L1:
CALLKEYCHECK;调用KEYCHECK,无键按下时,AL中值为0CH
CALLDELAY
CMPAL,0CH
JNZL2
JMPL1
L2:
CMPAL,02H
JGL1;设置小时十位时,将其他各位数码管灭掉及对应的七段译码表0CH
MOVAH,AL
MOVBYTEPTR[HOUR+1],AL
MOVBYTEPTR[HOUR],0CH
MOVMIN,0C0CH
MOVSEC,0C0CH
L3:
CALLSHOW
CALLKEYCHECK;设置小时的个位
CALLDELAY
CMPAL,0CH
JZL3
MOVAH,BYTEPTR[HOUR+1]
L4:
CMPAX,0204H
JGEL1
MOVHOUR,AX
L5:
CALLSHOW
CALLKEYCHECK;设置分钟的十位
CALLDELAY
CMPAL,0CH
JZL5
L6:
CMPAL,06H
JGEL1
MOVAH,AL
MOVBYTEPTR[MIN+1],AL
L7:
CALLSHOW
CALLKEYCHECK;设置分钟的个位
CALLDELAY
CMPAL,0CH
JZL7
MOVAH,BYTEPTR[MIN+1]
L8:
CMPAX,0509H
JGL1
MOVMIN,AX
L9:
CALLSHOW
CALLKEYCHECK;设置秒的十位
CALLDELAY
CMPAL,0CH
JZL9
L10:
CMPAL,06H
JGEL1
MOVAH,AL
MOVBYTEPTR[SEC+1],AL
L11:
CALLSHOW
CALLKEYCHECK;设置秒的个位
CALLDELAY
CMPAL,0CH
JZL11
MOVAH,BYTEPTR[SEC+1]
L12:
CMPAX,0509H
JGL1
MOVSEC,AX
L13:
CALLSHOW
CALLKEYCHECK;再次按键,启动计时
CALLDELAY
CMPAL,0CH
JZL13
RET
SETTIMEENDP
KEYCHECKPROC;判断有无键按下子程序
PUSHBX
CALLCLEAR
MOVDX,PORT2
INAL,DX
ANDAL,0FH
CMPAL,0FH
JZEXIT;有按键按下,延时消抖
NOP
NOP
;再次确认是否有键按下
INAL,DX
ANDAL,0FH
CMPAL,0FH
JZEXIT
;开始对每一列进行逐行扫描
MOVCX,3
MOVBL,0FEH
NEXT:
MOVAL,BL
MOVDX,PORT2
OUTDX,AL
NOP
NOP
INAL,DX
ANDAL,0FH
CMPAL,0FH
JNZKEY
ROLBL,1
LOOPNEXT
JMPEXIT
KEY:
SHLBL,4
ORAL,BL;形成一个字节的键码信息存入AL,高4位为列信息低4位为行信息
LEASI,KEYCOD
LEADI,KEYVAL
MOVCX,12
NEXT11:
CMPAL,[SI]
JZFIND
INCSI
INCDI
LOOPNEXT11
JMPEXIT
FIND:
MOVAL,[DI];AL中内容为所按键的键面值
PUSHAX
NOP
NOP
WAIT1:
INAL,DX;判断按键是否已释放,若无则等待
ANDAL,0FH
CMPAL,0FH
JNZWAIT1
POPAX
JMPEXIT2
EXIT:
MOVAL,0CH
EXIT2:
NOP
POPBX
RET
KEYCHECKENDP
SHOWPROC;显示时间
MOVAX,HOUR
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出小时的个位
MOVAL,0C2H
OUTDX,AL
CALLDELAY
CALLCLEAR
MOVAL,AH
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出小时的十位
MOVAL,0C1H
OUTDX,AL
CALLDELAY
CALLCLEAR
MOVAX,MIN
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出分钟的个位
MOVAL,0C8H
OUTDX,AL
CALLDELAY
CALLCLEAR
MOVAL,AH
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出分钟的十位
MOVAL,0C4H
OUTDX,AL
CALLDELAY
CALLCLEAR
MOVAX,SEC
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出秒的个位
MOVAL,0E0h
OUTDX,AL
CALLDELAY
CALLCLEAR
MOVAL,AH
XLAT
MOVDX,PORT1;段选输出数据
OUTDX,AL
MOVDX,PORT2;位选输出秒的十位
MOVAL,0D0H
OUTDX,AL
CALLDELAY
CALLCLEAR
RET
SHOWENDP
CODEENDS
ENDBEG
DELAYPROC;延时子程序
PUSHCX
MOVCX,1000
LOOP$
POPCX
RET
DELAYENDP
CLEARPROC;使七段译码管全灭子程序
MOVAL,00H
MOVDX,PORT1
OUTDX,AL
MOVDX,PORT2
OUTDX,AL
NOP
NOP
RET
CLEARENDP
五、实验结果
通过这次实验,我们学习了8253定时器的使用和编程方法;通过年月日的实验,使我进一步掌握8259中断控制器的编程方法,以及进一步掌握数码显示电路的驱动方法,但过程中也遇到很多麻烦。