4 MCS 51汇编语言程序设计ppt课件_第1页
4 MCS 51汇编语言程序设计ppt课件_第2页
4 MCS 51汇编语言程序设计ppt课件_第3页
4 MCS 51汇编语言程序设计ppt课件_第4页
4 MCS 51汇编语言程序设计ppt课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 MCS-51汇编语言程序设计,4.1 机器语言和汇编语言 指令系统:一台计算机所能识别、执行的指令的集合就是它的指令系统。 机器语言:指令系统是一套控制计算机执行操作的二进制编码,称为机器语言。机器语言指令是计算机唯一能识别和执行的指令。 汇编语言:指令系统是利用指令助记符来描述的,称为汇编语言。 计算机的指令系统一般都是利用汇编语言描述的,是由计算机硬件设计所决定的。指令系统没有通用性。 单片机一般是空机,未含任何系统软件。因此在第一次使用前,必须对其进行编程,4.1 单片机程序设计语言概述,高级语言:BASIC、PL/M、C语言,应用最广泛的是C语言,优点: 可以大大提高单片机应用

2、系统研制开发的效率 易移植,有助于打破不同单片机之间的界限,缺点: 生成的目标程序代码较长,导致程序运行速度较慢,4.1.2 汇编语言指令格式与伪指令,1常用单位与术语 位(bit):位是计算机所能表示的最小的、最基本的数据单位,位通常是指一个二进制位。 字节(Byte):一个连续的8位二进制数码称为一个字节,即1Byte=8bit。 字(Word):通常由16位二进制数码组成,即1Word=2Byte。 字长:字长是指计算机一次处理二进制数码位的多少。MCS-51型单片机是8位机,所以说它的字长为8位。 MCS-51系列单片机都是以Intel公司最早的典型产品8051为核心,增加了一定的功能

3、部件后构成的。本章以8051为主介绍MCS-51系列单片机 。,2汇编语言指令格式,指令格式:指令的表示方式称为指令格式,它规定了指令的长度和内部信息的安排。完整的指令格式如下: 标号: 操作码 操作数 ,操作数 ;注释 其中: 项是可选项。 标号:指本条指令起始地址的符号,也称为指令的符号地址。代表该条指令在程序编译时的具体地址。 操作码:又称助记符,它是由对应的英文缩写构成的,是指令语句的关键。它规定了指令具体的操作功能,描述指令的操作性质,是一条指令中不可缺少的内容。 操作数:它既可以是一个具体的数据,也可以是存放数据的地址。 注释:注释也是指令语句的可选项,它是为增加程序的可读性而设置

4、的,是针对某指令而添加的说明性文字,不产生可执行的目标代码。,伪指令(也称为汇编程序的控制命令)是程序员发给汇编 程序的命令,用来设置符号值、保留和初始化存储空间、控制 用户程序代码的位置。 伪指令只出现在汇编前的源程序中,仅提供汇编用的某些 控制信息,不产生可执行的目标代码,是CPU不能执行的指令。 (1)定位伪指令ORG 格式:ORG n 其中:n通常为绝对地址,可以是十六进制数、标号或 表达式。 功能:规定编译后的机器代码存放的起始位置。 在一个汇编语言源程序中允许存在多条定位伪指令,但 每一个n值都应和前面生成的机器指令存放地址不重叠。 例如程序:ORG1000H START:MOVA

5、,#20H MOVB,#30H ,3伪指令,(2)结束汇编伪指令END 格式:标号: END 表达式 功能:放在汇编语言源程序的末尾,表明源程序的汇编到此结束,其后的任何内容不予理睬。,(3)赋值伪指令EQU 格式:字符名称x EQU 赋值项n 功能:将赋值项n的值赋予字符名称x。程序中凡出现该字符名称x就等同于该赋值项n,其值在整个程序中有效。赋值项n可以是常数、地址、标号或表达式。在使用时,必须先赋值后使用。 “字符名称”与“标号”的区别是“字符名称”后无冒号,而“标号”后面有冒号。,(4)定义字节伪指令DB 格式:标号: DB x1, x2, xn 功能:将8位数据(或8位数据组)x1,

