微机原理课设_电子秒表

湖南文理学院芙蓉学院

微机原理课程设计报告

课程名称: 电子秒表

专业班级:

学生学号:

学生姓名:

指导教师:

完成时间:

湖南

目录 文理学院芙蓉学院课程设计报告

目 录

第1章 总体设计方案 .................................................................................................. 1

1.1 课程设计的内容和要求 ................................................................................... 1

1.2 课程设计原理 ................................................................................................... 1

1.3 课程设计思路 ................................................................................................... 2

1.4 设计环境 ........................................................................................................... 2

第2章 详细设计方案 .................................................................................................. 3

2.1 实现方法 ........................................................................................................... 3

2.2 模块的设计与实现 ........................................................................................... 4

2.2.1主程序模块 ................................................................................................... 4

2.2.2初始化模块 ................................................................................................... 5

2.2.3时钟模块 ....................................................................................................... 6

2.2.4秒表模块 ....................................................................................................... 6

2.3 程序连线图 ....................................................................................................... 8

第3章 调试及结果分析 .............................................................................................. 9

3.1 调试步骤及方法 ............................................................................................... 9

3.1.1程序的语法错误 ........................................................................................... 9

3.1.2时钟模块调试过程 ....................................................................................... 9

3.1.3秒表模块调试过程 ..................................................................................... 11

3.2 实验结果 ......................................................................................................... 11

参考文献 ........................................................................................................................ 13

附 录(源程序) ...................................................................................................... 14

第1章 总体设计方案

1.1 课程设计的内容和要求

一、课程设计内容:

设计一个带时间显示的电子秒表,具体内容如下:

1. 电子秒表的初始状态为零,分别显示分、秒、毫秒;

2. 设计一个按钮,按第一次开始计时,按第二次计时暂停,显示当前记录的

时间,按第三次计时停止,回到初始态;

3. 有时间显示的功能,当不用电子秒表的功能时,显示当先的时间,分别为

时、分、秒形式。

二、课程设计要求:

1. 独立完成课程设计任务;

2. 通过老师当场验收;

3. 交出完整的课程设计报告。

1.2 课程设计原理

题目要求实现电子秒表功能和显示当前时间的功能。这两部分的共同点是都需要实现时间显示和时间运行功能。除此之外,电子秒表还需要有开始计时和停止计时功能。因此电子秒表是本次课程设计的主要部分。

在本次设计中主要使用了8255A并行接口芯片,8253定时/计数器,8259A中断控制器,8279键盘/显示芯片。具体原理和功能如下:

1. 利用8255A芯片实现时钟和秒表之间的切换。将其连接到一个开关上,

读取开关的电位,以此来判断是时钟模式还是秒表模式。

2. 利用8253芯片计时。用8253的分频功能使其产生周期为1s和1ms的方

波,分别为时钟和秒表计时。

3. 利用8259A芯片接收中断。中断分为三种类型,分别是一秒一次的时钟

计时中断,一毫秒一次的秒表计时中断和控制秒表开始和停止的中断。

4. 利用8279芯片在数码管上显示当前时间或秒表时间。

1.3 课程设计思路

由于要求实现时钟和秒表两种功能。因此需要设计时钟和秒表两个模式。 时钟模式下,以秒为计时单位,计时功能和显示当前时间功能。秒表模式下,以毫秒为计时单位,有开始、停止和显示计时结果的功能。

首先,将8255A芯片的PC0接口连接到开关。读C端口的值。判断是0还是1。0代表时钟模式,1代表秒表模式。然后,根据判断结果调用相应模式下的显示功能。这样不停地读8255A芯片,然后判断,最后显示。构成一个死循环。若在这个过程中有中断,则会执行中断服务程序。

时间中断由8253芯片产生,周期分别为1s和1ms。时钟的最大时间为23时59分59秒,超过后从零开始重新计时。秒表最大时间为59分59秒999毫秒。当计数大于这个值时,秒表不再更新。

对秒表的控制中断由一个手动脉冲产生。将按键次数保存在名为pad的内存空间中。pad只能有0、1、2三个值,分别代表清零、开始计时和停止计时。

8259芯片接收中断,并调用相应模式下的中断服务程序。在时钟模式下,直接将时间加一秒。在秒表模式下,或清零(重新开始,pad=0),或将时间加一毫秒(开始计时,pad=1),或不做任何处理(停止计时,pad=2)。

要实现以上分析的功能,可以设计4个模块。模块名和作用见表1.1。

表1.1 模块划分及功能描述

1.4 设计环境

硬件环境:AEDK实验箱

软件环境:LCT88EA应用软件、WindowXP操作系统、PC机

第2章 详细设计方案

2.1 实现方法

1. 内存分配

程序中所需定义的内存单元含义如下:

timer0:存放当前时钟的值,共6个字节。时、分、秒各占两个字节;

timer1:存放秒表的计数值,共7个字节。分和秒各占两个字节,毫秒占三个字节;

pad:存放秒表的按键次数,共1个字节。可以有三种取值,0代表清零,1代表开始计时,2代表停止计时。当计数值大于2时,变为0重新开始计数;

tab:存放0~9在数码管上显示的编码,共10个字节。

2. 按键设置

秒表有一个按钮,接手动脉冲和8259A芯片的中断引脚。每次按键,pad都做相应改变。按第一次开始计时(pad=1),按第二次计时暂停(pad=2),显示当前记录的时间,按第三次计时停止(pad=0),回到初始态。

3. 时钟频率选择

CPU的频率为3.072105HZ。用8253芯片产生方波。计数器1的CLK1接CPU时钟脉冲,计数初值为307,使OUT0产生周期为1ms的方波。计数器0的CLK0接OUT1,计数初值为1000,使OUT0产生周期为1s的方波。

4. 中断设置

8259A芯片的中断引脚IR0、IR1、IR2分别接8253芯片的OUT0、OUT1和手动脉冲。

5. 显示设置

显示功能由8279芯片和数码管实现。显示分为两种情况。时钟模式下的显示规则是(时-分-秒),即(00-00-00)。秒表模式下的显示规则是(分-秒.毫秒),即(00-00.000)。

6. 端口地址分配

本次课程设计共使用了4种芯片,他们的端口号设置如表2.1所示。

表2.1 端口地址分配表

7. 子程序 子程序名称和功能如表2.2所示。

表2.2 子函数表

2.2 模块的设计与实现

2.2.1主程序模块

主程序的主要功能是初始化各芯片,模式选择以及调用显示函数。在初始化结束后,程序进入死循环,不断检测8255A芯片C端口的状态,CUP随时响应中断,更新时钟状态,把应显示的结果送入time0和time1中,以备显示。

主程序的流程如图2.1。

图2.1 主程序流程图

2.2.2初始化模块

初始化模块主要用于初始化各芯片,设定芯片工作方式,以及装入中断向量等。各芯片初始化情况如表2.3所示。

表2.3 芯片的初始化

2.2.3时钟模块

时钟模块主要是为了实现时钟的计时和显示功能。时钟的计时功能由int_timer0子程序实现,属于中断服务程序。显示功能由display0程序实现,由主程序调用。

