ImageVerifierCode 换一换
格式:PPT , 页数:56 ,大小:1.10MB ,
文档编号:3033089      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3033089.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(第4章-89S51的汇编语言程序设计课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

第4章-89S51的汇编语言程序设计课件.ppt

1、2022-6-231第第4 4章章 89S5189S51的汇编语言程序设计的汇编语言程序设计 程序编制的程序编制的方法方法和和技巧技巧4.1 源程序的源程序的编辑编辑和和汇编汇编4.2 基本基本程序结构程序结构4.3 子程序子程序及其调用及其调用4.42022-6-232 单片机应用系统由单片机应用系统由硬件系统硬件系统和和应用程序应用程序构成。构成。 汇编语言汇编语言 高级语言高级语言 ( (例如,例如,C C语言语言) ) 应用程序设计方法应用程序设计方法 汇编语言汇编语言,生成的目标程序占内存空间少、运行速,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强的特点。度快,具有效

2、率高、实时性强的特点。 高级语言高级语言,对系统的描述与实现与人的思维相似,程序,对系统的描述与实现与人的思维相似,程序阅读、修改和移植方便,适合于编写复杂的程序。阅读、修改和移植方便,适合于编写复杂的程序。 2022-6-2334.1 程序编制的方法和技巧程序编制的方法和技巧4.1.1 4.1.1 程序编制的步骤程序编制的步骤 明确任务:功能要求、技术指标明确任务:功能要求、技术指标 运行环境调研运行环境调研 任务分析任务分析 将实际问题转化为计算机处理的程序算法。将实际问题转化为计算机处理的程序算法。 算法比较与优化(内存需求、运行速度、效率)。算法比较与优化(内存需求、运行速度、效率)。

3、 算法设计算法设计2022-6-234 强化模块观念强化模块观念使程序结构清晰。使程序结构清晰。简化代码。简化代码。程序模块(主程序模块、各种子程序模块)程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、层次清晰、便于接口。模块化优点:分块设计、层次清晰、便于接口。4.1.2 4.1.2 程序编制的方法和技巧程序编制的方法和技巧 采用循环和子程序的优点采用循环和子程序的优点注意:注意:1 1、循环初值和结束条件,避免、循环初值和结束条件,避免“死循环死循环”现象。现象。 2 2、子程序的现场保护。、子程序的现场保护。2022-6-2354.1.3 4.1.3 汇编语言的语句格式汇编语

4、言的语句格式标号代表本行程序所在的地址。标号代表本行程序所在的地址。标号由标号由18个个ASCII码字符组成,第一个字符必须是字母。码字符组成,第一个字符必须是字母。不能用已定义的关键字(指令助记符、伪指令等)。不能用已定义的关键字(指令助记符、伪指令等)。同一标号在一个程序中只能定义一次,不能重复定义。同一标号在一个程序中只能定义一次,不能重复定义。标号后跟英文冒号标号后跟英文冒号“: :”。 标号(即符号地址)标号(即符号地址)标号: 指令助记符指令助记符 操作数1, 操作数2, 操作数3, ;注释2022-6-236数据:二进制(数据:二进制(B B) 十进制(十进制(D D或省略或省略

5、D D) 十六进制(十六进制(H H)。)。 注意:若十六进制操作数以字符AF开头,需在它前面加一个 “0”,以便汇编时把它和标号区分开。v 符号:符号名、标号或符号:符号名、标号或“$ $”。v 表达式:由运算符和数据构成。表达式:由运算符和数据构成。 操作数操作数2022-6-237 注释注释英文分号英文分号“; ;”开头。开头。汇编时,遇到汇编时,遇到“;” 就停止就停止“翻译翻译”。因此,注释字。因此,注释字段不会产生机器代码。段不会产生机器代码。2022-6-2384.2.1 4.2.1 伪指令伪指令4.2 源程序的编辑源程序的编辑4.2.2 4.2.2 源程序的编辑源程序的编辑20

6、22-6-2394.2.1 4.2.1 伪指令伪指令伪指令:用于指导汇编工作。伪指令:用于指导汇编工作。汇编后,伪指令没有与之对应的机器代码。汇编后,伪指令没有与之对应的机器代码。 起始地址设定伪指令起始地址设定伪指令ORGORGORG ORG 表达式表达式表达式通常为十六进制地址,例:表达式通常为十六进制地址,例: ORG 8000HSTART:MOV A,#30H ORG ORG可多次使用,但地址值的顺序要由小到大。可多次使用,但地址值的顺序要由小到大。2022-6-2310 结束汇编伪指令结束汇编伪指令ENDENDEND该伪指令位于源程序的最后一行,表示汇编到此结束。该伪指令位于源程序的

7、最后一行,表示汇编到此结束。整个源程序中只能有一条整个源程序中只能有一条ENDEND命令,且位于程序的最后。命令,且位于程序的最后。对于对于ENDEND之后的程序,将不进行汇编处理。之后的程序,将不进行汇编处理。2022-6-2311 定义字节数据表伪指令定义字节数据表伪指令DBDB定义字数据表伪指令定义字数据表伪指令DWDW1000H 标号:标号: DB DB 字节数据表字节数据表ORG 1000HORG 1000HDB -2,-4,-6,8,10,18DB -2,-4,-6,8,10,18FEH FCHFAH08H0AH12H1001H 标号:标号: DW DW 字数据表字数据表 ORG

8、1400H ORG 1400HDATA1:DW 32DATA1:DW 324A4AH,3CH H,3CH 1400H32H 4AH00H3CH1401H1402H1403H注意:字母按注意:字母按ASCIIASCII码存储。码存储。2022-6-2312 预留空间伪指令预留空间伪指令DSDS 标号:标号: DS DS 预留空间字节数预留空间字节数 ORG 2000H ORG 2000HTAB1TAB1:DB 12HDB 12H,34H34H DS 4H DS 4H DB 5 DB 512H34H-35H3000H3001H3002H3003H3004H3005H3006H2022-6-2313

9、 定义常量值的伪指令定义常量值的伪指令EQUEQU符号名符号名 EQU EQU 常值表达式常值表达式 LENLEN EQUEQU 10 10 SUMSUM EQUEQU 21H 21HBLOCKBLOCK EQU EQU 22H 22H MOV R7, MOV R7,LENLEN MOV R0, MOV R0,BLOCKBLOCK MOV MOV SUMSUM,A ,A 2022-6-2314 位定义命令位定义命令 BITBIT用于给字符名称赋予位地址,位地址可以是绝对位地址,用于给字符名称赋予位地址,位地址可以是绝对位地址,也可是符号地址。也可是符号地址。例如:例如:LEDLEDBIT P1

10、.6BIT P1.6功能是把功能是把P1.6P1.6的位地址赋给变量的位地址赋给变量LEDLED。2022-6-23154.2.2 4.2.2 源程序的编辑源程序的编辑 源程序的编辑源程序的编辑 ORG ORG 0000H LJMP MAIN ORG ORG 0040HMAIN:MOV R7,#16 MOV R0,#60H MOV A,#55HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP SJMP $ ENDEND依据汇编语言规则依据汇编语言规则用好用好伪指令伪指令符号符号不用中文不用中文汇编程序以汇编程序以.ASM.ASM存盘存盘2022-6-23164.3.1 4.3

11、.1 顺序程序顺序程序(无分支、无循环)(无分支、无循环)4.3 基本程序结构基本程序结构 ORG 0040HORG 0040HSTART:MOV A,21H ;START:MOV A,21H ;取取21H21H的内容的内容 ANL A,#0FH ; ANL A,#0FH ;保留低半字节保留低半字节 SWAP A ; SWAP A ;移至高半字节移至高半字节 MOV 20H,A ; MOV 20H,A ;存于存于20H20H单元单元 MOV A,22H ; MOV A,22H ;取取22H22H的内容的内容 ANL A,#0FH ; ANL A,#0FH ;保留低半字节保留低半字节 ORL 2

12、0H,A ; ORL 20H,A ;合并到结果单元合并到结果单元 SJMP $ SJMP $ ;等待;等待 END END2022-6-23174.3.2 4.3.2 分支程序分支程序(双分支)(双分支)【例例】实现两个实现两个8 8位无符号数求和的子程序。位无符号数求和的子程序。SADD:MOV A,R3 ;SADD:MOV A,R3 ;取加数(在取加数(在R3R3中)中) CLR CCLR C ADD A,R4 ; ADD A,R4 ;被加数(在被加数(在R4R4中)加中)加A A JC PP1 JC PP1 MOV R3,#00H ; MOV R3,#00H ;结果小于结果小于25525

13、5时,高字节时,高字节R3R3内容为内容为00H00H SJMP PP2 SJMP PP2 PP1:MOV R3,#01H ; PP1:MOV R3,#01H ;结果大于结果大于255255时,高字节时,高字节R3R3内容为内容为01H01H PP2:MOV R4,A ; PP2:MOV R4,A ;结果的低字节在结果的低字节在R4R4中中 RETRET入口入口: :(R3R3)= =加数;加数; (R4R4)= =被加数。被加数。出口出口: :(R3R3)= =和的高字节;和的高字节; (R4R4)= =和的低字节。和的低字节。2022-6-2318【例例】求单字节有符号数的二进制补码。求单

14、字节有符号数的二进制补码。 正数补码是其本身,负数补码是其反码加正数补码是其本身,负数补码是其反码加1。因此,应首先判被转换数。因此,应首先判被转换数的符号,负数进行转换,正数本身即为补码。的符号,负数进行转换,正数本身即为补码。设二进制数放在设二进制数放在A中,其补码放回到中,其补码放回到A中。参考程序如下:中。参考程序如下: CMPT: JNB Acc.7,RETURN ;(A)0,不需转换,不需转换 MOV C,Acc.7 ;符号位保存;符号位保存 CPL A ;(A)求反,加求反,加1 ADD A,#1 MOV Acc.7,C ;符号位存在;符号位存在A的最高位的最高位RETURN:R

15、ET2022-6-23194.3.2 4.3.2 分支程序分支程序(多分支)(多分支) 多分支结构是程序中常见的结构,在多分支结多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成构的程序中,能够按调用号执行相应的功能,完成指定操作。指定操作。 若给出若给出调用号调用号来调用子程序,一般用查表方法,来调用子程序,一般用查表方法,查到查到子程序的地址子程序的地址,转到相应,转到相应子程序子程序。2022-6-2320指令系统提供了非常有用的两种多分支选择指令:间接转移指令间接转移指令 JMP A+DPTR比较转移指令 CJNE A,direct,rel CJNE

16、A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel 间接转移指令“JMP A+DPTR”由数据指针DPTR决定决定多分支转移程序的首地址,由A的内容选择对应分支。 4条比较转移指令CJNE能对两个欲比较的单元内容进行比较,当不相等时,程序实现相对转移;若两者相等,则顺序往下执行。2022-6-2321【例例】设变量设变量x x存放在片内存放在片内RAMRAM的的30H30H单元,变量单元,变量y y与与x x的关系的关系是是: : 当当x x大于大于0 0时时,y=x;,y=x; 当当x=0 x=0时时,y=20H;,y=20H; 当当x x小于小于

17、0 0时时,y=x+5,y=x+5。编制程序编制程序, ,根据根据x x的大小求的大小求y y,并送回原单元。并送回原单元。2022-6-2322 ORG 0040HORG 0040HSTART:MOV A,30H ;START:MOV A,30H ;取取x x至累加器至累加器 JZ NEXTJZ NEXT ;x = 0, ;x = 0,转转NEXTNEXT ANL A,#80H ; ANL A,#80H ;否,保留符号位否,保留符号位 JZ DONEJZ DONE ;x 0, ;x 0,转结束转结束 MOV A,#05H ;x 0MOV A,#05H ;x 0X 0X = 00-12022-

18、6-2324程序如下:程序如下:SIGNFUC:MOV A,40H CJNE A,#00H,NZEAR AJMP NEGTNZEAR: JB Acc.7, POSI MOV A,#01H AJMP NEGTPOSI: MOV A,#81HNEGT: MOV 41H, A END2022-6-2325【例例】根据根据R7R7的内容的内容x x(转移序号)转向相应的处理程序。(转移序号)转向相应的处理程序。设设R7R7内容为内容为0 04 4,对应的处理程序入口地址分别为,对应的处理程序入口地址分别为PP0PP0PP4PP4。 2022-6-2326 START:MOV R7,#3 ; START

19、:MOV R7,#3 ;转移序号为转移序号为3 3,欲转向,欲转向PP3PP3 ACALL JPNUM ;ACALL JPNUM ;子程序调用子程序调用 AJMP START AJMP START JPNUM:MOV DPTR,#TAB ;DPTR JPNUM:MOV DPTR,#TAB ;DPTR指向分支入口的表首地址指向分支入口的表首地址 MOV A,R7MOV A,R7 ADD A,R7ADD A,R7 ;R7 ;R7乘乘2 2,调整偏移量(,调整偏移量(3x2=63x2=6) MOV R3,A ;A=R3=6MOV R3,A ;A=R3=6 MOVC A,A+DPTR ; MOVC A

20、,A+DPTR ;先取先取PP3PP3的高字节(的高字节(PP3PP3是是DWDW) XCH A,R3 ; XCH A,R3 ;高字节暂存于高字节暂存于R3R3 INC A ; INC A ;增增1 1后,后,A=7A=7,指向下一个,指向下一个 MOVC A,A+DPTR ; MOVC A,A+DPTR ;再取再取PP3PP3的低字节的低字节 MOV DPL,A ;MOV DPL,A ;处理程序入口地址低处理程序入口地址低8 8位送位送DPLDPL MOV DPH,R3 ; MOV DPH,R3 ;处理程序入口地址高处理程序入口地址高8 8位送位送DPHDPH CLR A ;DPTR CLR

21、 A ;DPTR指向指向PP3PP3地址地址 JMP A+DPTRJMP A+DPTR ; ;跳转向跳转向PP3PP3服务程序服务程序2022-6-2327 TAB:DW PP0 ; TAB TAB:DW PP0 ; TAB是转移地址表是转移地址表 DW PP1 DW PP1 DW PP2 DW PP2 DW PP3DW PP3 DW PP4 DW PP4 PP0:MOV 30H,#0 ; PP0:MOV 30H,#0 ;转移序号为转移序号为0 0时时, ,置功能号置功能号“0 0”于于30H30H单单元元 RETRET PP1:MOV 30H,#1 ; PP1:MOV 30H,#1 ;转移序

22、号为转移序号为1 1时时, ,置功能号置功能号“1 1”于于30H30H单单元元 RETRET PP2:MOV 30H,#2 ; PP2:MOV 30H,#2 ;转移序号为转移序号为2 2时时, ,置功能号置功能号“2 2”于于30H30H单单元元 RETRET PP3:MOV 30H,#3PP3:MOV 30H,#3 ; ;转移序号为转移序号为3 3时时, ,置功能号置功能号“3 3”于于30H30H单单元元 RETRET PP4:MOV 30H,#4 ; PP4:MOV 30H,#4 ;转移序号为转移序号为4 4时时, ,置功能号置功能号“4 4”于于30H30H单单元元 RETRET 2

23、022-6-23284.3.3 4.3.3 查表程序查表程序【例4-3】 设计一子程序,功能是根据累加器设计一子程序,功能是根据累加器A中的数中的数x(09之间)查之间)查x的平方表的平方表y,根据,根据x的值查出相应的平方的值查出相应的平方y。本例中的。本例中的x和和y均为单字节数。均为单字节数。 ADD A,#01HMOVC A,A+PCRET DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H ;数;数09的平方表的平方表2022-6-2329 指令指令“ADD A,#01H”的作用是的作用是A中的内容加上中的内容加上 “01H”, “01H”即为

24、查表指令与平方表之间的即为查表指令与平方表之间的“RET”指令所占的字节数。指令所占的字节数。加上加上 “01H”后,可保证后,可保证PC指向表首,累加器指向表首,累加器A中原来的内容仅是从中原来的内容仅是从表首开始向下查找多少个单元。表首开始向下查找多少个单元。 在进入程序前,在进入程序前,A的内容在的内容在0009H之间,如之间,如A中的内容为中的内容为02H,它的平方为它的平方为04H,可根据,可根据A的内容查出的内容查出x的平方。的平方。 指令指令“MOVC A,A+DPTR” 应用范围较广,使用该指令时应用范围较广,使用该指令时不必计算偏移量,优点是表格可以设在不必计算偏移量,优点是

25、表格可以设在64KB程序存储器空间内的任程序存储器空间内的任何地方,而不像何地方,而不像“MOVC A,A+PC”那样只设在那样只设在PC下面的下面的256个个单元中,所以使用较方便。单元中,所以使用较方便。2022-6-2330 如果如果DPTR已被使用,则在查表前必须保护已被使用,则在查表前必须保护DPTR,且结束后恢复,且结束后恢复DPTR,例,例4-3可改成如下形式:可改成如下形式: PUSH DPH ;保存;保存DPH PUSH DPL ;保存;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢复;恢复DPLPOP DPH ;恢复;恢复DPHRET

26、TAB1: DB 00H,01H,04H,09H,10H;平方表;平方表 DB 19H,24H,31H,40H,51H2022-6-2331 【例4-4】有一巡回检测报警装置,需对有一巡回检测报警装置,需对16路(路(x)输入)输入进行检测,每路有一个最大允许值(进行检测,每路有一个最大允许值(y),为双字节数。需),为双字节数。需根据测量的路数(根据测量的路数(x),查表找出对应该路的最大允许值),查表找出对应该路的最大允许值(y),看输入值是否大于最大允许值,如果大于就报警。),看输入值是否大于最大允许值,如果大于就报警。 取路数为取路数为x(0 x15),),y为最大允许值,放在表格为最

27、大允许值,放在表格中。设进入查表程序前,假设路数中。设进入查表程序前,假设路数x已放于已放于R2中,查表后该中,查表后该路的最大允许值路的最大允许值y放于放于R3R4中。查表的程序如下:中。查表的程序如下: 理解:根据路数理解:根据路数x,查最大允许值,查最大允许值y。2022-6-2332 TB3: MOV A,R2ADDA,R2 ;(R2)*2(A)MOV R3,A ;保存指针;保存指针 ADDA,#6 ;加偏移量;加偏移量MOVC A,A+PC ;查第一字节;查第一字节XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第二字节;查第二字节 MOVR4,ARETTAB3: D

28、W 1520,3721,42645,7580 ;最大值表;最大值表 DW 3483,32657,883,9943DW 10000,40511,6758,8931DW 4468,5871,13284,278082022-6-2333 表格长度不能超过表格长度不能超过256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256个单元中,如需把表格放在程序存储器个单元中,如需把表格放在程序存储器空间的任何地方,应使用指令空间的任何地方,应使用指令“MOVC AMOVC A,A+DPTRA+DPTR”。【例例4-54-5】 以以AT

29、89S51AT89S51为核心的温度控制器,温度传感器输为核心的温度控制器,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由出的电压与温度为非线性关系,传感器输出的电压已由A/DA/D转转换为换为1010位二进制数。测得的不同温度下的电压值数据构成一个位二进制数。测得的不同温度下的电压值数据构成一个表,表中温度值为表,表中温度值为y y(双字节无符号数),(双字节无符号数),x x(双字节无符号数)(双字节无符号数)为电压值数据。设测得电压值为电压值数据。设测得电压值x x放入放入R2R3R2R3中,根据电压值中,根据电压值x x,查,查找对应的温度值找对应的温度值y y,仍放入,

30、仍放入R2R3R2R3中。参考程序:中。参考程序:理解:根据电压值理解:根据电压值x,查温度值,查温度值y。2022-6-2334 LTB2: MOVDPTR,#TAB2 MOVA,R3 CLRC RLCA MOVR3,A XCHA,R2 RLCA XCHR2,A ADDA,DPL ;(R2R3)+(DPTR)(DPTR) MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA2022-6-2335MOVC A,A+DPTR ;查第一字节;查第一字节MOVR2,A ;第一字节存入;第一字节存入R2中中CLRAINCDPTRMOVC A,A+DPTR ;查第二字节;查

31、第二字节MOVR3,A ;第二字节存入;第二字节存入R3中中RETTAB2: DW, , ;温度值表;温度值表 由于使用了指令由于使用了指令“MOVC A,A+DPTR”,表,表TAB2可放入可放入64KB程序存储器空间任何位置,表格的长度可大于程序存储器空间任何位置,表格的长度可大于256B。2022-6-23364.3.4 4.3.4 查找关键字查找关键字在表中查找关键字的操作,也称为数据检索。在表中查找关键字的操作,也称为数据检索。【例4-6】 从从50个字节的表中查找一个关键字个字节的表中查找一个关键字“xxH”。ORG1000HMOV30H,#xxH ;关键字;关键字xxH送送30H

32、单元单元MOVR1,#50 ;查找次数送;查找次数送R1MOVA,#14;修正值送;修正值送AMOV DPTR,#TAB4;表首地址送;表首地址送DPTR2022-6-2337LOOP:PUSH AccMOVC A, A+PC;查表结果送;查表结果送A CJNE A,40H,LOOP1;(40H)不等于关键字则转不等于关键字则转LOOP1 MOV R2,DPH;查到关键字,把地址送;查到关键字,把地址送R2,R3MOV R3,DPLDONE: RETLOOP1:POP Acc;修正值弹出;修正值弹出INC A;A+1AINC DPTR;修改数据指针;修改数据指针DPTRDJNZ R1,LOOP

33、;R10,未查完,继续查找,未查完,继续查找MOVR2,#00H;R1=0,R2和和R3清清0MOVR3,#00H;表中;表中50个数已查完个数已查完AJMPDONE;从子程序返回;从子程序返回 TAB4: DB ,;50个数据表个数据表2022-6-23384.3.5 4.3.5 查找最值查找最值 【例例4-7】片内片内RAM中存放一批数据,查找出最大值并存放中存放一批数据,查找出最大值并存放于首地址中。设于首地址中。设R0中存放首地址,中存放首地址,R2中存放字节数。中存放字节数。 程序如下:程序如下: MOV R2,n ;n为要比较的数据字节数为要比较的数据字节数 MOV A, R0 ;

34、存首地址指针;存首地址指针 MOV R1,A DEC R2 MOV A,R12022-6-2339LOOP: MOV R3, ADEC R1CLR CSUBB A,R1 ;两个数比较;两个数比较JNC LOOP1 ;C=0,A中数大,跳中数大,跳LOOP1MOV A,R1 ;C=1,则大数送,则大数送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP ;是否比较结束?;是否比较结束?MOV R0, A ;存最大数;存最大数 RET2022-6-2340【例例】将内部将内部RAMRAM的的30H30H至至3FH3FH单元初始化为单元初始化为00H00H。M

35、OV 30H,#00H ;MOV 30H,#00H ;MOV 31H,#00H ;MOV 31H,#00H ;MOV 3EH,#00H ;MOV 3EH,#00H ;MOV 3FH,#00H ;MOV 3FH,#00H ;2022-6-23414.3.6 4.3.6 循环程序循环程序1 1循环程序的结构:循环程序的结构:主要由以下四部分组成。主要由以下四部分组成。(1 1)循环初始化)循环初始化完成循环前的准备工作。例如,设置循环控制计数初值、完成循环前的准备工作。例如,设置循环控制计数初值、起始地址、变量初值等。起始地址、变量初值等。(2 2)循环体)循环体完成实际的处理工作,反复执行循环体

36、。完成实际的处理工作,反复执行循环体。(3 3)循环控制)循环控制在重复执行循环体的过程中,不断修改循环控制变量,在重复执行循环体的过程中,不断修改循环控制变量,直到符合结束条件,就结束循环体的执行。直到符合结束条件,就结束循环体的执行。循环结束的控制方法有循环结束的控制方法有计数控制法计数控制法和和条件控制法条件控制法。(4 4)循环结束)循环结束对循环程序执行的结果进行分析、处理和存放。对循环程序执行的结果进行分析、处理和存放。2022-6-2342(1 1)计数控制法)计数控制法 依据计数器的值来决定循环次数,一般为减依据计数器的值来决定循环次数,一般为减1 1计数器,计数计数器,计数器