6、 x2, xn顺序存放在从当前程序存储器地址开始的存储单元中。xi可以是8位数据、ASCII码、表达式,也可以是括在单引号内的字符串。两个数据之间用逗号“,”分隔。 xi为数值常数时,取值范围为00HFFH。xi为ASCII码时,要使用单引号,以示区别。xi为字符串常数时,其长度不应超过80个字符。,例如:DB -2,-4,-6,10,11,17 把6个数转换为十六进制表示(即FEH,0FCH,0FAH, 0AH,0BH,11H),并连续存放在6个程序存储单元中,例如:存放数码管显示的十六进制数的字形码,可使用 多条DB命令定义:,(5)定义双字节伪指令DW 格式:标号: DW x1, x2,

7、 xn 功能:将双字节数据或双字节数据组顺序存放在从标号指定地址单元开始的存储单元中。其中,xi为16位数值常数,占两个存储单元,先存高8位(存入低位地址单元中),后存低8位(存入高位地址单元中)。,例如:,注意: DB和DW定义的数表,数的个数不得超过80个。 如数据的数目较多时,可使用多个定义命令 一般以DB来定义数据,以DW来定义地址,(6)预留存储空间伪指令DS 格式:标号: DS n 功能:从标号指定地址单元开始,预留n个存储单元,汇编时不对这些存储单元赋值。n可以是数据,也可以是表达式。 (7)定义位地址符号伪指令BIT 格式:字符名称x BIT 位地址n 功能:将位地址n的值赋予

8、字符名称x。程序中凡出现该字符名称x就代表该位地址。位地址n可以是绝对地址,也可以是符号地址。,AQ BIT P1.0,(8)数据地址赋值伪指令DATA 格式:字符名称x DATA 表达式n 功能:把表达式n的值赋值给左边的字符名称x。n可以是数据或地址,也可以是包含所定义的“字符名称x”在内的表达式,但不能是汇编符号。 DATA与EQU的主要区别是:EQU定义的“字符名称”必须先定义后使用,而DATA定义的“字符名称”没有这种限制。所以,DATA伪指令通常用在源程序的开头或末尾。,4.2.1 手工编程和汇编 4.2.2 机器编辑和交叉汇编 机器编辑:借助与PC机或开发器进行程序设计.其扩展名

9、为*.asm 交叉汇编:借助PC机运行汇编程序将汇编语言转换成单片机能识别的机器码过程.,4.2 单片机汇编语言源程序的编辑和汇编,4.3 单片机汇编语言程序设计,设计步骤 1、拟定设计任务书 2、建立数学模型 3、确定算法 4、分配内存单元,编制程序流程图 5、编制源程序 6、上机调试及程序优化,单片机汇编语言程序的基本结构形式,3种形式,顺序结构,分支结构,循环结构,4.3.1 顺序程序,顺序程序是最简单的程序结构,在顺序程序中既无分支、循环,也不调用子程序,程序执行时一条一条地按顺序执行指令。,例4.3.1 将片内RAM 30H单元中的两位 压缩BCD码转换成二进制数送到片内 RAM 4

10、0H单元中.(P63),ORG 1000H START:MOV A, 30H ; 取两位BCD压缩码a1a0送A ANL A, #0F0H ; 取高4位BCD码a1 SWAP A ; 高4位与低4位换位 MOV B, #0AH ; 将二进制数10送入B MUL AB ; 将10a1送入A中 MOV R0, A ; 结果送入R0中保存 MOV A, 30H ; 再取两位BCD压缩码a1a0送A ANL A, #0FH ; 取低4位BCD码a0 ADD A, R0 ; 求和10a1+ a0 MOV 40H, A ; 结果送入40H保存 SJMP $ ; 程序执行完,“原地踏步” END,例4.3.

11、2 将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASC码,存入21H、22H,高位存22H.(P64),ORG 1000H START:MOV A,20H ; 取压缩BCD码 ANL A,#0FH ; 取低位BCD码 ADD A,#30H ; 转换为低位ASCII码 MOV 21H,A ; 保存低位ASCII码 MOV A,20H ; 重新取压缩BCD码 ANL A,#0F0H ; 分离高位BCD码 SWAPA ; 得到高位BCD码 ADD A,#30H ; 转换为高位ASCII码 MOV 22H,A ; 保存高位ASCII码 SJMP$ END,补充举例:三字节无符号数相加,其中