1. int_timer0

这个中断服务程序的中断类型号为30H。8253芯片产生周期为1s的方波,当其上升沿到达8259A芯片的IR0引脚后,进入中断服务程序int_timer0。

进入int_timer0后,首先从内存中读出前一秒的时间的最后一位,即time0的最后一位,然后加1。若有进位,则把当前这一位置零,然后读出前一位再加一,再判断是否有进位。以此类推,直到没有进位或者达到计数最大值为止。把修改后的时间存回内存中,以备显示。

2. display0

这是时钟模式的显示程序。在时钟模式下会反复被主程序调用。首先设置8279A芯片的显示方式。然后读取time0的最后一位,用XLAT命令查tab表,将得到的结果输出到8279A芯片,然后在数码管上显示。每显示两位数字,就在中间显示一条横线以分隔时分秒。

2.2.4秒表模块

与时钟模式类似,秒表模式也需要计时和显示功能。除此之外,秒表模式还需要有按键控制功能用于开始、暂停计时和清零。

计时功能由int_timer1实现,属于中断服务程序。显示功能由display1子程序实现。按键功能由int_pad实现,属于中断服务程序。

1. int_timer1

这个中断服务程序的中断类型号为31H。8253芯片产生周期为1ms的方波,当其上升沿到达8259芯片的IR1引脚后,进入中断服务程序int_timer1。

进入int_timer1后,首先从内存pad中读出按键次数。

若pad中的值为2,说明现在秒表处于停止状态,计时停止,不将秒表的计时值刷新,所以直接中断返回。

若pad中的值为1,说明秒表正在计时,应将秒表的计时值加1ms。加1的方法与时钟加1的方法类似。先读出 time1的最低位,加1后判断进位。最后中断返回。

若pad中的值为0,说明秒表要重新开始计时,需要将秒表清零。即把time0中的每一位都改为零。最后中断返回。

2. display1

这是秒表模式的显示程序,在秒表模式下会反复被主程序调用。显示方法与display1类似。不同的是,秒表的显示格式是00-00.000,即在显示秒的最后一位时,需要加一个小数点。实现的方法是,先将这一位查表转化为可在数码管上的编码,由于数码管是否显示小数点是由编码的最高位指示的,所以只需将编码和80H进行或运算即可添加小数点。最后将结果输出到数码管显示。

3. int_pad

这个中断服务程序的中断类型号为32H。当手动脉冲被按下的时候,进入这个中断服务程序。将pad中的值加1。pad中的初始值为0,当加到3时,将其变为0。

2.3 程序连线图

图2.2 程序连线图

第3章 调试及结果分析

3.1 调试步骤及方法

由于程序比较大,要整体调试会非常困难,不容易找出哪里有问题。所以必

须分而治之,将程序拆分开来调试。由于整个程序被化分为了几个模块,所以,

调试可以按模块来进行。

我将调试分为时钟模块和秒表模块。因为时钟模块相对简单,所以先调试时

钟模块,后调试秒表模块。

3.1.1程序的语法错误

由于对汇编语言还不熟悉,所以出现了较多的语法错误。主要错误有以下一

些。

程序格式错误。例如,子程序最后应写RET。

寄存器寻址方式错误。例如,在装中断向量的时候,应该是寄存器间接寻址,

要加中括号。

跳转错误。跳转的最大值不能超过一定的限度。而且跳转的标号不能重复。

写地址错。例如,在向某个端口送数据的时候,不能直接写地址,而必须将

端口地址放入寄存器DX中,再送数据。

3.1.2时钟模块调试过程

时钟模块又分为显示模块和计数模块。先调试显示模块,再调试计数模块。

1. 显示模块调试中的问题及解决方案

问题1:数码管没有任何反应

问题分析:在初始化8279时,数码管就应该被清除显示,即会不显示任何东

西,但是先在数码管上的数并没有被清除,说明了可能是8279

工作错误。检查程序后发现,8279的控制端口是231H,但是正

确的应该为232H。

解决方案:将控制端口号改为232H。

问题2:数码管显示乱码

问题分析:8279在初始化时已经清除了显示,但是还是显示乱码,说明是后

送入的数有错。

解决方案:检查程序后发现,在初始化各芯片的时候没有关中断和开中断,

8259A可能错误的响应的中断。

问题3:显示顺序颠倒

问题分析:由于设置的是从左到右的八位显示,所以应该是送显示数的顺序

不对。

解决方案:将display0中的送显顺序颠倒。

2. 计数模块调试中的问题及解决方案

问题1:数码管显示结果一直为初始值

问题分析:可能的原因是8253芯片没有产生方波或是8259A芯片没有响应

中断。

解决方案:将8259A和8253断开,然后将手动脉冲接到8259A的IR0中断

引脚。用手动脉冲来产生中断。结果显示没有任何改变,说明中

断有问题。

问题2:中断响应问题,当接手动脉冲时,8259A的表现是不响应中断,时

钟值不增加。

问题分析:检查中断向量装入是否正确,再检查中断服务程序。最后发现是

中断服务程序有错。在使用各寄存器之前,没有对其进行相应的

保护,导致结果异常。

解决方案:int_timer0开始时将AX/BX/CX/DX分别压入栈中,在程序结束时

弹出。

问题3:将8253和8259A相连后,只能响应一次中断。

问题分析:在中断没有错误的情况下,只能是8253出错。8259A响应了一次

中断是因为8253在启动时,会从低电平变为高电平。在这个上升

沿,8259A响应了中断,将时钟加1。但后来就没有响应中断。

再将8253接到LED灯上,发现其一直不亮,说明8253产生的波

有错误。检查8253的初始化后发现是送的计数初值和送数的方式

都有错。

解决方案:将计数初值和送数方式改正。

问题4:时钟显示错位

问题分析:在只送初值的情况下,显示没有问题,但当时钟增加的时候,显

示会错位。

解决方案:改变显示方式在显示之前将显示方式写为90H

3.1.3秒表模块调试过程

在时钟模块被调试完后,秒表模块就更容易调试了,因为两个模式的显示和

计时都大同小异。因此,调试过程中的主要问题出在秒表的控制上。

问题1:按控制按钮秒表没有反应

问题分析:可能是控制信号没有得到响应,检查程序发现,int_pad的中断类

型号装入有错。

解决方案:将中断类型好改正后问题解决了。

问题2:在秒表模式下开始计后,若切换到时钟模式,则显示会发生错误。

问题分析:肯能是两个模式有冲突的地方。经过检查程序发现,可能是因为

没有保护寄存器的原因。

解决方案:int_timer1开始时将AX/BX/CX/DX分别压入栈中,在程序结束时

弹出。

问题3:时钟模拟计时误差大。在时钟计时显示的时候,有时会停顿有时又

加的比较快。

问题分析:可能是因为CPU响应中断需要一定的时间,也可能是程序安排不

恰当

解决方案:优化程序的结构,适当改变8253的计数初值。

3.2 实验结果

本程序能够满足题目的所有要求,其测试结果如下:

1. 将开关置于低电平,进入时钟模式。数码管显示当前时间,并每秒加1。

