【大学课件】MCS51单片机指令系统与汇编语言程序设计_第1页
【大学课件】MCS51单片机指令系统与汇编语言程序设计_第2页
【大学课件】MCS51单片机指令系统与汇编语言程序设计_第3页
【大学课件】MCS51单片机指令系统与汇编语言程序设计_第4页
【大学课件】MCS51单片机指令系统与汇编语言程序设计_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

1、2.3.5 2.3.5 位操作指令位操作指令 位操作(布尔变量操作)位操作(布尔变量操作):操作数不是字节,而是字节中的某操作数不是字节,而是字节中的某个位。每位的取值只能取个位。每位的取值只能取0或或1。 指令的寻址范围:指令的寻址范围:片内片内ram位寻址区位寻址区20h2fh, sfr中中的的11个可位寻址特殊寄存器中的个可位寻址特殊寄存器中的83个可寻址位。个可寻址位。 特点:特点:以进位标志以进位标志cy作为位累加器,可以实现布尔变量的传作为位累加器,可以实现布尔变量的传送、运算和控制转移等功能。送、运算和控制转移等功能。 指令中的位地址的表达方式:指令中的位地址的表达方式:直接地址

2、方式(如直接地址方式(如0afh)、特)、特殊功能寄存器名殊功能寄存器名.位序号(如位序号(如psw.3)、字节地址)、字节地址.位序号(如位序号(如0d0h.0)、位名称方式(如)、位名称方式(如f0)和用户定义名称等几种方式。)和用户定义名称等几种方式。 http:/ 位数据传送指令位数据传送指令(2条)条)特点:特点:在可寻址位与位累加器在可寻址位与位累加器cy之间进行的。不能在两个可寻之间进行的。不能在两个可寻址位间直接进行传送。址位间直接进行传送。 指令格式:指令格式:mov c, bit ;(cy)(bit) mov bit, c ;(bit) (cy) 例:例: 比较比较 mov

3、 a, 20h ;片内片内ram 20h单元内容送单元内容送a,传送,传送8位二进制数位二进制数 mov c, 20h ;位地址为位地址为20h的位送的位送c,传送,传送1位二进制数位二进制数p71 例例2.55 desthttp:/ 位逻辑操作指令位逻辑操作指令(6条)条)n指令格式:指令格式:操作码操作码 c , 其中:操作码包括其中:操作码包括anl、orl ; 包括包括bit、bit。 cpl ; dest 包括包括cy、 bit。功能:功能:位逻辑操作指令用于位逻辑操作,还可用于位逻辑操作指令用于位逻辑操作,还可用于对组合逻辑电路的模拟。采用位操作指令进行组对组合逻辑电路的模拟。采用

4、位操作指令进行组合逻辑电路的设计比采用字节型逻辑指令节约存合逻辑电路的设计比采用字节型逻辑指令节约存储空间,运算操作十分方便。储空间,运算操作十分方便。p71 例例2.56http:/ 位状态(置位、清位状态(置位、清0)控制指令)控制指令(4条)条) 指令格式:指令格式:clr ; 0 setb ; 1 其中:其中:包括包括cy、 bit。4. 位条件(控制)转移指令位条件(控制)转移指令(5条)条) 特点:特点:以位的状态作为实现程序转移的判断条件。以位的状态作为实现程序转移的判断条件。指令格式:指令格式:(1 1)以进位标志位)以进位标志位cycy内容为条件的转移指令内容为条件的转移指令

5、 jc rel ; 若若(cy )=1,则转移,则转移(pc)(pc)+2+rel , 否则顺否则顺序执行序执行 jnc rel ; 若若(cy )=0,则转移,则转移(pc)(pc)+2+rel , 否则否则顺序执行顺序执行http:/ 2)以位地址)以位地址bitbit内容为条件的转移指令内容为条件的转移指令指令格式:指令格式:jb bit, rel ; 若若(bit)=1,则转移,则转移(pc) (pc)+3+rel,否则顺序执行否则顺序执行 jnb bit, rel ; 若若(bit)=0,则转移,则转移(pc) (pc)+3+rel,否则顺序执行否则顺序执行 jbc bit, rel

6、 ; 若若(bit)=1,则转移,则转移(pc) (pc)+3+rel,且且(bit )0, 否则顺序执行否则顺序执行 http:/ 例2.58 org 0100h mov dptr,#data mov r0,#30h mov r1,#40hloop: movx a,dptr cjne a,#0dh,loop1 sjmp $loop1:jb acc.7,loop2 mov r0,a inc r0 inc dptr ajmp looploop2: mov r1,a inc r1 inc dptr ajmp loop endhttp:/ 汇编语言及程序设计汇编语言及程序设计 程序设计:程序设计:就

7、是编制计算机的程序,即应用计算机所能识别的、就是编制计算机的程序,即应用计算机所能识别的、接受的语言把要解决的问题的步骤有序地描述出来。接受的语言把要解决的问题的步骤有序地描述出来。 程序设计语言的种类:程序设计语言的种类:(1 1)机器语言)机器语言:机器语言是用二进制代码表示的计算机惟一能机器语言是用二进制代码表示的计算机惟一能识别和执行的最原始的程序设计语言。识别和执行的最原始的程序设计语言。 (2 2)汇编语言)汇编语言:利用指令助记符来描述的利用指令助记符来描述的程序设计语言。程序设计语言。(3 3)高级语言)高级语言:高级语言接近于人的自然语言,是面向过程而高级语言接近于人的自然语

