51系列单片机汇编语言程序设计方法-出版社_第1页
51系列单片机汇编语言程序设计方法-出版社_第2页
51系列单片机汇编语言程序设计方法-出版社_第3页
51系列单片机汇编语言程序设计方法-出版社_第4页
51系列单片机汇编语言程序设计方法-出版社_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章51系列单片机汇编语言程序设计方法,4.1单片机系统程序结构及设计过程,MCS-51单片机的汇编程序由主程序、若干个子程序和中断服务程序等构成。,1、主程序,主程序一般是由一些顺序程序组成的,主程序的结构与单片机应用系统及编程者的习惯有关。一般在进入主程序后都要根据实际要求对所用的可编程的硬件资源进行初始化。主程序必须是一个无限循环程序。,2、子程序,在程序设计中,往往要在很多地方要执行同样的任务,但程序并不很规则,无法用循环程序来实现,这时就可以将通用的任务设计成子程序。子程序由子程序名、具体功能程序、子程序返回组成。子程序名在一个单片机程序中是唯一的,不能重复。子程序调用由主程序执行

2、LCALL或ACALL指令产生,返回由RET指令完成。,4.1单片机系统程序结构及设计过程,3、中断服务程序,在使用某一中断时,在中断开放状态下,一旦具备中断条件,无论程序运行到何处,程序将立即转入其相应中断的入口地址,在入口地址安排一条无条件转移指令,转到相应的中断服务程序,中断服务程序执行完后,由中断返回指令RETI返回断点处。,4.1单片机系统程序结构及设计过程,MCS-51单片机的程序总体结构,程序从存储器的0000H开始执行,0003H、000BH、0013H、001BH和0023H分别是外部中断0、定时器0、外部中断1、定时器1和串行接口的中断入口地址。一般情况下,主程序安排在00

3、30H之后的程序存储器中。主程序是必须的,而子程序及中断服务程序则根据具体系统可有可无。,4.1单片机系统程序结构及设计过程,3、中断服务程序,例4.1下面是一个汇编程序的结构片段,4.1单片机系统程序结构及设计过程,用汇编语言编写程序时,一般应分为以下几个步骤。,分析任务,确定算法或解题思路。首先应根据所要解决的实际问题仔细分析,明确问题的要求。根据要求和指令系统的特点,找出合理的算法或思路。制定程序流程图。根据所选的算法,制定出运算步骤和顺序,把运算过程画成程序流程图。流程图可以直观地表达程序的执行过程和编程者的思路,有助于阅读程序、发现问题、减少错误。确定数据格式。合理地选择和分配内存单

4、元以及工作寄存器。根据程序流程图编写程序。上机调试程序。将编好的源程序进行汇编,并执行目标程序,检查和修改程序中的错误,并优化程序,缩短程序量、减少运算时间和节省工作单元。,4.2顺序程序结构设计,顺序结构程序的特点是最简单、最基本的程序。程序按编写的顺序依次往下执行每一条指令,直到最后一条。,例4.2设6位十进制被加数存放在32H30H中(十进制数的高位存在地址的高位,低位存在地址的低位),6位十进制加数存放在42H40H中,试编写程序完成6位十进制加法程序,结果存于52H50H。,MOVA,30HADDA,40HDAAMOV50H,AMOVA,31HADDCA,41HDAAMOV51H,A

5、MOVA,32HADDCA,42HDAAMOV52H,A,4.2顺序程序结构设计,例4.3将片内RAM的30H单元中的2位压缩BCD码转换成二进制数送到片内RAM的40H单元中。,ORG0000HSTART:MOVA,30HANLA,#0F0HSWAPAMOVB,#0AHMULABMOVR0,AMOVA,30HANLA,#0FHADDA,R0MOV40H,ASJMP$END,4.3分支程序结构设计,分支结构程序的特点:含有转移指令。根据不同的条件,程序的流向有两个或两个以上出口。,分支程序的设计要点如下:,建立可供条件转移指令测试的条件;选用合适的条件转移指令;在转移的目的地址处设定标号。,4