37、减到器减到“0 0”时,结束循环。计数器初值在初始化设定。时,结束循环。计数器初值在初始化设定。 MCS-51 MCS-51指令系统提供了功能极强的循环控制指令:指令系统提供了功能极强的循环控制指令: DJNZ R DJNZ Rn n,relrel ;以工作寄存器作控制计数器;以工作寄存器作控制计数器 DJNZ direct DJNZ direct,relrel ;以直接寻址单元作控制计数器;以直接寻址单元作控制计数器 2022-6-2343【例例】将内部将内部RAMRAM的的30H30H至至3FH3FH单元初始化为单元初始化为00H00H。MAIN:MOV R0,#30H ;R0MAIN:M

38、OV R0,#30H ;R0用作地址指针,置地址初值用作地址指针,置地址初值 MOV R7,#16 ; MOV R7,#16 ;计数值,计数值,1616个单元个单元 MOV A,#00H ; MOV A,#00H ;LOOP:MOV R0,A ;LOOP:MOV R0,A ;循环处理循环处理 INC R0 ;INC R0 ;指向下一个单元指向下一个单元 DJNZ R7,LOOP ; DJNZ R7,LOOP ;循环循环 SJMP $ ;SJMP $ ;等待等待2022-6-2344 例:对例:对RAMRAM中中22H22H开始的开始的1010个单元的数据求和,个单元的数据求和, 并将求和的结果