8、言,是面向过程而独立于机器的通用语言。独立于机器的通用语言。汇编语言的指令类型汇编语言的指令类型: mcs-51mcs-51单片机汇编语言,包含两类不同性质的指令。单片机汇编语言,包含两类不同性质的指令。(1 1)指令)指令:即指令系统中的指令。它们都是机器能够执行的指即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。令,每一条指令都有对应的机器码。(2 2)伪指令)伪指令:汇编时用于控制汇编的指令。它们都是机器不执汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码。行的指令,无机器码。http:/ 标号标号: : 操作码操作码 操作数操作数 , ,操作数操

9、作数 ; ;注释注释 数据的表示方法数据的表示方法:(1 1)二进制数:)二进制数:由由0、1组成,组成,“逢逢2进进1”的数制。如:的数制。如:01011110b (01 后缀:后缀:b/b)(2 2)十六进制数:)十六进制数:便于读写记忆的二进制数的简写形式。便于读写记忆的二进制数的简写形式。 (09,af 后缀:后缀:h/h)(3 3)十进制数:)十进制数:可用二进制数表示(也称为可用二进制数表示(也称为bcd码,码, 09表示表示为为:00001001b ),也可用十进制数表示(后缀),也可用十进制数表示(后缀:d/d或无后缀)。或无后缀)。http:/ 汇编语言程序设计的步骤汇编语言

10、程序设计的步骤 汇编语言程序设计汇编语言程序设计:根据任务要求,采用汇编语言编制程序的过程称为汇编根据任务要求,采用汇编语言编制程序的过程称为汇编语言程序设计。语言程序设计。汇编语言程序设计的步骤汇编语言程序设计的步骤:(1 1)拟订设计任务书)拟订设计任务书 (2 2)建立数学模型)建立数学模型 (3 3)确定算法)确定算法 (4 4)分配内存单元,编制程序流程图)分配内存单元,编制程序流程图 (5 5)编制源程序)编制源程序 进一步合理分配存储器单元和了解进一步合理分配存储器单元和了解i/oi/o接口地址;按功能设计程序,明接口地址;按功能设计程序,明确各程序之间的相互关系;用注释行说明程

11、序,便于阅读和修改调试和修改。确各程序之间的相互关系;用注释行说明程序,便于阅读和修改调试和修改。 (6 6)上机调试)上机调试(7 7)程序优化)程序优化 http:/ 椭圆框:椭圆框:开始和结束框,在程序的开始和结束时使用。开始和结束框,在程序的开始和结束时使用。 矩形框:矩形框:处理框,表示要进行的各种操作。处理框,表示要进行的各种操作。 菱形框:菱形框:判断框,表示条件判断,以决定程序的流向。判断框,表示条件判断,以决定程序的流向。 流向线:流向线:流程线,表示程序执行的流向。流程线,表示程序执行的流向。 圆圆 圈:圈:连接符,表示不同页之间的流程连接。连接符,表示不同页之间的流程连接

12、。各种几何图形符号如下图所示。各种几何图形符号如下图所示。http:/ 顺序程序设计顺序程序设计 特点:特点:顺序结构程序是最简单、最基本的程序。顺序结构程序是最简单、最基本的程序。程序按编写的顺程序按编写的顺序依次往下执行每一条指令,直到最后一条。序依次往下执行每一条指令,直到最后一条。它能够解决某些实它能够解决某些实际问题,或成为复杂程序的子程序。际问题,或成为复杂程序的子程序。例题例题2 将片内将片内ram 30h单元中的两位压缩单元中的两位压缩bcd码转换成二进制码转换成二进制数送到片内数送到片内ram 40h单元中。单元中。 解:解:两位压缩两位压缩bcd码转换成二进制数码转换成二进

13、制数的算法为:的算法为: (a1a 0)bcd=10a1a0 程序流程图如右图所示。程序流程图如右图所示。如:如:25=225=210+510+5用用bcdbcd码:(码:(00100101)00100101)bcdbcd=0010=00101010+0101=110011010+0101=11001http:/ org 1000hstart: mov a, 30h ; 取两位取两位bcd压缩码压缩码a1a0送送a anl a, #0f0h ; 取高取高4位位bcd码码a1 swap a ; 高高4位与低位与低4位换位位换位 mov b, #0ah ; 将二进制数将二进制数10送入送入b mu

14、l ab ; 将将10a1送入送入a中中 mov r0, a ; 结果送入结果送入r0中保存中保存 mov a, 30h ; 再取两位再取两位bcd压缩码压缩码a1a0送送a anl a, #0fh ; 取低取低4位位bcd码码a0 add a, r0 ; 求和求和10a1+ a0 mov 40h, a ; 结果送入结果送入40h保存保存 sjmp $ ; 程序执行完,程序执行完,“原地踏步原地踏步” endhttp:/ bcd码的码的09对应的对应的ascii码为码为30h39h,将,将30h39h按大小顺序排列放入表按大小顺序排列放入表table中,先将中,先将bcd码拆分,将拆分后码拆分