2. 将开关置于高电平,进入秒表模式。数码管显示计数初值。

3. 在秒表模式下,按一下秒表控制按钮,开始计时,数码管不断刷新秒表计时。

4. 在秒表开始计数后,切换到时钟模式,时钟仍然在正常计时。

5. 切换回秒表模式下第二次按下按钮,计时停止,显示最后计时结果。

6. 在秒表模式下第三次按下按钮,计时停止,结果清零。

7. 将时钟的初值设定为23时59分40秒,30秒后观察结果。

8. 将秒表的初值设定为59分40秒000毫秒,30秒后观察结果。

湖南文理学院芙蓉学院课程设计报告 参考文献

参考文献

[1] 龚尚福.微机原理与接口技术[M].西安:西安电子科技大学出版社,2003

[2] 王忠民.微型计算机原理[M]. 西安:西安电子科技大学出版社,2003

[3] 沈美明,温冬婵.IBM-PC汇编语言程序设计[M].北京:清华大学出版社,2001

[4] 郑初华.汇编语言、微机原理及接口技术[M]. 西安:西安电子科技大学出

版社,2003

[5] 仇玉章.32位微型计算机原理与接口技术[M]. 北京:清华大学出版社,2000

[6] 王富荣.微机原理与汇编语言实用教程[M]. 北京:清华大学出版社,2009

[7] 白中英.计算机组成原理[M]. 北京:科学出版社,2000

[8] 罗云彬. Windows环境下32位汇编语言程序设计[M]. 北京:电子工业出版

社,2002

附 录(源程序)

C8255 EQU 203H

D8255C EQU 202H

C8253 EQU 213H

D82530 EQU 210H

D82531 EQU 211H

D82532 EQU 212H

C82590 EQU 220H

C82591 EQU 221H

C8279 EQU 232H

D8279 EQU 230H

time0 EQU 1000

time1 EQU 307

CODE SEGMENT

ASSUME CS:CODE

START: JMP Y

timer0 DB 2,0,1,3,5,9

timer1 DB 7 DUP(0)

pad DB 0

tab DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9

Y: ;初始化各芯片

MOV AX,8100H

MOV DS,AX

CLI

CALL i8279

CALL i8259

CALL i8253

CALL i8255

STI

big_lp: MOV DX,202H ;读8255 C口

IN AL,DX

CMP AL,01H ;判断是什么模式

JE mode1

CALL display0 ;时间模式,显示时间

JMP big_lp

mode1: CALL display1 ;秒表模式,显示秒表

JMP big_lp

i8253: ;210,211,212,213分别为:计数器0/计数器1/计数器2/控制端口

;CPU时钟频率为307200HZ

;初始化计数器1,先送低八位,后送高八位,工作方式3,二进制计数

MOV DX,C8253

MOV AL,76H

OUT DX,AL

;使OUT1产生周期为1ms的方波

MOV DX,D82531

MOV AX,time1

OUT DX,AL

MOV AL,AH

OUT DX,AL

;初始化计数器0,,先送低八位,后送高八位,工作方式3,二进制计数

MOV DX,C8253

MOV AL,36H

OUT DX,AL

;CLK0接OUT1,OUT0产生周期为1s的方波

MOV DX,D82530

MOV AX,time0

OUT DX,AL

MOV AL,AH

OUT DX,AL

POP BX

POP CX

POP DX

POP AX

RET

i8259: ;端口地址为220H和221H

;ICW1,上升沿触发,单片,写ICW4

PUSH AX

PUSH DX

PUSH CX

PUSH BX

MOV DX,C82590

MOV AL,13H; (00010011)

OUT DX,AL

;ICW2,中断类型号为30H,31H,32H

MOV DX,C82591

MOV AL,30H

OUT DX,AL

;ICW4,正常EOI,8086/8088系统

MOV AL,01H

OUT DX,AL

PUSH DS

MOV AX,0

MOV DS,AX

MOV BX,30H*4

MOV AX,OFFSET int_timer0

MOV DS:[BX],AX

MOV AX,CS

MOV BX,30H*4+2

MOV DS:[BX],AX

MOV BX,31H*4

MOV AX,OFFSET int_timer1

MOV DS:[BX],AX

MOV AX,CS

MOV BX,31H*4+2

MOV DS:[BX],AX

MOV BX,32H*4

MOV AX,OFFSET int_pad

MOV DS:[BX],AX

MOV AX,CS

MOV BX,32H*4+2

MOV DS:[BX],AX

POP DS

POP BX

POP CX

POP DX

POP AX

RET

i8279: ;数据端口230H,控制端口232H

;清除显示和显示寄存器

MOV DX,C8279

MOV AL,0D2H

OUT DX,AL

;键盘显示命令,八个字符显示,左端输入方式

MOV AL,0

OUT DX,AL

RET

i8255: ;200,201,202,203分别为:A口/B口/C口/控制端口

;只用到PC0,输入

MOV DX,C8255

MOV AL,9BH

OUT DX,AL

RET

int_timer0 PROC

;1秒产生一次中断,每次中断时间加1秒

PUSH AX

PUSH DX

PUSH CX

PUSH BX

PUSH DI

LEA DI,timer0

MOV BL,BYTE PTR[DI+5]

CMP BL,9

JE c0; 有进位

INC BL; 1s位加1

MOV BYTE PTR[DI+5],BL

JMP addend0

c0: MOV BYTE PTR[DI+5],0

MOV BL,BYTE PTR[DI+4]; 处理下一位

CMP BL,5

JE c1; 有进位

INC BL; 10s位加1

MOV BYTE PTR[DI+4],BL

JMP addend0

c1: MOV BYTE PTR[DI+4],0

MOV BL,BYTE PTR[DI+3]; 处理下一位

CMP BL,9

JE c2; 有进位

INC BL; 1min位加1

MOV BYTE PTR[DI+3],BL

JMP addend0

c2: MOV BYTE PTR[DI+3],0

MOV BL,BYTE PTR[DI+2]; 处理下一位

CMP BL,5

JE c3; 有进位

INC BL; 10min位加1

MOV BYTE PTR[DI+2],BL

JMP addend0

c3: MOV BYTE PTR[DI+2],0

MOV BL,BYTE PTR[DI+1]

MOV BH,BYTE PTR[DI];

湖南文理学院芙蓉学院课程设计报告 附录

CMP BH,2

JNE c4

CMP BL,3

JE c5; 23h的情况

INC BL; 21h位加1

MOV BYTE PTR[DI+1],BL

JMP addend0

c5: MOV BYTE PTR[DI],0; 新的一天

MOV BYTE PTR[DI+1],0

JMP addend0

c4: CMP BL,9

JE c6; 有进位

INC BL; 01h位加1

MOV BYTE PTR[DI+1],BL

JMP addend0

c6: INC BH

MOV BYTE PTR[DI],BH; 10h位加1

JMP addend0

addend0:MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

int_timer0 ENDP

display0:

;显示时间

PUSH DI

LEA BX,tab

MOV AL,90H

MOV DX,232H

OUT DX,AL