39、放在并将求和的结果放在21H21H单元中。单元中。 CLR A CLR A MOV R7, MOV R7,10 10 ;计数初值;计数初值 MOV R0, MOV R0,22H 22H ;R0R0作为数据单元指针作为数据单元指针 LOOP:ADD A,R0 LOOP:ADD A,R0 INC R0 INC R0 DJNZ R7,LOOP DJNZ R7,LOOP MOV MOV 21H21H,A ,A 2022-6-2345(2 2)条件控制法)条件控制法 计数控制法只有在计数控制法只有在循环次数已知循环次数已知的情况下才适用。循环次的情况下才适用。循环次数未知,不能用循环次数来控制,往往需要

40、根据某种条件来判数未知,不能用循环次数来控制,往往需要根据某种条件来判断是否应该结束循环。断是否应该结束循环。 条件控制法:设置一个条件,判断是否满足该条件。如满条件控制法:设置一个条件,判断是否满足该条件。如满足,则循环结束;如不满足该条件,则循环继续。足,则循环结束;如不满足该条件,则循环继续。 2022-6-2346【例例】将内部将内部RAMRAM起始地址为起始地址为60H60H的数据串传送到外部的数据串传送到外部RAMRAM中起始中起始地址为地址为1000H1000H的存储区域,直到发现的存储区域,直到发现$ $字符停止传送。字符停止传送。 MAIN:MOV R0,#60H ; MAI