15、,将拆分后的的bcd码送入码送入a,表首址送入,表首址送入dptr ,然后领用查表指令,然后领用查表指令movc a,a+dptr,查表即得结果,然后存入,查表即得结果,然后存入21h、22h中。中。程序如下:程序如下: org 1000h start:mov dptr,#tablemova,20hanla,#0fhmovc a,a+dptrmov21h,ahttp:/ mova,20hanla,#0f0hswapamovc a,a+dptrmov22h,asjmp table:db 30h,31h,32h,33h,34h db 35h,36h,37h,38h,39h endhttp:/ 分支

16、程序设计分支程序设计特点特点:根据不同的条件,确根据不同的条件,确定程序的走向。它主要靠条定程序的走向。它主要靠条件转移指令、比较转移指令件转移指令、比较转移指令和位转移指令来实现。分支和位转移指令来实现。分支程序的结构如右图所示。程序的结构如右图所示。 分支程序的设计要点如下:分支程序的设计要点如下:(1 1)先建立可供条件转移指令测试的条件。)先建立可供条件转移指令测试的条件。 (2 2)选用合适的条件转移指令。)选用合适的条件转移指令。(3 3)在转移的目的地址处设定标号。)在转移的目的地址处设定标号。http:/ 解解:此题有三个条件,所以有三个分支程序。此题有三个条件,所以有三个分支

17、程序。这是一个三分支归一的条件转移问题。这是一个三分支归一的条件转移问题。 x是有符号数,判断符号位是是有符号数,判断符号位是0还是还是1可可利用利用jb或或jnb指令。判断指令。判断x是否等于是否等于0则直接则直接可以使用累加器可以使用累加器a的判的判0指令。指令。程序流程图如右图所示。程序流程图如右图所示。例题例题4 求符号函数的值。已知片内求符号函数的值。已知片内ram的的 40h单元内有一自变单元内有一自变量量x,编制程序按如下条件求函数,编制程序按如下条件求函数y的值,并将其存入片内的值,并将其存入片内ram 的的41h单元中。单元中。 1 x0y= 0 x=0 -1x255,因此单

18、重循环程序无法实现,可采用双重循环的方法,因此单重循环程序无法实现,可采用双重循环的方法编写编写50ms延时程序。延时程序。 http:/ org 1000h delay: mov r7, #200 ; 设置外循环次数(此条指令需要设置外循环次数(此条指令需要1个机器周期)个机器周期) dly1: mov r6, #123 ; 设置内循环次数设置内循环次数 dly2: djnz r6, dly2 ;(r6)1=0,则顺序执行,否则转回,则顺序执行,否则转回 dly2继续循环,延时时间为继续循环,延时时间为2 s123=246 s nop ; 延时时间为延时时间为1 s djnz r7,dly1

19、 ;(r7)1=0,则顺序执行,则顺序执行, 否则转回否则转回dly1继续循环,延时时间为继续循环,延时时间为 (246211)20021=50.003ms ret ; 子程序结束子程序结束 endhttp:/ 3设计循环程序时应注意的问题设计循环程序时应注意的问题(1 1)循环程序是一个有始有终的整体,它的执行是有条件的,)循环程序是一个有始有终的整体,它的执行是有条件的,所以要避免从循环体外直接转到循环体内部。所以要避免从循环体外直接转到循环体内部。(2 2)多重循环程序是从外层向内层一层一层进入,循环结束时)多重循环程序是从外层向内层一层一层进入,循环结束时是由内层到外层一层一层退出的。

20、是由内层到外层一层一层退出的。在多重循环中,只允许外重循在多重循环中,只允许外重循环嵌套内重循环。不允许循环相互交叉,也不允许从循环程序的环嵌套内重循环。不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。外部跳入循环程序的内部。(3 3)编写循环程序时,首先要确定程序结构,处理好逻辑关系。)编写循环程序时,首先要确定程序结构,处理好逻辑关系。一般情况下,一个循环体的设计可以从第一次执行情况入手,先一般情况下,一个循环体的设计可以从第一次执行情况入手,先画出重复执行的程序框图,然后再加上循环控制和置循环初值部画出重复执行的程序框图,然后再加上循环控制和置循环初值部分,使其成为一个完

21、整的循环程序。分,使其成为一个完整的循环程序。(4 4)循环体是循环程序中重复执行的部分,应仔细推敲,合理)循环体是循环程序中重复执行的部分,应仔细推敲,合理安排,应从改进算法、选择合适的指令入手对其进行优化,以达安排,应从改进算法、选择合适的指令入手对其进行优化,以达到缩短程序执行时间的目的。到缩短程序执行时间的目的。 http:/ 例题例题7 设设mcs-51单片机内部单片机内部ram起始地址为起始地址为30h的数据块中共的数据块中共存有存有64个无符号数,编制程序使它们按从小到大的顺序排列。个无符号数,编制程序使它们按从小到大的顺序排列。解:解:设设64个无符号数在数据块中的顺序为:个无