12、被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中进位存放在位寻址区的20H单元最低位中(即20H.0)。,分析: 除最低字节可以使用ADD指令之外,其它字节相加时要把低字节的进位考虑进去,因此使用ADDC指令.,MOV 00H,C,#20H,4.3.2 分支程序设计,分支程序有三种形式(见P64,图4.3.2) 一、单分支 二、双分支 三、多分支,分支程序设计要点: 1、先建立可供条件转移指令测试的条件 2、选用合适的条件转移指令 3、在转移的目的地址处设定标号,分支程序是通过转移指令实现的,一、

13、单分支程序,使用条件转移指令实现,即根据条件对程序的执行进行判断,满足条件则进行程序转移,否则程序顺利执行。,可实现单分支程序转移的指令有:,JZ、JNZ、CJNE、DJNZ等,还有以位状态作为条件进行程序分支的指令:,JC、JNC、JB、JNB和JBC等,(1)单分支结构举例,例4.3.3 求符号函数的值。已知片内RAM的40H单元内有一自变量X,编制程序按如下条件求函数Y的值,并将其存入片内RAM的41H单元中。见P65,1 X0,0 X=0,-1 X0,Y =,ORG 1000H START: MOV A, 40H; 将X送入A中 JZ COMP ; 若A为0,转至COMP处 JNB A

14、CC.7, POST ; 若A第7位不为1(X为正数), ;则程序转到 POST处, ;否则(X为负数)程序往下执行 MOV A, #0FFH ; 将1(补码)送入A中 SJMP COMP ; 程序转到COMP处 POST: MOV A, #01H ; 将+1送入A中 COMP: MOV 41H, A ; 结果存入Y SJMP $ ; 程序执行完,“原地踏步” END,补充举例:假定在外部RAM中有ST1、ST2、ST3共3个连续单元,其中ST1和ST2单元中分别存放着两个8位无符号二进制数,要求 找出其中的大数并存入ST3单元中。,MOV A,R2,二、散转程序设计举例,MCS-51指令系统

15、中没有多分支转移指令,可使用 JMP A+DPTR 实现多分支程序转移,但需要有数据表格配合,(1)通过数据表实现程序多分支,使用JMP A+DPTR指令,通过数据表实现多分支程序转移,n为分支序号。,MOV A, n ;分支序号送A MOV DPTR, #BRTAB ;地址表首址 MOVC A, A+DPTR ;查表,(A)=BRn-BRTAB JMP A+DPTR ;转移,(PC) = BRn BRTAB: DB BR0-BRTAB ;地址表 DB BR1-BRTAB DB BRn-BRTAB BR0: ;分支程序 BR1: BRn: ,BRn-BRTAB 分支程序入口地址数据表首地址,分

16、支程序范围:256字节,(2)通过转移指令表实现程序多分支(见P66,例4.3.4),使用JMP A+DPTR指令,实现多分支程序转移,但要有转移指令表相配合。,MOV A, n ;分支序号送A RL A ;分支序号值乘以2 MOV DPTR, #BRTAB ;转移指令表首址 JMP A+DPTR ;转移 BRTAB: AJMP BR0 ;转分支程序0, (2字节指令) AJMP BR1 ;转分支程序1 AJMP BR127 ;转分支程序n BR0: ;分支程序 BR1: BR127: ,分支程序范围:2K字节,(3)其他实现程序多分支的方法,把分支程序入口地址存放在BRTAB表中,并假定分支

17、序号值在R3中,则可用堆栈操作实现多分支程序转移。,思路:把分支程序入口地址压入堆栈,然后在利用返回指令,把分支程序入口地址出栈送PC,从而转去执行分支程序。 RET: 高8位地址先出栈,低8位地址后出栈,4.3.3、循环程序,重复执行一个程序段,使用条件转移指令通过条件判 断来控制循环是继续还是结束。(见P69),循环程序由4个主要部分组成: 1、初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。 2、处理部分:循环程序主体 3、循环控制: 4、循环结束:存放循环主体所得的结果等。,一、 单重循环程序,例4.3.5 已知片内RAM30H3FH单元中存放了16个二进制无