41、N:MOV R0,#60H ;置初值置初值 MOV DPTR,#1000HMOV DPTR,#1000HLOOP0:MOV A,R0 ;LOOP0:MOV A,R0 ;取数据取数据 CJNE A,#24H,LOOP1 ; CJNE A,#24H,LOOP1 ;循环结束?循环结束? SJMP DONE ; SJMP DONE ;是是LOOP1:MOVX DPTR,A ;LOOP1:MOVX DPTR,A ;把把A A的内容传到片外的内容传到片外 INC R0 ;INC R0 ;片内:指向下一个单元片内:指向下一个单元 INC DPTR ;INC DPTR ;片外:指向下一个单元片外:指向下一个单

42、元 SJMP LOOP0 ; SJMP LOOP0 ;继续循环继续循环 DONE:SJMP DONE ; DONE:SJMP DONE ;等待等待2022-6-2347【例例4-13】 一串字符,依次存放在内部一串字符,依次存放在内部RAM从从30H单元开单元开始的单元中,字符串以始的单元中,字符串以0AH为结束标志,测试字符串的长度。为结束标志,测试字符串的长度。 采用逐个字符依次与采用逐个字符依次与“0AH”比较(设置的条件)的方法。比较(设置的条件)的方法。设置一个累计字符串长度的计数器和一个指向字符串的指针。设置一个累计字符串长度的计数器和一个指向字符串的指针。 如果字符与如果字符与“

