微机原理实验三子程序设计实验

时间:2019-05-12 17:57:21下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《微机原理实验三子程序设计实验》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《微机原理实验三子程序设计实验》。

第一篇:微机原理实验三子程序设计实验

实验三 子程序设计实验

一、实验目的

1.学习子程序的定义和调用方法。2.掌握子程序的程序设计、编制及调用。

二、实验设备

TDN86/88教学实验系统一台

三、实验内容及步骤

1.求无符号字节序列中的最大值和最小值

设有一字节序列,其存储首址为3000H,字节数为08H。利用子程序的方法编程求出该序列中的最大值和最小值。实验程序及流程如下:

主程序STACK1SEGMENT STACK

开始DW 64 DUP(?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE START: MOV SI,3000H MOV CX,0008H CALL branch A1:JMP A1 branch: JCXZ A4 PUSH SI PUSH CX PUSH BX

结束序列的字节个数→CX数据区首址→SI调用求最大最小值子程序 MOV BH,[SI] MOV BL,BH A1: LODSB CMP AL,BH JBE A2 MOV BH,AL JMP A3 A2: CMP AL,BL JAE A3

Y子程序CX=0?NSI、CX、BX入栈[SI]→BHBH→BLSI+1→SI[SI]→ALNAL﹤BHAL→BHMOV BL,AL A3: LOOP A1 MOV AX,BX POP BX POP CX

YAL﹥BLYCX-1→CXNNAL→BLCX=0?POP SI A4: RET CODE ENDS END START

实验步骤

(1)输入源程序,进行编译、链接和加载。

YSI、CX、BX出栈RET

(2)在调试区键入E0000:3000↙,输入8个字节的数据:D9、07、8B、C5、EB、04、9D、F9。

(3)运行程序,查看结果,在调试区键入R AX↙,显示结果应为AX=F9 04,AH中为最大值,AL中为最小值。

2.数组求和

设有一字节序列(存储地址和字节数可自定义),编写程序,求出该序列的和,求和工作由子程序来实现。

程序:

STACK1 SEGMENT STACK DW 64 DUP(?)STACK1 ENDS CODE

SEGMENT ASSUME CS:CODE START: MOV SI,3000H MOV CX,0008H XOR AX,AX CALL branch A5: JMP A5 branch: JCXZ A4 PUSH SI

PUSH CX A1: ADD AL,[SI] INC SI A3: LOOP A1

POP CX POP SI A4: RET CODE

ENDS END START

8个01,总和为08

第二篇:微机原理实验总结

微机原理实验总结

不知不觉,微机原理与接口技术实验课程已经结束了。回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言,对于学习机电工程的自动控制和计算机都是很重要的,因为它是和机器语言最接近的了,如果用它来编程序的话,会比用其它高级语言要快得多。本学期我们在老师的带领下,进行了微机原理实验六到十这五组实验。它们分别是: 实验六

8255 PA口控制PB口

实验目的掌握单片机系统中扩展外围芯片的方法,了解 8255 芯片的结构及编程方法。实验内容

用 8255 PA 口作开关量输入口,PB 口作输出口。

实验步骤

1、用8 芯线将8 255 PA口接至开关Kl~K8,PB口接至发光二极管L1~L8;

2、运行程序 HW06.ASM,拨动开关K1~K8,观察L1~L8发光二极管是否对应点亮。

实验七

8255控制交通灯

实验目的进一步了解8 255 芯片的结构及编程方法,学习模拟交通控制的实现方法。

实验内容

用8255 做输出口,控制六个发光二极管燃灭,模拟交通灯管理。

实验步骤

1、用双头线将 8 255 PA0~PA2 口接至发光二极管L3~L1,PA3~PA5口接至发光二极管L7~L5;

2、执行 程序HW07.ASM,初始态为四个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若干次后,再切换到东西路口方向,之后重复以上过程。实验八

简单I /O口扩展

实验目的学习单片机系统中扩展简单I/O 口的方法; 学习数据输入输出程序的编制方法。实验内容

利用74LS244 作为输入口,读取开关状态,并将此状态,通过74LS273再驱动发光二极管显示出来。

五、实验步骤

1、用8 芯线将Y0~Y7接至开关K1~K8,Q0~Q7 接至发光二极管L1~L8,用双头线将 CS1 接至8 000 孔,CS2 接至9 000 孔,用8 芯线将J X0 接至JX7(D0~D7数据线);

2、执行程序 HW08.ASM,按动开关K1~K8,观察发光二极管L1~L8是否对应点亮。

实验九

A/D 0809转换实验

实验目的)掌握A/D 转换与单片机接口的方法;)了解A/D 芯片0809转换性能及编程方法;)通过实验了解单片机如何进行数据采集。实验内容