6、.3分支程序结构设计,4.3.1基本分支程序结构设计,例4.4求符号函数的值。已知片内RAM的40H单元内有一自变量X,编制程序按如下条件求函数Y的值,并将其存入片内RAM的41H单元中。,ORG0000HSTART:MOVA,40HJZCOMPJNBACC.7,POSTMOVA,#0FFHSJMPCOMPPOST:MOVA,#01HCOMP:MOV41H,ASJMP$END,X为正数,X为负数,X为正数,4.3分支程序结构设计,4.3.1基本分支程序结构设计,散转移程序是一种并行分支程序(即多分支程序),是根据某种输入或运算结果,分别转向各个处理程序。在MCS-51单片机中采用JMPA+DP

7、TR指令来实现程序的散转移。转移的地址最多为256个。,4.3分支程序结构设计,4.3.1基本分支程序结构设计,散转移程序的设计方法:,应用转移指令表实现的散转移程序。,例4.5假设R3内存放的是分支子程序的序号00H7FH,编写JMP_128程序实现根据入口条件转移到128个目的地址,JMP_128:MOVA,R3RLAMOVDPTR,#JMPTABJMPA+DPTRJMPTAB:AJMPROUT00AJMPROUT01AJMPROUT7F,4.3分支程序结构设计,4.3.1基本分支程序结构设计,散转移程序的设计方法:,应用地址偏移量表实现的散转移程序。,例4.6设R3中存放了入口条件03,

8、R0指向RAM的低8位地址,R1指向RAM的高8位地址,根据入口条件编程实现转向4个分支程序,执行不同的分支程序后,累加器A中的内容为读取到的数。,4.3分支程序结构设计,4.3.1基本分支程序结构设计,散转移程序的设计方法:,应用转向地址表实现的散转移程序。,例4.7假设常数表TAB中存放的是各个分支程序的入口地址,A中存放的是分支程序的序号,编程实现采用JMPA+DPTR指令跳转至相应分支程序。,4.3分支程序结构设计,4.3.1基本分支程序结构设计,散转移程序的设计方法:,应用RET指令实现的散转移程序。,例4.8设入口R3存放了转移目的地址的序号(00HFFH),出口SP中的内容是以当

9、前栈顶内容为转移子程序的入口地址(高位),根据入口条件转移到256个目的地址。,4.4循环程序结构设计,循环程序一般由下面四部分组成。,循环初始化:位于循环程序开头,用于完成循环前的准备工作,例如,设置各工作单元的初始值以及循环次数;循环体:循环程序的主体,位于循环程序的工作程序,在执行中会被多次重复使用。要求编写得尽可能简练,以提高程序的执行速度;循环控制:位于循环体内,一般由循环次数修改、循环修改和条件语句等组成,用于控制循环次数和修改每次循环时的参数;循环结束:用于存放执行循环程序所得的结果,以及恢复各工作单元的初值。,4.4循环程序结构设计,循环程序的结构:,先循环处理,后循环控制(即

10、先处理后控制),先循环控制,后循环处理(即先控制后处理),4.4循环程序结构设计,4.4.1单重循环程序,例4.9已知片内RAM的30H3FH单元中存放了16个二进制无符号数,编写程序求它们的累加和,并将其和数存放在R4、R5中。,ORG1000HSTART:MOVR0,#30HMOVR2,#10HMOVR4,#00HMOVR5,#00HLOOP:MOVA,R5ADDA,R0MOVR5,ACLRAADDCA,R4MOVR4,AINCR0DJNZR2,LOOPSJMP$END,4.4循环程序结构设计,4.4.2多重循环程序,例4.10编程设计50ms延时子程序,假设晶振频率fosc=12MHz。