MOV DX,D8279

LEA DI,timer0

MOV AL,BYTE PTR[DI+5]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+4]

XLAT

湖南文理学院芙蓉学院课程设计报告 附录

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+3]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+2]

XLAT

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+1]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI]

XLAT

OUT DX,AL

POP DI

RET

int_timer1 PROC

PUSH AX

PUSH DX

PUSH CX

PUSH BX

PUSH DI

MOV BL,pad

CMP BL,0; 复位

JE t0

CMP BL,1; 第一次按键

JE t1; 第二次按键

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

t0: ;初始状态或第三次按键,秒表归零

LEA DI,timer1

MOV BYTE PTR[DI],0

MOV BYTE PTR[DI+1],0

MOV BYTE PTR[DI+2],0

MOV BYTE PTR[DI+3],0

MOV BYTE PTR[DI+4],0

MOV BYTE PTR[DI+5],0

MOV BYTE PTR[DI+6],0

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

t1: ;第一次按键,开始计时或增加1毫秒

LEA DI,timer1

MOV BL,BYTE PTR[DI+6]

CMP BL,9

JE r0; 有进位

INC BL; 0.001s位加1

MOV BYTE PTR[DI+6],BL

JMP addend

r0: MOV BYTE PTR[DI+6],0; 上一位清零

MOV BL,BYTE PTR[DI+5]; 处理下一位

CMP BL,9

JE r1; 有进位

INC BL; 0.01s位加1

MOV BYTE PTR[DI+5],BL

JMP addend

r1: MOV BYTE PTR[DI+5],0

MOV BL,BYTE PTR[DI+4]; 处理下一位

CMP BL,9

JE r2; 有进位

INC BL; 0.1s位加1

MOV BYTE PTR[DI+4],BL

JMP addend

r2: MOV BYTE PTR[DI+4],0

MOV BL,BYTE PTR[DI+3]; 处理下一位

CMP BL,9

JE r3; 有进位

INC BL; 1s位加1

MOV BYTE PTR[DI+3],BL

JMP addend

r3: MOV BYTE PTR[DI+3],0

MOV BL,BYTE PTR[DI+2]; 处理下一位

CMP BL,5

JE r4; 有进位

INC BL; 10s位加1

MOV BYTE PTR[DI+2],BL

JMP addend

r4: MOV BYTE PTR[DI+2],0

MOV BL,BYTE PTR[DI+1]; 处理下一位

CMP BL,9

JE r5; 有进位

INC BL; 1min位加1

MOV BYTE PTR[DI+1],BL

JMP addend

r5: MOV BYTE PTR[DI+1],0

MOV BL,BYTE PTR[DI]; 处理下一位

CMP BL,5

JE addend; 有进位,但已经超出了可表示的范围

INC BL; 1min位加1

MOV BYTE PTR[DI],BL

addend: MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

int_timer1 ENDP

display1:

;显示秒表

PUSH DI

LEA BX,tab

MOV AL,90H

MOV DX,232H

OUT DX,AL

MOV DX,D8279

LEA DI,timer1

MOV AL,BYTE PTR[DI+6]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+5]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+4]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+3]

XLAT

OR AL,80H; 添加小数点

OUT DX,AL

MOV AL,BYTE PTR[DI+2]

XLAT

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+1]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI]

XLAT

OUT DX,AL

POP DI

RET

int_pad:

;有键按下,pad加1,若是第三下按键,则归零

湖南文理学院芙蓉学院课程设计报告 附录

PUSH AX

PUSH DX

PUSH CX

PUSH BX

MOV BL,pad

INC BL

CMP BL,3

JNE p

MOV BL,0

p: MOV pad,BL

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP BX

POP CX

POP DX

POP AX

IRET

CODE ENDS

END START

湖南文

课程设计总结 理学院芙蓉学院课程设计报告

课程设计总结:

在这次课程设计中,我遇到了很多问题,看到了自己的不足。但是经过努力,我克服了困难,最终顺利完成了课程设计任务。

首先,我分析了课程设计题目的要求,将要求具体化,选择芯片。然后,又用了较短时间就将程序写出来了。但这还远远不够,因为在上机调试的时候,真正的问题才来了。

我把语法错误修改完后,将芯片连接起来,但是运行的结果却是错误的。于是我又回过头检查程序是否有逻辑错误。但是由于程序很大,错误找起来很困难。虽然找到了一些错误,但问题却没有得到解决。因为错误不是因为一个单一的逻辑错误造成的。所以我用了计算机编程常用的“分治法”,将一个大问题细化,化为很多小的、简单的问题。单独调试了所有芯片和模块。从时间显示、脉冲产生、手动中断到自动中断,再到相对完整的时钟模块,最后到功能最复杂的秒表模块。我找出每个模块的错误,在保证每个模块都正确无误后再把它们组合起来。这样,所有问题就都解决了。

虽然这次课程设计中,我使用的芯片都是学过并做过实验的芯片,但是我仍然遇到这么多问题。虽然程序很快就写出来了,但是调试却用了很长时间。机器运行的结果总是与预想的有区别。这些都说明了我的的动手实践能力还需要提高,并且还要不断积累经验,避免犯同样的错误。

最后,还要感谢老师的指点,让我少走弯路,顺利完成课程设计。

湖南文理学院芙蓉学院

微机原理课程设计报告

课程名称: 电子秒表

专业班级:

学生学号:

学生姓名:

指导教师:

完成时间:

湖南

目录 文理学院芙蓉学院课程设计报告

目 录

第1章 总体设计方案 .................................................................................................. 1

1.1 课程设计的内容和要求 ................................................................................... 1

1.2 课程设计原理 ................................................................................................... 1

1.3 课程设计思路 ................................................................................................... 2

1.4 设计环境 ........................................................................................................... 2

第2章 详细设计方案 .................................................................................................. 3

2.1 实现方法 ........................................................................................................... 3

2.2 模块的设计与实现 ........................................................................................... 4

2.2.1主程序模块 ................................................................................................... 4

2.2.2初始化模块 ................................................................................................... 5

2.2.3时钟模块 ....................................................................................................... 6

2.2.4秒表模块 ....................................................................................................... 6

2.3 程序连线图 ....................................................................................................... 8

第3章 调试及结果分析 .............................................................................................. 9

3.1 调试步骤及方法 ............................................................................................... 9

3.1.1程序的语法错误 ........................................................................................... 9

3.1.2时钟模块调试过程 ....................................................................................... 9

3.1.3秒表模块调试过程 ..................................................................................... 11

3.2 实验结果 ......................................................................................................... 11

参考文献 ........................................................................................................................ 13

附 录(源程序) ...................................................................................................... 14

第1章 总体设计方案

1.1 课程设计的内容和要求

一、课程设计内容:

设计一个带时间显示的电子秒表,具体内容如下:

1. 电子秒表的初始状态为零,分别显示分、秒、毫秒;

2. 设计一个按钮,按第一次开始计时,按第二次计时暂停,显示当前记录的

时间,按第三次计时停止,回到初始态;

3. 有时间显示的功能,当不用电子秒表的功能时,显示当先的时间,分别为