22、符号数在数据块中的顺序为:e64, e63, e2, e1,使,使他们从小到大顺序排列的方法很多,现以冒泡法为例进行介绍。他们从小到大顺序排列的方法很多,现以冒泡法为例进行介绍。 冒泡法又称两两比较法。它先使冒泡法又称两两比较法。它先使e64和和e63比较,若比较,若e64e63,则,则两个存储单元中的内容交换,否则就不交换。然后使两个存储单元中的内容交换,否则就不交换。然后使e63和和e62比较,比较,按同样的原则决定是否交换。一直比较下去,最后完成按同样的原则决定是否交换。一直比较下去,最后完成e2和和e1的的比较及交换,经过比较及交换,经过n 1=63次比较(常用内循环次比较(常用内循环

23、63次来实现)后,次来实现)后,e1的位置上必然得到数组中的最大值,犹如一个气泡从水低冒出的位置上必然得到数组中的最大值,犹如一个气泡从水低冒出来一样,如下页图所示(图中只画出了来一样,如下页图所示(图中只画出了6个数的比较过程)。个数的比较过程)。http:/ 第二次冒泡过程和第一次完全相同,比较次数也可以是第二次冒泡过程和第一次完全相同,比较次数也可以是6363次(其实只需要次(其实只需要6262次,因为次,因为e e1 1的位置上是数据块中的最大数,的位置上是数据块中的最大数,不需要再比较),冒泡后在不需要再比较),冒泡后在e e2 2的位置上得到数组中的次大数,的位置上得到数组中的次大

24、数,如上页图所示。如此冒泡(即大循环)共如上页图所示。如此冒泡(即大循环)共6363次(内循环次(内循环63636363次)便可完成次)便可完成6464个数的排序。个数的排序。 实际编程时,可通过设置实际编程时,可通过设置“交换标志交换标志”用来控制是否再需用来控制是否再需要冒泡,若刚刚进行完的冒泡中发生过数据交换(即排序尚未要冒泡,若刚刚进行完的冒泡中发生过数据交换(即排序尚未完成),应继续进行冒泡;若进行完的冒泡中未发生过数据交完成),应继续进行冒泡;若进行完的冒泡中未发生过数据交换(即排序已经完成),冒泡应该停止。例如:对于一个已经换(即排序已经完成),冒泡应该停止。例如:对于一个已经排

25、好序的数组:排好序的数组:1, 2, 3,1, 2, 3, 63, 64, 63, 64,排序程序只要进行一次,排序程序只要进行一次循环便可根据循环便可根据“交换标志交换标志”的状态而结束排序程序的再执行,的状态而结束排序程序的再执行,这自然可以减少这自然可以减少6363 1=621=62次的冒泡时间。次的冒泡时间。 冒泡法程序流程图如下页图所示。冒泡法程序流程图如下页图所示。 http:/ org 1000hmov r0, #30h ; 数据区首地址送数据区首地址送r0mov r3, #63h ; 设置外循环次数在设置外循环次数在r3中中lp0: clr 7fh ; 交换标志位交换标志位2f

26、h.7清清0mov a, r3 ; 取外循环次数取外循环次数mov r2, a ; 设置内循环次数设置内循环次数lp1: mov 20h, r0 ; 数据区数据送数据区数据送20h单元中单元中mov a, r0 ; 20h内容送内容送ainc r0 ; 修改地址指针(修改地址指针(r0+1)mov 21h, r0 ; 下一个地址的内容送下一个地址的内容送21hclr c ; cy清清0 subb a, 21h ; 前一个单元的内容与下一个单元的内容比较前一个单元的内容与下一个单元的内容比较jc lp2 ; 若有借位(若有借位(cy =1),前者小,程序转移到),前者小,程序转移到lp2处执行,

27、处执行, 若无借位(若无借位(cy =0),前者大,不转移,程序往下执行),前者大,不转移,程序往下执行http:/ mov r0, 20h ; 前、后内容交换前、后内容交换dec r0mov r0, 21h inc r0 ; 修改地址指针(修改地址指针(r0+1)setb 7fh ; 置位交换标志位置位交换标志位2fh.7为为1lp2: djnz r2, lp1 ; 修改内循环次数修改内循环次数r2(减少),(减少), 若若r20,则程序转到,则程序转到lp1 处仍执行循环,处仍执行循环, 若若r2=0,程序结束循环,程序往下执行,程序结束循环,程序往下执行jnb 7fh, lp3 ; 交换

28、标志位交换标志位2fh.7若为若为0,则程序转到,则程序转到lp3处结束循环处结束循环djnz r3, lp0 ; 修改外循环次数修改外循环次数r3(减少),(减少), 若若r30,程序转到,程序转到lp0处,处, 执行仍循环,执行仍循环, 若若r3=0,程序结束循环,往下执行,程序结束循环,往下执行lp3: sjmp $ ; 程序执行完,程序执行完,“原地踏步原地踏步”endhttp:/ 查表程序设计查表程序设计 查表查表:根据存放在根据存放在rom中数据表格的项数来查找与它对应的表中数据表格的项数来查找与它对应的表中值。中值。 适用场合适用场合:主要应用于数码显示、打印字符的转换、数据转换

29、主要应用于数码显示、打印字符的转换、数据转换等场合。等场合。 1. 采用采用movc a, a+dptr指令查表程序的设计方法指令查表程序的设计方法(1)在程序存储器中建立相应的函数表(设自变量为)在程序存储器中建立相应的函数表(设自变量为x)。)。(2)计算出这个表中所有的函数值)计算出这个表中所有的函数值y。将这群函数值按顺序存。将这群函数值按顺序存放在起始(基)地址为放在起始(基)地址为table的程序存储器中。的程序存储器中。(3)将表格首地址)将表格首地址table送入送入dptr,x送入送入a,采用查表指,采用查表指令令movc a, a+dptr完成查表,就可以得到与完成查表,就

