单片机原理与接口技术4
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑵ MCS-51汇编语言的伪指令 汇编语言程序的机器汇编是由微型计算机通过汇 编程序自动完成的。为此,在源程序中应该有向 汇编程序发出指示的信息,告诉它应该如何完成 汇编工作。 伪指令就是汇编程序能够识别的汇编命令,它是 程序员发给汇编程序的命令,只在汇编过程中起 作用,它不是单片机要执行的指令,所以它没有 机器码,在目标程序中也就不存在与伪指令相对 应的机器码。
⑤ DS(DEFINE STONAGE)定义存储区命令
本命令用于从指定地址开始,保留指定数目的 空白字节单元作为存储区,供程序运行时使用,汇 编时,对这些单元不赋值。其命令格式为: [〈标号:〉] DS〈表达式〉
⑥ EQU(EQUATE)赋值命令
本命令用于给标号赋值,赋值以后,
其标号值在整个程序中有效。其命令格式
例2:某温度控制系统,采集的温度值T存
放在累加器A中,此外在内部RAM的54H单元中存
放控制温度的下限值Ta,在55H单元中存放控制
温度的上限值Tb。若T>Tb,程序转向降温处理 若Ta≤T≤Tb,则程序返回主程序。
程序JW;若T<Ta,则程序转向升温处理程序SW;
实现程序如下:
CJNE A,55H,LOOP1
第4章 MCS-51单片机汇编语言程序设计
4.1 程序设计的基本方法
4.2 汇编语言程序的基本形式与设计举例
4.1 程序设计的基本方法
程序设计就是编写计算机程序,任务是 利用计算机语言对所要实现的功能进行描述 和规定。80C51单片机程序设计主要采用2种 语言: 一种是汇编语言,另一种是高级语言。
③ DB(DEFINE BYTE)定义字节命令
本命令用于从指定的地址开始,在程序 存储器的连续单元中定义字节数据,其命令 格式为: [〈标号:〉] DB 〈8位数表〉
④ DW(DEFINE WORD)定义数据字命令 本命令用于从指定地址开始,在程序存 储器的连续单元中定义16位的数据字。该命 令将字数据表中的数据依从左到右的顺序存 放在指定的存储单元中,数据字的高8位放 在低地址单元,低8位放在高地址单元。其 命令格式为: [〈标号:〉] DW〈16位数表〉
MCS-51汇编程序中常用的伪指令有以下几条: ① ORG(ORIGIN)汇编起始地址命令 该命令常出现在源程序的开头,用于规定 目标程序存放的起始地址。 在一个源程序中,可以多次使用ORG伪指 令,但要求ORG定位从小到大,不能有重叠的 情况。 其命令格式为: [〈标号:〉]ORG〈地址〉
② END(END OF ASSEMBLY)汇编终止命令 本命令用于终止源程序的汇编工作。在此命令后面 的源程序汇编程序一 律不予处理,所以一个源程序只有一条END命令, 而且位于源程序的最 后。其命令格式为: [〈标号:〉] END [〈表达式〉]
例1:长度为10H的字符串存放在首地址为inbuf的内部RAM中,从 inbuf地址开始将字符串向片外RAM的outbuf地址开始的存储单元传送, 一直进行到遇见回车符(ODH)或整个字符串传送完毕。
实现程序如下:
MOV MOV MOV LOOP: CJNE SJMP NEXT: MOV MOVX INC INC DJNZ ED: SJMP R7, #10H R0, #inbuf DPTR, #outbuf @R0, #ODH, NEXT ED A, @R0 @DPTR, A R0 DPTR R7, LOOP ﹩ ;置转送次数 ;送字符串首地址 ;送传送单元起始地址 ;不是回车符则转移
例3:根据R7的内容转向相应的处理程序。设R7的内容为处理程 序的序号0~N,对应的处理程序的入口地址分别为A0~AN。 实现程序如下:
START:MOV MOV ADD MOV MOVC XCH INC
DPTR,#TAB A,R7 A,R7 R3,A A,@A+DPTR A,R3 A
;处理程序入口地址表的首地址送数据指针 ;处理程序的序号送A ;处理程序的序号加倍(因地址表中的入口地址占2个字节) ;将所求得的地址偏移量暂存R3 ;取处理程序入口地址的高8位 ;将暂存的地址偏移量交换到A中 ;地址偏移量加1
RL A
ANL A,#11100000Bwk.baidu.comORL 30H,A
;将A中的数据再循环左移1次
;屏蔽A中数据的低5位 ;完成拼装
例3:做3个字节的无符号数的加法。设一 个加数存放在内部RAM的50H、51H、52H单元, 另一个加数存放在内部RAM的53H、54H、55H单 元,相加结果存放在内部RAM的50H、51H、52H 单元,均从高字节开始存放,进位存放在位寻 址区的00H位中。
常用的流程图符号如图4.1所示。
⑷ 编写程序 按所使用的指令系统逐条编写汇编语言程序,力求简单明 了,层次清楚,运行时间短,占用内存数量少。
2.汇编语言源程序的编辑和汇编
⑴ 源程序的编辑和汇编 对一个单片机的应用系统,首先要根据它 应具有的功能编制相应的程序,这就是源 程序的编辑。 把源程序翻译成单片机所能识别的机器码 的过程称为对源程序的汇编。 源程序的编辑和汇编可通过手工或通过机 器来完成。
例2:设在片内RAM中,20H和21H单元各存放有一个8位数 据,要求拼装一个新字节并送30H保存,其低5位取自20H单元 中的低5位,高3位取自21H单元中的低3位。 实现程序如下: MOV 30H,20H ANL 30H,#00011111B MOV A,21H SWAP A ;20H单元中的数据送入30H单元 ;屏幕高3位 ;21H单元中的数据送入A ;将A中的数据高低3位交换,即循环左移4次
例3:把片内RAM中地址为30H到39H单元中的 10个无符号数逐一比较,并按从小到大的顺序依 次排列在这片单元中。 数据排序常用冒泡排序法。此题可从30H开 始从前向后进行相邻两数的比较,若两数的大小 次序与要求的顺序不符,则将两数的顺序互换, 并置位标志位,否则就不互换,也不置位标志位。 从头到尾进行1次相邻数比较并按要求调整两数 的顺序后(进行1次冒泡),就会把最大的数换 到最后,再进行1次这样的比较和调整,就会把 次大的数排在倒数第2的位置。在多次比较和调 整后中,若出现相邻两数从头到尾不再有互换的 情况(互换标志始终为0),就说明从30H~29H 单元中的数已经从小到大排列完毕。
本章介绍单片机汇编语言程序设计。
1.程序设计的步骤
⑴ 分析问题 对需要解决的问题进行分析,以求对问题有一 个正确的理解。在处理比较简单的问题时,问 题的要求往往是显而已见的,无需多加分析。 ⑵ 确定解决问题的算法思想 解决一个问题常有多种方法可供选择。从数学 的角度来描述,可能有几种不同的算法。所谓 的算法,就是解决问题的方法。
MOVC A,@A+DPTR ;取处理程序入口地址的低8位 MOV DPL,A ;低8位地址送DPL MOV DPH,R3 ;高8位地址送DPH CLR A ;A清0 JMP @A+DPTR ;程序转向相应的处理程序 TAB: DW A0 DW A1 …… DW AN
3.循环程序
在程序设计中,经常需要连续多次地重复执行某段程序, 这时可以设计循环程序,这种结构有助于用简短的程序完 成大量的处理任务。我们把这种按某一规律重复执行的程 序称为循环程序。 循环程序的设计中一般包含有循环体设计、循环结束条 件设置和循环初态设置3个内容。 循环程序的操作流程有先执行后判断和先判断后执2种结 构。
顺序程序是指无分支、无循环结构、也不调用子程序的 程序,这是最简单的程序结构。顺序程序执行的流程是依指
令在存储器中的存放顺序进行的。
例1:把累加器中的8位无符号二进制数转换成3 位(2个字节)BCD码形式。百位数存入片内的21H 单元,十位数和个位数存入相邻的22H单元。 这个 题目实际上是数制转换的问题,要把二进制数转换 为十进制数(BCD码形式)。一个8位的二进制数最 大为11111111B,转换结果为255,共有3位,所以 在编程时要考虑最多存放3个BCD码的情况。题目要 求把最高位放在21H,而十位数和个位数以压缩BCD 码的形式放在于22H。 我们采用除法指令来实现。
为:
〈字符名称〉EQU〈赋值项〉
⑦.BIT位定义命令
本命令用于给字符名称赋以位地址。
其命令格式为:
〈字符名称〉BIT〈位地址〉
上层目录
4.2 汇编语言程序的基本形式与设计举例
程序设计是为了解决某一个问题,将指令有序地组合在 一起。程序有繁有简,有些复杂的程序往往是由简单的基本 程序所构成的,程序设计的基本形式包括不同类型程序的设 计方法和技巧,掌握了这些方法和技巧将有利于熟练地编制 单片机的各种应用程序。 1. 顺序程序
⑶ 程序结构设计 程序结构设计是把研究课题转化为程序的 准备阶段。如果程序较小且简单,此阶段 可能仅仅是绘制一张流程图。如果程序较 大或较复杂,设计者就要考虑较完善的方 法,例如模块化程序设计、结构式程序设 计及自顶向下设计等方法。
流程图一般是利用一些带方向的线段,框图等 把解决问题的先后次序等直观地描述出来。这样 便于对程序的编写、检查和修改,当程序较为简 单时,也可以不画出流程图。流程图的种类比较 多,如逻辑流程图、算法流程图、程序流程图等。 对于复杂的问题可以画几级流程图,程序还常要 分成一个一个的模块,画出模块间的结构图。
;取字符 ;送字符 ;地址加1 ; ;未送完返回
例2:在外部RAM首地址为table的数据表中,有10个字节 的数据,编程将每个字节的最高位无条件的置1。 实现程序如下: MOV DPTR,#table ;送数据表首地址 MOV R7,#OAH ;置处理次数 LOOP: MOVX A,@DPTR ;取数据 ORL A,#10000000B ;最高位置1 MOVX @DPTR,A ;送回 INC DPTR ;地址加1 DJNZ R7,LOOP ;未处理完返回 SJMP ﹩
实现程序如下:
MOV R0,#52H MOV R1,#55H MOV A, @R0 ADD A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R0 ADDC A,@R1 MOV @R0,A DEC R1 DEC R0 MOV A,@R0 ADDC A,@R1 MOV @R0,A MOV 00H,C ;低字节相加,结果存52H
AJMP ZUCG LOOP1:JNC JW
;T≠Tb,程序转向LOOP1
;T=Tb,返回主程序 ;若(CY)=0,表明T>Tb,转降温处理程序JW
CJNE A,54H,LOOP2
AJMP ZUCG LOOP2:JC SW ZUCG: RET
;T≠Ta,程序转向LOOP2
;T=Ta,返回主程序 ;若(CY)=1,表明T<Ta,转升温处理程序SW ;若Ta≤T≤Tb,返回主程序
;中间字节带进位相加,结果存51H
;高字节带进位相加,结果存52H
;存进位
2.分支程序
在程序设计中,有时根据实际需要可以通过判断、
比较等结果,改变程序执行的顺序,转向不同的分 支。分支程序是通过转移指令实现的,可分成单分 支、双分支和多分支三种结构。 例1:设在外部RAM的3个连续存储单元ST1、ST2和
ST3中,ST1和ST2存放着两个不带符号的二进制数,
请找出其中的大数并存ST3单元中。
实现程序如下:
START:CLR C MOV DPTR,#ST1 MOVX A,@DPTR MOV R7,A INC DPTR MOVX A,@DPTR SUBB A,R7 JNC BIG1 XCH A,R7 BIG0:INC DPTR MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0 ;进位位清0 ;设置数据指针 ;取第一个数 ;暂存R7 ;数据指针加1 ;取第二个数 ;比较两数的大小 ;第二个数大转移 ;第一个数大送A ;数据指针加1 ;存大数 ;第二个数送A
实现程序如下:
BINBCD:MOV B,#100 DIV AB MOV 21H,A MOV A,#10 XCH A,B DIV AB SWAP A ADD A,B MOV 22H,A RET
;A除以100,商为百位数 ;保存百位数 ;余数送入A中,除数送入B中 ;余数除以10,得十位数 ;将十位数交换到高半字节 ;十位数加个位数 ;转换结果的十位数和个位数存22H