时、分、秒形式。

二、课程设计要求:

1. 独立完成课程设计任务;

2. 通过老师当场验收;

3. 交出完整的课程设计报告。

1.2 课程设计原理

题目要求实现电子秒表功能和显示当前时间的功能。这两部分的共同点是都需要实现时间显示和时间运行功能。除此之外,电子秒表还需要有开始计时和停止计时功能。因此电子秒表是本次课程设计的主要部分。

在本次设计中主要使用了8255A并行接口芯片,8253定时/计数器,8259A中断控制器,8279键盘/显示芯片。具体原理和功能如下:

1. 利用8255A芯片实现时钟和秒表之间的切换。将其连接到一个开关上,

读取开关的电位,以此来判断是时钟模式还是秒表模式。

2. 利用8253芯片计时。用8253的分频功能使其产生周期为1s和1ms的方

波,分别为时钟和秒表计时。

3. 利用8259A芯片接收中断。中断分为三种类型,分别是一秒一次的时钟

计时中断,一毫秒一次的秒表计时中断和控制秒表开始和停止的中断。

4. 利用8279芯片在数码管上显示当前时间或秒表时间。

1.3 课程设计思路

由于要求实现时钟和秒表两种功能。因此需要设计时钟和秒表两个模式。 时钟模式下,以秒为计时单位,计时功能和显示当前时间功能。秒表模式下,以毫秒为计时单位,有开始、停止和显示计时结果的功能。

首先,将8255A芯片的PC0接口连接到开关。读C端口的值。判断是0还是1。0代表时钟模式,1代表秒表模式。然后,根据判断结果调用相应模式下的显示功能。这样不停地读8255A芯片,然后判断,最后显示。构成一个死循环。若在这个过程中有中断,则会执行中断服务程序。

时间中断由8253芯片产生,周期分别为1s和1ms。时钟的最大时间为23时59分59秒,超过后从零开始重新计时。秒表最大时间为59分59秒999毫秒。当计数大于这个值时,秒表不再更新。

对秒表的控制中断由一个手动脉冲产生。将按键次数保存在名为pad的内存空间中。pad只能有0、1、2三个值,分别代表清零、开始计时和停止计时。

8259芯片接收中断,并调用相应模式下的中断服务程序。在时钟模式下,直接将时间加一秒。在秒表模式下,或清零(重新开始,pad=0),或将时间加一毫秒(开始计时,pad=1),或不做任何处理(停止计时,pad=2)。

要实现以上分析的功能,可以设计4个模块。模块名和作用见表1.1。

表1.1 模块划分及功能描述

1.4 设计环境

硬件环境:AEDK实验箱

软件环境:LCT88EA应用软件、WindowXP操作系统、PC机

第2章 详细设计方案

2.1 实现方法

1. 内存分配

程序中所需定义的内存单元含义如下:

timer0:存放当前时钟的值,共6个字节。时、分、秒各占两个字节;

timer1:存放秒表的计数值,共7个字节。分和秒各占两个字节,毫秒占三个字节;

pad:存放秒表的按键次数,共1个字节。可以有三种取值,0代表清零,1代表开始计时,2代表停止计时。当计数值大于2时,变为0重新开始计数;

tab:存放0~9在数码管上显示的编码,共10个字节。

2. 按键设置

秒表有一个按钮,接手动脉冲和8259A芯片的中断引脚。每次按键,pad都做相应改变。按第一次开始计时(pad=1),按第二次计时暂停(pad=2),显示当前记录的时间,按第三次计时停止(pad=0),回到初始态。

3. 时钟频率选择

CPU的频率为3.072105HZ。用8253芯片产生方波。计数器1的CLK1接CPU时钟脉冲,计数初值为307,使OUT0产生周期为1ms的方波。计数器0的CLK0接OUT1,计数初值为1000,使OUT0产生周期为1s的方波。

4. 中断设置

8259A芯片的中断引脚IR0、IR1、IR2分别接8253芯片的OUT0、OUT1和手动脉冲。

5. 显示设置

显示功能由8279芯片和数码管实现。显示分为两种情况。时钟模式下的显示规则是(时-分-秒),即(00-00-00)。秒表模式下的显示规则是(分-秒.毫秒),即(00-00.000)。

6. 端口地址分配

本次课程设计共使用了4种芯片,他们的端口号设置如表2.1所示。

表2.1 端口地址分配表

7. 子程序 子程序名称和功能如表2.2所示。

表2.2 子函数表

2.2 模块的设计与实现

2.2.1主程序模块

主程序的主要功能是初始化各芯片,模式选择以及调用显示函数。在初始化结束后,程序进入死循环,不断检测8255A芯片C端口的状态,CUP随时响应中断,更新时钟状态,把应显示的结果送入time0和time1中,以备显示。

主程序的流程如图2.1。

图2.1 主程序流程图

2.2.2初始化模块

初始化模块主要用于初始化各芯片,设定芯片工作方式,以及装入中断向量等。各芯片初始化情况如表2.3所示。

表2.3 芯片的初始化

2.2.3时钟模块

时钟模块主要是为了实现时钟的计时和显示功能。时钟的计时功能由int_timer0子程序实现,属于中断服务程序。显示功能由display0程序实现,由主程序调用。

1. int_timer0

这个中断服务程序的中断类型号为30H。8253芯片产生周期为1s的方波,当其上升沿到达8259A芯片的IR0引脚后,进入中断服务程序int_timer0。

进入int_timer0后,首先从内存中读出前一秒的时间的最后一位,即time0的最后一位,然后加1。若有进位,则把当前这一位置零,然后读出前一位再加一,再判断是否有进位。以此类推,直到没有进位或者达到计数最大值为止。把修改后的时间存回内存中,以备显示。

2. display0

这是时钟模式的显示程序。在时钟模式下会反复被主程序调用。首先设置8279A芯片的显示方式。然后读取time0的最后一位,用XLAT命令查tab表,将得到的结果输出到8279A芯片,然后在数码管上显示。每显示两位数字,就在中间显示一条横线以分隔时分秒。

2.2.4秒表模块

与时钟模式类似,秒表模式也需要计时和显示功能。除此之外,秒表模式还需要有按键控制功能用于开始、暂停计时和清零。

计时功能由int_timer1实现,属于中断服务程序。显示功能由display1子程序实现。按键功能由int_pad实现,属于中断服务程序。

1. int_timer1

这个中断服务程序的中断类型号为31H。8253芯片产生周期为1ms的方波,当其上升沿到达8259芯片的IR1引脚后,进入中断服务程序int_timer1。

进入int_timer1后,首先从内存pad中读出按键次数。

若pad中的值为2,说明现在秒表处于停止状态,计时停止,不将秒表的计时值刷新,所以直接中断返回。

若pad中的值为1,说明秒表正在计时,应将秒表的计时值加1ms。加1的方法与时钟加1的方法类似。先读出 time1的最低位,加1后判断进位。最后中断返回。

若pad中的值为0,说明秒表要重新开始计时,需要将秒表清零。即把time0中的每一位都改为零。最后中断返回。

2. display1