30、可以得到与x相对应的相对应的y值于累加器值于累加器a中。中。 http:/ 采用采用movc a, a+pc指令查表程序的设计方法指令查表程序的设计方法 当使用当使用pc作为基址寄存器时,由于作为基址寄存器时,由于pc本身是一个程序计数本身是一个程序计数器,与指令的存放地址有关,查表时其操作有所不同。器,与指令的存放地址有关,查表时其操作有所不同。(1)在程序存储器中建立相应的函数表(设自变量为)在程序存储器中建立相应的函数表(设自变量为x)。)。(2)计算出这个表中所有的函数值)计算出这个表中所有的函数值y。将这群函数值按顺序存。将这群函数值按顺序存放在起始(基)地址为放在起始(基)地址为t

31、able的程序存储器中。的程序存储器中。(3)x送入送入a,使用,使用add a, #data指令对累加器指令对累加器a的内容进行修的内容进行修正,偏移量正,偏移量data由公式由公式data=函数数据表首地址函数数据表首地址 pc 1确定,即确定,即data值等于查表指令和函数表之间的字节数。值等于查表指令和函数表之间的字节数。(4)采用查表指令)采用查表指令movc a, a+pc完成查表,就可以得到与完成查表,就可以得到与x相对应的相对应的y值于累加器值于累加器a中。中。 http:/ 1, 2, 9)的程序。)的程序。解:解:设变量设变量x的值存放在内存的值存放在内存30h单元中,求得

32、的单元中,求得的y的值存放在内的值存放在内存存31h单元中。平方表存放在首地址为单元中。平方表存放在首地址为table的程序存储器中。的程序存储器中。方法一:采用方法一:采用movc a, a+dptr指令实现,查表过程如下图指令实现,查表过程如下图2.所示。所示。http:/ org 1000h start: mov a, 30h ; 将查表的变量将查表的变量x送入送入a mov dptr, #table ; 将查表的将查表的16位基地址位基地址table送送dptr movc a, a+dptr ; 将查表结果将查表结果y送送a mov 31h, a ; y值最后放入值最后放入31h中中

33、sjmp $ table: db 0, 1, 4, 9, 16 db 25, 36, 49, 64, 81 end方法二:采用方法二:采用movc a, a+pcmovc a, a+pc指令实现,查表过程如下页图所指令实现,查表过程如下页图所示。示。程序如下:程序如下:http:/ org 1000h start: mov a, 30h ; 将查表的变量将查表的变量x送入送入a add a, #04h ; 定位修正定位修正 movc a, a+pc ; 将查表结果将查表结果y送送a mov 31h, a ; y值最后放入值最后放入31h中中 sjmp $ table: db 0, 1, 4,

34、9, 16 db 25, 36, 49, 64, 81 end http:/ 例2.67将存放在片内ram 40h单元的1位16进制数转换为ascii码,分别用查表和计算法完成。方法1:用查表求解。(略)方法2:计算求解: org 0000h lp1:add a,#0ah ljmp start add a,30h org 0030h lp2:mov 40h,astart: mov a,40h sjmp $ anl a,#0fh end clr c subb a,#0ah jc lp1 add a,#0ah add a,37h sjmp lp2 http:/ 子程序设计子程序设计子程序子程序:能

35、够完成确定任务,并能为其他程序反复调用的程序能够完成确定任务,并能为其他程序反复调用的程序段称为子程序。段称为子程序。特点特点:子程序可以多次重复使用,避免重复性工作,缩短整个子程序可以多次重复使用,避免重复性工作,缩短整个程序,节省程序存储空间,有效地简化程序的逻辑结构,便于程序,节省程序存储空间,有效地简化程序的逻辑结构,便于程序调试。程序调试。 主程序:主程序:调用子程序的程序叫做主程序或称调用程序。调用子程序的程序叫做主程序或称调用程序。 主程序 子程序 . ad1: push psw mov a,20h push 06h lcall ad1 rl amov 30h,a rl a .

36、pop 06h pop psw rethttp:/ 主程序调用子程序的过程:在主程序主程序调用子程序的过程:在主程序中需要执行这种操作的地方执行一条调用中需要执行这种操作的地方执行一条调用指令(指令(lcall或或acall),转到子程序,转到子程序,而完成规定的操作后,再在子程序最后应而完成规定的操作后,再在子程序最后应用用ret返回指令返回到主程序断点处,继返回指令返回到主程序断点处,继续执行下去。续执行下去。http:/ (1)子程序的调用)子程序的调用子程序的入口地址:子程序的入口地址:子程序的第一条指令地址称为子程序的入子程序的第一条指令地址称为子程序的入口地址,常用标号表示。口地址

37、,常用标号表示。子程序的调用过程子程序的调用过程:单片机执行单片机执行acallacall或或lcalllcall指令时,首先将指令时,首先将当前的当前的pcpc值(调用指令的下一条指令的首地址)压入堆栈保存值(调用指令的下一条指令的首地址)压入堆栈保存(低(低8 8位先进栈,高位先进栈,高8 8位后进栈),然后将子程序的入口地址送位后进栈),然后将子程序的入口地址送入入pcpc,转去执行子程序。,转去执行子程序。(2)子程序的返回)子程序的返回主程序的断点地址:主程序的断点地址:子程序执行完毕后,返回主程序的地址称子程序执行完毕后,返回主程序的地址称为主程序的断点地址,它在堆栈中保存。为主程

