390 likes | 563 Views
第四章 MCS-51 汇编程序设计. 本章在指令系统基础上,介绍 51 单片机 汇编语言程序设计. 本章主要内容. 4 . 1 汇编语言程序设计简介 4 . 2 顺序程序设计 4 . 3 分支程序设计 4 . 4 循环程序设计 4 . 5 子程序设计和参数传递. 4 . 1 汇编语言程序设计简介. 1 、 MCS-51 采用的程序设计语言 机器语言:现在基本不用; 51 汇编语言:计算简单、主要是控制 混合语言: 51 汇编语言 + 高级语言如 C51 (控制 + 计算 ). 2 、汇编语言源程序 只采用汇编语言描述或编写的程序.
E N D
第四章 MCS-51汇编程序设计 本章在指令系统基础上,介绍51单片机汇编语言程序设计
本章主要内容 4.1 汇编语言程序设计简介 4.2 顺序程序设计 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计和参数传递
4.1 汇编语言程序设计简介 1、MCS-51采用的程序设计语言 机器语言:现在基本不用; 51汇编语言:计算简单、主要是控制 混合语言: 51汇编语言+高级语言如C51(控制+计算) 2、汇编语言源程序 只采用汇编语言描述或编写的程序 3、51汇编语言源程序:只能用于51单片机上运行 只采用51汇编语言描述或编写的程序 注:不同机器汇编语言不相同,其汇编语言源程序也不相同
4、51汇编语言源程序组成 汇编语言源程序是汇编语句的有序集合 即由若干条汇编语句按一定顺序组成 程序 文章 语句 句子 程序结构 逻辑关系 程序是按一定的逻辑关系将语句组合起来的集合
5 、汇编程序语句格式 不同语言的语句都有一定格式 。 MCS—51汇编语言的语句格式如下: [标号]: 指令 ;[注释] 方括号括起来的是可选择部分,可有可无,视需要而定 (1)标号是语句地址的标志符号 ; (2)指令:用于规定语句执行的操作或功能; 指令即是MCS—51指令系统中的汇编指令 (3)注释:对语句的解释说明 ,提高可读性; (4)指令中数据形式: 十进制数:以D作为后缀(可省略)如15D 二进制数:以B作为后缀如00001111B 十六进制数:以H作为后缀,若以A-F开头其前必加0,0F0H 字符或字符串:用‘’或“”表示如‘A’表示字符A的ASCII码(41H)
6 、程序的基本结构 程序的基本结构即逻辑结构: 程序中语句之间的逻辑关系; 各语句在程序中的先后顺序关系; 各语句执行的顺序关系。 结构化程序的基本结构有三种: (1)顺序结构: (2)分支结构: (3)循环结构: 由于处理问题不同,不同程序结构不尽相同; 实际的程序的结构是以上三种基本结构的混合形式
程序基本结构的示意图 设某一程序由5条语句组成:1、2、3、4、5 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 循环结构 顺序结构 分支结构
7 、程序设计基本步骤 第一步 问题分析(定义已知、要求) 第二步 确定处理问题的方法即算法 第三步 工作单元分配(变量或寄存器任务分配) 第四步 根据算法绘制程序流程图(确定逻辑结构) 第五步 根据流程图编写源程序 第六步 程序调试:查错且更正(上机实验)
8 、程序流程图—算法描述的图形工具 程序流程图:算法的图形描述 是描述程序执行过程的示图,由逻辑框符号和流程线组成 逻辑框符号:指示程序操作功能的符号 流程线:指示操作顺序的符号,指出程序执行的流向 处理框 开始/结束 判断框 流程线 输入输出框 连接框
9 、伪指令 :用于规定程序地址和建立数据表格 计算机只认识机器指令(二进制编码),必须把汇编语言源程序通过汇编程序翻译成机器语言程序(目标程序),计算机才能执行,这个翻译过程称为汇编。汇编程序在汇编过程中,必须要提供一些专门的指令以协助汇编,这些指令在汇编时并不产生目标代码,不影响程序的执行,所以称为伪指令。 (1) 汇编起始/定位指令ORG 指令格式为:ORG nn 指令的作用:指明后面的程序或数据块的起始地址,它总是出现在每段源程序或数据块的开始。式中,nn为16位地址或标号。 ORG 0030H MOV A,#20H 则指令MOV A,#20H将存放在0030H地址开始的存贮单元中
(2)汇编结束指令END 指令格式: END 功能:提供汇编结束标志。 汇编程序遇到END后就停止汇编,对END以后的语句不予处理,故END应放在程序的结束处。 且每个程序最后都 是END指令 (3) 常量定义伪指令EQU 格式: 字符名称 EQU 数字 功能:使指令中的字符名称等价于给定的数字 G6 EQU 60 MOV A,#G6 MOV A,#60
(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位后存.
(6)定义存储单元指令DS 格式:标号:DS 数字 功能:表示从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元。 例: SPACE: DS 10 ;表示从SPACE开始保留10个存储单元, 下一条指令将从SPACE+10处开始汇编。 (7)地址符号指令BIT 格式:名称 BIT 位地址 功能:将位地址赋给某一名称 例: PORTER BIT P1.5 ; MOV C,PORTER 将P1.5的数值送到进位标志CY中。
4.2 顺序程序设计 顺序结构是最简单的一种程序结构,编程很容易,它 有两个显著特点: ①程序语句按编写顺序一条条执行,程序流向不变 最后一条指令执行完毕整个程序即结束. ②程序中无转移、调转等指令; 多用于处理比较简单的问题 例1 两个无符号单字节数相加程序 已知:被加数存放于内部RAM的40H,加数存放于50H, 设计程序计算这二数据之和且将二数之和存入40H单元中。 假设:二数之和仍为单字节数即无进位。
第一步 问题分析(定义已知、要求及假设) X + Y = Z 40H X + 50H Y 40H Z 第二步 确定处理问题的方法即算法 结合语言本身的特点确定解决方法 X 寄存器 寄存器 + Y 寄存器 寄存器 Z 第三步 工作单元分配(变量或寄存器任务分配) 工作单元:寄存器 ? 寄存器只能是A
开始 开始 (40H) A (A)+(50H) A (A) 40H 结束 结束 第四步 根据算法绘制程序流程图(确定逻辑结构) 取数X送累加器A A和数Y相加 相加结果保存 流程图1 流程图2
开始 (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单元开始存放 第六步 程序调试:查错且更正(上机实验)
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码的十位数,余数为个位数,再合并为一个字节 商:十位数 余数:个位数
开始 结束 工作单元:被除数、除数、商和余数 第三步 工作单元分配(变量或寄存器任务分配) A:被除数和商 B:除数和余数 ? 第四步 根据算法绘制程序流程图(确定逻辑结构) 从40H取数送A 被除数10送B 除法运算 合并商和余数 结果保存在41H
开始 从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单元开始存放 第六步 程序调试:查错且更正(上机实验)
是 条件满足? 否 1 2 4.3 分支程序设计 一、 分支结构程序特点: 根据给定的条件进行判定以决定程序执行流向, 并不总是按语句编写顺序执行即在程序某处有分支 二 、分支的实现 通常由条件转移指令实现这一功能 ①根据要求利用转移指令,改变程序流向; ②设计难点是如何正确使用供条件转移指令使用的条件。 三、分支转移指令 1 条件转移指令; 2 无条件转移指令; 3 比较转移指令;
执行条件转移指令时,先对某一条件或状态进行执行条件转移指令时,先对某一条件或状态进行 判断,满足则转移;否则顺序执行后面的指令 条件转移指令 JZ 标号 JNZ 标号 JC 标号 JNC 标号 JB bit,标号 JNB bit, 标号 无条件转移指令 执行无条件转移指令时,无论状态如何都转移至标号处,而不按顺序执行后面的指令。 AJMP 标号 SJMP 标号 LJMP 标号 JMP @A+DPTR
比较不相等转移指令 执行这类指令时,先对两个数大小进行比较,若不相等则转移;否则顺序执行后面的指令
A A +30H 0- 9的数 ASCII码 A- F的数 +37H 例1 十六进制数转换成ASCII码 设待转换的一位十六进制数据已存于A中,要求将之转换成相应ASCII码,结果仍存于A中。 第一步 问题分析(定义已知、要求及假设) 01H 31H 第二步 确定处理问题的方法即算法 在转换程序中应在判别后分别进行处理。
开始 开始 (A)>9? (A)>9? (A)+30H A (A)+30H A (A)+37H A (A)+07H A 结束 结束 第三步 根据算法绘制程序流程图(确定逻辑结构) No No Yes Yes
(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 ;程序结束
开始 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 ;程序结束
4.4 循环程序设计 需要多次连续重复的某一程序段:操作相同,只是操作数不同 一 循环程序的主要特点: ①大大缩短程序,减少占用程序空间; ②程序结构优化,清晰易读; ③循环程序主要由循环常数、循环体和循环控制三部分组成 二 循环的实现 通常由转移指令实现这一功能,多次转向某一程序段 ①条件转移指令 ②循环转移指令(减1条件转移指令)
DJNZ Rn,标号 (Rn)—1 Rn DJNZ direct,标号 No (Rn) =0? 操作: 1 先对Rn进行减1操作(Rn)—1 Rn ; 2 若(Rn) 0 则转移至标号位置;否则顺序执行。 Yes 循环转移指令 执行循环转移指令时,先对某一操作数进行减1操作,若仍 不为0则转移至标号称;若为0则顺序执行后面的指令。
50H X 例1 10个无符号单字节数求和程序 设在内部RAM的30H单元开始连续存放10个的无符号单字节数 试编一个求和程序,并将和存入内部RAM的50H单元 (设和不超过8位)。 第一步 问题分析(定义已知、要求及假设) a1+a2+a3+…+a9+a10 = X 30H 31H … … 39H 注:数据地址相邻即相差1
第二步 确定处理问题的方法即算法 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:计数器:存放相加次数
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 保存结果
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 ;程序结束
例2将内部RAM 40H-4FH单元中数据全部清0 第一步 问题分析(定义已知、要求及假设) 40H 41H … … 4FH 第二步 确定处理问题的方法即算法 对某一单元清0即存入00H; 第三步 工作单元分配(变量或寄存器任务分配) 寄存器R0(或R1):存放第一个单元地址值40H, 则第二个单元的地址为(R0)+1、 第三个单元的地址为(R0)+1+1… 寄存器R3:存贮单元个数
开始 设置初始地址入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 ;程序结束 第五步 根据流程图编写源程序
4.5 子程序设计 1 子程序的定义 子程序名:... ;子程序开始 … … RET ;子程序结束 注:子程序名由用户定义,以字母开头 2 子程序的调用 在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。 调用子程序的指令: ACALL 子程序名:短调用(2KB范围内) LCALL 子程序名:长调用(64KB范围内)
例 延时200ms的程序设计 设晶振fs=12MHZ 第一步 问题分析(定义已知、要求及假设) 第二步 确定处理问题的方法即算法 采用单重循环和子程序: 延时T≈一个子程序所需要的执行时间×循环次数 200ms ≈1ms ×200 第三步工作单元分配(变量或寄存器任务分配) R2:子程序工作寄存器 存放子程序循环次数 R3:主程序存放调用五程序的次数 注:主程序和子程序所用工作寄存器 不能冲突
开始 开始 置R3为调用次数200 LP1: 置R2为循环数 调用延时1ms子程序 LP0: 空操作 No 调用完? No Yes 循环完? 结束 结束 Yes 第四步 根据算法绘制程序流程图 主程序流程图 1ms延时子程序流程图
第五步 根据流程图编写源程序 START:MOV R3,#200 LP1:ACALL DELAY1MS ;调用延时1MS子程序 DJNZ R3,LP1 END DELAY1MS:MOV R4,#250 A1:NOP NOP DJNZ R2,A1 RET ;返回主程序