11、,DELAY:MOVR7,#200DLY1:MOVR6,#123DLY2:DJNZR6,DLY2NOPDJNZR7,DLY1RET,4.4.3已知循环次数结构程序设计(略)如例4.9和4.10,4.4循环程序结构设计,4.4.4未知循环次数结构程序设计,例4.11设在外部RAM中有一个ASCII字符串,它的首地址在DPTR中,字符串以0结尾。现在要求用串行口把它发送出去。已知串行口已经初始化(TI初值置为1)。,SOUT:MOVXA,DPTRJNZSOT1RETSOT1:JNBTI,SOT1CLRTIMOVSBUF,AINCDPTRSJMPSOUT,4.4循环程序结构设计,编写循环程序时应注意

12、以下几个问题:,循环程序是一个有始有终的整体,它的执行是有条件的,所以要避免从循环体外部直接转到循环体内部;多重循环程序是从外层向内层一层一层进入,循环结束时是由内层到外层一层一层退出的。在多生循环中,只允许外重循环嵌套内重循环,不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部;编写循环程序时,首先要确定程序结构,处理好逻辑关系。一般情况下,一个循环体的设计可以从第一次执行情况入手,先画出重复执行的程序框图,然后再加上循环控制和置循环初值部分,使其成为一个完整的循环程序;循环体是循环程序中重复执行的部分,应仔细推敲,合理安排,应从改进算法、选择合适的指令入手对其进行优化,以达到缩

13、短程序执行时间的目的。,4.5子程序设计及参数传递方法,主程序与子程序的关系,4.5子程序设计及参数传递方法,子程序具有如下4个特点:,重复性。通用性。可浮动性。可递归和可重入性。,4.5子程序设计及参数传递方法,1、子程序的调用,当主程序执行ACALL或LCALL指令后,单片机首先将当前PC值(即调用指令的下一条指令的首地址)压入堆栈保存(低8位PCL先入栈,高8位PCH后入栈),然后将子程序的入口地址送入PC,转去执行子程序。子程序入口地址是指子程序的第一条指令地址,常用标号表示。,2、子程序的返回,子程序执行到RET指令后,将压入堆栈的断点地址弹出给PC(即将保存的原PCH出栈,后将原P

14、CL出栈),使程序回到原先被中断的主程序地址(断点地址),继续执行。主程序的断点地址是指子程序执行完毕后,返回主程序的地址称为主程序的断点地址,它在堆栈中保存。,4.5子程序设计及参数传递方法,3、现场保护和恢复,保护现场,主程序转入子程序后,保护主程序的信息不会在运行子程序时丢失的过程称为保护现场。保护现场通常在进入子程序的开始时,由堆栈完成。,PUSHPSWPUSHACC,恢复现场,从子程序返回时,将保存在堆栈中的主程序的信息还原的过程称为恢复现场。恢复现场通常在从子程序返回之前将堆栈中保存的内容弹回各自的寄存器。,POPACCPOPPSW,4.5子程序设计及参数传递方法,4、子程序的嵌套

15、,在子程序中若再调用子程序,称子程序的嵌套,4.5子程序设计及参数传递方法,1、用工作寄存器或累加器来传递参数,这种方法就是把入口参数或出口参数放在工作寄存器或累加器中。,例4.12累加器ACC内的一个十六进制数的ASCII字符转换为一位十六进制数存放于A。,ASCH:CLRCSUBBA,#30HCJNEA,#10,$+3JCAH10SUBBA,#07AH10:RET,4.5子程序设计及参数传递方法,2、用指针寄存器来传递参数,一般如果参数在内部RAM中,可用R0或R1作指针;参数在外部RAM或程序存贮器中,可用DPTR作指针。可变长度运算时,可用一个寄存器来指出数据长度,也可在数据中指出其长