38、序的断点地址,它在堆栈中保存。子程序的返回过程子程序的返回过程:子程序执行子程序执行retret指令时,将栈顶的内容(返指令时,将栈顶的内容(返回地址)弹回给回地址)弹回给pcpc(先弹回(先弹回pcpc的高的高8 8位,后弹回位,后弹回pcpc的低的低8 8位),位),使程序回到原先被中断的主程序地址(断点地址)去继续执行。使程序回到原先被中断的主程序地址(断点地址)去继续执行。http:/ 2 2保存与恢复寄存器内容保存与恢复寄存器内容(1 1)保护现场)保护现场 主程序转入子程序后,保护主程序的信息不会在运行子程主程序转入子程序后,保护主程序的信息不会在运行子程序时丢失的过程称为保护现场

39、。序时丢失的过程称为保护现场。 保护现场通常在进入子程序的开始时,由堆栈完成。如:保护现场通常在进入子程序的开始时,由堆栈完成。如: push psw push acc http:/ 2)恢复现场)恢复现场 从子程序返回时,将保存在堆栈中的主程序的信息还原的过程称为恢复现从子程序返回时,将保存在堆栈中的主程序的信息还原的过程称为恢复现场。场。恢复现场恢复现场通常在从子程序返回之前将堆栈中保存的内容弹回各自的寄存通常在从子程序返回之前将堆栈中保存的内容弹回各自的寄存器。如:器。如: pop acc pop psw 3 3子程序的参数传递子程序的参数传递 主程序在调用子程序时传送给子程序的参数和子

40、程序结束后送回主程序的主程序在调用子程序时传送给子程序的参数和子程序结束后送回主程序的参数统称为参数传递。参数统称为参数传递。入口参数入口参数:子程序需要的原始参数。主程序在调用子程序前将入口参数送到子程序需要的原始参数。主程序在调用子程序前将入口参数送到约定的存储器单元(或寄存器)中,然后子程序从约定的存储器单元(或寄约定的存储器单元(或寄存器)中,然后子程序从约定的存储器单元(或寄存器)中获得这些入口参数。存器)中获得这些入口参数。出口参数出口参数:子程序根据入口参数执行程序后获得的结果参数。子程序在结束子程序根据入口参数执行程序后获得的结果参数。子程序在结束前将出口参数送到约定的存储器单

41、元(或寄存器)中,然后主程序从约定的前将出口参数送到约定的存储器单元(或寄存器)中,然后主程序从约定的存储器单元(或寄存器)中获得这些出口参数。存储器单元(或寄存器)中获得这些出口参数。http:/ 3)传送子程序参数的方法)传送子程序参数的方法 应用工作寄存器或累加器传递参数。优点是程序简单、应用工作寄存器或累加器传递参数。优点是程序简单、运算速度较快,缺点是工作寄存器有限。运算速度较快,缺点是工作寄存器有限。 应用指针寄存器传递参数。优点是能有效节省传递数据应用指针寄存器传递参数。优点是能有效节省传递数据的工作量,并可实现可变长度运算。的工作量,并可实现可变长度运算。 应用堆栈传递参数。优

42、点是简单,能传递的数据量较大,应用堆栈传递参数。优点是简单,能传递的数据量较大,不必为特定的参数分配存储单元。不必为特定的参数分配存储单元。 利用位地址传送子程序参数。利用位地址传送子程序参数。4 4子程序的嵌套子程序的嵌套 在子程序中若再调用子程序,称为子程序的嵌套。在子程序中若再调用子程序,称为子程序的嵌套。mcs-mcs-5151单片机允许多重嵌套。如下页图所示。单片机允许多重嵌套。如下页图所示。 http:/ 5编写子程序时应注意的问题编写子程序时应注意的问题 子程序的入口地址一般用标号表子程序的入口地址一般用标号表示,标号习惯上以子程序的任务命名。示,标号习惯上以子程序的任务命名。例

43、如,延时子程序常以例如,延时子程序常以delaydelay作为标号。作为标号。 主程序通过调用指令调用子程序,主程序通过调用指令调用子程序,子程序返回主程序之前,必须执行子程子程序返回主程序之前,必须执行子程序末尾的一条返回指令序末尾的一条返回指令retret。 单片机能自动保护和恢复主程序的断点地址。但对于各工单片机能自动保护和恢复主程序的断点地址。但对于各工作寄存器、特殊功能寄存器和内存单元的内容,则必须通过保护作寄存器、特殊功能寄存器和内存单元的内容,则必须通过保护现场和恢复现场实现保护。现场和恢复现场实现保护。 子程序内部必须使用相对转移指令,以便子程序可以放在子程序内部必须使用相对转

44、移指令,以便子程序可以放在程序存储器程序存储器64kb64kb存储空间的任何子域并能为主程序调用,汇编时存储空间的任何子域并能为主程序调用,汇编时生成浮动代码。生成浮动代码。 子程序的参数传递方法同样适用于中断服务程序。子程序的参数传递方法同样适用于中断服务程序。 http:/ 编制程序实现编制程序实现c=a2+b2,(,(a, b均为均为1位十进制数)。位十进制数)。解:解:计算某数的平方可采用查表计算某数的平方可采用查表的方法实现,并编写成子程序。的方法实现,并编写成子程序。只要两次调用子程序,并求和就只要两次调用子程序,并求和就可得运算结果。设可得运算结果。设a, b分别存放于分别存放于

