微机原理实习报告 - 电子时钟(用汇编语言实现)

更新时间:2024-01-14 07:44:01 阅读量: 教育文库 文档下载

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

河南农业大学 课 程 设 计 报 告 题 目:电子时钟显示设计 课 程:微型计算机原理 专 业:电子信息工程 班 级: 学生姓名: 学 号: 指导教师: 完成日期: 机电工程学院

目 录 前

言 ……………………………………………………………………………………………………… .1 第一章 绪

论 …………………………………………………………………………………………… .2

一、 实习目

的 ………………………………………………………………………………………… 2

二、实习要

求 ……………………………………………………………………………………… .2

三、 设计所需设

备 …………………………………………………………………………………… 2 第二章 软件系统介

绍 ……………………………………………………………………… .................3 一、 中断技术 (或其它相关技

术 …………………………………………………………………… .3

(一 介绍中断的概念中断技

术 …………………………………………………………………… .3

(二 DOS 及 BIOS 中

断 …………………………………………………………………………… ..3

二、 汇编语言及汇编工具简

介 ………………………………………………………………… .3

三、 软件介

绍 ………………………………………………………………………………………… .3 第三章 设计分

析 …………………………………………………………………………………… 4

一、 软件设计思

路 ………………………………………………………………………………… ..4

二、 软件各模块内

容 ………………………………………………………………………………… .4

(一 光标定位子程序原

理 ………………………………………………………………………… .4

(二 清屏原

理 …………………………………………………………………………………… ...4

(三 字符及字符串显示原

理 ……………………………………………………………………… .4

(四 压缩 BCD 转为 ASCII 码原

理 ………………………………………………………………… .5

(五 动态扫描键盘原

理 ………………………………………………………………………… ...5三、 程序流程图设

计 ………………………………………………………………………………… .5 第四章 系统实

现 ……………………………………………………………………………………… .7

一、 程序原代码清单及详细注

释 …………………………………………………………………… .7

二、 实验结

果 …………………………………………………………………………………… .. … .15 总

结 …………………………………………………………………………………………………… ...16

一、 软件的选

取 …………………………………………………………………………………… ...16

二、 图案的设

计 …………………………………………………………………………………… ...16

三、 程序调

试 ……………………………………………………………………………………… .16参考文

献 …………………………………………………………………………………………… .....16

前言

软件设计题目

电子时钟。 (在计算机屏幕上显示当前系统的时间,日期,或时间和日期, 3人一组

设计目的:

1. 了解定时 /计数器和中断(DOS/BIOS的使用; 2. 掌握定时 /计数器和中断的工作原理和编程方法。 编程要求:

1. 调用系统时间,在屏幕上显示出来; 2. 获取键盘的按键值,判断键值并退出系统。 程序设计参考步骤: 第一部分:定义显示界面。

第二部分:调用系统时间 (日期 , 并将调用的用二进制表示的时间数转换成 ASCII 码, 并将时间数(日期数存入内存区。

第三部分:将存在系统内存区的时间数(日期数用显示字符串的形式显示出来。 第四部分:获取键盘的按键值,判断键值并退出系统。

第一章 绪论 一、实验目的

1. 理解掌握定时 /计数器和中断的使用方法。 2. 掌握微机常用的输入输出方式及接口技术。

3. 掌握一定的汇编语言知识,培养自己的动手操作能力。 4. 学习程序设计的基本思路和方法。 二、实习要求

1. 调用系统时间,在屏幕上显示出来; 2. 获取键盘的按键值,判断键值并退出系统。 三、设计所需设备 :PC 机 第二章 软件系统介绍

一、中断技术(或其它相关技术 (一介绍中断的概念中断技术

在微机中,当 CPU 在执行过程中时,由于随机的事件(包括 CPU 内部的和 CPU 外部的事件 引起的 CPU 暂时停止正在执行的程序, 而转去执行一个用于处理该事件的程序—称为中断式服务 程序(或称中断处理程序,处理完后又返回被终止的程序断点处继续执行,这一过程成为中段 (二 DOS 及 BIOS 中断

通过调用 DOS 系统的 8号功能实现控制字符的输入, 通过调用延时程序实现十分之一秒的定 时,通过调用 DOS 系统的 2号功能实现光标定位,调用 DOS 系统的 2号功能实现字符的输出,通 过调用 DOS 系统的 9号功能实现字符串的输出。

二、汇编语言及汇编工具简介

汇编语言 (AssemblyLanguage是面向机器的程序设计语言。 在汇编语合中, 用助记符 (Memoni代替操作码,用地址符号 (Symbol或标号 (Label代替地址码。这样用符号代替机器语言的二进制 码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序, 机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程 序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为 汇编。

EMU8086是学习汇编必不可少的工具,它结合了一个先进的原始编辑器、 组译器、 反组译 器、具除错功能的软件模拟工具(虚拟 PC ,还有一个循序渐进的指导工具。 Emu8086同主 流汇编程序相比,语法简单得多,但是它能生成兼容8086的机器语言。可以直接对通用寄存 器,段寄存器,直接进行汇编编址操作,而且便于直接生成 exe 文件进行操作。

三、软件介绍

这个电子时钟可以通过 DOS 命令实现对系统时间进行调用,并且直接显示出来,按‘ C ’或 ‘ c ’直接修改时间,然后按‘ ESC ’退出此时的程序

第三章 设计分析 一、 软件设计思路

先在数据段开一段显示缓冲区, 用来存储系统时间, 调用子程序的清屏部分。 调用 DOS 中断, 得到系统当前时间,并将其二进制转换成 ASCII 码。再分别将小时数、分钟数、秒数存入显示缓 冲区,在修改时间的时候调用键盘输入输出程序实现时钟的修改功能,然后存入结束字符‘$’。 调用 DOS 字符串显示功能将时间显示在显示器上,调用屏幕的 I/O中断,定位光标的开始位置, 将时间显示在预先定义好的位置。

把程序设计成用刷新的方式来不断获取系统的时间,这样就有了会一秒一秒走动的电子时 钟。

二、软件各模块内容 (一光标定位子程序原理

DOS显示屏为 25行、 80列,左上角为(0, 0 ,右下角(18,4F

设置光标,可调用 BIOS 系统,用汇编语句调用中断 INT10H 。入口信息为 (AH=2 要设置光标; (BH=0 页号;

(DH,DL =光标的行号、列号 (二 清屏原理

开始执行程序时为保证有一个洁净的屏幕,可使显示屏做上滚动作,使屏幕留下一片空白。 要使屏幕上滚,可用汇编语句 INT 10H ,入口信息为

(AH =6 使屏幕上滚 (AL =00上滚行数

(CH , CL =滚动区域左上角的行、列号 (DH , DL =滚动区域右下角的行、列号 (BG =00 颜色的设置 (三字符及字符串显示原理

通过调用 DOS 系统模块 2只能是西安 DL 中的一个字符的显示。为了实现字符串的显示,调 用其 9号模块功能,其入口信息为

(AH =9 显示字符串的功能模块

(DS:DX 指向字符串的首地址,要求字符串以字符 ‘$’结尾。 4

(四 压缩 BCD 转为 ASCII 码原理

(1.两位的:先将压缩 BCD 码的高 4位取出,右移四位后,与 30H 相或,存到相应内存单 元;然后将低 4位取出,与 30H 相或,存到下一内存单元。

(2.一位的:原数字加 30H (五 动态扫描键盘原理

运用 INT 21H的 8号功能来实现动态扫描键盘。如果有键按下,则相应的键值的 ASCII 码被 存到 AL 中。判断 AL 中的数值,若不是控制字符,则继续循环,从而实现动态扫描键盘。 三、程序流程图设计

5 6

第四章 系统实现

一、 程序原代码清单及详细注释

;--------------------------------数据段定义阶段 -------------------------------------------------------

data segment

mess1 DB ' ↖ ^ ( && && ^ ↖ (^o^ ',0ah,0dh DB ' && && Happy ^ New ~* Year ',0ah,0dh

DB ' **** **** ** **** ',0ah,0dh

DB ' ** ** ** ** **** ** ** ************ ASM ASSIGNMENT *********** ',0ah,0dh

DB ' ** ** ** ** ** ******* ELECTRONIC CLOCK ************** ',0ah,0dh

DB ' ** ** ** ** ** **Designed by ZhangLei ChengQin and WuXiao* ',0ah,0dh DB ' ** ** ** ** ** ** Press C or c to correct the time ****** ',0ah,0dh DB ' ** ** ** ** ** *** Press ESC button to exit ************ ',0ah,0dh DB ' ** ** ** ** ** ',0ah,0dh

DB ' ** **** ** ** ** ******** ',0ah,0dh DB ' ******* **** ** ******** ',0ah,0dh,'$' TS DB ?,0ah,0dh DB ?,0ah,0dh

DB ' ====**======@@======**=====',0ah,0dh

DB ' Please input the new time (hh:mm:ss:',0dh,0ah,'$' ; 提示输入时间的格式 mess2 db ' The Time is:',0ah,0dh,'$'

HCQ db 40 ; 在数据段开一段时间显示缓冲区,大小为 40个字节 hor db ? ; 为变量分配一个字节的空间,初值为任意字符 7

min db ? ; 为变量分配一个字节的空间,初值为任意字符 sec db ? ; 为变量分配一个字节的空间,初值为任意字符 data ends

;--------------------------------堆栈段定义阶段 -------------------------------------------------

stack segment

db 100 dup(? ; 定义 100个字节的堆栈段 stack ends

;--------------------------------代码段定义阶段 ------------------------------------------ code segment

assume cs:code,ss:stack,ds:data ;确定各个逻辑段的类型 start:

call clear ;调用清屏子程序 display: ;时间显示部分

mov ax, data ; 将 DATA 的段基地址送到寄存器 AX mov ds,ax ; 将 AX 寄存器的内容存到 DS 中 mov bx,offset HCQ ; 送 HCQ 的偏移地址到 BX

mov ah,2ch ; 调用 DOS 时间调用功能 , 功能号 :2cH,小时 , 分钟 , 秒数 int 21h ; 分别保存在 CH,CL,DH 中

mov al,ch ; 小时数设定 mov ah,0 ; 此处置零是为了 call C16-10 ; 调用进制转换子程序 inc bx

;----------------------------------------------------------

mov al,':' ; 显示分隔符号

mov [bx],al ; 将寄存器内容存入 BX 中 inc bx ; 寄存器指向的地址 +1

;-------------------------------------------------------

mov ah,2ch ; 调用 DOS 时间调用功能 , 功能号 :2cH,小时 , 分钟 , 秒数 8

int 21h ; 分别保存在 CH,CL,DH 中 mov al,cl ;分钟数设定 mov ah,0 ;将该位置零 call C16-10 inc bx

;------------------------------------------------------------------------- mov al,':' ; 显示分隔符号

mov [bx],al ; 将寄存器内容存入 BX 中 inc bx ;寄存器指向的地址 +1

;---------------------秒的设计 --------------------------------- mov ah,2ch ; 秒设定 int 21h mov al,dh

mov ah,0 ;将该位置零 call C16-10 inc bx

;----------------------------------------------------------------------

mov al,'$' ; 将字符串的结束位送至显示缓冲区的最后一位 mov [bx],al ;------------------------------------------------------------------------ push bx ; 修改时间显示的地方

mov ah,2 ; 置光标位置 ,调用功能号 AH=2 mov bh,0 ; 置显示模式

mov dh,17 ; DH 跟 DL 分别为行号与列号 , 并入栈保护 BX mov dl,50 ; 显示输出在第 17行

int 10h ; 显示输出在 51列 pop bx

lea dx,HCQ ; 送 HCQ 偏移地址到 DX, 并调用 DOS 显示功能 , 功能号为 9 mov ah,9 ; 调用 DOS 9号功能,显示字符串

int 21h push bx

mov ah,2 ; 置光标位置调用 DOS 的功能 , AH=2 mov bh,0 ; 置显示以下模式

mov dh,1 ; 修改前面附加的内容的显示位置 mov dl,0 int 10h

lea dx,mess1 ; 取 m ess1的有效地址赋给 DX mov ah,9 ; 调用 DOS 9号功能,显示字符串 int 21h

pop bx ;BX 寄存器出栈 push bx ;PUSH BX mov ah,2 ; 置光标位置 mov bh,0 ; 置显示模式 mov dh,17 ; 定位在 17行 mov dl,35 ; 定位在 35列 int 10h pop bx

lea dx,mess2 ; 取 mess1的有效地址赋给 DX mov ah,9 int 21h

;-----------------------------

mov ah,1 ; 调用键盘 I/O中断功能号 1, 获取键值到 AL int 16h

cmp al,'c' ; 是 c 键 , 转到时间修改程序 je Cor

cmp al,'C' ; 是 C 键 , 转到时间修改程序 je Cor cmp al,1bh

jz quit ; 是 ESC 键 , 退出程序 jmp display quit:

mov ah,4ch ; 程序终止功能号 int 21h ret

Cor: call correct ; 调用时间修改子程序 ;------------------------------- C16-10 PROC NEAR PUSH CX

MOV AH,0 ; 16位二进制数转换为 ASCII 码 MOV CX,10D ; 基数 10

DIV CL ; 用除 10取余的方法转换为 BCD 码(二进制码 ADD AX,3030H ;BCD 码转换为 ASCII 码的代码

MOV [BX],AL ; 此时将低八位的 AL 加载到 BX 中, [BX]指的是寄存器 BX 指向的内存单元

INC BX ; BX 指向的存储单元加一 MOV [BX],AH POP CX RET C16-10 ENDP

;------------------------------------------- clear proc near push ax ; 入栈保护现场 push bx push cx push dx

mov ax,0600h ; ah=06(滚动 al=00(全屏空白 mov bh,2eh ; 设置背景颜色 (2和前景颜色 (e sub cx,cx ; 将寄存器清零

mov dx,5f5fh ; 设备重定向 子功能号功能描述 int 10h

pop dx ; 出栈恢复现场

pop cx pop bx pop ax ret clear endp

;----------------------------

correct proc NEAR ; 时间修改子程序 call input ; 调用键盘输入子程序输入数据 mov ch,hor mov cl,min mov dh,sec and dl,0h

mov ah,2dh ; 调用 DOS 功能调用系统时间并修改系统时间 int 21h jmp start ret correct endp

;------------------------------------------- input proc NEAR ; 键盘输入子程序 push ax ; 入栈保护数据

push bx push cx push dx pushf

mov dx,offset TS ; 显示修改时间的格式提示 mov ah,09h ; 显示字符串,提示的内容 int 21h ; 调用 DOS 功能

mov dx,OFFSET HCQ ; 数据缓冲区的数据输入 mov ah,0ah ; 带缓存的键盘输入(字符串 int 21h

and dx,0h ; 将寄存器置零 lea bx,HCQ ; 向 BX 装入有效地址 inc bx ; 地址 +1 inc bx ; 跳过‘:’

mov dh,[bx] ; 将 [BX]的内容储存到寄存器 DH 中

sub dh,30h ; 将得到的 ASCII 码转化为 16进制的数据 inc bx ; 地址加 1 mov dl,[bx] ; 分

sub dl,30h ; 转化为 16进制的数据 mov cl,10 ; 计数器计数十次

mov al,dh ; 将 DH 的内容送入寄存器

mul cl ; 通过减 30h ,再乘 10的方法得到该二进制数 add al,dl ; 然后将两个数据相加

mov ch,al ; 存入时间

mov hor,al ; 将寄存器的内容存入 HOR 中 inc bx inc bx

mov dh,[bx] ; 将 ASCII 码转换为二进制数 sub dh,30h

inc bx mov dl,[bx] sub dl,30h mov cl,10 mov al,dh mul cl add al,dl mov cl,al mov min,al inc bx inc bx mov dh,[bx] sub dh,30h inc bx mov dl,[bx] sub dl,30h mov cl,10 mov al,dh mul cl add al,dl mov dh,al mov sec,al popf pop dx pop cx pop bx pop ax ret input endp ;---------------------------14 ;乘以 10 ;将 ASCII 码转换为二进制数 ;出栈恢复数据

code ends end start 二、 实验结果 点击运行后,出现运行的结果如下: 当按下‘c’或‘C’时显示提示符“please input the new time(hh:mm:ss:” 15

总结 “纸上得来终觉浅,绝知此事要躬行”,这是本次课程设计我最大的体会。刚开始时,看着 老师给的参考材料,心里想“这个课程设计不是很难的事情嘛,把这几个子程序堆一块不就完 了”,可是真正做起来时,才发现事情远非想的那么简单。从上机软件的选取,到课程设计报告 的最终完成,我们经历了很多曲折,也收获了很多,下面具体阐述一下。 一、软件的选取 古语云:工欲善其事必先利其器。汇编语言上机软件和流程图绘制软件的选取对此次课程设 计非常重要。经过对比我们最终选取了 EMU8086 最终也能熟练操作这款软件。这是此次设

计较 大的收获。 二、图案的设计 为了能得到一个比较漂亮的界面显示,我们在图案设计上花了不少功夫。很多次设计的图案 很漂亮,可是搬到程序里面运行时却是一堆乱码,让我们很沮丧...还有要把秒表的显示正好调 到图案正中央,我们也经过了多次调试。在这个过程中,我们学会了耐心,去除浮躁,平心静气 的把程序一遍遍的修改、调试,臻于完美。 三、 程序调试 程序调试前,我们检查了好几遍。可是调试时还是错误百出。尤其是“;”的使用,一定要 区分英文输入的分号和中文分号的区别,还有字符串结束时一定要加‘$’,否则会出现乱码。 这些都是调试中发现的问题,只有注意细节,细心,才能顺利完成任务。 通过本次课程设计,我加深了对课汇编语言的理解,同时熟练掌握了汇编语言的编辑、调试 软件。在以后的学习生活中还要继续保持严谨认真的科学态度,保持不断尝试和探索的耐心,保 持勇于解决问题的决心。不断地向老师、同学们学习、交流,分享吸取他们的经验,更好的提高 自己。 参考文献 《微型计算机原理》P150~158、P166~171 张荣祥 中国电力出版社 《微型计算机原理与接口技术(第二版) 冯博琴 吴宁主编 清华大学出版社 》 16

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

Top