51系列汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
36
4.3 汇编语言程序设计举例
定时程序
短时间 长时间 调整定时时间 一个程序多种定时
37
定时程序
1.单循环定时程序 MOV R5, #TlME LOOP: NOP ;1机器周期 NOP ;1机器周期 DJNZ R5, LOOP ;2机器周期 如单片机的晶振颇率为6MHz,则一个机器周期是 2uS。因此一次循环的延迟时间为8uS,程序总的延 迟时间为8xtime(uS)。本程序的实际延迟时间决 定于装入寄存器R5的定时时间常数。R5是8位寄存 器,因此这个程序的最长定时时间为 256X8=2048(uS)。即定时范围是 2048uS(2.048mS)----------时间延迟比较小
29
使用查转移指令表方法实现多分支程序转移
30
使用查转移指令表方法实现多分支程序转移
使用这种方法最多可实现128个分支程 序的转移 由于AJMP指令的转移范围是2KB,可以在 2KB范围内安排分支程序.因此分支范围 较大,便于分支数目较多时应用 如把表中的AJMP改为长转移LJMP楷今, 则分支程序可以在64KB范围内转移 长转移LJMP为3字节指令。
但MCS51指令系统中没有多分支转移
指令,无法使用一条指令完成多分支转 移。要实现多分支转移,可采用以下几 种方法。
使用多条CJNE指令,通过逐次比较,实
现多分支程序转移。 使用查表方法实现多分支程序转移 查表方法,但把转移指令直接放人表中 使用堆栈操作实现多分支转移
22
使用CJNE指令实现多分支转移
(3)字定义
标号:DW (字常数或表达式)
作用: 指示在程序存储器中以标号为起始地址 的单元里存放的数为字数据(即16位的二进制数), 例如: GH :DW 1234H,56Hale Waihona Puke Baidu8H,08
GH+4 GH+2
56 78 00
08
(4)保留字节
标号:DS (数值表达式)
作用: 指示在程序存储器中保留以标号为起始地 址的若干字节单元,其单元个数由数值表达式指定。 例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。
12
顺序程序设计
由于MCS-51指令系统中只有单字节加
法指令,因此对多字节相加时运算,必 须从低位字节开始分字节进行。 最低字节可以使用ADD指令 其它字节相加时要把低字节的进位考 虑进去.因此应使用ADDC指令。
13
顺序程序设计
【例】两个无符号双字节数相加。设被加数存放在内部存储器 30H(高位字节)、31H(低位字节)单元,加数存放在内部存储器 40H (高位字节)、 41H (低位字节)单元,和存入 30H (高位字 节)、31H(低位字节)单元。
第四章
MCS-51汇编语言程序设计
本章介绍以下内容
汇编语言程序设计概述 汇编语言伪指令 源程序的编辑和汇编 汇编语言程序基本结构形式 程序设计举例
9
汇编语言程序基本结构形式
按结构化程序设计思想,任何复杂程
序都可由顺序结构、分支结构、循环结 构等构成
10
顺序结构
不同的操作顺序执行,没有
R0中存低8位地址,R1中存放高8位地址,
R3中存放分支序号值。brtab为差值表首地 址, br0_brtab、 br3_brtab为差值
26
使用查表方法实现多分支程序转移
27
使用查表方法实现多分支程序转移
28
使用查转移指令表方法实现多分支程序转移
假定有多个分支程序,使这些分支程序都 通过绝对转移指令AJMP进行转移,并把这些 转移指令按序写入表中 把分支序号值乘以2的原因是AJMP指令为2 字节指令。 分支实现过程是根据分支序号值(R3),通 过JMP指令转向BRTAB表中的某一条AJMP指令, 然后再执行该AJMP指令,而把程序转移到指 定分支。 因此这种分支方法实际上是通过两次转移 而实现
2.较长时间的定时程序 为了加长定时时间,通常采用多重循环的方法。例 如下列双重循环的定时程序,最长可延时262658个机 器周期,6Mhz晶振时,即525316uS(525mS或0.5S)
2
编译器C51
C语言程序
汇编语言 源程序
浮 动 地 址 目 标 程 序
绝对地址 目标程序 .BIN
· HEX
汇编器A51
连接/定位器 L51
符号转换程序 OHS51
图 3-1 两种语言源程序转换成目标程序
4.2
伪指令与汇编程序基本格式
1.伪指令
(1)起始指令 ORG nn 功能:定义程序或数据块的起始地址。指示此语句后面的程序 或数据块以nn为起始地址,连续存放在程序存储器中。 指令地址 机器码 源程序 ORG 2000H 2000H 78 30 MAIN: MOV R0,#30H 2002H E6 MOV A,@R0 … 3000H 3001H 3002H 23 64 41 ORG 3000H TAB: DB 23H,100,‘A’
(7)汇编结束
END
作用: 指示源程序段结束。 END指令放在程序的最后。 A51汇编程序还有一些其它的伪指令。
2、汇编程序基本格式
(1)汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] (2)汇编程序的一般格式 ORG XXXXH 汇编语句1 …… 汇编语句N END
8 返回本节
此外还有以位状态作为条件进行程序分支的指令,
如JC、JNC、JB、JNB和JBC等。
使用这些指令,可以完成为0、为1、为正、为负
以及相等、不相等等各种条件判断。
20
多分支程序转移
首先把分支程序按序号进行排列,然后按照序号
值进行转移。假定分支转移序号最大值为n,则分 支转移结构如图
21
多分支程序转移
38
4.3 汇编语言程序设计举例
短时间定时程序
12M晶振,50ms延时
Delay: DEL1: DEL2: MOV R7,#125 MOV R6,#200 DJNZ R6,DEL2 DJNZ R7,DEL1 RET 调用CALL Delay MOV R7,#??? CALL Delay
39
定时程序
24
使用查表方法实现多分支程序转移
在程序中建立一个差值表,并将
各分支入口地址与该表首址的差值 按序排列其中。 差值表首址送DPTR,分支序号值 送A中,查表后就可通过转移指令 JMP @A+DPTR进行分支。
25
使用查表方法实现多分支程序转移
„例‟有四个分支程序段,各分支程序段
依次是
从内部RAM取数 从外部RAM低256E范围取数 从外部RAM <4KB范围取数 从外部RAM 64KB范围取数
31
使用堆栈操作实现多分支转移
把分支程序入口地址存放在转移表
中(低8位在前,高8位在后) 先把分支程序人口地址进栈.然后 利用返回指令RET把分支程序入口地 址装入PC,所以接着就转去执行分支 程序
32
使用堆栈操作实现多分支转移
33
第四章
MCS-51汇编语言程序设计
本章介绍以下内容
汇编语言程序设计概述 汇编语言伪指令 源程序的编辑和汇编 汇编语言程序基本结构形式 程序设计举例
34
4.3 汇编语言程序设计举例
算术运算程序
加减法 乘法 除法
数制转换
ASCII码与16进制相互转换 BCD码与16进制相互转换
35
4.3 汇编语言程序设计举例
定时程序
在单片机的控制应用中,常有定时的需要.如定时中 断、定时检测和定时扫描等.定时功能除可以使用 定时器/计数器实现之外.更多地是使用定时程序 完成。 定时程序是典型的循环程序,它是通过执行一个具有 固定延迟时间的循环程序来实现延时的。因此也把 定时程序称之为延时程序。定时程序只能使用汇编 语言编写。
(2)字节定义 标号: DB(字节常数,或字符或表达式)
功能:指示在程序存储器中以标号为起始地址的单 元里存放的数为字节数据(八位二进制数)。
地址
LN
数据
20 43 25 FF
12 34
LN+1 LN+2 LN+3
GH
例如
LN:DB 32,’C’,25H,-1;LN~LN+2
地址单元依次存放20H , 43H , 25H ,FFH
;加数单元
INC R0 INC R1 ;修改指针,指向下一个相加的数
DJNZ R2,LOOP
;循环实现多字节数相加
19
分支程序
程序分支是通过条件转移指令实现的,即根据条
件对程序的执行进行判断,满足条件则进行程序转 移,不满足条件程序就顺序执行。
在MCS-51指令系统中,通过条件到断实现单分支
程序转移的指令有JZ、JNZ、CJNE和DJNZ等。
分支、循环、子程序调用。 多字节无符号数相加 整个系统流程就是顺序结构
11
顺序程序设计
顺序结构程序是一种最简单、最基本的程序(也称为简单 程序),它是一种无分支的直线形程序,按照程序编写的顺序 依次执行。 【例】 两个8位无符号数相加,和仍为8位。 假设两个无符号数X1, X2分别存放于内部RAM60H、 61H单元中,求其和并将和送入62H单元。 ORG 0000H 程序如下: CLR C MOV R0 ,# 60H ;设R0为数据指针 MOV A ,@R0 ;取X1 INC R0 ADDC A ,@R0 ;X1+X2 INC R0 MOV @R0,A ;保存结果 END
;低字节和存人被加数低字节
;修改指针,指向被加数高字节 ;修改指针,指向加数高字节 ;取被加数高字节 ;高字节相加 ;存结果
14
循环控制
没有专门循环指令 通过条件判断控制循环 区分
先执行后判断 先判断后执行
15
循环程序设计 循环程序一般由4部分组成。 (1)置循环初值。 (2)循环体。 (3)循环修改。 (4)循环控制。 图 (a)结构是“先执行后判断”,适用于循环次 数已知的情况。 图 (b)结构是“先判断后执行”,适用于循环次 数未知的情况。
分支序号值在A中,则可使用CJNE A,#date , rel 指令实现多分支转移 这种多分支方法的优点是层次清晰,程序简单 易懂。 但这种方法分支速度较慢,特别是层次较多时。 此外分支入口地址应在8位偏移量的有效范围 之内。
23
使用CJNE指令实现多分支转移
多分支转移流程图(与8088之INT21H中断 相似)
ORG CLR MOV MOV MOV ADD 0000H C R0 ,#31H R1 ,#41H A ,@R0 A ,@R1 ;将C清零 ;送被加数首址 ;送加数首址 ;取被加数低字节 ;两个低字节相加
MOV
DEC DEC MOV ADDC MOV END
@R0 ,A
R0 R1 A,@R0 A,@R1 @R0 , A
第五章
《MCS-51汇编语言程序设计》
刘建成 ljc@mail.csu.edu.cn
中南大学信息院自动化系
1
4.1
汇编语言程序设计概述
汇编语言是面向机器硬件的语言,要求程序设计者
对MCS-51单片机具有很好的“软、硬结合”的功底。
MCS-51单片机的编程语言可以是汇编语言也可以是高级
语言(如C语言),高级语言编程快捷,但程序长,占用存 储空间大,执行慢;汇编语言产生的目标程序简短,占用 存储空间小,执行快,能充分发挥计算机的硬件功能。无 论是高级语言还是汇编语言,源程序都要转换成目标程序 (机器语言)单片机才能执行。
它们的字节数为L,要求加得的和放
回被加数的单元。
18
参考程序如下
MOV R0,#ADR1 MOV R1,#ADR2 MOV R2,#L
CLR C
LOOP: MOV A,@R0;通过R0间址,取得被加数的一 ;个字节
ADDC A,@R1 ;通过R1间址,取得加数的一个字
;节,与被加数的相应字节相加 MOV @R0,A ;加得的和通过R0间址放回原被
(5)等值指令 标号 EQU(数值表达式) 表示EQU两边的量等值,用于为标号或标识符赋值。 X1 EQU 2000H 例如: X2 EQU 0FH … MAIN: MOV DPTR,#X1 ; DPTR=2000H ADD A,#X2 ; A=A+0FH
(6)位定义 标号 BIT [位地址] 作用: 同EQU指令,不过定义的是位操作地址。 例如 AIC BIT P1.1
16
循环程序设计
开始 置循环初值 开始 置循环初值
循环处理 循环修改 N
Y
循环结束?
N 循环处理 循环修改
循环结束?
Y 结束处理 结束 (a)先执行后判断 结束处理 结束 (b)先判断后执行
17
多字节无符号数相加
设被加数与加数分别在以ADR1与 ADR2为初址的片内数据存储器区域 中,自低字节起,由低到高依次存放;