45、片内片内ram的的30h, 31h两个单元中,两个单元中,结果结果c存放于片内存放于片内ram的的40h单单元。程序流程图如右图所示。元。程序流程图如右图所示。http:/ org 1000h sr: mov a, 30h; 将将30h中的内容中的内容a送入送入a acall sqr; 转求平方子程序转求平方子程序sqr处执行处执行 mov r1, a; 将将a2结果送结果送r1 mov a, 31h; 将将31h中的内容中的内容b送入送入a acall sqr; 转求平方子程序转求平方子程序sqr处执行处执行 add a, r1; a2+b2结果送结果送a mov 40h, a; 结果送结果

46、送40h单元中单元中 sjmp $; 程序执行完,程序执行完,“原地踏步原地踏步”求平方子程序如下(采用查平方表的方法):求平方子程序如下(采用查平方表的方法): sqr: inc a movc a, a+pc ret table: db 0, 1, 4, 9, 16 db 25, 36, 49, 64, 81 endhttp:/ 例2.69n编写子程序,将由r0和r1所指的片内ram中的两个3字节无符号数相加,结果送到r0所指的片内ram中。n入口参数:r0,r1分别指向两个加数的低字节。n出口参数:r0指向结果的高位字节n子程序功能:将由r0和r1所指的片内ram中的两个3字节无符号数相加

47、,结果送到r0所指的片内ram中。http:/ org 0100hnadd: mov r7,#03 clr cnadd1:mov a,r0 addc a,r1 mov r0,a inc r0 inc r1 djnz r7,nadd1 dec r0 ret endhttp:/ 作业题20 org 0100hmov r0,#30hmov r7,#08hmov a , #00hl1: add a,r0 inc r0 djnz r7,l1 mov b,#08h div ab mov 3ah,a mov 3bh,b sjmp $ end n编程计算片内ram30h37h这8个单元中的数的算术平均值,结果

48、存放在3ah单元中。http:/ 程序设计举例程序设计举例2.5.1 多字节算术运算程序多字节算术运算程序例 2.70 已知片内ram以block1和block2为起始的单元中,分别存有5字节无符号被减数和减数(低位在前,高位在后)。编程序求差值,并把结果存入以block1为起始地址的片内ram中。解:两个5字节的数做减法,需要用循环结构设计程序。http:/ org 0100hsysub:mov r0,#block1 mov r1,#block2 mov r2,#05h clr cloop: mov a,r0 subb a,r1 mov r0,a inc r0 inc r1 djnz r2,

49、loop ret endhttp:/ 编制程序实现两个编制程序实现两个16位二位二进制数乘法运算:进制数乘法运算: (r7r6)16(r5r4)16(r3r2r1r0)16 r7 r6 r5 r4 r4r6 r1r0 r4r7 r2r1 r5r6 r2r1 r5r7 r3r2http:/ 程序解:解:mcs-51乘法指令只能完成两个乘法指令只能完成两个8位无符号数相乘位无符号数相乘,因此,因此16位无符号数求积必须将它们分解成位无符号数求积必须将它们分解成8位数相位数相乘来实现。其方法有先乘后加和边乘边加两种。现以乘来实现。其方法有先乘后加和边乘边加两种。现以边乘边加为例设计。边乘边加为例设计

50、。程序如下程序如下 org 1000h dmul: mov a, r6; 第一个因数的低位送第一个因数的低位送a mov b, r4; 第二个因数的低位送第二个因数的低位送b mul ab; 第一个因数的低位乘以第二个因数的低位第一个因数的低位乘以第二个因数的低位 r4r6http:/ mov r0, a; 积的低位送积的低位送r0 mov r1, b; 积的高位送积的高位送r1 mov a, r7; 第一个因数的高位送第一个因数的高位送a mov b, r4; 第二个因数的低位送第二个因数的低位送b mul ab; r4r7 add a, r1; 部分积相加,形成进位部分积相加,形成进位cy

51、 mov r1, a; 部分积相加送部分积相加送r1 mov a, b; 部分积的进位部分积的进位cy加到高位加到高位 addc a, #00h mov r2, a mov a, r6; 第一个因数的低位送第一个因数的低位送a mov b, r5; 第二个因数的高位送第二个因数的高位送b mul ab; r5r6 add a, r1; 部分积相加,形成进位部分积相加,形成进位cy mov r1, a; 回送部分积回送部分积 mov a, r2http:/ addc a, b; 部分积相加部分积相加 mov r2, a; 回送部分积回送部分积 mov a, #00h; 部分积的进位部分积的进位c

52、y加到高位加到高位 addc a, #00h mov r3, a; 回送部分积回送部分积 mov a, r7; 第一个因数的高位送第一个因数的高位送a mov b, r5; 第二个因数的高位送第二个因数的高位送b mul ab; r5r7 add a, r2; 部分积相加,形成进位部分积相加,形成进位cy mov r2, a; 回送部分积回送部分积 mov a, r3 addc a, b; 部分积相加部分积相加 mov r3, a; 回送部分积回送部分积 ret endhttp:/ 数制转换程序数制转换程序n例 2.72 将4位压缩bcd码(十进制数)转换为二进制数。a3a2a1a0=a310

