微机原理综合实验:电子钟实验要求8253每1s产生中断请求给8259,中断服务程序利用8255控制数码管,构建一个电子钟。
一、实验原理(相关芯片大致介绍)1.82548254 是Intel 公司生产的可编程间隔定时器,是8253 的改进型,比8253 具有更优良的性能。
8254 具有以下基本功能:(1)有3 个独立的16 位计数器。
(2)每个计数器可按二进制或十进制(BCD)计数。
(3)每个计数器可编程工作于6 种不同工作方式。
(4)8254 每个计数器允许的最高计数频率为10MHz(8253 为2MHz)。
(5)8254 有读回命令(8253 没有),除了可以读出当前计数单元的内容外,还可以读出状态寄存器的内容。
(6)计数脉冲可以是有规律的时钟信号,也可以是随机信号。
计数初值公式为:n=fCLKi÷fOUTi、其中fCLKi是输入时钟脉冲的频率,fOUTi是输出波形的频率。
2.8259Intel公司专为控制优先级中断而设计开发的芯片,包括中断源优先级排队、辨别中断源以及提供中断矢量的电路,无需附加任何电路,用户只需对8259 进行编程,就可以管理8 级中断,并选择优先模式和中断请求方式。
同时,在不需增加其他电路的情况下,通过多片8259 的级连,能构成多达64 级的矢量中断系统。
管理功能包括:1)记录各级中断源请求,2)判别优先级,确定是否响应和响应哪一级中断,3)响应中断时,向CPU 传送中断类型号。
3.8255并行接口是以数据的字节为单位与I/O 设备或被控制对象之间传递信息。
CPU 和接口之间的数据传送总是并行的,即可以同时传递8 位、16 位或32 位等。
8255 可编程外围接口芯片是Intel 公司生产的通用并行I/O 接口芯片,它具有A、B、C 三个并行接口,用+5V 单电源供电,能在以下三种方式下工作:方式0--基本输入/输出方式、方式1--选通输入/输出方式、方式2--双向选通工作方式。
二、设计方案①:初始化各芯片,选定工作方式。
②:使用功能调用获取当前时间,作为初值装入。
③:8254芯片开始计数,每隔1s产生一个中断信号。
④:8259芯片接受到中断信号,并传给cpu,cpu响应中断。
⑤:返回到③循环执行。
⑥:添加子程序,判断当有按键按下时,终止计时。
三、接线设计8255 PA0~PA7,PB0~PB7……………………数码管显示8259IQ1……………………8253OUT18.432KHZ……………………853CLK+5V……………………8253GATE四、源代码CS0 EQU 3000H ;片选CS0对应的端口始地址CS2 EQU 3040H ;片选CS2对应的端口始地址MY8255_A EQU CS0+00H ;8255的A口地址MY8255_B EQU CS0+01H ;8255的B口地址MY8255_C EQU CS0+02H ;8255的C口地址MY8255_MODE EQU CS0+03H ;8255的控制寄存器地址MY8254_COUNT0 EQU CS2+00H ;8254计数器0端口地址MY8254_MODE EQU CS2+03H ;8254控制寄存器端口地址IRQ_IVADD EQU 01C8H ;IRQ10对应的中断矢量地址IRQ_OCW1 EQU 0A1H ;IRQ10对应PC机内部8259的OCW1地址IRQ_OCW2 EQU 0A0H ;IRQ10对应PC机内部8259的OCW2地址IRQ_IM EQU 0FBH ;IRQ10对应的中断屏蔽字STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENTCS_CHUSHI DW ?;保存IRQ10原中断处理程序入口段地址的变量IP_CHUSHI DW ?;保存IRQ10原中断处理程序入口偏移地址的变量IM_CHUSHI DB ?;保存IRQ10原中断屏蔽字的变量HOUR DB 0MINUTE DB 0SECOND DB 0DTABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDATA ENDS ;键值表,0~F对应的7段数码管的段位值CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXCLI ;清除中断标志位MOV AX,0000H ;替换IRQ10的中断矢量MOV ES,AXMOV DI,IRQ_IVADDMOV AX,ES:[DI]MOV IP_CHUSHI,AX ;保存IRQ10原中断处理程序入口偏移地址MOV AX,OFFSET MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址ADD DI,2MOV AX,ES:[DI]MOV CS_CHUSHI,AX ;保存IRQ10原中断处理程序入口段地址MOV AX,SEG MYISRMOV ES:[DI],AX ;设置当前中断处理程序入口段地址MOV DX,IRQ_OCW1 ;设置中断屏蔽寄存器,打开IRQ10的屏蔽位IN AL,DXMOV IM_CHUSHI,AL ;保存IRQ10原中断屏蔽字AND AL,IRQ_IMOUT DX,ALMOV AH,2CH ;获取现在的时间INT 21HMOV second,DHMOV MINUTE,CLMOV HOUR,CHSTIMOV SI,3000H ;建立缓冲区,存放要显示的键值MOV AL,00H ;先初始化键值为0MOV [SI],ALMOV [SI+1],ALMOV [SI+2],ALMOV [SI+3],ALMOV [SI+4],ALMOV [SI+5],ALMOV DI,3005HMOV DX,MY8255_MODE ;初始化8255工作方式MOV AL,81H ;方式0,A口、B口输出,C口低4位输入OUT DX,ALMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,34H ;计数器0,方式2OUT DX,ALMOV DX,MY8254_COUNT0 ;装入计数初值MOV AL,0FFHOUT DX,ALMOV AL,0FFH ;18432分频OUT DX,ALBEGIN: CALL DIS ;显示刷新CALL CLEAR ;清屏CALL GETTIME ;有键按下则跳置GETKEY1MOV AH,1 ;判断PC键盘是否有按键按下INT 16HJZ BEGIN ;无按键则跳回继续循环,有则退出QUIT: CLIMOV AX,0000H ;恢复IRQ10原中断矢量MOV ES,AXMOV DI,IRQ_IVADDMOV AX,IP_CHUSHI ;恢复IRQ10原中断处理程序入口偏移地址 MOV ES:[DI],AXADD DI,2MOV AX,CS_CHUSHI ;恢复IRQ10原中断处理程序入口段地址 MOV ES:[DI],AXMOV DX,IRQ_OCW1 ;恢复IRQ10原中断屏蔽寄存器的屏蔽字 MOV AL,IM_CHUSHIOUT DX,ALSTIMOV DX,MY8254_MODE ;退出时8254为方式2,OUT0置0MOV AL,10HOUT DX,ALMOV AX,4C00HINT 21HGETTIME PROC NEARCALL DIS ;显示刷新CALL DELAYCALL DELAYCALL CLEAR ;清屏MOV AL,HOURMOV AH,0MOV CL,10DIV CLMOV SI,3005HMOV [SI],ALDEC SIMOV [SI],AHMOV AL,MINUTEMOV AH,0MOV CL,10DIV CLDEC SIMOV [SI],ALDEC SIMOV [SI],AHMOV AL,SECONDMOV AH,0MOV CL,10DIV CLDEC SIMOV [SI],ALDEC SIMOV [SI],AHRETGETTIME ENDPMYISR PROC NEAR ;中断处理程序MYISRPUSH AXPUSH DXMOV AX,DATAMOV DS,AXINC SECOND ;秒加1MOV AL,SECONDCMP AL,60 ;秒数与60比较JNE OVERMOV SECOND,0 ;秒清零INC MINUTE ;分加1MOV AL,MINUTECMP AL,60 ;分数与60比较JNE OVERMOV MINUTE,0 ;分清零INC HOUR ;时加1MOV AL,HOURCMP AL,60 ;时数与24比较JNE OVERMOV HOUR,0 ;时清零OVER: MOV DX,IRQ_OCW2 ;向PC机内部8259发送中断结束命令MOV AL,20HOUT DX,ALMOV AL,20HOUT 20H,ALPOP DXPOP AXIRETMYISR ENDPCLEAR PROC NEAR ;清除数码管显示子程序MOV DX,MY8255_B ;段位置0即可清除数码管显示MOV AL,00HOUT DX,ALRETCLEAR ENDPDIS PROC NEAR ;显示子程序PUSH AX ;以缓冲区存放的值为键值表偏移找到值并显示MOV SI,3000HMOV DL,0DFHMOV AL,DLAGAIN: PUSH DXMOV DX,MY8255_AOUT DX,AL ;设置X1~X6,选通一个数码管MOV AL,[SI] ;取出缓冲区中存放的值MOV BX,OFFSET DTABLEAND AX,00FFHADD BX,AXMOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值MOV DX,MY8255_BOUT DX,AL ;写入数码管A~DpCALL DELAYINC SI ;取下一个值POP DXMOV AL,DLTEST AL,01H ;判断是否显示完?JZ OUT1 ;显示完,返回ROR AL,1MOV DL,ALJMP AGAIN ;未显示完,跳回继续OUT1: POP AXRETDIS ENDPPUTBUF PROC NEAR ;保存键值子程序MOV SI,DIMOV [SI],ALDEC DICMP DI,2FFFHJNZ GOBACKMOV DI,3005HGOBACK: RETPUTBUF ENDPDELAY PROC NEAR ;软件延时子程序PUSH CXMOV CX,0FFHD1: MOV AX,0FFFHD2: DEC AXJNZ D2LOOP D1POP CXRETDELAY ENDPCODE ENDSEND START五、实验结果电子钟能正确获取当前时间并运行下去,6位数码管分别对应时、分、秒,精准度大致与普通时钟一致,但仍有待改善。