16、度,例4.13将R0和R1所指向的内部RAM中两个3字节无符号整数相加,结果送R0所指向的内部RAM中。入口时,R0、R1分别指向加数和被加数的低位字节(高位字节存在低地址单元),出口时R0指向结果的高位字节。,NADD:MOVR7,#3CLRCNADD1:MOVA,R0ADDCA,R1MOVR0,ADECR0,DECR1DJNZR7,NADD1INCR0RET,4.5子程序设计及参数传递方法,3、用堆栈来传递参数,堆栈可以用于传递参数。调用时,主程序可用PUSH指令把参数压入堆栈中。以后子程序可按栈指针来间接访问堆栈中的参数,同时可把结果参数送回堆栈中。返回主程序后,可用POP指令得到这些结

17、果参数。,例4.14一位十六进制的数转换为ASCII码子程序,HASC:MOVR0,SPDECR0DECR0;R0为参数指针XCHA,R0;保护ACC,取出参数ANLA,#0FH;只取(A)03ADDA,#2;加偏移量MOVCA,A+PCXCHA,R0;查表结果放回堆栈并恢复ACCRETDB0123456789;十六进制数的ASCII字符表DBABCDEF,4.5子程序设计及参数传递方法,3、用堆栈来传递参数,例4.15把内部RAM中50H,51H的双字节十六进制数转换为4位ASCII码,存放于R1所指向的4个内部RAM单元,我们可以用如下所示的方法调用例4.14中的子程序。,调用HASC子程

18、序运行结果,4.5子程序设计及参数传递方法,3、用堆栈来传递参数,例4.16一个字节单元中的2位十六进制数转换为两个ASCII码子程序。,4.5子程序设计及参数传递方法,3、用堆栈来传递参数,例4.17将内部RAM中50H,51H中的内容以4位十六进制数的ASCII形式在串行口发送出去,可如下调用HTA2程序。,4.5子程序设计及参数传递方法,4、程序段参数传递,如果需要大量参数,并且这些参数均为常数时,程序段参数传递方法(有时也称为直接参数传递)是传递常数的有效方法。调用时,常数作为程序代码的一部分,紧跟在调用子程序后面。子程序根据栈内的返回地址,决定从何处找到这些常数,然后在需要时,从程序

19、存贮器中读出这些参数。,例4.18字符串发送子程序,SOUT:POPDPHPOPDPLSOT1:CLRAMOVCA,A+DPTRINCDPTRJZSENDJNBTI,$CLRTIMOVSBUF,ASJMPSOT1SEND:JMPA+DPTR,下面从发送字符串AT89C52CONTROLLER为例,说明该子程序调用的方法.,MP1:ACALLSOUTDBAT89C52CONTROLLERDB0AH,0DH,0MP2:,4.5子程序设计及参数传递方法,4、程序段参数传递,采用程序段参数传递法发送字符串程序运行结果,4.5子程序设计及参数传递方法,4、程序段参数传递,上面这种子程序有几个特点:,它不

20、以一般的返回指令结尾,而是采用基寄存器加变址寄存器间接转移指令来返回到参数表后的第一条指令。一开始的两条POP指令已调整了堆栈指针的内容。它可适用于ACALL或LCALL,因为这两种调用指令均把下一条指令或数据字节的地址压入堆栈中。调用程序可位于程序存贮器地址空间的任何地方,因为该查表指令能访问所有64K字节。传递到子程序的参数可按最方便的次序列表,而不必按使用的次序排列。子程序在每一条MOVC指令前向累加器装入适当,这样基本上可“随机访问”参数。子程序只使用累加器A和数据指针DPTR,应用程序可以在调用前,把这些寄存器压入堆栈中来保护它们的内容。,4.6中断程序设计,4.6.1中断的初始化,

21、中断的初始化实际上就是对4个与中断有关的特殊功能寄存器TCON、SCON、IE和IP进行编程。初始化的主要步骤如下。,CPU开中断与关中断;相应中断显示目录请求的与禁止;各中断源优先级的设定;外部中断的触发方式设定。,例4.19请写出为边沿触发、高优先级的中断初始化程序,解:采用位操作指令SETBEX0SETBPX0SETBIT0SETBEA,解:采用字节操作指令MOVIE,#81HORLIP,#01HORLTCON,#01H,4.6中断程序设计,4.6.2中断服务程序,当CPU响应中断源的中断请求后,就把当前的PC值压入堆栈中,然后转到相应的中断服务程序入口处执行。在编写中断服务程序时,应注