43、0AH”不等,则长度计数器和字符串指针都加不等,则长度计数器和字符串指针都加1;如果比较相等,则表示该字符为;如果比较相等,则表示该字符为“0AH”,字符串结束,计,字符串结束,计数器值就是字符串的长度。程序如下:数器值就是字符串的长度。程序如下:2022-6-2348MOVR4,#0FFH;长度计数器初值送;长度计数器初值送R4MOV R1,#2FH;字符串指针初值送;字符串指针初值送R1NEXT: INC R4INC R1CJNE R1,#0AH,NEXT;比较,不等则进行下一;比较,不等则进行下一 ;字符比较;字符比较END 上面两例都是在一个循环程序中不再包含其他循环程序,则称该循上面

44、两例都是在一个循环程序中不再包含其他循环程序,则称该循环程序为环程序为单重循环单重循环。如果一个循环程序中包含了其他循环程序,则称为。如果一个循环程序中包含了其他循环程序,则称为多重循环多重循环。 常见的多重循环是由常见的多重循环是由DJNZ指令构成的软件延时程序,是常用程序指令构成的软件延时程序,是常用程序之一。之一。2022-6-2349【例例4-14】 50ms的延时程序。的延时程序。 在使用在使用12MHz晶振时,一个机器周期为晶振时,一个机器周期为1s,执行一条,执行一条DJNZ指令的指令的时间为时间为2s。可用。可用多重循环的方法的延时的延时50ms程序:程序: DEL: MOV

