第04章单片机课件之MCS-51单片机汇编语言程序设计1wj.ppt
《第04章单片机课件之MCS-51单片机汇编语言程序设计1wj.ppt》由会员分享,可在线阅读,更多相关《第04章单片机课件之MCS-51单片机汇编语言程序设计1wj.ppt(49页珍藏版)》请在三一文库上搜索。
1、第4章 MCS-51单片机汇编语言程序设计,汇编语言具有高效、快捷等特点,在中小规模应用软件中广泛应用。了解常用伪指令的格式、功能及使用方法,掌握顺序程序、分支程序、循环程序、子程序的特点及编写方法是汇编语言程序设计的基础。顺序程序的执行次序就是按语句的先后次序执行,应避免用顺序程序实现大量重复操作;分支程序中有比较判断环节,应注意逻辑正确性;循环程序中有一部分要反复执行多次,应注意避免死循环;子程序是能完成某一特定功能的程序模块,应具有通用性。通常都将常用功能模块编写成子程序形式,以提高程序的可读性和执行效率。,4.1 概述,程序是完成某一特定任务的若干指令的有序集合。编写程序,就要熟悉计算
2、机语言。目前计算机语言种类繁多,性能各异,大致可分为三类:机器语言、汇编语言和高级语言。 汇编语言也是一种面向机器的程序设计语言,它用英文字符来代替对应的机器语言。例如用ADD代替机器语言中的加法运算,这些英文字符被称为助记符。 计算机高级语言是一种面向算法、过程和对象的程序设计语言,它采用更接近人们习惯的自然语言和数学语言描述算法、过程和对象,如BASIC,C,JAVA等都是常用的高级语言。,4.1.2 汇编语言语句种类及格式,汇编语言语句有三种基本类型:指令语句、伪指令语句和宏指令语句。 指令语句:每一个指令语句都在汇编时产生一个目标代码,对应着机器的一种操作。 【例】:MOV A,05H
3、 ;其目标代码为74H 05H。 伪指令语句:伪指令语句是一种说明语句,主要是为汇编程序服务的,在汇编时没有目标代码与之对应,没有对应的机器操作。 【例】:ONE EQU 1 ;其功能为定义ONE的值为1 宏指令语句:用以代替汇编语言源程序中重复使用的程序段而设置的一种语句,由汇编程序在汇编时产生相应的目标代码。,4.1.3 常用伪指令,为了便于编程和对汇编语言程序进行汇编,各种汇编语言都 提供一些特殊的伪指令,由伪指令确定的操作称为伪操作。 1起始地址说明 格式: ORG nn 功能:用于汇编语言源程序或数据块开头,指出程序段或数 据块存储的起始地址。nn表示16位地址。 【例】: ORG
4、1000H MAIN:MOV DPTR,#2000H ORG伪指令规定了程序段MAIN的起始地址为1000H。,2汇编结束说明 格式: END 功能:用于汇编语言源程序末尾,指示源程序到此全部结束。 在汇编时,对END后面的指令不予汇编。因此,END语句 必须放在整个程序的末尾,有且只能有一个。,3赋值 格式: 字符名 EQU 数据或汇编符号 功能:将一个数(8位或16位)或汇编符号赋值给所定义的字符 名。EQU伪指令中的字符名必须先赋值后使用,故该语句通 常放在源程序的开头。 【例】:ORG 0000H CH1 EQU 50H CH2 EQU R4 MOV A,CHl ;A(50H) , 相
5、当于MOV A,50H MOV A,CH2 ; AR4, 相当于MOV A,R4,4定义字节 格式: 标号: DB nl,n2,nn 功能:用于定义8位数据的存放地址。表示把指令右边的单字 节数据依次存放到以左边标号为起始地址的连续存储单元 中,通常用于定义数据表,程序中使用查表指令将数据取出。 【例】: ORG 1000H MAIN:MOV DPTR,TAB ;取表头地址 MOV A,R2 ;R2中存放查表指针 MOVC A,ADPTR ;从表中取出数据 TAB: DB 7FH,6FH,77H,7CH,39H,5EH,79H,61H END,5定义字 格式为:标号: DW nnl,nn2,n
6、nN 功能:用于定义16位数据的存放地址。DW指令与DB指 令相似,都是在内存的某个区域内定义数据,不同的是 DW指令定义的是字,而DB指令定义的是字节。DW指令 表示把指令右边的双字节数据依次存入指定的连续存储单 元中。常用于定义一个地址表。,6位地址赋值 格式:字符名称 BIT 位地址 功能:该指令把BIT右边的位地址赋给左边的字符名称。被 定义的位地址在源程序中可用符号名称来表示。也可以用 EQU指令来定义位地址变量。 【例】: ORG 1000H L0 BIT P1.1 Ll BIT 20H,7定义存储区 格式: 标号: DS X 功能:用于定义从标号开始预留一定数量的内存单元,以备
7、源程序执行过程中使用。预留单元的数量由X决定。 【例】: ORG 1000H CDS: DS 08H MAIN:MOV DPTR,1000H END 程序汇编到DS语句时,从1000H地址开始预留8个连续地址 单元,后面内容从1008H地址开始依次存放。,4.1.4 汇编语言程序设计方法,汇编语言程序设计同高级语言程序设计一样,是有章可循 的,只要按照一定的方法步骤去做,程序设计就会变成一 件轻松愉快的事情,设计的程序也会规范、清晰、易读、 易懂。使用汇编语言设计程序大致上可分为以下几个步骤。 1. 分析题意,明确要求。 2. 确定算法。 3. 画程序流程图。 4. 分配内存工作单元。 5.
8、编写源程序。 6. 程序优化。 7. 上机调试。,4.2 顺序程序设计,【例】程序初始化。初始化就是为变量、寄存器、存储单元 赋一初值,是最简单、最常用的操作。如将R0-R3,P1, 30H,40H单元初始化为00H,把R4,R5初始化为0FFH。 参考程序如下: ORG 0000H ;PC起始地址 LJMP START ;转主程序 ORG 0100H ;主程序起始地址 START:MOV R0,#00H ;初始化 MOV R1,#00H MOV R2,#00H MOV R3,#00H MOV P1,#00H,MOV R4,#0FFH MOV R5,#0FFH MOV 30H,#00H MOV
9、 40H,#00H HERE:SJMP HERE ;反复执行该指令,相当于等待 END 用立即数比较直观,但用MOV A,#00H ,MOV R0, A 指 令赋值,效果更好。,【例】 逻辑运算。逻辑操作是控制过程中经常使用的,掌握逻辑运算的特点是提高程序效率的重要途径。在逻辑运算中,进位标标志CY的地位很特殊,它是逻辑累加器,大多数逻辑操作要通过CY来完成。用程序实现图4-2所示的逻辑电路功能。,图4-2 逻辑电路,参考程序如下: ORG 0000H LJMP START ORG 0100H MOV P1,#0FFH ;P1口初始化 LOOP:MOV C,P1.1 ORL C, P1.2 ;
10、P1.1与P1.2逻辑或运算 CPL C ;取反 ANL C,P1.0 ;C与P1.0逻辑与运算 CPL C MOV 07H,C ;暂存于07H单元中 MOV C,P1.3 ANL C,/P1.4 ;P1.3与P1.4的反逻辑与运算 CPL C ORL C,07H MOV P1.5,C ;把结果在P1.5口输出 SJMP $ END,4.3 分支程序设计,分支程序的主要特点是程序包含有判断环节,不同的条件对 应不同的执行路径。编程的关键任务是合理选用具有逻辑判 断功能的指令。由于选择结构程序的走向不再是单一的,因 此,在程序设计时,应该借助程序框图(判断框)来明确程序 的走向,避免犯逻辑错误。
11、一般情况下,每个选择分支均需 单独一段程序,并有特定的名字,以便当条件满足时实现转 移。 1单分支选择结构 当程序的判断是二选一时,称为单分支选择结构。通常用条 件转移指令实现判断及转移。单分支选择结构有三种典型表 现形式。,图4-3 单分支选择结构,(a)当条件满足时执行分支程序1,否则执行分支程序2。 (b)当条件满足时跳过程序段1,从程序段2顺序执行;否则,顺序执行程序段1和程序段2。 (c)当条件满足时程序顺序执行程序段2;否则,重复执行程序段1,直到条件满足为止。 由于条件转移指令均属相对寻址方式,其相对偏移量rel是个 带符号的8位二进制数,可正可负。因此,它可向高地址方向 转移,
12、也可向低地址方向转移。 对于第三种形式,可用程序段1重复执行的次数作为判断条 件,当重复次数达到某一数值时,停止重复,程序顺序往下 执行。这是分支结构的一种特殊情况,这实际是循环结构程 序。用这种方式可方便实现状态检测。 【例】:LOOP: JB P1.1,LOOP 单分支程序一般要使用状态标志,应注意标志位的建立。,【例】设a存放在累加器A中,b存放在寄存器B中,若a0, Y=ab;若a0,则Y=ab。 这里的关键是判a是正数,还是负数;可通过判断ACC.7确定。 ORG 0000H JMP BR ORG 0100H BR: JB ACC.7,MINUS ;负数,转到MINUS CLR C
13、;清进位位 SUBB A,B ;A-B SJMP DONE MINUS:ADD A,B ;A+B DONE:SJMP $ ;等待 END,2多分支选择结构 当程序的判别输出有两个以上的出口流向时,称为多分支选 择结构。8051的多分支结构程序还允许嵌套,即分支程序中 又有另一个分支程序。汇编语言本身并不限制这种嵌套的层 次数,但过多的嵌套层次将使程序的结构变得十分复杂和臃 肿,以致造成逻辑上的混乱。多分支选择结构通常有两种形 式,如图4-4所示。,图4-4 多分支选择结构,8051的散转指令和比较指令均可以实现多分支转移。 散转指令 JMP A+DPTR 比较指令 CJNE A,direct,
14、rel (共有4条) 使用散转指令前,先将各分支程序编写好,存放在程序存储 器中,并将各分支程序的入口地址组成一个表格放在一起, 把表首地址送入DPTR,把子程序的序号放入A中。 在8051指令中,还有4条功能极强的比较转移指令: CJNE A,direct,rel ;A内容与直接寻址单元内容比 较,不等转移 CJNE A,#data,rel ;A内容与立即数比较,不等转 移 CJNE Rn,#data,rel ;寄存器内容与立即数比较,不 等转移 CJNE Ri,#data,rel ;间址单元内容与立即数比较, 不等转移 这4条指令对指定单元内容进行比较,当不相等时程序作相对 转移,并指出其
15、大小,以备作第二次判断;若两者相等,则 程序顺序执行。,【例】散转程序。编写程序,根据20H单元中的内容转入相应的分支,执行指定的操作,将结果存入指定存储器单元。程序流程框图如图4-5所示,图4-5 散转程序流程,参考程序 ORG 0000H LJMP MEMS RESULT EQU 0050H ORG 0100H MEMS:MOV A,20H MOV DPTR,#KKKK ;散转程序入口地址表首 址 RL A ;分支号乘2,每个入口 地址均为2字节 JMP A+DPTR ;转移 END1: SJMP $ KKKK:AJMP MEMSP0 ;A=0加法 AJMP MEMSP1 ;A=1减法 A
16、JMP MEMSP2 ;A=2乘法 SJMP MEMSP3 ;A=3除法 SJMP MEMSP4 ;A=4逻辑与 SJMP MEMSP5 ;A=5逻辑或,MEMSP0:MOV A,R0 ;相加分支 CLR C ADD A,R1 MOV RESULT,A LJMP END1 MEMSP1:MOV A,R0 ;相减分支 CLR C SUBB A, R1 MOV RESULT,A LJMP END1 MEMSP2:MOV A,R0 ;乘法分支 MOV B,R1 CLR C MUL AB MOV RESULT,A MOV RESULT+1,B LJMP END1,MEMSP3:MOV A,R0 ;除法
17、分支 MOV B,R1 CLR C DIV AB MOV RESULT,A MOV RESULT+1,B LJMP END1 MEMSP4:MOV A,R0 ;逻辑与分支 ANL A,R1 MOV RESULT,A LJMP END1 MEMSP5:MOV A,R0 ;逻辑或分支 ORL A,R1 MOV RESULT,A LJMP END1 END,【例】 两个无符号数比较大小。设外部RAM单元ST1和ST2中存放两个无符号二进制数,要找出其中的大数存入ST3单元中。程序流程框图如图4-6所示。,图4-6 求大数程序流程,参考程序如下: ORG 0000H LJMP START ORG 01
18、00H START:MOV A,addr1 ;将addr1中内容送A CJNE A,addr2,LOOP1 ;两数比较,不相等则 转LOOP1 LOOP3:AJMP $ ;结束 LOOP1:JC LOOP2 ;当CY1,转LOOP2 MOV addr3,A ;CY0,(A)(addr2) SJMP LOOP3 ;转结束 LOOP2:MOV addr3,addr2 ;CY1,(addr2)(A) SJMP LOOP3 END,4.4 循环程序设计,在实际应用中经常会遇到功能相同,需要多次重复执行某段 程序的情况,这时可把这段程序设计成循环结构,这有助于 节省程序的存储空间,提高程序的质量。循环程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 单片机 课件 MCS 51 汇编 语言程序设计 wj
链接地址:https://www.31doc.com/p-2250458.html