53、00+a2100+a110+a0=(a310+a2) 100+(a110+a0 )公因式 (ai10+aj),可用双重嵌套子程序的方法将公因式用内层子程序编写。(ai为高4位,aj为低4位)外层子程序入口参数:4位压缩bcd码存r6r5。外层子程序出口参数:转换后的二进制数存r6r5。内层子程序入口参数:待转换的bcd存r2。内层子程序出口参数:转换后的二进制数存r2。http:/ (a310+a2) 100+(a110+a0 ) org 0100hbcdbin2:mov a,r6 mov r2,a acall bcdbin1 mov a,r2 mov b,#100 mul ab mov r6

54、,b mov r4,a mov a,r5 mov r2,a acall bcdbin1 mov a,r2 add a,r4 mov r5,a mov a,r6 addc a,#00 mov r6,a retbcdbin1:mov a,r2 anl a,#0f0h mov b,#10 swap a mul ab mov r3,a mov a,r2 anl a,#0fh add a,r3 mov r2,a ret endhttp:/ 将双字节二进制数转换成将双字节二进制数转换成bcd码码(十进制数)。(十进制数)。解:解:将二进制数转换成将二进制数转换成bcd码的数学模型为:码的数学模型为:(a1

55、5a14a1a0)2=(a15215+a14214+a121+a020)10上式右侧即为欲求的上式右侧即为欲求的bcd码。它可作如下变换码。它可作如下变换 (a15214+a14213+a1)2+a0括号里的内容可变为:括号里的内容可变为:(a15213 +a14212+a13211+a2)2+a1括号里的内容可变为:括号里的内容可变为:(a15212+a14211+a13210+a3)2+a2 经过经过16次的变换后,括号里的内容可变为:次的变换后,括号里的内容可变为: (02+a15)2+a14 所以括号里的内容的通式为所以括号里的内容的通式为ai+12+ai,即为二进制数转换成,即为二进

56、制数转换成bcd码的公因式。码的公因式。http:/ 在程序设计中,可利用左移在程序设计中,可利用左移指令(乘以指令(乘以2)实现)实现ai+12,采,采用循环计算用循环计算16次公因式的方法来次公因式的方法来完成二进制数转换成完成二进制数转换成bcd码。码。入口参数:入口参数:16位无符号数送位无符号数送r3, r2。出口参数:出口参数:共有共有5位位bcd数,万数,万位位r6;千、百位;千、百位r5;十、;十、个位个位r4位。位。程序流程图如右图所示。程序流程图如右图所示。http:/ org 1000h binbcd1: clr a ; a 清清0 mov r4, a ; 清清0出口参数

57、寄存器出口参数寄存器 mov r5, a mov r6, a mov r7, #10h ; 设置循环次数设置循环次数16 loop: clr c ; 标志位标志位cy清清0,为二进制数,为二进制数2作准备作准备 mov a, r2 ;ai+12 rlc a mov r2, a mov a, r3 rlc a mov r3, a mov a, r4 http:/ addc a, r4 ; 带进位自身相加,相当于乘带进位自身相加,相当于乘2 da a mov r4, a mov a, r5 addc a, r5 da a mov r5, a mov a, r6 addc a, r6 mov r6,

58、 a ; 双字节十六进制数的万位数不超过双字节十六进制数的万位数不超过6, 不用调整不用调整 djnz r7, loop ; 若若16位未循环完,转向位未循环完,转向loop继续循环,继续循环, 否则继续执行否则继续执行 ret endhttp:/ 散转程序散转程序 散转程序:散转程序:是一种并行分支程序(多分支程序),它是根据是一种并行分支程序(多分支程序),它是根据某种输入或运算结果,分别转向各个处理程序。在某种输入或运算结果,分别转向各个处理程序。在mcs-51mcs-51中用中用jmp a+dptrjmp a+dptr指令来实现程序的散转。转移的地址最多为指令来实现程序的散转。转移的地

59、址最多为256256个。个。其结构如图下所示。其结构如图下所示。http:/ 1)应用转移指令表实现的散转程序)应用转移指令表实现的散转程序 直接利用转移指令(直接利用转移指令(ajmpajmp或或ljmpljmp)将欲散转的程序组形成)将欲散转的程序组形成一个转移表,然后将标志单元内容读入累加器一个转移表,然后将标志单元内容读入累加器a a,转移表首址送,转移表首址送入入dptrdptr中,再利用散转指令中,再利用散转指令jmp a+dptrjmp a+dptr实现散转。实现散转。(2 2)应用地址偏移量表实现的散转程序)应用地址偏移量表实现的散转程序 直接利用地址偏移量形成转移表,特点是程

60、序简单、转移直接利用地址偏移量形成转移表,特点是程序简单、转移表短,转移表和处理程序可位于程序存储器的任何地方。表短,转移表和处理程序可位于程序存储器的任何地方。(3 3)应用转向地址表的散转程序)应用转向地址表的散转程序 直接使用转向地址表。其表中各项即为各转向程序的入口。直接使用转向地址表。其表中各项即为各转向程序的入口。散转时,使用查表指令,按某单元的内容查找到对应的转向地散转时,使用查表指令,按某单元的内容查找到对应的转向地址,将它装入址,将它装入dptrdptr,然后清累加器,然后清累加器a a,再用,再用jmp a+dptrjmp a+dptr指令直指令直接转向各个分支程序。接转向

温馨提示

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

评论

0/150

提交评论