45、R7,#200 ;本指令执行时间;本指令执行时间1s DEL1:MOV R6,#125;本指令执行时间;本指令执行时间1s DEL2:DJNZ R6,DEL2 ;指令执行;指令执行1次为次为2s,共,共 ; 1252 s=250s DJNZ R7,DEL1 ;指令执行时间;指令执行时间2s,本循环体执行,本循环体执行125次次 RET ;指令执行时间;指令执行时间2s2022-6-2350 以上延时程序以上延时程序不是太精确,把所有指令的执行时间计,把所有指令的执行时间计算在内,其延时时间为算在内,其延时时间为1+(1+250+2) 200+2s=50.603ms, 如要求比较精确的延时,应对

46、上述程序进行修改,才如要求比较精确的延时,应对上述程序进行修改,才能达到较为精确的延时时间。但要注意,用软件实现延时能达到较为精确的延时时间。但要注意,用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。程序,不允许有中断,否则将严重影响定时的准确性。 对于延时更长的时间,可采用多重的循环,如对于延时更长的时间,可采用多重的循环,如1s延时,延时,可用三重循环。可用三重循环。2022-6-23514.4 子程序及其调用子程序及其调用 完成完成通用功能通用功能、反复使用反复使用的程序设计成的程序设计成子程序子程序。这样会。这样会使程序结构清晰紧凑,便于阅读和调试。使程序结构清晰紧凑,便

