用8253和8259中断做电子时钟

更新时间:2023-11-06 13:41:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验报告

开课学院及实验室:

学院 年级、专业、班级 姓名 zhirongguo 学号 成绩 指导 老师 实验课程名称 实验项目名称 一、实验目的 微型计算机原理和接口技术 实验六 电子钟实验 1、进一步掌握8253定时器的使用和编程方法。 2、进一步掌握8259中断控制器的编程方法。 3、进一步掌握数码显示电路的驱动方法。

二、实验器材

计算机,汇编相关程序,WAVE6000实验仿真器

三、实验原理

利用8253定时器、8259中断控制器和实验箱上提供的数码显示电路,设计一个电子时钟。格式如下:XX XX XX 由左向右分别为:时、分、秒

定时器每100us中断一次,在中断服务程序中,对中断次数进行计数,100us计数10000次就是1秒。然后再对秒计数得到分和小时值,并送入显示缓冲区。

四、实验步骤

(1) 在实验箱断电的情况下连好线。 连线 1 2 3 4 5 连接孔1 KEY/LED_CS 8253_CS 8253的GATE1 8253的CLK1 4MHZ 连接孔2 CS0 CS4 +5V 1MHZ Fin

连线 6 7 8 9 10 连接孔1 8253的OUT1 8259_CS 右8259的INT 右8259的SP/EN 连接孔2 右8259的IR0 CS5 8088的INTR (在CPU的左侧) +5V

(2) 输入自编程序并检查,保存程序。 (3) 调试程序。

(4) 记录实验结果及分析。

五、实验参考程序、框图 开始 置定时器模式及常数 设置初始常数 启动定时器 读取小时值 转换成显示数据 显示数据送缓冲 读取分钟值 转换成显示数据 显示数据送缓冲 读取秒值 转换成显示数据 显示数据送缓冲 调用显示子程序 主程序框图 CONTROL equ 0c003h COUNT0 equ 0c000h COUNT1 equ 0c001h COUNT2 equ 0c002h md8255 equ 82h ; 8255 工作方式 PA8255 equ 8000h ; 8255 PA口输出地址

中断入口 保护现场 10000次计数值减1 否 计数值为0 是 设置下次10000次计数值 秒值加1 到60秒 否 是 秒值清0,分钟加1 否 到60分钟 分值清0,小时加1 否 到24小时 小时值清0 恢复现场 中断返回 100us定时中断服务程序 CTL8255 equ 8003h ; ICW4 8255 控制口地址 ICW2 equ 00100000b OUTBIT equ 08002h ; 位控制中断号为20H 口 ICW4 equ 00000001b OUTSEG equ 08004h ; 段控工作在8086/88 方式 制口 OCW1 equ 11111110b ICW1 equ 00010011b ; 只响应INT0 中断 单片8259, 上升沿中断, 要写CS8259A equ 0d000h ; ; ; ;

8259地址

CS8259B equ 0d001h data segment CNT db 0

LEDBuf db 6 dup(?) ; 显示缓冲

Num db 1 dup(?) ; 显示的数据

DelayT db 1 dup(?) Hour db 0 Minute db 0 Second db 0

LEDMAP: ; 八段管显示码

db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h

db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h data ends code segment

assume cs:code, ds: data Delay proc near

push ax ; 延时子程序

push cx mov al, 0 mov cx,ax loop $ pop cx pop ax ret Delay endp DisplayLED proc near

mov bx, offset LEDBuf mov cl, 6 ; 共6个八段管

mov ah, 00100000b ; 从左边开始显示 DLoop:

mov dx, OUTBIT mov al, 0

out dx,al ; 关所有八段管

mov al, [bx]

mov dx, OUTSEG out dx,al mov dx, OUTBIT mov al, ah

out dx, al ; 显示一位八段管 push ax mov ah, 1 call Delay pop ax shr ah, 1 inc bx dec cl jnz DLoop mov dx, OUTBIT mov al, 0