利用实验系统上的 0809 做A /D 转换器,实验系统上的电位器提输入,编制程序,将模拟量转换成数字,通过数码管显示出来。实验步骤

1、用双头线将可调电压区的VOUT接至ADC0809 模数转换区的IN0,可调电压区的VIN 接至电源+5V,ADC0809 模数转换区的CS4 接至系统接口区的8000H 端口,ADC0809模数转换区的WR接至系统接口区的/IOWR端口,ADC0809 模数转换去的 RD 接至系统接口区的/IORD,ADC0809 模数转换区的ADDA、ADDB、ADDC接至G ND,CLK接至单脉冲与时钟区的500K,用8 芯线将数据总线JX0 接至A DC0809模数转换区的JX6;

2、运行程序 HW09.ASM,数码管上显示0809.XX,后二位显示当前采集的电压转换的数字量,调节可调电压,该二位将随着电压变化而相应变化,变化范围为00至FF。

实验十

D/A 0832转换实验

实验目的(1)了解D/A 转换与单片机的接口方法;

(2)了解D/A 转换芯片 0832 的性能及编程方法;

(3)了解单片机系统中扩展D/A 转换芯片的基本方法。

实验步骤

1、用双头线将DAC0832 数模转换区的CS5 端口接至系统接口区的8000H端口,WR端口接至系统接口区的/IOWR端口,AOUT输出接电压表或小直流电机DJ,用8 芯线将DAC0832 数模转换区的JX2 接至数据总线JX0

2、运行程序HW10.ASM,数码管上显示不断加大或减小的数字量,数字变化范围 00 到FF,用万 用表测试 D/A 输出孔 AOUT 应能测出不断加大或减小的电压值,电压变化范围 0V 到5V。

这次实验课程加深了我们对汇编语言指令的熟悉和理解。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了操作,加深了我们对硬件的熟悉,锻炼了动手能力,发挥创造才能。

通过这次课程使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这门课程可以阐明微处理器,汇编语言程序设计,计算机结构和操作系统等基本概念。详尽地论述了有关微处理器及其指令系统的概念和程序设计方法,介绍构成微型计算机的存储器,接口部件,总线等各项技术。.微机的最基础语言--汇编语言是一个最基础最古老的计算机语言,依赖于计算机的低级程序设计语言。汇编语言是我们理解整个计算机系统的最佳起点和最有效途径。汇编是对寄存的地址,以及数据单元进行最直接的修改,而在某些时候,这种方法的确是最有效,也是最可靠的.然而有优点,自然也就有缺点,最重要的一点就是汇编语言很繁琐,对某个数据进行修改时,本来很简单一个操作会用很多条繁琐的语句来解决,而这些语句本身在执行和操作的过程中,占用大量的时间和成本。并有大量的程序和硬件设计类题目,使我们能够深入了解计算机的原理、结构和特点,以及如何运用这些知识来设计一个实用的微型计算机系统。具体来说,就是掌握Intel8086/8088微型计算机系统地组成原理,熟练运用8086宏汇编语言进行程序设计,熟悉各种I/O接口芯片的配套使用技术,并通过一定的课程实验与实践,进一步提高系统设计的能力,使学生能够完成实用的微型计算机系统的软硬件设计。