这是秒表模式的显示程序,在秒表模式下会反复被主程序调用。显示方法与display1类似。不同的是,秒表的显示格式是00-00.000,即在显示秒的最后一位时,需要加一个小数点。实现的方法是,先将这一位查表转化为可在数码管上的编码,由于数码管是否显示小数点是由编码的最高位指示的,所以只需将编码和80H进行或运算即可添加小数点。最后将结果输出到数码管显示。

3. int_pad

这个中断服务程序的中断类型号为32H。当手动脉冲被按下的时候,进入这个中断服务程序。将pad中的值加1。pad中的初始值为0,当加到3时,将其变为0。

2.3 程序连线图

图2.2 程序连线图

第3章 调试及结果分析

3.1 调试步骤及方法

由于程序比较大,要整体调试会非常困难,不容易找出哪里有问题。所以必

须分而治之,将程序拆分开来调试。由于整个程序被化分为了几个模块,所以,

调试可以按模块来进行。

我将调试分为时钟模块和秒表模块。因为时钟模块相对简单,所以先调试时

钟模块,后调试秒表模块。

3.1.1程序的语法错误

由于对汇编语言还不熟悉,所以出现了较多的语法错误。主要错误有以下一

些。

程序格式错误。例如,子程序最后应写RET。

寄存器寻址方式错误。例如,在装中断向量的时候,应该是寄存器间接寻址,

要加中括号。

跳转错误。跳转的最大值不能超过一定的限度。而且跳转的标号不能重复。

写地址错。例如,在向某个端口送数据的时候,不能直接写地址,而必须将

端口地址放入寄存器DX中,再送数据。

3.1.2时钟模块调试过程

时钟模块又分为显示模块和计数模块。先调试显示模块,再调试计数模块。

1. 显示模块调试中的问题及解决方案

问题1:数码管没有任何反应

问题分析:在初始化8279时,数码管就应该被清除显示,即会不显示任何东

西,但是先在数码管上的数并没有被清除,说明了可能是8279

工作错误。检查程序后发现,8279的控制端口是231H,但是正

确的应该为232H。

解决方案:将控制端口号改为232H。

问题2:数码管显示乱码

问题分析:8279在初始化时已经清除了显示,但是还是显示乱码,说明是后

送入的数有错。

解决方案:检查程序后发现,在初始化各芯片的时候没有关中断和开中断,

8259A可能错误的响应的中断。

问题3:显示顺序颠倒

问题分析:由于设置的是从左到右的八位显示,所以应该是送显示数的顺序

不对。

解决方案:将display0中的送显顺序颠倒。

2. 计数模块调试中的问题及解决方案

问题1:数码管显示结果一直为初始值

问题分析:可能的原因是8253芯片没有产生方波或是8259A芯片没有响应

中断。

解决方案:将8259A和8253断开,然后将手动脉冲接到8259A的IR0中断

引脚。用手动脉冲来产生中断。结果显示没有任何改变,说明中

断有问题。

问题2:中断响应问题,当接手动脉冲时,8259A的表现是不响应中断,时

钟值不增加。

问题分析:检查中断向量装入是否正确,再检查中断服务程序。最后发现是

中断服务程序有错。在使用各寄存器之前,没有对其进行相应的

保护,导致结果异常。

解决方案:int_timer0开始时将AX/BX/CX/DX分别压入栈中,在程序结束时

弹出。

问题3:将8253和8259A相连后,只能响应一次中断。

问题分析:在中断没有错误的情况下,只能是8253出错。8259A响应了一次

中断是因为8253在启动时,会从低电平变为高电平。在这个上升

沿,8259A响应了中断,将时钟加1。但后来就没有响应中断。

再将8253接到LED灯上,发现其一直不亮,说明8253产生的波

有错误。检查8253的初始化后发现是送的计数初值和送数的方式

都有错。

解决方案:将计数初值和送数方式改正。

问题4:时钟显示错位

问题分析:在只送初值的情况下,显示没有问题,但当时钟增加的时候,显

示会错位。

解决方案:改变显示方式在显示之前将显示方式写为90H

3.1.3秒表模块调试过程

在时钟模块被调试完后,秒表模块就更容易调试了,因为两个模式的显示和

计时都大同小异。因此,调试过程中的主要问题出在秒表的控制上。

问题1:按控制按钮秒表没有反应

问题分析:可能是控制信号没有得到响应,检查程序发现,int_pad的中断类

型号装入有错。

解决方案:将中断类型好改正后问题解决了。

问题2:在秒表模式下开始计后,若切换到时钟模式,则显示会发生错误。

问题分析:肯能是两个模式有冲突的地方。经过检查程序发现,可能是因为

没有保护寄存器的原因。

解决方案:int_timer1开始时将AX/BX/CX/DX分别压入栈中,在程序结束时

弹出。

问题3:时钟模拟计时误差大。在时钟计时显示的时候,有时会停顿有时又

加的比较快。

问题分析:可能是因为CPU响应中断需要一定的时间,也可能是程序安排不

恰当

解决方案:优化程序的结构,适当改变8253的计数初值。

3.2 实验结果

本程序能够满足题目的所有要求,其测试结果如下:

1. 将开关置于低电平,进入时钟模式。数码管显示当前时间,并每秒加1。

2. 将开关置于高电平,进入秒表模式。数码管显示计数初值。

3. 在秒表模式下,按一下秒表控制按钮,开始计时,数码管不断刷新秒表计时。

4. 在秒表开始计数后,切换到时钟模式,时钟仍然在正常计时。

5. 切换回秒表模式下第二次按下按钮,计时停止,显示最后计时结果。

6. 在秒表模式下第三次按下按钮,计时停止,结果清零。

7. 将时钟的初值设定为23时59分40秒,30秒后观察结果。

8. 将秒表的初值设定为59分40秒000毫秒,30秒后观察结果。

湖南文理学院芙蓉学院课程设计报告 参考文献

参考文献

[1] 龚尚福.微机原理与接口技术[M].西安:西安电子科技大学出版社,2003

[2] 王忠民.微型计算机原理[M]. 西安:西安电子科技大学出版社,2003

[3] 沈美明,温冬婵.IBM-PC汇编语言程序设计[M].北京:清华大学出版社,2001

[4] 郑初华.汇编语言、微机原理及接口技术[M]. 西安:西安电子科技大学出

版社,2003

[5] 仇玉章.32位微型计算机原理与接口技术[M]. 北京:清华大学出版社,2000

[6] 王富荣.微机原理与汇编语言实用教程[M]. 北京:清华大学出版社,2009

[7] 白中英.计算机组成原理[M]. 北京:科学出版社,2000

[8] 罗云彬. Windows环境下32位汇编语言程序设计[M]. 北京:电子工业出版

社,2002

附 录(源程序)

C8255 EQU 203H

D8255C EQU 202H

C8253 EQU 213H

D82530 EQU 210H

D82531 EQU 211H

D82532 EQU 212H

C82590 EQU 220H

C82591 EQU 221H

C8279 EQU 232H

D8279 EQU 230H

time0 EQU 1000

time1 EQU 307

