电子钟计算机接口实验.docx
《电子钟计算机接口实验.docx》由会员分享,可在线阅读,更多相关《电子钟计算机接口实验.docx(31页珍藏版)》请在冰豆网上搜索。
![电子钟计算机接口实验.docx](https://file1.bdocx.com/fileroot1/2023-2/25/14eccc15-cb82-4973-8b1b-fe12edf038fe/14eccc15-cb82-4973-8b1b-fe12edf038fe1.gif)
电子钟计算机接口实验
微机原理与接口技术课程设计报告
姓名:
班级:
专业:
指导教师:
2012年6月
目录
一、设计题目3
二、题目要求3
三、设计原理3
1、8259A中断控制器3
2、8254定时/计数器5
3、8255可编程芯片6
4、七段数码管7
四、设计思路8
1、电子钟基本功能的实现8
2、电子钟按键功能的实现9
3、显示的实现10
五、设计电路原理图10
六、流程图11
1、主程序流程11
2、中断处理程序流程12
3、键盘扫描程序流程13
七、程序清单(包括必要的注释)14
八、设计最后实现的功能及结果21
九、设计过程中的问题及解决方案22
十、心得体会22
附录一TD-PIT-B实验系统的硬件环境22
一、设计题目
电子钟
二、题目要求
设计一电子时钟,能在数码管上显示时间并计时。
根据题目和所用的接口电路芯片设计出完整的接口电路,并在实验系统上完成电路的连接和调试通过.
由8254定时,数码管显示时间,小键盘控制计时:
图2-1
1键(清除)显示初值00、00
2键(启动)电子钟计时
3键(停止)电子钟停止计时
4键(终止程序)熄灭数码管,程序退出
5键(设置初始值)设置分、秒值。
同时具有判断错误的能力,若输入有错,则显示错误提示,此时按5可从输入预置值。
前期完成的实验有:
8259A中断控制器实验,8254定时计数器实验,8255并行接口实验,LED数码管测试实验。
三、设计原理
本系统是利用8254定时/计数器产生的固定频率的脉冲作为8255可编程芯片的中断信号,来控制数码管的显示及小键盘的按键处理,从而实现电子钟的计时、按键控制等功能。
1、8259A中断控制器
8259A中断控制器将中断源优先级排队、辨别中断源以及提供中断向量的电路于一片中,因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设置。
同时,在不需增加其他电路的情况下,通过多片8259A的级连,能构成多达64级的矢量中断系统。
8259A的内部结构和管脚如图3-1所示。
3-1
●8259A的中断过程,即微机系统响应可屏蔽中断的过程
(1)将加到引脚IR0~IR7上的中断请求寄存到中断请求寄存器中。
(2)在中断屏蔽寄存器的管理下,没有被屏蔽的中断请求被送到优先权电路判优。
(3)选中当前级别最高的中断源,然后从引脚INT向CPU发出中断请求信号。
(4)CPU满足一定的条件后,向8259A发出两个中断响应信号(负脉冲):
1)8259A从引脚INTA收到第1个中断响应信号之后,立即使中断服务寄存器中与被选中的中断源对应的那一位置1,同时把中断请求寄存器中的相应位清0。
2)从引脚INTA收到第2个中断响应信号之后,8259A把选中的中断源类型码n通过数据线送往CPU。
(5)在实模式下,CPU从4×n~4×n+3单元取出该中断源的中断向量→IP,CS,从而引导CPU执行该中断源的中断服务程序。
●8259A编程
(1)初始化编程
提供了4个(ICW1~ICW4)初始化命令字,写入命令寄存器组后,就建立了8259A的基本工作方式。
系统8259A的初始化编程在微机启动时,由BIOS自动完成。
用户不需再对其初始化,更改它的初始化设置。
BIOS对系统8259A初始化为:
中断触发方式采用边沿触发。
中断屏蔽方式采用常规屏蔽方式。
中断优先级的管理采用完全嵌套即固定优先级方式。
IR0的请求级别最高,IR7的请求级别最低。
中断结束,采用常规结束方式。
(2)操作方式编程
将操作命令字OCW1~OCW3写入操作命令寄存器组,对中断处理过程实现动态控制。
OCW1~OCW3各命令格式如图3-2所示。
OCW1——写中断屏蔽字(对奇地址操作)
某位Mi为1,表示对应的中断源IRQi被屏蔽;Mi为0,IRQi被开放。
OCW2——写中断方式命令字(对偶地址操作)
设置优先级是否进行循环,循环的方式及中断结束的方式。
OCW3——(对偶地址操作)
用来设置特殊屏蔽方式、查询方式
用来读8259A的中断请求寄存器IRR,中断服务寄存器ISR、中断屏蔽寄存器IMR的当前状态。
3-2
2、8254定时/计数器
8254是Intel公司生产的可编程间隔定时器。
是8253的改进型,比8253具有更优良的性能。
●8254具有以下基本功能:
(1)有3个独立的16位计数通道;
(2)每个计数器可按二进制或十进制(BCD)计数;
(3)每个计数器可编程工作在6种不同工作方式;
(4)每个计数器允许的最高计数频率为10MNZ(8253为2MHZ);
(5)有读回命令(8253没有),可以读出当前计数单元的内容和状态寄存器内容;
图3-3
图3-3是8254的内部结构框图和管脚图。
它是由与CPU的接口、内部控制电路和三个计数器组成。
●8254的工作方式:
方式0——计数结束输出正跃变信号(可作为中断请求信号),
方式1——单脉冲发生器(形成负脉冲,宽度=N×CLK脉冲周期)
方式2——分频器(输出固定频率的脉冲)
方式3——方波发生器
方式4——软件触发的单脉冲发生器(输出负脉冲,宽度为一个CLK周期)
方式5——硬件触发的单脉冲发生器(输出负脉冲,宽度为一个CLK周期)
●8254的方式控制字格式,如图3-4:
图3-4
3、8255可编程芯片
8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,具有A、B、C三个并行接口,用+5V单电源供电,其内部结构及管脚,如图3-5:
图3-5
●8255的工作方式:
方式0——基本输入/输出方式,其工作特点为:
1)即为无条件输入/输出方式,端口与外设之间不需要联络信号。
2)A口、B口、C口可由控制字规定为输入/输出。
方式1——选通型输入/输出方式
方式2——双向选通方式
●8255工作方式控制字和C口按位置位/复位控制字格式如图3-6所示:
图3-6
4、七段数码管
数码的显示方式中最常应用的是分段式,主要器件是七段发光二极管(LED)显示器。
它可以分为两种,一种是共阳极显示器(发光二极管的阳极都接在一个公共点上),另一种是共阴极显示器(发光二极管的阴极都接在一个公共点上,使用时公共点接地)。
我们的电子钟是由4个“七段数码管”排列组成,分别显示对应数字,如“00.00”。
七段数码管a、b、c、d、e、f、g如图3-7所示:
图3-7
当显示“1”时b、c段亮,“2”时a、b、g、e、d亮,依次推导。
下面是数码转换图3-8,其中包括七段码中共阴部分对应关系。
汇编中显示0、1、2、3、4、5、6、7、8、9对应编码依次是3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H。
3-8
四、设计思路
本系统所要完成的是电子钟的计时等功能,其中最基本的就是实现计时功能,并把相应的数值送到数码管上显示出来。
1、电子钟基本功能的实现:
在本系统中,用到的8254的功能只是相当于一个定时计,采用计数器0,工作于方式2,使8254的OUT0端输出周期性的负脉冲信号。
我们给定时器输入10KHz频率的脉冲,这样每隔一秒就会在OUT0端产生0到1的跃变,作为中断IRQ的请求信号。
当然,时钟的计数也有其特定的规则,那就是秒、分的个位逢十进一,十位逢六进一,所以,我们可以通过中断处理程序来控制其进位。
这样我们便完成了计时功能。
然而,如果仅仅将计时得到的相应数据送入数码管,我们会发现,四个数码管同时显示,无法完成其时钟的显示功能。
但是,我们知道,四个数码管的亮灭与小键盘X1,X2,X3,X4各列是否为低电平是相对应的(即:
X1,X2,X3,X4依次对应从左到右的四个数码管,若X1为低电平,则数码管1亮;若X2为低电平,则数码管2亮;•••),于是,我们就可以将低电平输出到相应的键盘上,来实现对应数码管的显示。
通过以上分析,我们可以用四位二进制码分别对应表示X4X3X2X1的逻辑值(1--高电平,0--低电平),这样要实现时钟的显示功能,便可以按照以下方法来进行:
首先将秒的个位数据通过8255的B端口送给数码管,同时将二进制码“0111”通过8255的A端口送给小键盘X4X3X2X1,这样通过计算机的扫描后,就会在数码管4上显示秒的个位值;接着将秒的十位数据送给数码管,同时将二进制码“1011”送给小键盘X4X3X2X1,这样就会在数码管3上显示相应的数值;同样的道理,分别将分的个位、十位送给数码管,“1101”、“1110”送给小键盘X4X3X2X1,就会依次在数码管2、1上显示分的个位、十位数值。
另外,必须注意的一点就是,显示的时间应该是:
XX.XX,中间的一点显示在分的个位上,也就是说在数码管2上显示那一点,以区分分与秒。
所以,我们将显示分个位的数码管的二进制码最高位置“1”,其他数码管置“0”,便达到了显示点的功能。
从上面的方法我们可以看出,电子钟分秒各位的显示并不是同时进行的,而是按顺序依次循环显示的,它利用的就是人的视觉暂留现象来欺骗人们的眼睛,造成一种“四位数值同时显示”的假象。
2、电子钟按键功能的实现:
观察小键盘,我们会发现它其实有两行(对应Y1、Y2)四列(对应X1、X2、X3、X4)共八个键,前面我们在实现时钟的显示功能时,就是分别将相应的二进制编码送到小键盘,来实现对应数码管的显示。
其实,它是一个循环扫描的过程,当它扫描到对应的X列为低电平时就显示相应的数码管,同时把Y1、Y2的逻辑值读回。
所以,我们就可以利用这点,仅仅判断Y1、Y2的逻辑值就可以辨别究竟按下了哪个键,并通过相应的编程来完成不同键的按键功能。
具体实现过程是这样的,我们将Y1、Y2的逻辑值送到8255的C端口,通过清零仅留下最低两位来实现Y2Y1的逻辑值判别。
假如Y2Y1的逻辑值是“01”,说明是Y2行的键被按下,假如是“10”,则Y1行的键被按下。
在判别了哪行键被按下后,我们将X4X3X2X1列的逻辑值前面增加一位作为按键的二进制编码,就可以用来判别究竟是哪个键被按下了,其中“0”---Y1行,“1”---Y2行。
我们按照从左到右、从上到下的顺序将小键盘的各键定义为1-8键,具体编码如下:
1-4键在Y1行:
01110 01101 01011 00111
5-8键在Y2行:
11110 11101 11011 10111
●1键清除功能的设置:
在判别了按键的逻辑值为01110后,将存储时间的每一个内存单元赋0,这样在数码管显示的就是00.00,便达到了清除功能的目的。
●2键启动、3键停止计时功能的设置:
在进行2键和3键功能设置之前,我们必须定义一个暂停标志位:
PAUSE,它用标准的逻辑值(0、1)来表示,假如PAUSE=0,在进行计时设置的时候,让其自动加1,依次显示时间的各位;假如PAUSE=1,我们就将其返回,停止加1,即暂停计时。
接着,假如我们判别的是2键被按下,就令PAUSE=0,让计数器计时,自动加1;假如我们按下的是3键,就令PAUSE=1,让计数器暂停计时,即停止加1。
●4键终止程序功能的设置:
从上面的分析,我们已经知道,只有同时将对应键盘X列的低电平送到相应的数码管才会使得数码管亮,所以我们在判别了是4键被按下后,只要将键盘对应的二进制码全部赋高电平,并送到数码管,同时结束程序,就可以实现熄灭数码管、退出程序的功能。
●5键重置初始值功能的设置:
在这里我们设置了两个标志位:
调整位标志ADJUST和闪烁标志FLASH。
它们的具体设置如下:
ADJUST初始设置为00H,表示非调整状态,01H表示调整秒的个位,02H表示调整秒的十位,03H表示调整分的个位,04H表示调整分的十位。
FLASH设置为逻辑值,初始设置为00H,表示非闪烁状态,0FFH表示闪烁,其闪烁功能实现的过程为:
假如FLASH=0FFH,则将00H送给数码管,让数码管不显示。
然后,在中断计时程序里面,加入FLASH取反语句,由于计时程序每秒加1循环一次,这样FLASH也实现了每秒改变逻辑值一次。
也就是说,数码管闪烁的周期是1秒。
当然,闪烁标志位只是在有对应位需要调整的时候才用的着。
要实现5键设置初始时间的功能,我们就必须增加一个键(6键)来控制时间的增加。
●6键时间位加1功能的设置
这里,我们再引进一个标志位:
按键标志KEYMARK。
其设置为逻辑值,初始设置为0,表示允许响应此次按键,并在响应过后,将其置1;KEMARK为1时,表示不响应此次按键。
之所以要设置此标志位,是因为键盘扫描的速度非常快,假如我按下6键需要调整时间加1,我按下的时间再怎么短,计算机一定已经扫描了无数次,这样一来,我只按了一次,时间位就会响应无数次,实现了无数次的加1,从而无法实现6键的功能。
3、显示的实现:
使用8259控制,用数码管的显示功能来设计,显示部分用四只LED为显示管,这些LED发光二极管的阴极是互相连接在一起的,所以称为共阴极数码管。
通过在这八只发光二极管的阳极加+5V或0V的电压使不同的二极管发光,形成不同的字符和数字。
电子时钟用到的是0-9十个数字,它们所对应的字符表依次是3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、6FH。
五、设计电路原理图
系统的连线图主要由五个部分构成。
8259中断控制器、8255并口控制器、8254定时计数器、键盘及数码管显示单元、开关及LED显示单元构成。
如图5-1所示:
图5-1
六、流程图
1、主程序流程(图5-2):
主程序的流程图是对整个程序的逻辑的图象表示。
首先是设置8254、8255、8259的各个端口地址。
接着初始化各个芯片,开始计时,并通过8259中断控制时间的正确显示。
在整个过程中都在检测是否有铵键响应。
有则停止,没有则返回继续执行。
如图5-2。
图5-2
2、中断处理程序流程(图5-3):
图5-3
3、键盘扫描程序流程(图5-4):
图5-4
七、程序清单(包括必要的注释)
INTCSR_BYTE0EQU0D838H;设置PC机内部8259的端口地址
INTCSR_BYTE1EQU0D839H
INTCSR_BYTE2EQU0D83AH
INTCSR_BYTE3EQU0D83BH
IMB4_BYTE3EQU0D81FH
MY8254_COUNT0EQU0E040H;8254计数器0端口地址
MY8254_COUNT1EQU0E041H;8254计数器1端口地址
MY8254_COUNT2EQU0E042H;8254计数器2端口地址
MY8254_MODEEQU0E043H;8254控制寄存器端口地址
MY8255_AEQU0E060H;8255的A口地址
MY8255_BEQU0E061H;8255的B口地址
MY8255_CEQU0E062H;8255的C口地址
MY8255_MODEEQU0E063H;8255的控制寄存器地址
IRQEQU01CCH
DATASEGMENT
CSBAKDW?
;保存INTR原中断处理程序入口段地址的变量
IPBAKDW?
;保存INTR原中断处理程序入口偏移地址的变量
MKBAKDB?
;保存INTR原中断屏蔽字的变量
ADJUSTDB00H;调整位标志
FLASHDB00H;闪烁标志位
PAUSEDB0B;暂停标志位
KEYMARKDB0B;按键标志位
INKEYDB00H;按键
SECONDADB00H;秒个位
SECONDBDB00H;秒十位
MINUTEADB00H;分个位
MINUTEBDB00H;分十位
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;数码管显示“0-9”编码
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
CLI
MOVAX,DATA
MOVDS,AX
MOVDX,INTCSR_BYTE0;初始化PCI卡中断控制寄存器
MOVAL,00H;向PCI卡中断控制寄存器中写入003F1F00H
OUTDX,AL
MOVDX,INTCSR_BYTE1
MOVAL,1FH
OUTDX,AL
MOVDX,INTCSR_BYTE2
MOVAL,3FH
OUTDX,AL
MOVDX,INTCSR_BYTE3
MOVAL,00H
OUTDX,AL
MOVAX,0000H;替换INTR的中断矢量
MOVES,AX
MOVDI,01CCH
MOVAX,ES:
[DI]
MOVIPBAK,AX;保存INTR原中断处理程序入口偏移地址
MOVAX,OFFSETMYINT
CLD
STOSW
MOVAX,ES:
[DI]
MOVCSBAK,AX
MOVAX,SEGMYINT;设置中断矢量
STOSW
INAL,0A1H
MOVMKBAK,AL
ANDAL,0F7H
OUT0A1H,AL
STI
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,17H
OUTDX,AL
MOVDX,MY8254_COUNT0;装入计数初值
MOVAL,0
OUTDX,AL
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;A口,B口均为方式0,输出;C口:
低四位输入,高四位输出。
其实只用到了最低两位来判断Y1、Y2的逻辑值。
OUTDX,AL
A1:
NOP;等待
MOVCX,32H
A2:
MOVDX,MY8255_B
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETLED
MOVAL,SECONDA
XLATLED
CMPADJUST,01H;是否调整秒的个位
JNEDIS_SECONDA
CMPFLASH,0FFH;是否闪烁
JNEDIS_SECONDA
ANDAL,00H;熄灭数码管
DIS_SECONDA:
OUTDX,AL;显示秒的个位
MOVDX,MY8255_A
MOVAL,0111B
OUTDX,AL
CALLKEYCTR;调用按键处理程序
CALLDELAY;调用延迟程序
MOVDX,MY8255_B
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETLED
MOVAL,SECONDB
XLATLED
CMPADJUST,02H;是否调整秒的十位
JNEDIS_SECONDB
CMPFLASH,0FFH
JNEDIS_SECONDB
ANDAL,00H
DIS_SECONDB:
;显示秒的十位
OUTDX,AL
MOVDX,MY8255_A
MOVAL,1011B
OUTDX,AL
CALLKEYCTR
CALLDELAY
MOVDX,MY8255_B
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETLED
MOVAL,MINUTEA
XLATLED
CMPADJUST,03H;是否调整分的个位
JNEDIS_MINUTEA
CMPFLASH,0FFH
JNEDIS_MINUTEA
ANDAL,00H
DIS_MINUTEA:
ADDAL,80H;显示分的个位
OUTDX,AL;显示“XX.XX”中的“.”
MOVDX,MY8255_A
MOVAL,1101B
OUTDX,AL
CALLKEYCTR
CALLDELAY
MOVDX,MY8255_B
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETLED
MOVAL,MINUTEB
XLATLED
CMPADJUST,04H;是否调整分的十位
JNEDIS_MINUTEB
CMPFLASH,0FFH
JNEDIS_MINUTEB
ANDAL,00H
DIS_MINUTEB:
;显示分的十位
OUTDX,AL
MOVDX,MY8255_A
MOVAL,1110B
OUTDX,AL
CALLKEYCTR
CALLDELAY
LOOPSK1
JMPSK2
SK1:
JMPA2
SK2:
JMPA1
MYINT:
PUSHDS
PUSHAX
PUSHDX
MOVDX,IMB4_BYTE3
INAL,DX
MOVDX,INTCSR_BYTE2
MOVAL,3FH
OUTDX,AL;清8259中断标志
MOVAL,63H;根据中断号修改
OUT0A0H,AL
MOVAL,62H
OUT20H,AL
MOVAX,DATA
MOVDS,AX
NOTFLASH;中断处理程序
MOVKEYMARK,0B
CMPPAUSE,0B
JNEL1
INCSECONDA
CMPSECONDA,0AH;秒的个位与10比较
JCL1
MOVSECONDA,00H;如果大于等于10,则清零
INCSECONDB
CMPSECONDB,06H;秒的十位与6比较
JCL1
MOVSECONDB,00H;秒的十位清零
INCMINUTEA
CMPMINUTEA,0AH
JCL1
INCMINUTEB
MOVMINUTEA,00H
CMPMINUTEB,06H
JCL1
MOVMINUTEB,00H
L1:
POPDS
POPAX
POPDX
IRET
KEYCTRPROCNEAR;键盘扫描子程序
MOVINKEY,AL
MOVDX,MY8255_C
INAL,DX
ANDAL,03H;是否高6位清零
CMPAL,10B;是否按下Y1行
JNEINY2
ADDINKEY,00H
JMPJUDGKEY
INY2:
CMPAL,01B;是否按下Y2行
JNESKIP
ADDINKEY,10000B
JUDGKEY:
CMPINKEY,01110B;是否按下1键
JNEKEY2
ANDSECONDA,00H;时间清零
ANDSECONDB,00H
ANDMINUTEA,00H
ANDMINUTEB,00H
SKIP:
JMPBACK
KE