学习该门课程知识时,其思维方法也和其它课程不同,该课程偏重于工程思维,具体地说,在了解了微处理器各种芯片的功能和外部特性以后,剩下额是如何将它们用于实际系统中,其创造性劳动在于如何用计算机的有关技术和厂家提供的各种芯片,设计实用的电路和系统,再配上相应的应用程序,完成各种实际应用项目。

这次实验并不是很难,主要的困难来自对程序的理解。我们最后对实验的原理有了清晰的认识。让我们知道了实验台上各个模块的用法;而且它还让我们对自己动手写程序来控制实验台的运作有了一定的基础。虽然实验台只是一个小型的模拟平台,但是通过对它的学习和操作,我们对有关接口的知识将会有一个更广泛的认识,而且它对我们以后的学习也会有帮助的。

实验中个人的力量是不及群体的力量的,我们分工合作,做事的效率高了很多。虽然有时候会为了一些细节争论不休,但最后得出的总是最好的结论。而且实验也教会我们在团队中要善于与人相处,与人共事,不要一个人解决所有问题。总之,这次课程设计对于我们有很大的帮助,通过课程设计,我更加深入地理解了,微机原理课程上讲到的各种芯片的功能,以及引脚的作用,同时加深了对于主要芯片的应用的认识,同时在试验室的环境里熟悉了汇编程序的编写过程和运行过程,最后还提高了自己的动手能力 对课程设计的建议

本次课程设计的几个实验相对都比较简单,而且经过老师的讲解以及实验书上的指导,几乎把我们要用到的程序和实验台电路的接线方法都告诉我们了,所以做起来很容易。

实验过程中,获得了很多收获,获得了很多感悟,当然也遇到了很多困难。但我们都一一克服了他们,成功的完成了实验。并在解决问题,克服困难的过程中,发现了自己平时忽略的,隐藏的问题,以及一些不该出现的粗心大意的小毛病。通过这些,我们认识的更加深刻,了解的更加深入。做到了学以致用,对知识掌握得更加牢固。通过了这一学期对微机原理的学习,真的对它有了一个全新的认识,我会坚持对它的学习,使自己在汇编语言上有一个长足的提高!

第三篇:微机实验心得

微机实验心得

这学期通过对微机原理和微机实验课的学习,对微机系统和它的工作原理有了很大的了解。微机实验课,总共做了十几个实验,回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言,它是和机器语言最接近的,用它来编程序,会比用其它高级语言要快得多。实验课程加深了我们对汇编语言指令的熟悉和理解。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了操作,加深了我们对硬件的熟悉,锻炼了动手能力,发挥创造才能。

通过这次课程使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。

对于这门课,我们收获了很多,我觉得这门课偏重于工程思维,主要难点在于对程序的理解。但是老师让我们通过手打程序,控制实验平台很好的理解了各实验的实验程序。对于课程的建议,实验讲义给的程序很清楚,大大降低了实验预习和自主编程的难度,给实验讲义可以更多的给方法和方式,提供一些程序建议而减少直接给出程序内容。实验课上,请一个或两个同学讲解一下实验程序设计思路,通过讲解与其他人互动,可以收获更多。微机原理课程上讲到的各种芯片的功能,以及引脚的作用,在实验中都得到了运用,使我们加深了对于主要芯片的应用的认识,同时在实验室的环境里熟悉了汇编程序的编写过程和运行过程,最后还提高了自己的动手能力。总结这门课,个人感觉很有必要,学习理论的过程中边通过实验辅助,使我们更容易的接受微机原理的知识。实验过程中,获得了很多收获,获得了很多感悟,当然也遇到了很多困难。但我们都一一克服了他们,成功的完成了实验。并在解决问题,克服困难的过程中,发现了自己平时忽略的,隐藏的问题,以及一些不该出现的粗心大意的小毛病。通过这些,我们认识的更加深刻,了解的更加深入。做到了学以致用,对知识掌握得更加牢固。