CODE SEGMENT

ASSUME CS:CODE

START: JMP Y

timer0 DB 2,0,1,3,5,9

timer1 DB 7 DUP(0)

pad DB 0

tab DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0~9

Y: ;初始化各芯片

MOV AX,8100H

MOV DS,AX

CLI

CALL i8279

CALL i8259

CALL i8253

CALL i8255

STI

big_lp: MOV DX,202H ;读8255 C口

IN AL,DX

CMP AL,01H ;判断是什么模式

JE mode1

CALL display0 ;时间模式,显示时间

JMP big_lp

mode1: CALL display1 ;秒表模式,显示秒表

JMP big_lp

i8253: ;210,211,212,213分别为:计数器0/计数器1/计数器2/控制端口

;CPU时钟频率为307200HZ

;初始化计数器1,先送低八位,后送高八位,工作方式3,二进制计数

MOV DX,C8253

MOV AL,76H

OUT DX,AL

;使OUT1产生周期为1ms的方波

MOV DX,D82531

MOV AX,time1

OUT DX,AL

MOV AL,AH

OUT DX,AL

;初始化计数器0,,先送低八位,后送高八位,工作方式3,二进制计数

MOV DX,C8253

MOV AL,36H

OUT DX,AL

;CLK0接OUT1,OUT0产生周期为1s的方波

MOV DX,D82530

MOV AX,time0

OUT DX,AL

MOV AL,AH

OUT DX,AL

POP BX

POP CX

POP DX

POP AX

RET

i8259: ;端口地址为220H和221H

;ICW1,上升沿触发,单片,写ICW4

PUSH AX

PUSH DX

PUSH CX

PUSH BX

MOV DX,C82590

MOV AL,13H; (00010011)

OUT DX,AL

;ICW2,中断类型号为30H,31H,32H

MOV DX,C82591

MOV AL,30H

OUT DX,AL

;ICW4,正常EOI,8086/8088系统

MOV AL,01H

OUT DX,AL

PUSH DS

MOV AX,0

MOV DS,AX

MOV BX,30H*4

MOV AX,OFFSET int_timer0

MOV DS:[BX],AX

MOV AX,CS

MOV BX,30H*4+2

MOV DS:[BX],AX

MOV BX,31H*4

MOV AX,OFFSET int_timer1

MOV DS:[BX],AX

MOV AX,CS

MOV BX,31H*4+2

MOV DS:[BX],AX

MOV BX,32H*4

MOV AX,OFFSET int_pad

MOV DS:[BX],AX

MOV AX,CS

MOV BX,32H*4+2

MOV DS:[BX],AX

POP DS

POP BX

POP CX

POP DX

POP AX

RET

i8279: ;数据端口230H,控制端口232H

;清除显示和显示寄存器

MOV DX,C8279

MOV AL,0D2H

OUT DX,AL

;键盘显示命令,八个字符显示,左端输入方式

MOV AL,0

OUT DX,AL

RET

i8255: ;200,201,202,203分别为:A口/B口/C口/控制端口

;只用到PC0,输入

MOV DX,C8255

MOV AL,9BH

OUT DX,AL

RET

int_timer0 PROC

;1秒产生一次中断,每次中断时间加1秒

PUSH AX

PUSH DX

PUSH CX

PUSH BX

PUSH DI

LEA DI,timer0

MOV BL,BYTE PTR[DI+5]

CMP BL,9

JE c0; 有进位

INC BL; 1s位加1

MOV BYTE PTR[DI+5],BL

JMP addend0

c0: MOV BYTE PTR[DI+5],0

MOV BL,BYTE PTR[DI+4]; 处理下一位

CMP BL,5

JE c1; 有进位

INC BL; 10s位加1

MOV BYTE PTR[DI+4],BL

JMP addend0

c1: MOV BYTE PTR[DI+4],0

MOV BL,BYTE PTR[DI+3]; 处理下一位

CMP BL,9

JE c2; 有进位

INC BL; 1min位加1

MOV BYTE PTR[DI+3],BL

JMP addend0

c2: MOV BYTE PTR[DI+3],0

MOV BL,BYTE PTR[DI+2]; 处理下一位

CMP BL,5

JE c3; 有进位

INC BL; 10min位加1

MOV BYTE PTR[DI+2],BL

JMP addend0

c3: MOV BYTE PTR[DI+2],0

MOV BL,BYTE PTR[DI+1]

MOV BH,BYTE PTR[DI];

湖南文理学院芙蓉学院课程设计报告 附录

CMP BH,2

JNE c4

CMP BL,3

JE c5; 23h的情况

INC BL; 21h位加1

MOV BYTE PTR[DI+1],BL

JMP addend0

c5: MOV BYTE PTR[DI],0; 新的一天

MOV BYTE PTR[DI+1],0

JMP addend0

c4: CMP BL,9

JE c6; 有进位

INC BL; 01h位加1

MOV BYTE PTR[DI+1],BL

JMP addend0

c6: INC BH

MOV BYTE PTR[DI],BH; 10h位加1

JMP addend0

addend0:MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

int_timer0 ENDP

display0:

;显示时间

PUSH DI

LEA BX,tab

MOV AL,90H

MOV DX,232H

OUT DX,AL

MOV DX,D8279

LEA DI,timer0

MOV AL,BYTE PTR[DI+5]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+4]

XLAT

湖南文理学院芙蓉学院课程设计报告 附录

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+3]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+2]

XLAT

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+1]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI]

XLAT

OUT DX,AL

POP DI

RET

int_timer1 PROC

PUSH AX

PUSH DX

PUSH CX

PUSH BX

PUSH DI

MOV BL,pad

CMP BL,0; 复位

JE t0

CMP BL,1; 第一次按键

JE t1; 第二次按键

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

t0: ;初始状态或第三次按键,秒表归零

LEA DI,timer1

MOV BYTE PTR[DI],0

MOV BYTE PTR[DI+1],0

MOV BYTE PTR[DI+2],0

MOV BYTE PTR[DI+3],0

MOV BYTE PTR[DI+4],0

MOV BYTE PTR[DI+5],0

MOV BYTE PTR[DI+6],0

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

t1: ;第一次按键,开始计时或增加1毫秒

LEA DI,timer1

MOV BL,BYTE PTR[DI+6]

CMP BL,9

JE r0; 有进位

INC BL; 0.001s位加1

MOV BYTE PTR[DI+6],BL

JMP addend

r0: MOV BYTE PTR[DI+6],0; 上一位清零

MOV BL,BYTE PTR[DI+5]; 处理下一位

CMP BL,9

JE r1; 有进位

INC BL; 0.01s位加1

MOV BYTE PTR[DI+5],BL

JMP addend

r1: MOV BYTE PTR[DI+5],0

MOV BL,BYTE PTR[DI+4]; 处理下一位

CMP BL,9

JE r2; 有进位

INC BL; 0.1s位加1

MOV BYTE PTR[DI+4],BL

JMP addend

r2: MOV BYTE PTR[DI+4],0

MOV BL,BYTE PTR[DI+3]; 处理下一位

CMP BL,9