47、于阅读和调试。 执行要由其它程序来调用,执行完后要返回到调用程序。执行要由其它程序来调用,执行完后要返回到调用程序。 子程序调用:子程序调用:ACALLACALL、LCALLLCALL; 子程序返回:子程序返回:RETRET。 2022-6-23521 1子程序的设计原则和应注意的问题子程序的设计原则和应注意的问题编写子程序应注意以下问题:编写子程序应注意以下问题: (1 1)子程序的入口地址,前必须有标号。)子程序的入口地址,前必须有标号。 (2 2)主程序调用子程序,是通过调用指令来实现。)主程序调用子程序,是通过调用指令来实现。 有两条子程序调用指令:有两条子程序调用指令: 绝对调用指令

48、绝对调用指令ACALL addr11ACALL addr11。双字节,。双字节,addr11addr11指出指出了调用的目的地址,了调用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不变,被调用位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高的子程序的首地址与绝对调用指令的下一条指令的高5 5位地位地址相同,即只能在同一个址相同,即只能在同一个2KB2KB区内。区内。 长调用指令长调用指令LCALL addr16LCALL addr16。三字节,。三字节,addr16addr16为直接为直接调用的目的地址,子程序可放在调用的目的地址,子程序可放在64KB64KB程

49、序存储器区任意位置。程序存储器区任意位置。2022-6-2353(3 3)子程序结构中必须用到堆栈,用来进行断点和现场的)子程序结构中必须用到堆栈,用来进行断点和现场的保护。保护。(4 4)子程序返回主程序时,最后一条指令必须是)子程序返回主程序时,最后一条指令必须是RETRET指令,指令,功能是把堆栈中的断点地址弹出送给功能是把堆栈中的断点地址弹出送给PCPC,从而实现子程序返回,从而实现子程序返回后从主程序断点处继续执行主程序。后从主程序断点处继续执行主程序。(5 5)子程序可以嵌套,即主程序可以调用子程序,子程序)子程序可以嵌套,即主程序可以调用子程序,子程序又可以调用另外的子程序。又可以调用另外的子程序。2022-6-2354在子程序中实现在子程序中实现SUB1SUB1:PUSH PSW ;:PUSH PSW ;保护现场(含当前工作寄存器组号)保护现场(含当前工作寄存器组号) PUSH ACC ;PUSH ACC ; PUSH B ; PUSH B ; MOV PSW,#10H ; MOV PSW,#10H ;切换当前工作寄存器组切换当前工作寄存器组 POP B ; POP B ;恢复现场恢复现场 POP ACC ;POP ACC ; POP PSW ; POP PSW ;内含当前工作寄存器组切换内含当前工作寄存器组切换 RETRET现场保护与恢复现场保护与恢复

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|