这学期的课程告一段落,但是对微机原理的理解和认识,我深知我们做的还远远不够,我们接下来还要继续努力多学习更多知识,当然动手实践很重要,我们平时也应该多编写多运用。通过了这一学期对微机原理的学习,真的对它有了一个全新的认识,我会坚持对它的学习,使自己在汇编语言上有一个长足的提高!

第四篇:微机原理与接口技术实验总结

微机原理与接口技术实验总结

11107108

徐寒黎

一、实验内容以及设计思路

1、①试编写一程序,比较两个字符串STRING1、STRING2 所含字符是否相同,若相同输出“MATCH”,若不相同输出 “NO MATCH”。设计思路:定义一个数据段,在数据段中定义两个字符串作为STRING1、STRING2以及几个用于输入提示的和输出所需内容的字符串,定义一个堆栈段用于存放,定义代码段。关键步骤以及少量语句:第一步将STRING1和STRING2都实现用键盘输入,方法是

MOV DX,OFFSET STRING2 MOV AH,0AH INT 21H 并且显示在显示器上,显示方法将0AH改成09H,语句与上面类似。然后进行比较第一个单元,MOV AL,[STRING1+1] CMP AL,[STRING2+1] JNZ NOMATCH 若字符串长度不等,则直接跳转,输出输出 “NO MATCH”; 若长度相等再逐个比较 LEA SI,[STRING1+2] LEA DI,[STRING2+2] MOV CL,[STRING1+1] MOV CH,0 CLD REPE CMPSB JCXZ MATCH,意思是全部相同就跳转MATCH,输出“MATCH”;不然进入下面的NOMATCH。退出。

②试编写求级数1^3+2^3 +3^3 …..前几项和刚大于10000的程序。

设计思路:原先编写的程序,设定和为10000,结果是14。但要求高一点的话,可以自己设置,实现用键盘输入和的值。

一个难点是将输入的ASCII码字符串,转换成与之相同的十进制数的数值。关键的思路部分是:从1开始求级数,将和的值存在AX里,要加下一项级数前,比如这时已经加到4,PUSH一下AX,然后将5乘三遍,将乘积MOV到BX里,再POP AX,然后将BX的值加到AX里,然后将AX与N比较,如果比N小就继续上述步骤,知道刚比N大就输出数字。

③试编写一程序,完成字符串中各字符出现频度的统计,统计结果在屏幕上输出。

设计思路:因为这个程序需要统计所有的字符,所以首先要定义一个存储区,用来存放26个字符以及每个字符出现的个数。用键盘控制输入字符串以后,将字符串的第一个字符与这二十六个字符逐个比较,若有相同,在存放相应次数的存储单元的值上加1。然后比较第二个字符,依次类推,将字符串里的字符全部比较完。将个数大于1的字符以及字符的个数都输出到屏幕上。退出语句。缺点和不足:这样需要定义一个非常繁的存储区。可以根据输入的字符,然后进行比较和统计。

④设计一个动画程序。

设计思路:这个程序参考了网上的资料,没有什么新意,是小鸟的图形,可以用上下左右键进行移动,可以退出。

步骤:首先设置堆栈段,数据段,代码段,设置显示方式等一些属性,设置背景色,设置小鸟的初始位置以及写出小鸟图形的像素的点。功能性的语句是,用键盘接受一个输入,将其与1bh比较,用JZ语句跳转到退出。若不是便与48h比较,看是否为向上,是则跳转到相应语句,不是则继续与50h比较;,看是否向下,是则跳转到关于向下移动的相关语句,否则再与4bh比较,看是否向左,依次类推,根据键盘输入的上下左右跳转到不同的语句。再将小鸟的位置进行与上下左右键的输入相应的移动。