JE r3; 有进位

INC BL; 1s位加1

MOV BYTE PTR[DI+3],BL

JMP addend

r3: MOV BYTE PTR[DI+3],0

MOV BL,BYTE PTR[DI+2]; 处理下一位

CMP BL,5

JE r4; 有进位

INC BL; 10s位加1

MOV BYTE PTR[DI+2],BL

JMP addend

r4: MOV BYTE PTR[DI+2],0

MOV BL,BYTE PTR[DI+1]; 处理下一位

CMP BL,9

JE r5; 有进位

INC BL; 1min位加1

MOV BYTE PTR[DI+1],BL

JMP addend

r5: MOV BYTE PTR[DI+1],0

MOV BL,BYTE PTR[DI]; 处理下一位

CMP BL,5

JE addend; 有进位,但已经超出了可表示的范围

INC BL; 1min位加1

MOV BYTE PTR[DI],BL

addend: MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP DI

POP BX

POP CX

POP DX

POP AX

IRET

int_timer1 ENDP

display1:

;显示秒表

PUSH DI

LEA BX,tab

MOV AL,90H

MOV DX,232H

OUT DX,AL

MOV DX,D8279

LEA DI,timer1

MOV AL,BYTE PTR[DI+6]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+5]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+4]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI+3]

XLAT

OR AL,80H; 添加小数点

OUT DX,AL

MOV AL,BYTE PTR[DI+2]

XLAT

OUT DX,AL

MOV AL,40H

OUT DX,AL

MOV AL,BYTE PTR[DI+1]

XLAT

OUT DX,AL

MOV AL,BYTE PTR[DI]

XLAT

OUT DX,AL

POP DI

RET

int_pad:

;有键按下,pad加1,若是第三下按键,则归零

湖南文理学院芙蓉学院课程设计报告 附录

PUSH AX

PUSH DX

PUSH CX

PUSH BX

MOV BL,pad

INC BL

CMP BL,3

JNE p

MOV BL,0

p: MOV pad,BL

MOV AL,20H

MOV DX,C82590

OUT DX,AL

POP BX

POP CX

POP DX

POP AX

IRET

CODE ENDS

END START

湖南文

课程设计总结 理学院芙蓉学院课程设计报告

课程设计总结:

在这次课程设计中,我遇到了很多问题,看到了自己的不足。但是经过努力,我克服了困难,最终顺利完成了课程设计任务。

首先,我分析了课程设计题目的要求,将要求具体化,选择芯片。然后,又用了较短时间就将程序写出来了。但这还远远不够,因为在上机调试的时候,真正的问题才来了。

我把语法错误修改完后,将芯片连接起来,但是运行的结果却是错误的。于是我又回过头检查程序是否有逻辑错误。但是由于程序很大,错误找起来很困难。虽然找到了一些错误,但问题却没有得到解决。因为错误不是因为一个单一的逻辑错误造成的。所以我用了计算机编程常用的“分治法”,将一个大问题细化,化为很多小的、简单的问题。单独调试了所有芯片和模块。从时间显示、脉冲产生、手动中断到自动中断,再到相对完整的时钟模块,最后到功能最复杂的秒表模块。我找出每个模块的错误,在保证每个模块都正确无误后再把它们组合起来。这样,所有问题就都解决了。

虽然这次课程设计中,我使用的芯片都是学过并做过实验的芯片,但是我仍然遇到这么多问题。虽然程序很快就写出来了,但是调试却用了很长时间。机器运行的结果总是与预想的有区别。这些都说明了我的的动手实践能力还需要提高,并且还要不断积累经验,避免犯同样的错误。

最后,还要感谢老师的指点,让我少走弯路,顺利完成课程设计。


相关内容

  • 微机原理课程设计报告(电子秒表)
  • 电子与控制工程学院 计算机原理与接口技术 课 程 设 计 姓 名 高强强 学 号 3206100232 专 业 建筑设施智能技术 设计题目 可任意启动停止的电子秒表 指导老师 傅攀峰 目录 1电子秒表课程设计要求············································ ...

  • 秒表系统设置课程设计
  • 课 程 设 计 说 明 书 学生姓名: 学 号: 学 院: 专 业: 电子信息工程 题 目: 专业综合实践之硬件部分: 基于单片机的秒表系统设计 指导教师: 职称: 2013 年 12 月 16 日 课程设计任务书 13/14 学年第 一 学期 学 院: 专 业: 电子信息工程 学 生 姓 名: 学 ...

  • 微机原理软件课程设计报告
  • 电气工程学院 微机原理课程设计 报 告 书 课 题 名 吃豆子程序和电子秒表 班 级____ _________________ 姓 名___________ _____ 指导教师 日 期 目录 一:软件课程设计 1.1.概要及关键词................................1 ...

  • 称重传感器的原理及应用
  • 称重传感器的原理及应用 随着技术的进步,由称重传感器制作的电子衡器已广泛地应用到各行各业,实现了对物料的快速.准确的称量,特别是随着微处理机的出现,工业生产过程自动化程度化的不断提高,称重传感器已成为过程控制中的一种必需的装置,从以前不能称重的大型罐.料斗等重量计测以及吊车秤.汽车秤等计测控制,到混 ...

  • 电子秒表课程设计报告
  • 电子信息工程专业10级学生单片机原理课程设计任务书 电子秒表的设计 一.设计要求 设计一个电子秒表,与通用秒表功能类似,有启动,暂停.复位等键.计时长长度为300秒,需显示百分秒. 二. 设计方案分析 1.方案设计 数字电子秒表具有显示直观.读取方便.精度高等优点,在计时中广泛使用.本设计用单片机组 ...

  • 信息技术课外活动记录
  • 信息技术课外活动记录 周次 地点 活动内容 一 微机教室 电脑报刊 日期 人员 指导教师 3月2日 课外小组 朱秀瑜 1.如何正确使用计算机,创建自己的文件夹. 2.初步认识 wps,并向学生展示由 wps 制作的成品 电脑报刊.以引发学生的学习兴趣 活动过程记录 3.设置电脑报刊的页面,插入文本框 ...

  • 电子秒表的设计与制作
  • 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 电子秒表的设计与制作 初始条件: (1) 计数精度可达1/100秒 (2) 可显示时间99.99秒 (3) 具有开关可启动,暂停,清零功能 选作:设计可改变计时时间(最大59.99秒)的电路 要求完成的主要任务: (包括课程设 ...

  • 单片机10秒秒表课程设计
  • 赣 南 师 范 学 院 物理与电子信息学院 课程设计Ⅳ设计报告书 基于AT89S52单片机的 10秒秒表的设计 姓名: 匡远熹 班级: 09电子信息工程 学号: 090802015 指导老师:刘小燕 时间: 2012.1.01 目 录 内容摘要 ........................... ...

  • 说明书模板
  • 苏 州 市 职 业 大 学 实习(实训)报告 名称 2013年 1 月 7 日至 2013 年 1 月 11 日共 1 周 院 系 计算机工程系 班 级姓 名 系 主 任 教研室主任 指导教师 目 录 一.课程设计的目的与要求..................................... ...