out dx,al ; 关所有八段管 ret DisplayLED endp IEnter proc near push ax push dx inc Second mov al, Second cmp al, 60 jne Exit mov Second, 0 inc Minute mov al, Minute cmp al, 60 jne Exit mov Minute, 0 inc Hour mov al, Hour cmp al, 24 jne Exit mov Hour, 0 Exit:

mov dx, CS8259A mov al, 20h ; 中断服务程序结束指令 out dx, al pop dx

pop ax iret IEnter endp IInit proc

mov dx, CS8259A mov al, ICW1 out dx, al mov dx, CS8259B mov al, ICW2 out dx, al mov al, ICW4 out dx, al mov al, OCW1 out dx, al ret IInit endp start proc near mov ax, data mov ds, ax mov Hour, 0 mov Minute, 0 mov Second, 0 cli

mov ax, 0 mov ds, ax mov al, 76h;

01110110B ; 计数器1,16位,方式3,二进制

mov dx, CONTROL out dx, al mov ax, 62500 mov dx, COUNT1 out dx,

al ; 计数器低字节 mov al, ah out dx,

al ; 计数器高字节 mov al, MD8255 mov dx, CTL8255 out dx, al mov bx,

4*ICW2 ; 中断号 mov ax, code shl ax,

4 ; x 16

add ax, offset IEnter ; 中断入口地址(段地址为0) mov [bx], ax mov ax, 0 inc bx inc bx mov [bx],

ax ; 代码段地址为0 call IInit mov ax, data mov ds, ax mov CNT,

0 ; 计数值初始为0

mov al, CNT mov dx, PA8255 out dx, al sti

LP: ; 等待中断,并计数。 mov al, Hour mov ah, 0 mov cl, 10 div cl mov ch, ah mov ah, 0 mov bx, offset

LEDMAP

add bx, ax mov al, [bx] mov LEDBuf, al mov bx, offset LEDMAP

mov al, ch mov ah, 0 add bx, ax mov al, [bx] or al, 80h mov LEDBuf+1, al mov al, Minute mov ah, 0 mov cl, 10 div cl mov ch, ah mov ah, 0 mov bx, offset LEDMAP

add bx, ax mov al, [bx] mov LEDBuf+2, al mov bx, offset LEDMAP

mov al, ch mov ah, 0 add bx, ax

mov al, [bx] or al, 80h mov LEDBuf+3, al mov al, Second mov ah, 0 mov cl, 10 div cl mov ch, ah mov ah, 0 mov bx, offset LEDMAP

add bx, ax mov al, [bx] mov LEDBuf+4, al mov bx, offset LEDMAP

mov al, ch mov ah, 0 add bx, ax mov al, [bx] or al, 80h mov LEDBuf+5, al call DisplayLED jmp LP start endp code ends end start

六、实验结果分析

1. 写出实验现象及原因。

实验现象:显示屏亮,刚开始可以看到八段管的第六个管开始显示数字,计时开始,每秒加1,实现了时钟效果。

现象的原因分析:程序写入控制字与计数初值后,定时器启动工作,当计数器减到1时,输出端输出一个CLK周期的低电平,向CPU申请中断,当达到100次时,则输出端输出1s,向CPU申请中断,其中一个数码管显示,当计数到60s时,输出端向CPU申请中断,由另一数码管显示1min,同理由数码管显示1h,CPU处理,使数码管的显示发生变化。电子时钟的显示格式HH:MM:SS由左到右分别为时、分、秒,依次对秒、分、小时寄存器的内容加一时,六个数码管动态显示时、分、秒的当前值。最大记时59:59:59超过这个时间时分秒位都清零从00:00:00重新开始。 2. 如何调整输出周期,使其2秒输出一次? 修改start段的mov ax,62500为mov ax,125000,修改后理论上是可以实现2秒输出一次,但是实际上并不可以。因为ax储存的十六进制数只是由16个二进制数组成的,62500(10)=1111010000100100(2),而12500(10)=11000011010100(2)超过了其储存范围,所以是不可以实现的。 此程序最多可以每隔1111111111111111(2)=65535(10),即1.04856秒输出。

本文来源:https://www.bwwdw.com/article/grp2.html

Top