END
显然,Al和A2经BIT语句定义后便作为位地址使用,其中A1的物理位地址是00H,A2的物理位地址是90H。但不是所有汇编程序都允许有BIT这条伪指令语句。在无BIT伪指令语句可用时,用户也可以采用EQU语句来定义位地址变量Al和A2,但EQU语句右边必须采用物理地址,而不应采用像P1.0那样的符号位地址。 2.3.3.2汇编语言源程序的设计与汇编
在单片机应用中,绝大部分实用程序都是采用汇编语句编写的。因此,汇编语言程序设计不仅关系到单片机控制系统的特性和效率,而且还与控制系统本身的硬件结构有关。为了编出质量高且功能强的实用程序,设计者一方面要正确理解程序设计的目标和步骤,另一方面还要掌握汇编语言源程序的汇编原理和方法,现就这两个关键问题作一概述。
(1) 汇编语言源程序的设计步骤 根据任务要求,采用汇编语言编制程序的过程称为汇编语言程序设计。一个应用程序的编制,从拟制设计任务书直到所编程序的调试通过,通常可以分成以下6步:
1)拟制设计任务书 这是一个收集资料和项目调研的过程。设计者应根据设计要求到现场进行实地考察,并根据国内外情况写出比较翔实的设计任务书,必要时还应聘请有关专家帮助论证。设计任务书应包括:程序功能、技术指标、精度等级、实施方案、工程进度、所需设备、研制费用和人员分工,等等。 2)建立数学模型 在弄清设计任务书的基础上,设计者应把控制系统的计算任务或控制对象的物理过程抽象并归纳为数学模型。数字模型是多种多样的,可以是一系列的数学表达式,也可以是数学的推理和判断,也可以是运行状态的模拟等。 3)确立算法 根据被控对象的实时过程和逻辑关系,设计者还必须把数学模型演化为计算机可以处理的形式,并拟制出具体的算法和步骤。同一数学模型,往往有几种不同的算法,设计者还应对各种不同算法进行分析和比较,从中找出一种切合实际的最佳算法。 4)绘制程序流程图 这是程序的结构设计阶段,也是程序设计前的准备阶段。对于一个复杂的设计任务,还应根据实际情况确定程序的结构设计方法(如模块化程序设计、自顶向下程序设计等),把总设计任务划分为若干子任务(即子模块),并分别绘制出相应的程序流程图。因此,程干流程图不仅可以体现程序的设计思想,而且可以使复杂问题简化并收到提纲挈领的效果。
5)编制汇编语言源程序 编制汇编语言源程序是根据程序流程图进行的,也是设计者充分施展才华的地方。但是,设计者应在掌握程序设汁的基本方法和技巧的基础上,注意所编程序的可读性和正确性,必要时应在程序的适当位置上加上注释。
6)上机调试 上机调试可以检验程序的正确性,也是任何有实用价值的程序设
- 46 -
计无法超越的阶段。因为任何程序编写完成后都难免会有缺点和错误,只有通过上机调试和试运行才能比较容易发现开纠正。
汇编语言程序设计的上述各步骤及其相互间的关系如图2-20所示。由图可见,编写好的程序在上机调试前必须汇编成目标机器码,以便在计算机上调试并运行。如果汇编不能通过.则说明源程序中有错或使用了不合法语句,调试者应根据汇编时指出的错误类型对被汇编源程序作出修改,直到可以通过汇编为止。汇编通过的源程序才能在机器上调试并执行,但上机调试不一定能够通过。调试不通过的原因可能有两条:一是程序中存在一般性的小问题,红过修改后便可通过;二是程序有大问题,必须更改程序流程图中其他部分才能上机调试通过。
各子模块分调完成后,还应逐步挂接其他子模块,以实现程序的联调。联调时的情况和分调时类似,也会发现和纠正不少错误。联调通过后的程序还必须试运行,即在所设计系统的硬件环境下运行。试运行应先在实验室条件下进行,然后才可以到现场进行。
图2-20 程序设计步骤流程图
- 47 -
上面介绍的是复杂程序设计问题,对于简单一些的程序设计问题,自然可以省略其中的某些步骤。
(2) 汇编语言源程序的汇编
前面已经谈到,汇编语言源程序在上机调试前必须翻译成目标机器码才能被CPU执行。这种能把汇编语言源程序翻译成目标代码的过程称为汇编。通常,汇编语言源程序的汇编可以分为人工汇编和机器汇编两类。两种汇编各有所长,读者应予掌握。 1)人工汇编
人工汇编是指人工直接把汇编语言源程序翻译成机器码的过程,有时也称为程序的人士“代真”。人工汇编常常作为机器汇编的补充,因为人工汇编只需一张指令码表以及一支笔和一张纸就可开展工作。
通常,源程序的人工汇编需要进行两次才能完成,只有无分支程序才可以一次完成。对于包含有转移指令和标号在内的汇编语言源程序,第一次汇编完成指令码的人工“代真”,第二次汇编完成地址偏移量的“代真”。 2) 机器汇编
人工汇编具有简单易行的优点,但它的效率低,出错率高,尤其在被汇编程序较长和较复杂时更是如此。因此,工程上的实用程序都是采用机器汇编来实现的。
图2-21 汇编程序的功能
机器汇编是一种用机器代替人脑的一种汇编,是机器自动把汇编语言源程序(助记符形式)翻译成目标代码的过程。这里,完成这一翻译工作的机器是系统机(如IBM-PC/386),给系统机输入源程序的(助记符形式)是人,完成这一翻译工作的软件称为“汇编程序”。因此,机器汇编实际上是通过执行“汇编程序”来对源程序进行汇编;机器汇编的原理与人工汇编类似,实际上是人工汇编的模拟,如图2-21所示。
“汇编程序”是一种系统软件,有时也称为工具软件,因机器而异,常由计算机厂家提供。
- 48 -
2.4 MCS-51 中断系统 2.4.1概述
中断是现代计算机必须具备的重要功能,也是计算机发展史上的一个重要里程碑。因此.建立准确的中断概念并灵活掌握中断技术是学好本门课程的关键问题之一。
2.4.1.1中断的定义和作用
中断是指计算机暂时停止原程序的执行转而为外部设备服务(执行中断服务程序),并在服务完成后自动返回原程序执行的过程。中断由中断源产生,中断源在需要时可以向CPU提出“中断请求”。“中断请求”通常是一种电信号,CPU一旦对这个电信号进行检测和响应便可自动转入该中断源的中断服务程序执行,并在执行完后自动返回原程序继续执行,而且中断源不同中断服务程序的功能也不同。因此,中断又可以定义为CPU自动执行中断服务程序并返回原程序执行的过程。
按照这一思想制成的现代计算机有以下优点: (1)可以提高CPU的工作效率
CPU有了中断功能就可以通过分时操作启动多个外设同时工作,并能对它们进行统一管理。CPU执行人们在主程序中安排的有关指令可以令各外设与它并行工作,而且任何一个外设在工作完成后(例如,打印完第一个数的打印机)都可以通过中断得到满意服务(例如,给打印机送第二个需要打印的数)。因此,CPU在与外设交换信息时通过中断就可以避免不必要的等待和查询,从而大大提高它的工作效率。
(2)可以提高实时数据的处理时效
在实时控制系统中,被控系统的实时参量、越限数据和故障信息必须为计算机及时采集、进行处理和分析判断,以便对系统实施正确的调节和控制。因此,计算机对实时数据的处理时效常常是被控系统的生命,是影响产品质量和系统安全的关键。CPU有了中断功能,系统的失常和故障就都可以通过中断立刻通知CPU,使它可以迅速的采集实时数据和故障信息,并对系统作出应急处理。
2.4.1.2中断源
中断源是指引起中断原因的设备或部件,或发出中断请求信号的源泉。弄清中断源设备可以有助于正确理解中断概念,这也是灵活运用CPU中断功能的重要方面。通常,中断源有以下几种: (1)外部设备中断源
外部设备主要为微型计算机输入和输出数据,故它是最原始和最广泛的中断源。在用作中断源时,通常要求它在输入或输出一个数据时能自动产生一个“中断请求”信号(TTL高电平或TTL低电平)送到CPU的中断请求输入线INT0或
INT1,以供CPU检测和响应。例如,打印机打印完一个字符时可以通过打印中
断请求CPU为它送下一个打印字符;人们在键盘上按下一个键符时也可通过键盘
- 49 -
中断请求CPU从它那里提取输入的键符编码。因此,打印机和键盘都可以用作中
断源。 (2)控制对象中断源
在计算机用作实时控制时,被控对象常常被用作中断源,用于产生中断请求信号,要求CPU及时采集系统的控制参量,越限参数以及要求发送和接收数据,等等。例如,电压、电流、温度、压力、流量和流速等超越上限和下限以及开关和继电器的闭合或断开都可以作为中断源来产生中断请求信号,要求CPU通过中断服务程序加以处理。因此,被控对象常常是用作实时控制的计算机的巨大中断源。 (3)故障中断源
故障源是产生故障信息的源泉,把它作为中断源是要CPU以中断方式对已发生的故障进行分析处理。计算机故障中断源有内部和外部之分:CPU内部故障源引起内部中断,如被零除中断等;CPU外部故障源引起外部中断,如断电中断等。在掉电时,掉电检测电路检测到它时就自动产生一个掉电中断请求,CPU检测到后,便在大滤波电容维持正常供电的几秒钟内,通过执行掉电中断服务程序来保护现场和启用备用电池,以便市电恢复正常后继续执行掉电前的用户程序。 和上述CPU故障中断源类似,被控对象的故障源也可用作故障中断源,以便对被控对象进行应急处理,从而可以减少系统在发生故障时的损失。 (4)定时脉冲中断源
定时脉冲中断源又称为定时器中断源,实际上是一种定时脉冲电路或定时器。定时脉冲中断源用于产生定时器中断,定时器中断有内部和外部之分。内部定时器中断由CPU内部的定时器/计数器溢出(全“1”变全“0”)时自动产生,故又称为内部定时器溢出中断;外部定时器中断通常由外部定时电路的定时脉冲通过CPU的中断请求输入线引起。不论是内部定时器中断还是外部定时器中断都可以使CPU进行及时处理,以便达到时间控制的目的。
2.4.1.3 中断分类
中断按照功能通常可以分为可屏蔽、非屏蔽和软件中断三类。现在它们的工作特点分析如下: (1) 可屏蔽中断
可屏蔽中断是指CPU对中断请求输入线上的中断请求是可以控制(或屏蔽)的,这种控制通常可以通过中断控制指令来实现。CPU可以通过预先执行一条开中断指令来响应来自中断请求输入线上的低电平中断请求,也可以通过预先执行一
- 50 -