最后编写好退出语句。

2、硬件接口主要是了解8255与8253的功能,以及控制字。①I/O地址译码

只要对硬件概念清晰,很简单的。基本上没有什么创造性。收获:熟悉实验箱结构,了解每部分元件和标注的意义。掌握I/O地址译码电路的工作原理。②可编程定时器8253 1,对照实验电路图,将计数器0设置为方式0,即数初值设为N(N<0fh),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并用逻辑笔观察OUT0点平变化。

2,将计数器0、计数器1分别设置为方式3,计数初值设为1000用逻辑笔观察out1输出电平的变化。

收获:掌握8253的基本工作原理和编程方法

③并行接口8255 1,试验电路如图所示,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。3,数码管静态显示:按下图接好电路,将8255A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接5V(选中),S0和dp接地(关闭)。编程从键盘输入一位十进制数(0-9),在七段数码管上显示。

4,数码管动态显示:按下图接好电路,七段数码管的连接不变,位码驱动输入端S1、S0接8255 C口的PC1和PC0。编程在两个数码管上显示“56”。

动态显示时,先送“5”的段码送A口,再送02h到C口为位码;经一定延时后,送“6”的段码送A口,再送01h到C口为位码。循环完成,可以显示数码。5,数码管动态显示(选做):同图接好电路,编程在两个数码管上显示循环显示“00-99”。只要搞清楚各个口的地址,以及选择适当的控制字,其实很简单的。

收获:掌握8255的基本工作原理和编程方法,对方式0的认识加深了。

二、试验中遇到的问题 1在编写程序时,我深深体会到,画程序框图的重要性,每一步跳转的条件一定要搞清楚,Y和N不能搞反了,否则就错了。

2实验2,里面涉及的寄存器很多,很容易就会用乱了,还是很需要注意的。3比如那个小鸟动画的题目,当时在控制左右移动的时候,选择的起始位置的语句没写对位置,每次按一个移位的键以后,都从最初的初始位置向某个方向移动。

4硬件方面的,一开始没搞懂地址什么意思,所以连线时很懵懂,后来清楚了,发现就没什么了。

三、心得感受

微机原理与接口技术的课程实验历时大半个学期,通过自己编写、运行程序,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。

前四个简单程序设计,加深了我们对初学的汇编语言指令的熟悉和理解,汇编语言直接描述机器指令,比机器指令容易记忆和理解。通过学习和使用汇编语言,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了我们的创造才能。

后面几个实验是并行输入输出接口8255和计数器8253的功能的操作,加深了我们对硬件的熟悉,锻炼了动手能力,发挥创造才能。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在自己的思考以及和同学的讨论中,终于迎刃而解。

第五篇:北京邮电大学 微机原理软件实验3

北京邮电大学

微机原理软件实验·第三次实验

题目一:

一、实验目的1、2、初步掌握中断程序的设计方法;

初步掌握修改 DOS 系统中断,以适应实际使用的方法。

二、实验内容

编一程序,在显示器上显示时、分、秒。借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。在中断服务程序中管理刷新时、分、秒。

要求:

1、输入文件名(如:CLK)后清屏后显示:

2、Current time is: xx:xx:xx(时分秒键盘输入)

3、打回车,时、分、秒开始计时。时钟不停的刷新。

4、当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。

提示:

8253的初始化程序段可借用。口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,输出方波频率为100Hz,其周期为1000/100=10ms。

三、设计思路

1、开始程序流程图

重新在屏幕上打印时间是判断键盘缓冲区有无按键按下定义数据段和堆栈段回车是否按下判断内存中的时间是否被修改保存源中断向量否是秒表功能否否将timer子程序地址设置为中断向量显示字符串:“Now the time is:”是判断“S”是否按下否设置8253工作状态,使其输出方波100Hz判断设定时间是否符合规范否输出一条错误信息判断Ctrl+C是否按下是设置8259A工作状态输出一条提示信息,要求用户设定时间是退出程序

