1 / 39

第四章 MCS-51 汇编程序设计

第四章 MCS-51 汇编程序设计. 本章在指令系统基础上,介绍 51 单片机 汇编语言程序设计. 本章主要内容. 4 . 1 汇编语言程序设计简介 4 . 2 顺序程序设计 4 . 3 分支程序设计 4 . 4 循环程序设计 4 . 5 子程序设计和参数传递. 4 . 1 汇编语言程序设计简介. 1 、 MCS-51 采用的程序设计语言 机器语言:现在基本不用; 51 汇编语言:计算简单、主要是控制 混合语言: 51 汇编语言 + 高级语言如 C51 (控制 + 计算 ). 2 、汇编语言源程序 只采用汇编语言描述或编写的程序.

clove
Télécharger la présentation

第四章 MCS-51 汇编程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 MCS-51汇编程序设计 本章在指令系统基础上,介绍51单片机汇编语言程序设计

  2. 本章主要内容 4.1 汇编语言程序设计简介 4.2 顺序程序设计 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计和参数传递

  3. 4.1 汇编语言程序设计简介 1、MCS-51采用的程序设计语言 机器语言:现在基本不用; 51汇编语言:计算简单、主要是控制 混合语言: 51汇编语言+高级语言如C51(控制+计算) 2、汇编语言源程序 只采用汇编语言描述或编写的程序 3、51汇编语言源程序:只能用于51单片机上运行 只采用51汇编语言描述或编写的程序 注:不同机器汇编语言不相同,其汇编语言源程序也不相同

  4. 4、51汇编语言源程序组成 汇编语言源程序是汇编语句的有序集合 即由若干条汇编语句按一定顺序组成 程序 文章 语句 句子 程序结构 逻辑关系 程序是按一定的逻辑关系将语句组合起来的集合

  5. 5 、汇编程序语句格式 不同语言的语句都有一定格式 。 MCS—51汇编语言的语句格式如下: [标号]: 指令 ;[注释] 方括号括起来的是可选择部分,可有可无,视需要而定 (1)标号是语句地址的标志符号 ; (2)指令:用于规定语句执行的操作或功能; 指令即是MCS—51指令系统中的汇编指令 (3)注释:对语句的解释说明 ,提高可读性; (4)指令中数据形式: 十进制数:以D作为后缀(可省略)如15D 二进制数:以B作为后缀如00001111B 十六进制数:以H作为后缀,若以A-F开头其前必加0,0F0H 字符或字符串:用‘’或“”表示如‘A’表示字符A的ASCII码(41H)

  6. 6 、程序的基本结构 程序的基本结构即逻辑结构: 程序中语句之间的逻辑关系; 各语句在程序中的先后顺序关系; 各语句执行的顺序关系。 结构化程序的基本结构有三种: (1)顺序结构: (2)分支结构: (3)循环结构: 由于处理问题不同,不同程序结构不尽相同; 实际的程序的结构是以上三种基本结构的混合形式

  7. 程序基本结构的示意图 设某一程序由5条语句组成:1、2、3、4、5 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 循环结构 顺序结构 分支结构

  8. 7 、程序设计基本步骤 第一步 问题分析(定义已知、要求) 第二步 确定处理问题的方法即算法 第三步 工作单元分配(变量或寄存器任务分配) 第四步 根据算法绘制程序流程图(确定逻辑结构) 第五步 根据流程图编写源程序 第六步 程序调试:查错且更正(上机实验)

  9. 8 、程序流程图—算法描述的图形工具 程序流程图:算法的图形描述 是描述程序执行过程的示图,由逻辑框符号和流程线组成 逻辑框符号:指示程序操作功能的符号 流程线:指示操作顺序的符号,指出程序执行的流向 处理框 开始/结束 判断框 流程线 输入输出框 连接框

  10. 9 、伪指令 :用于规定程序地址和建立数据表格 计算机只认识机器指令(二进制编码),必须把汇编语言源程序通过汇编程序翻译成机器语言程序(目标程序),计算机才能执行,这个翻译过程称为汇编。汇编程序在汇编过程中,必须要提供一些专门的指令以协助汇编,这些指令在汇编时并不产生目标代码,不影响程序的执行,所以称为伪指令。 (1) 汇编起始/定位指令ORG 指令格式为:ORG nn 指令的作用:指明后面的程序或数据块的起始地址,它总是出现在每段源程序或数据块的开始。式中,nn为16位地址或标号。 ORG 0030H MOV A,#20H 则指令MOV A,#20H将存放在0030H地址开始的存贮单元中

  11. (2)汇编结束指令END 指令格式: END 功能:提供汇编结束标志。 汇编程序遇到END后就停止汇编,对END以后的语句不予处理,故END应放在程序的结束处。 且每个程序最后都 是END指令 (3) 常量定义伪指令EQU 格式: 字符名称 EQU 数字 功能:使指令中的字符名称等价于给定的数字 G6 EQU 60 MOV A,#G6 MOV A,#60

  12. (4) 定义字节指令DB 指令格式: [标号:] DB X1,X2,…,Xn 其中 X1,X2, … ,Xn为8位数据或ASC码 功能:把X1,X2, … ,Xn依次存入从标号开始的连续的存储单元中。 0200H 0201H 0202H 0203H 0204H ORG 0200H BUF1: DB 10H,20H,25H,80H (5) 定义字指令DW 指令格式: [标号:] DW 16位数据表 指令功能:与DB相似,区别仅在于从指定地址开始存放的是指令中的16位数据。每个16位数据要占两个存储单元,高8位先存,低8位后存.

  13. (6)定义存储单元指令DS 格式:标号:DS 数字 功能:表示从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元。 例: SPACE: DS 10 ;表示从SPACE开始保留10个存储单元, 下一条指令将从SPACE+10处开始汇编。 (7)地址符号指令BIT 格式:名称 BIT 位地址 功能:将位地址赋给某一名称 例: PORTER BIT P1.5 ; MOV C,PORTER 将P1.5的数值送到进位标志CY中。

  14. 4.2 顺序程序设计 顺序结构是最简单的一种程序结构,编程很容易,它 有两个显著特点: ①程序语句按编写顺序一条条执行,程序流向不变 最后一条指令执行完毕整个程序即结束. ②程序中无转移、调转等指令; 多用于处理比较简单的问题 例1 两个无符号单字节数相加程序 已知:被加数存放于内部RAM的40H,加数存放于50H, 设计程序计算这二数据之和且将二数之和存入40H单元中。 假设:二数之和仍为单字节数即无进位。

  15. 第一步 问题分析(定义已知、要求及假设) X + Y = Z 40H X + 50H Y 40H Z 第二步 确定处理问题的方法即算法 结合语言本身的特点确定解决方法 X 寄存器 寄存器 + Y 寄存器 寄存器 Z 第三步 工作单元分配(变量或寄存器任务分配) 工作单元:寄存器 ? 寄存器只能是A

  16. 开始 开始 (40H) A (A)+(50H) A (A) 40H 结束 结束 第四步 根据算法绘制程序流程图(确定逻辑结构) 取数X送累加器A A和数Y相加 相加结果保存 流程图1 流程图2

  17. 开始 (40H) A (A)+(50H) A (A) 40H 结束 第五步 根据流程图编写源程序 ORG 0000H ;程序开始 START: MOV A,40H ; 8位被加数送A ADD A,50H ;两数相加 MOV 40H,A ;相加和送40H END ;程序结束 注:程序从ROM的0000H单元开始存放 第六步 程序调试:查错且更正(上机实验)

  18. D7-4 D3-0 40H 41H 4 10 48 40 8 例2 单字节二进制数转换成压缩BCD码程序设计 设单字节二进制数存于内部RAM 40H中(设<100),转换结果存于41H中。 第一步 问题分析(定义已知、要求及假设) 30H 4 8 十位 个位 第二步 确定处理问题的方法即算法 A中十六进制数据在0-99之间,将其除以10后所得商为BCD码的十位数,余数为个位数,再合并为一个字节 商:十位数 余数:个位数

  19. 开始 结束 工作单元:被除数、除数、商和余数 第三步 工作单元分配(变量或寄存器任务分配) A:被除数和商 B:除数和余数 ? 第四步 根据算法绘制程序流程图(确定逻辑结构) 从40H取数送A 被除数10送B 除法运算 合并商和余数 结果保存在41H

  20. 开始 从40H取数送A 被除数10送B 除法运算 结束 合并商和余数 结果保存在41H 第五步 根据流程图编写源程序 ORG 0030H ;程序开始 HEXBCD:MOV A,40H ;取数 MOV B,#10 DIV AB ;除以10 SWAP A ADD A,B ;合并商和余数为一个字节 ;商存高半字节,余数存低半字节 MOV 41H,A ;保存结果 END ;程序结束 注:程序从ROM的0030H单元开始存放 第六步 程序调试:查错且更正(上机实验)

  21. 条件满足? 否 1 2 4.3 分支程序设计 一、 分支结构程序特点: 根据给定的条件进行判定以决定程序执行流向, 并不总是按语句编写顺序执行即在程序某处有分支 二 、分支的实现 通常由条件转移指令实现这一功能 ①根据要求利用转移指令,改变程序流向; ②设计难点是如何正确使用供条件转移指令使用的条件。 三、分支转移指令 1 条件转移指令; 2 无条件转移指令; 3 比较转移指令;

  22. 执行条件转移指令时,先对某一条件或状态进行执行条件转移指令时,先对某一条件或状态进行 判断,满足则转移;否则顺序执行后面的指令 条件转移指令 JZ 标号 JNZ 标号 JC 标号 JNC 标号 JB bit,标号 JNB bit, 标号 无条件转移指令 执行无条件转移指令时,无论状态如何都转移至标号处,而不按顺序执行后面的指令。 AJMP 标号 SJMP 标号 LJMP 标号 JMP @A+DPTR

  23. 比较不相等转移指令 执行这类指令时,先对两个数大小进行比较,若不相等则转移;否则顺序执行后面的指令

  24. A A +30H 0- 9的数 ASCII码 A- F的数 +37H 例1 十六进制数转换成ASCII码 设待转换的一位十六进制数据已存于A中,要求将之转换成相应ASCII码,结果仍存于A中。 第一步 问题分析(定义已知、要求及假设) 01H 31H 第二步 确定处理问题的方法即算法 在转换程序中应在判别后分别进行处理。

  25. 开始 开始 (A)>9? (A)>9? (A)+30H A (A)+30H A (A)+37H A (A)+07H A 结束 结束 第三步 根据算法绘制程序流程图(确定逻辑结构) No No Yes Yes

  26. (A) R2 (A)+246 A No Yes C=0 C=1? (A)>9? C=1 第四步 根据流程图编写源程序 ORG 0000H ;程序开始 HEXASC: MOV R2,A ADD A,#246 MOV A,R2 JNC AD30 ADD A,#07H AD30: ADD A,#30H END ;程序结束

  27. 开始 Yes P1.0=1? No P2.0=0 A1: Yes P1.1=1? No P2.1=0 A2: 例2 开关显示程序 已知流程图如下图示: 源程序如下: ORG 0000H ;程序开始 START: JB P1.0,A1 ;若P1.0=1则去A1 CLR P2.0 A1: JB P1.1,A2;若P1.0=1则去A2 CLR P2.1 A2: AJMP START ;重复上述过程 END ;程序结束

  28. 4.4 循环程序设计 需要多次连续重复的某一程序段:操作相同,只是操作数不同 一 循环程序的主要特点: ①大大缩短程序,减少占用程序空间; ②程序结构优化,清晰易读; ③循环程序主要由循环常数、循环体和循环控制三部分组成 二 循环的实现 通常由转移指令实现这一功能,多次转向某一程序段 ①条件转移指令 ②循环转移指令(减1条件转移指令)

  29. DJNZ Rn,标号 (Rn)—1 Rn DJNZ direct,标号 No (Rn) =0? 操作: 1 先对Rn进行减1操作(Rn)—1 Rn ; 2 若(Rn) 0 则转移至标号位置;否则顺序执行。 Yes 循环转移指令 执行循环转移指令时,先对某一操作数进行减1操作,若仍 不为0则转移至标号称;若为0则顺序执行后面的指令。

  30. 50H X 例1 10个无符号单字节数求和程序 设在内部RAM的30H单元开始连续存放10个的无符号单字节数 试编一个求和程序,并将和存入内部RAM的50H单元 (设和不超过8位)。 第一步 问题分析(定义已知、要求及假设) a1+a2+a3+…+a9+a10 = X 30H 31H … … 39H 注:数据地址相邻即相差1

  31. 第二步 确定处理问题的方法即算法 a1 + a2 + a3+…+ a9 + a10 = X b1 b2 b8 b9=X 第三步 工作单元分配(变量或寄存器任务分配) 累加器A:存放中间结果b1、b2、..b9即存放累加和 最好用A ? 寄存器R0(或R1):存放数据地址指针 若将a1的地址存放在R0中设(R0)=30H,则a2的地址为(R0)+1 a3的地址为(R0)+1+1… R2:计数器:存放相加次数

  32. 0  A 10 R2 开始 开始 30H  R0 (A)+((R0))A (R0)+1 R0 No (R2)-1  R2=0? 是否加完? 结束 结束 Yes (A) 50H 第四步 根据算法绘制程序流程图(确定逻辑结构) 累加器A清0 置R2相加次数 设置初始地址 加一个数 指向下一个数 No Yes 保存结果

  33. 0  A 10 R2 开始 30H  R0 (A)+((R0))A (R0)+1 R0 No (R2)-1  R2=0? 结束 Yes (A) 50H 第五步 根据流程图编写源程序 ORG 0030H ;程序开始 START:CLR A ;清累加器A MOV R2,#10 ;相加次数送R2 MOV R0,#30H ;第一个数据地址送R0 LOOP1:ADD A,@R0 ;循环累加 INC R0 ;地址指向下一个数 DJNZ R2,LOOP1 ;修改计数器并判断 MOV 50H,A ;保存和结果 END ;程序结束

  34. 例2将内部RAM 40H-4FH单元中数据全部清0 第一步 问题分析(定义已知、要求及假设) 40H 41H … … 4FH 第二步 确定处理问题的方法即算法 对某一单元清0即存入00H; 第三步 工作单元分配(变量或寄存器任务分配) 寄存器R0(或R1):存放第一个单元地址值40H, 则第二个单元的地址为(R0)+1、 第三个单元的地址为(R0)+1+1… 寄存器R3:存贮单元个数

  35. 开始 设置初始地址入R0 置R3存贮单元个数 对存贮单元清0 指向下一个单元 No 所有单元完? 结束 Yes 第四步 根据算法绘制程序流程图(确定逻辑结构) ORG 0030H ;程序开始 START: MOV R0,#40H ;第一个单元地址送R0 MOV R3,#16 ;存贮单元个数送R3 LOOP1:MOV @R0,#00H ;清0 INC R0 ;指向下一单元 DJNZ R3,LOOP1 ; END ;程序结束 第五步 根据流程图编写源程序

  36. 4.5 子程序设计 1 子程序的定义 子程序名:... ;子程序开始 … … RET ;子程序结束 注:子程序名由用户定义,以字母开头 2 子程序的调用 在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。 调用子程序的指令: ACALL 子程序名:短调用(2KB范围内) LCALL 子程序名:长调用(64KB范围内)

  37. 例 延时200ms的程序设计 设晶振fs=12MHZ 第一步 问题分析(定义已知、要求及假设) 第二步 确定处理问题的方法即算法 采用单重循环和子程序: 延时T≈一个子程序所需要的执行时间×循环次数 200ms ≈1ms ×200 第三步工作单元分配(变量或寄存器任务分配) R2:子程序工作寄存器 存放子程序循环次数 R3:主程序存放调用五程序的次数 注:主程序和子程序所用工作寄存器 不能冲突

  38. 开始 开始 置R3为调用次数200 LP1: 置R2为循环数 调用延时1ms子程序 LP0: 空操作 No 调用完? No Yes 循环完? 结束 结束 Yes 第四步 根据算法绘制程序流程图 主程序流程图 1ms延时子程序流程图

  39. 第五步 根据流程图编写源程序 START:MOV R3,#200 LP1:ACALL DELAY1MS ;调用延时1MS子程序 DJNZ R3,LP1 END DELAY1MS:MOV R4,#250 A1:NOP NOP DJNZ R2,A1 RET ;返回主程序

More Related