18、符号数,编制程序求他们的累加和,并将其和数存放在R4,R5中(R4存高8位,R5存低8位)。见P69,ORG 1000H START: MOV R0, #30H MOV R2, #10H ; 设置循环次数(16) MOV R4, #00H ; 和高位单元R4清0 MOV R5, #00H ; 和低位单元R5清0 LOOP: MOV A, R5 ; 和低8位的内容送A ADD A, R0 ; 将R0与R5的内容相加 MOV R5, A ; 低8位的结果送R5 CLR A ; A清0 ADDC A, R4 ; 将R4的内容和Cy相加 MOV R4, A ; 高8位的结果送R4 INC R0 ; 地

19、址递增(加1) DJNZ R2, LOOP ; 若循环次数减1不为0,则转 ;到LOOP处循环,否则,循环结束 SJMP $ END,例4.3.6 编制程序将片内RAM的30H4FH单元中的内容传送至片外RAM的2000H开始的单元中。(见P70),程序如下: ORG 1000H START: MOV R0, #30H MOV DPTR, #2000H MOV R2, #20H ; 设置循环次数 LOOP: MOV A, R0 ; 将片内RAM数据区内容送A MOVX DPTR, A ; 将A的内容送片外 ;RAM数据区 INC R0 ; 源地址递增 INC DPTR ; 目的地址递增 DJN

20、Z R2, LOOP ; 若R2的不为0,则转到 ;LOOP处继续循环,否则循环结束 SJMP $ END,补充举例:设有一字符串以回车符为结束标志,并存放在内部RAM从40H单元开始的连续存储单元中,编写测试字符串长度 的程序。,分析:使用逐个字符依次与回车符(0DH)比较的方法,作为判断条件。设置R0作为字符串指针,用于指定字符,设置R2作为长度计数器,用于累加字符串的长度。,补充举例:把内部RAM中起始地址为data的数据串传送到外部RAM以buffer为首地址的区域,直到发现“$”字符的ASCII码为止。同时规定数据串的最大长度为32个字节。,MOV R0,#data ;data数据区

21、起始地址 MOV DPTR,#buffer ;buffer数据区起始地址 MOV R1,#20H ;最大数据串长 LOOP: MOV A,R0 ;取数据 SUBB A,#24H ;判是否为“$”符 JZ LOOP1 ;A=0,结束 MOVX DPTR, A ;数据传送 INC DPTR INC R0 DJNZ R1,LOOP ;循环控制 LOOP1: RET ;结束,CLR C,MOV A, R0 ;重新取数据,2、ASCII码转换为十六进制数(略),例:把外部RAM 30H3FH单元中的ASCII码依次转换为 十六进制数,并存入内部RAM60H67H单元中。,二、 长定时程序,用多重循环实现

22、,定时需要:定时中断、定时检测和定时扫描,定时功能实现可通过,定时器、计数器,定时程序:通过汇编语言编写,1、单循环定时程序,1个机器周期,1个机器周期,2个机器周期,4个机器周期,如单片机的晶振频率为6MHz,则一个机器周期是2s, 因此一次循环的延迟时间为8 s,故该程序的延迟时间为8TIME(s),因此这个程序的最长定时时间为: 82562048( s ),2、较长时间的定时程序,较长时间的定时,通常采用多重循环的方法,1个机器周期,1个机器周期,2个机器周期,4个机器周期,最大定时时间计算公式为:,(4256+2+1)2562s2s+2 s=525828(s),2个机器周期,1个机器周期,1个机器周期,1个机器周期,3、调整定时时间,在定时程序中可通过在循环程序段中增减指令的方法对 定时时间进行微调,1个机器周期,1个机器周期,2个机器周期,因此6MHz晶振频率下,该程序的定时时间为: 10TIME(s),假定要求定时时间为24 s,对于这个定时程序, 无论TIME取任何值均得不到要求的定时时间, 可通过增加一条NOP指令,把循环程序段的机器周期 增加到6,即:,MOV R0, #TIME LOOP: ADD A, R1 NOP NOP DJNZ R0 , LOOP,1个机

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论