22、意以下问题。,注意保护现场。对于在中断服务程序中用到的寄存器等资源应进行保护,以免执行完中断服务程序后,再执行原来的程序时出错;在中断服务程序中,及时清除那些不能被硬件自动清除的中断标志,以免产生错误的中断;中断服务程序中的压栈(PUSH)和弹出(POP)指令应成对使用,以确保中断服务程序执行完返回原来程序后能正确执行;主程序与中断服务程序间的参数传递和主程序与子程序间的参数传递相同。,4.6中断程序设计,4.6.3外部中断程序,例4.20如图所示,用中断的方式实现由按键S控制发光二极管LED。,ORG0000HAJMPSTARTORG0003HAJMPINT_0ORG0030HSTART:M

23、OVSP,#5FHMOVP1,#0FFHMOVP3,#0FFHSETBEASETBEX0AJMP$INT_0:PUSHACCPUSHPSWCPLP1.0POPPSWPOPACCRETIEND,S键断开,S键按下,,,4.6中断程序设计,4.6.4定时中断程序,例4.21利用定时/计数器T0的方式1,产生一个50Hz的方波,此方波由P1.0引脚输出,假设晶振频率为12MHz。,编程步骤如下。,确定定时器初值a,由于晶振为12MHz,即应将D8H送TH0中,F0H送入TL0中。,求T0的方式控制字TMOD,T0的方式1,方式控制字TMOD=01H,采用定时中断实现P1.0输出频率为50Hz的方波信

24、号结果,,,4.6中断程序设计,4.6.5串行中断程序,例4.22编制一个发送程序,将片内RAM中50H5FH的数据串行发送。串行口设定为工作方式2,TB8为奇偶校验位,采用中断方式。,采用串行中断将片内RAM中50H5FH的数据发送的结果图,,,4.7常用程序设计及调试实例,1、双字节数取补子程序,例4.23将(R4R5)中的双字节数取补结果送R4R5。,CMPT:MOVA,R5CPLAADDA,#1MOVR5,AMOVA,R4CPLAADDCA,#0MOVR4,ARET,给R4R5赋初值,双字节数求补运算结果,,,4.7常用程序设计及调试实例,2、双字节无符号数加减程序,例4.24将(R2

25、R3)和(R6R7)两个双字节无符号数相加,结果送R4R5。,NADD:MOVA,R3ADDA,R7MOVR5,AMOVA,R2ADDCA,R6MOVR4,ARET,,,4.7常用程序设计及调试实例,2、双字节无符号数加减程序,例4.25将将(R2R3)和(R6R7)两个双字节无符号数相减,结果送R4R5。,NSUB1:MOVA,R3CLRCSUBBA,R7MOVR5,AMOVA,R2SUBBA,R6MOVR4,ARET,,,4.7常用程序设计及调试实例,3、原码加减运算程序,对于原码表示的数,不能直接执行加减运算,必须先按操作数的符号决定运算方法,然后再对数值部分执行操作。,原码加减运算程序

26、图,,,4.7常用程序设计及调试实例,3、原码加减运算程序,例4.26(R2R3)和(R6R7)为两个原码表示的数,最高位为符号位,求(R2R3)(R6R7)结果送R4R5,按图4.7.2的程序框图,我们可以编写出下面的程序,DADD为原码加法子程序入口,DSUB为原码减法子程序入口。出口时CY=1发生溢出,CY=0为正常。,,,4.7常用程序设计及调试实例,3、原码加减运算程序,完成1F7AH-03B9H=1BC1H运算,完成03B9H-1F7AH=9BC1H运算,,,4.7常用程序设计及调试实例,3、原码加减运算程序,两个原码相加03B9H+FF7AH=FBC1H,,,4.7常用程序设计及调试实例,1、采用MOVCA,A+DPTR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论