2、中断子程序流程图

子程序开始记下进入中断的次数判断次数是否为100是计数清零,修改内存中存储的时间查看是否有进位否进位调整结束

3、可能用到的指令

① STI 置中断允许位.CLI 清中断允许位.格式:CLI STI 功能:开关中断允许标志,用于在程序中防止中断嵌套,设置中断。

② STOS(STOre into String)存入串指令 格式:STOS DST STOSB //存放字节串(DI)= AL STOSW //存放字串(DI)= AX 执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字单元中,并根据DF值修改及数据类型修改DI的内容。字节操作:((DT))←(AL),(DI)←(DI)±1

4、① 字操作:((DI))←(AX),(DI)←(DI)±2无条件转移指令

IN输入指令

长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)<-(PORT)(字节)(AX)<-(wPORT+1,PORT)(字)短格式为:IN AL,DX(字节)IN AX,DX(字)

OUT输出指令

长格式为:OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作:(PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为:OUT DX,AL(字节)OUT DX,AX(字)执行的操作:((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)

设置中断向量 格式:

mov al,8 mov ah,25h int 21h DS:DX=中断向量 AL=中断类型号

查看中断向量 格式:

mov al,8

mov ah,35h AL=中断类型 ES:BX=中断向量

计数器芯片8253简介 初始化

使用8253前,要进行初始化编程。初始化编程的步骤是:

A向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。B 向使用的计数器端口写入计数初值。

② 8253控制字

D7D6=00:使用0号计数器,D7D6=01:使用1号计数器

D7D6=10:使用2号计数器,D7D6=11:无效 D5D4=00:锁存当前计数值

D5D4=01:只写低8位(高8位为0),读出时只读低8位 D5D4=10:只写高8位(低8位为0),读出时只读高8位 D5D4=11:先读/写低8位,后读/写高8位计数值

D3D2D1=000:选择方式0,D3D2D1=001:选择方式1 D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3 D3D2D1=100:选择方式4,D3D2D1=101:选择方式5 D0=0:计数初值为二进制,D0=1:计数初值为BCD码数

四、源程序

data segment count100 db 100

;100个10ms=1s,此处count100起计数作用 msg1 db 'Please enter the current time(XX:XX:XX)!(Press ENTER to use default time)$' msg2 db 'Sorry,your date entered incorrectly ,please try again!$' msg3 db 'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press Enter to use as a Stopwatch.)',0ah,'(Press S or s to set current time again.)(XX:XX:XX)$' msg4 db 0ah,'Program EXIT normally.$' tenhour db '0';小时十位数 hour db '0',':';小时个位数 tenmin db '0';分钟十位数 minute db '0',':';分钟个位数 tensec db '0';秒十位数 second db '0’;秒个位数 data ends

stack segment stack 'stack' db 256 dup(0)stack ends

code segment assume cs:code,ds:data,es:data

start: mov ax,seg data mov es,ax mov ds,ax

cli;使中断标志IF=0 mov al,8;保存源中断向量 mov ah,35h int 21h push es push bx

mov ax,0

mov es,ax;es置零,这是准备中断向量的写入 mov di,20h

mov ax,offset timer;中断子程序timer的偏移量 stows

;字符串填充,将AX的内容

;(timer偏移量)存入di所指向的单元,;di的增减取决于DF,默认段基址总是ES mov ax,cs

stosw;timer端基址

mov al,36h

out 43h,a;设置8253控制字为36H

mov bx,11932

;分频系数为11932,分频结

;果1.1932MHz/11932=100Hz,10ms变化一次

mov al,bl;分两次设置分频系数 out 40h,al

mov al,bh out 40h,al

mov al,0fch;主PIC端口设置为0fch out 21h,al

sti;开中断,允许外部中断

mov ax,seg data mov es,ax mov ds,ax

mov dx,offset msg1;打印提示信息1 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h

settime:mov si,offset tenhour;设定时间 mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2;如果输入不合法,报错 cmp al,'3' jnc error2 mov [si],al inc si cmp al,'2' jz ershi

mov ah,01h;如果小时高位为1,;低位可以设置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'9'+1 jnc error2 mov [si],al inc si jmp fen

ershi: mov ah,01h;如果小时高位为2,低位可以设置0~4 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'4' jnc error2 mov [si],al inc si jmp fen

fen: mov ah,01h;分高位可设置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si

mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si

zcy4: mov ah,01h;分低位0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si jmp zcy

settime2:jmp settime;用来跳转接力 error2: jmp error1 forever1:jmp next2

zcy: mov ah,01h;秒高位可设置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si

mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si

mov ah,01h;秒低位可设置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si

jmp next2

error1: mov dl,0ah;用来报错:设置时间不合法 mov ah,02h int 21h

mov dx,offset msg2;打印提示信息2 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h

jmp settime

settime3: jmp settime2;跳转接力

next2: MOV AX,0003H;做时钟显示初始化 INT 10H;清屏显示 mov dl,0ah mov ah,02h int 21h mov dx,offset msg3;打印提示信息3 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h forever:mov bx,offset tenhour;这个程序段循环执行 mov cx,8 cmp tenhour,'2';如果超过24点,置为0点 jnz dispclk cmp hour,'4' jnz dispclk mov tenhour,'0' mov hour,'0' dispclk:mov dl,[bx];用来显示当前时间 call dispchar inc bx loop dispclk

;调用显示子程序,显示初始状态时间,;比如”11:11:11"

mov dl,0dh;输出一个换行 call dispchar

xor al,al;读键盘缓冲区 mov ah,0bh int 21h cmp al,0FFH jnz next3 mov ah,08h;取其字符 int 21h cmp al,03h;Ctrl+C退出 jz stop cmp al,'s';S/s设定时间 jz settime3 cmp al,'S' jz settime3 cmp al,0dh jnz next3 mov dl,0ah;回车则使用秒表功能 mov ah,02h int 21h jmp forever

next3: mov al,second

next: cmp al,second;判断second是否发生变化je next;如果没有,循环比较

jmp forever;如果有变化,刷新输出

stop: mov dx,offset msg4;打印提示信息4 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h

pop dx;恢复中断向量 pop ds mov al,8 mov ah,25h int 21h mov ah,4ch int 21h

timer proc far;中断程序timer push ax

dec count100;计数100次

jnz timerx;如果计数小于100,跳出中断 mov count100,100

;否则重置count100<=100;1s已经到达

inc second;加一秒 cmp second,'9'

;判断大小,用于进位,以下原理相同 jle timerx

mov second,'0' inc tensec cmp tensec,'6' jl timerx

mov tensec,'0' inc minute cmp minute,'9' jle timerx

mov minute,'0' inc tenmin cmp tenmin,'6' jl timerx

mov tenmin,'0' inc hour cmp hour,'9' ja adjhour cmp hour,'3' jnz timerx

cmp tenhour,'1' jnz timerx mov hour,'1' mov tenhour,'0'

jmp short timerx;段内短转移

adjhour:inc tenhour mov hour,'0' timerx: mov al,20h out 20h,al;主PIC口地址 pop ax;出栈恢复 iret;中断返回 timer endp

dispchar proc near;显示子函数 push bx mov bx,0 mov ah,02h

int 21h

;DOS功能调用,输出DL内容 pop bx ret

dispchar endp

code ends end start

五、实验结果(反色)

这幅图是运行程序之后,设定时间,输入的时间不合法的截图。当输入不合法的字符时,对弹出一条错误信息,然后要求重新输入时间。

这幅图是输入一个合法字符串后,时钟被设定为该值,并且正常计数的程序截图。

这幅图是在时钟运行的过程中,按下Enter键,进入秒表模式的截图。秒表模式,会将按下Enter的时间保存下来。

这幅图是在时钟运行的过程中,按下S键,进入设定模式的截图。该截图输入字符串不合法。当输入合法的字符串后,程序将清屏,这是截图和正常计时状态一样。

这幅图是按下Ctrl+C,程序正常退出的截图。程序正常退出后,与之前的运行情况完全一样,程序运行不死机。

六、实验总结:

这次微原实验是我设计比较大型的汇编程序,从如何使用8253/8255开始,到程序被完整调通为止,这个实验带给我的是对于课本第七章、第八章的知识更加清晰的认识与了解,和对于微机运行的原理的进一步认识。在这次实验中,我都要求自己先做整体思路规划,再去做代码实现,这样节省了我大量时间。也给我带来了很多收获。

整体的思路规划:我认识到,相比于直接闷头就上的编程方法,有一个好的整体思路规划,会节省很多后期的力气,对于任务的完成大有裨益。

严谨认真的代码风格:汇编语言的编译器不如C++等高级语言,当程序出错时,并不会给出错误。我们要有严谨的代码风格,才能保证效率。

学会调试:汇编语言的编译器较差,当程序出错时,我们要善用DEBUG工具,去认真地分析程序的每一部动向,找到问题所在。

回归课本基本概念:在编程的过程中,曾经出过一个bug,总是无法正常的进入计时中断Timer。经过我查阅课本,发现是8253的控制字设置有问题。这说明我对课本的内容掌握的还不够好,应该多多回归课本基本概念,才可以顺利的编程。

下载微机原理实验三子程序设计实验word格式文档
下载微机原理实验三子程序设计实验.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    【微机实验】2018东南大学微型计算机原理及应用实验二

    实验二 基本算术和逻辑运算 学院:信息科学与工程学院 姓名:周信元学号:04016523 实验日期:2018.4.4 一、实验目的 1.熟悉算术和逻辑运算指令的功能。 2.进一步了解标志寄存器各......

    (语言、微机原理及接口技术)实验交通灯

    课程设计说明书课程设计名称:微机原理与接口技术课程设计课程设计题目:微机打印口外接交通灯模拟LED显示器学院名称:信息工程学院专业:计算机科学与技术班级:学号:姓名:评分:教师:201......

    微机硬件实验心得

    实训四底板LED点阵控制实训个人总结 通过led点阵实验的实践,使我在理论的基础上更深刻的掌握了嵌入式系统的深层内容及实际生活中的应用,实践锻炼了自己动手能力和思维能力,还......

    微机实验指导书20160425(本站推荐)

    实验一 汇编语言程序设计(分支/循环) 1. 实验目的: 熟悉8088/8086指令系统 了解程序设计过程 掌握汇编语言程序设计和调试方法 2. 实验内容 上机任务1: ① 熟悉进入......

    2013微机原理课综合实验题目及要求5篇

    计算机原理及接口技术综合实验 2011320601-02班 计算机原理及接口技术课程综合实验一、综合实验的目的 通常,学习知识是由浅入深、由此及彼,一点点的学习和积累的,而应用知识则......

    化工原理实验

    吸收实验 ? 一、 实验目的 1、? 熟悉填料吸收塔结构和流程 2、? 观察填料塔流体力学状况,测定压降与气速的关系曲线 3、? 掌握气相总体积系数kYa和气相总传质单元高度HOG的测......

    实验二 定时器程序设计121

    一、 实验目的学会使用单片机定时器产生定时中断,并利用定时中断产生更长时间延时。二、实验设备及器件 IBM PC机一台 DP-51PRO.NET单片机仿真器、编程器、实验仪三合一综......

    UML程序设计实验指导书

    《UML程序设计》 实验指导教程 适合专业:计算机类专业 浙江树人大学信息科技学院 2016.02 课程与实验综述 第一部分实验综述 一.课程简介及实践要求: 《UML程序设计》是以介绍......