MCS-51系列单片机的指令系统.ppt

上传人:sh****n 文档编号:6381130 上传时间:2020-02-24 格式:PPT 页数:91 大小:848.05KB
返回 下载 相关 举报
MCS-51系列单片机的指令系统.ppt_第1页
第1页 / 共91页
MCS-51系列单片机的指令系统.ppt_第2页
第2页 / 共91页
MCS-51系列单片机的指令系统.ppt_第3页
第3页 / 共91页
点击查看更多>>
资源描述
1 第3章MCS 51系列单片机的指令系统 3 1指令系统简介3 2寻址方式3 3数据传送类指令3 4算术运算类指令3 5逻辑运算及移位类指令3 6控制转移类指令3 7位操作类指令 2 3 1指令系统概述 指令是规定计算机进行某种操作的命令 一台计算机所能执行的指令集合称为该计算机的指令系统 3 1 1指令概述计算机内部只识别二进制数 因此 能被计算机直接识别 执行的指令是使用二进制编码表示的指令 这种指令被称为机器语言指令 MCS 51系列单片机指令系统共有111条指令 按功能划分 可分为五大类 1 数据传送类指令 29条 2 算术运算类指令 24条 3 逻辑运算及移位类指令 24条 4 控制转移类指令 17条 5 位操作类指令 17条 3 3 1 2指令格式一条完整的指令格式如下 标号 操作码 操作数 注释 标号 标号是该指令的起始地址 是一种符号地址 标号可以由1 8个字符组成 第一个字符必须是字母 其余字符可以是字母 数字或其他特定符号 标号后跟分界符 操作码 指令的助记符 它规定了指令所能完成的操作功能 操作数 指出了指令的操作对象 操作数可以是一个具体的数据 也可以是存放数据的单元地址 还可以是符号常量或符号地址等 多个操作数之间用逗号 分隔 注释 为了方便阅读而添加的解释说明性的文字 用 开头 4 3 1 3指令中常用符号说明Rn 当前选中的工作寄存器组中的寄存器R0 R7之一 所以n 0 7 Ri 当前选中的工作寄存器组中可作地址指针的寄存器R0 R1 所以i 0 1 data 8位立即数 data16 16位立即数 direct 内部RAM的8位地址 即可以是内部RAM的低128个单元地址 也可以是特殊功能寄存器的单元地址或符号 在指令中direct表示直接寻址方式 addr11 11位目的地址 只限于在ACALL和AJMP指令中使用 addr16 16位目的地址 只限于在LCALL和LJMP指令中使用 5 rel 补码形式表示的8位地址偏移量 在相对转移指令中使用 bit 表示片内RAM位寻址区或可位寻址的特殊功能寄存器的位地址 间接寻址方式中间址寄存器的前缀标志 C 进位标志位 它是布尔处理机的累加器 也称之为位累加器 加在位地址的前面 表示对该位先求反再参与操作 但不影响该位的值 x 由x指定的寄存器或地址单元中的内容 x 由x所指寄存器的内容作为地址的存储单元的内容 表示本条指令的起始地址 表示指令操作流程 将箭头右边的内容送到箭头左边的单元中 6 3 2寻址方式 寻址就是寻找操作数的地址 寻址方式则指出寻找操作数地址的方式方法 MCS 51系列单片机提供了七种寻址方式 3 2 1立即寻址所谓立即寻址就是在指令中直接给出操作数 通常把出现在指令中的操作数称为立即数 为了与直接寻址指令中的直接地址相区别 在立即数前面加 标志 例如 MOVA 3AH其中3AH就是立即数 该指令功能是将3AH这个数本身送入累加器A中 7 3 2 2直接寻址在指令中直接给出操作数地址 这就是直接寻址方式 例如 MOVA 3AH其中3AH就是表示直接地址 其操作示意图如图3 1所示 直接寻址方式可访问以下存储空间 内部RAM低128个字节单元 特殊功能寄存器 应注意 直接寻址是访问特殊功能寄存器的唯一方法 8 3 2 3寄存器寻址寄存器寻址即寄存器的内容就是操作数 因此在指令的操作数位置上指定了寄存器就能得到操作数 MOVA R0MOVR2 A前一条指令是将R0寄存器的内容送到累加器A中 后一条是把累加器A中的内容传送到R2寄存器中 采用寄存器寻址方式的指令都是一字节的指令 可以作寄存器寻址的寄存器有 R0 R7 A AB寄存器对和数据指针DPTR 9 3 2 4寄存器间接寻址所谓寄存器间接寻址就是以寄存器中的内容作为RAM地址 该地址中的内容才是操作数 寄存器前加 标志 表示间接寻址 例如 MOVA R0其操作示意图如图3 2所示 此时R0寄存器的内容3AH是操作数地址 内部RAM的3AH单元的内容65H才是操作数 把该操作数传送到累加器A中 结果A 65H 10 能用于间接寻址的寄存器有R0 R1 DPTR 其中R0 R1必须是工作寄存器组中的寄存器 间接寻址可以访问的存储器空间包括内部RAM和外部RAM 内部RAM的低128个单元采用R0 R1作为间址寄存器 外部RAM 一是采用R0 R1作为间址寄存器 可寻址256个单元 二是采用16位的DPTR作为间址寄存器 可寻址外部RAM的整个64KB地址空间 11 例如 MOV R0 A 内部RAM R0 A a b MOVX DPTR A 外部RAM DPTR A其指令操作过程示意图如上图 b 所示 其指令操作过程示意图如下图 a 所示 12 对于52子系列的单片机 其内部RAM是256个字节 其高128字节地址与特殊功能寄存器的地址是重叠的 在使用上 对52子系列的高128BRAM 必须采用寄存器间接寻址方式访问 对特殊功能寄存器则必须采用直接寻址方式访问 3 2 5变址寻址变址寻址是以DPTR或PC作基址寄存器 以累加器A作变址寄存器 并以二者内容相加形成的16位地址作为操作数地址 ROM中地址 例如 MOVCA A DPTR A A DPTR MOVCA A PC A A PC 13 第一条指令的功能将A的内容与DPTR的内容之和作为操作数地址 把该地址中的内容送入累加器A中 如图3 3所示 第二条指令的功能将A的内容与PC的内容之和作为操作数地址 把该地址中的内容送入累加器A中 这两条指令常用于访问程序存储器中的数据表格 且都为一字节指令 14 3 2 6相对寻址相对寻址即将程序计数器PC的当前值与指令中给出的偏移量rel相加 其结果作为转移地址送入PC中 相对寻址能修改PC的值 故可用来实现程序的分支转移 PC当前值是指正在执行指令的下一条指令的地址 rel是一个带符号的8位二进制数 取值范围 128 127 2000H SJMP54H这是无条件相对转移指令 双字节指令 指令代码80H 54H 其中54H是偏移量 15 3 2 7位寻址在指令的操作数位置上直接给出位地址 这种寻址方式称为位寻址 MCS 51系列单片机的特色之一是具有位处理功能 可对寻址的位单独进行各种操作 例如 MOVC 30H该指令的功能是把位地址30H中的值 0或1 传送到位累加器CY中 51系列单片机的内部RAM有两个区域可以位寻址 一个是位寻址区20H 2FH单元的128位 另一个是字节地址能被8整除的特殊功能寄存器的相应位 16 在MCS 51系列单片机中 位地址有以下几种表示方式 1 直接使用位地址 对于20H 2FH共16个单元的128位 其位地址编号是00H 7FH 例如 20H单元的0 7位的位地址为00H 7H 2 用单元地址加位序号表示 如25H 5表示25H单元的D5位 位地址是2DH 而PSW中的D3可表示为D0H 3 这种表示方法可以避免查表或计算 比较方便 3 用位名称表示 特殊功能寄存器中的可寻址位均有位名称 可以用位名称来表示该位 如可用RS0表示PSW中的D3位 D0H 3 4 对特殊功能寄存器可直接用寄存器符号加位序号表示 如PSW中的D3位 又可表示为PSW 3 17 例题 1 20H 11HMOVA 20HMOVC 07HA 11HCy 02 20H 11H 24H 7FHMOVA 20HMOVC 20H A 11H Cy 13 30H 1AHMOVA 30H A 30HMOVA 30H A 1AH 18 数据传送类指令的功能是把源操作数传送到目的操作数 源操作数不变 目的操作数被源操作数所代替 3 3 1内部RAM数据传送指令内部RAM的数据传送类指令是指累加器 寄存器 特殊功能寄存器 RAM单元之间的数据相互传送 1 以累加器A为目的操作数的数据传送指令MOVA data A dataMOVA direct A direct MOVA Rn A Rn MOVA Ri A Ri 这组指令的功能是将源操作数所指定的内容送入累加器A中 3 3数据传送类指令 19 2 以寄存器Rn为目的操作数的数据传送指令MOVRn A Rn A MOVRn data Rn dataMOVRn direct Rn direct 这组指令的功能是将源操作数所指定的内容送到当前工作寄存器组R0 R7中的某个寄存器中 注意 没有 MOVRn Rn 指令 也没有 MOVRn Ri 指令 例3 1 A 50H R1 10H R2 20H R3 30H 30H 4FH 执行下述指令 MOVR1 A R1 A MOVR2 30H R2 30H MOVR3 85H R3 85H执行后 R1 50H R2 4FH R3 85H 20 3 以直接地址为目的操作数的数据传送指令MOVdirect A direct A MOVdirect data direct dataMOVdirect1 direct2 direct1 direct2 MOVdirect Rn direct Rn MOVdirect Ri direct Ri 这组指令的功能是将源操作数所指定的内容送入由直接地址direct所指定的片内存储单元 例3 2已知 R0 60H 60H 72H MOV40H R0 40H 60H 指令执行过程如图3 5所示 执行结果为 40H 72H 21 4 以间接地址 Ri为目的操作数的数据传送指令MOV Ri A Ri A MOV Ri data Ri dataMOV Ri direct Ri direct 这组指令的功能是把源操作数所指定的内容送入以R0或R1为地址指针的片内RAM单元中 源操作数可采用寄存器寻址 立即寻址和直接寻址3种方式 注意 没有 MOV Ri Rn 指令 例3 3已知 R1 30H A 20H 执行指令 MOV R1 A 30H A 执行结果为 30H 20H 22 5 以DPTR为目的操作数的数据传送指令MOVDPTR data16 DPTR data16这是MCS 51系列单片机指令系统中唯一的一条16位立即数传送指令 其功能是将外部存储器 RAM或ROM 某单元地址作为立即数送到DPTR中 立即数的高8位送DPH 低8位送DPL 在学习 使用上述各条指令时 需注意以下几点 1 要区分各种寻址方式的含义 正确传送数据 2 所有传送指令都不影响标志位 这里所说的标志位是指CY AC 和OV 涉及到累加器A的将影响奇偶标志位P 23 3 估算指令的字节数 凡是指令中既不包含直接地址 又不包含8位立即数的指令均为一字节指令 若指令中包含一个直接地址或8位立即数 则指令字节数为2 若包含两个这样的操作数 则指令字节数为3 例3 4若 R0 30H 30H 50H 执行指令 MOVA R0 A 30H 一字节 MOVA 30H A 50H 二字节 MOVA 30H A 30H 二字节 MOV30H 0FH 30H 0FH 三字节 MOVDPTR 2000H DPH 20H DPL 00H 三字节 24 例 30H 40H 40H 10H 10H 32H P1 EFHMOVR0 30HMOVA R0MOVR1 AMOVB R1MOV R1 P1MOVP2 P1MOV10H 20HMOV30H 10H 25 3 3 2访问外部RAM的数据传送指令CPU与外部RAM或I O口进行数据传送 必须采用寄存器间接寻址的方式 并通过累加器A来传送 这类指令共有四条 MOVXA DPTR A DPTR MOVX DPTR A DPTR AMOVXA Ri A Ri MOVX Ri A Ri A前两条指令是以DPTR作为间址寄存器 DPTR是16位地址指针 因此其寻址范围可达片外RAM64KB空间 后两条指令是以R0或R1作为间址寄存器 R0或R1是8位地址指针 因此其寻址范围仅限于外部RAM256个字节单元 该组指令的功能 在DPTR或R0 R1所指定的外部RAM单元与累加器A之间传送数据 26 例3 5试编程 将片外RAM的2000H单元内容送入片外RAM的0200H单元中 解 片外RAM与片外RAM之间不能直接传送数据 需通过累加器A传送 另外 当片外RAM地址值大于FFH时 需用DPTR作为间址寄存器 编程如下 MOVDPTR 2000H 源数据地址送DPTRMOVXA DPTR 从外部RAM中取数送AMOVDPTR 0200H 目的地址送DPTRMOVX DPTR A A中内容送外部RAM 27 3 3 3程序存储器向累加器A传送数据指令MOVCA A DPTR A A DPTR MOVCA A PC A A PC 两条指令适合于查阅在ROM中建立的数据表格 也称作查表指令 实现的功能完全相同 但使用中有一点差异 第一条指令采用DPTR作为基址寄存器 使用前可将16位地址送入DPTR中 实现在64KBROM空间向累加器A的数据传送 数据表格可存放在64KBROM的任意位置 因此这条指令称为远程查表指令 第二条指令是以PC作为基址寄存器 程序中PC值是确定的 为下一条指令的地址 不是表格首地址 使基址与实际要读取的数据表格首地址不一致 这样A PC与实际要访问的单元地址就不一致 因此 使用该指令之前要用一条加法指令进行地址调整 28 由于PC的内容不能随意改变 所以只能借助于A来进行调整 即通过对累加器A加一个数 使得A PC和所读ROM单元地址一样 例3 6若在外部ROM中2000H单元存放 0 9 的平方值0 1 4 9 81 要求根据累加器A中的值 0 9 来查找所对应的平方值 并存入60H单元中 解 用DPTR作基址寄存器 MOVDPTR 2000H 表格首地址送DPTRMOVCA A DPTR 根据表格首地址及A中值确定地址 取数送A MOV60H A 存结果此处 A DPTR 之和为所查平方值所存地址 29 用PC作为基址寄存器 在MOVC指令之前先用一条加法指令进行地址调整 ADDA data A data作地址调整MOVCA A PC A data PC 确定查表地址 取数送A MOV60H A 存结果RET2000H DB0 1 4 9 16 25 36 81执行MOVC指令时 PC已指向下一条指令地址 很显然 PC的内容不是要查找的表格首地址2000H 二者之间存在地址差 这个地址差就是MOVC下边的指令与数据表格首地址之间 其他指令所占的字节数之和 在本例中 地址差是03 即data 03H 30 3 3 4数据交换指令数据交换指令共有五条 可完成累加器和内部RAM单元之间的整字节或半字节交换 1 整字节交换指令整字节交换指令有三条 完成累加器A与内部RAM单元内容的整字节交换 XCHA Rn A Rn XCHA direct A direct XCHA Ri A Ri 2 半字节交换指令XCHDA Ri A 3 0 Ri 3 0低半字节交换 高半字节不变 3 累加器高低半字节交换指令SWAPA A 7 4 A 3 0 31 例3 7试编程 将外部RAM1000H单元中的数据与内部RAM6AH单元中的数据相互交换 解 数据交换指令只能完成累加器A和内部RAM单元之间的数据交换 要完成外部RAM与内部RAM之间的数据交换 需先把外部RAM中的数据取到A中 交换后再送回到外部RAM中 编程如下 MOVDPTR 1000H 外部RAM地址送DPTRMOVXA DPTR 从外部RAM中取数送AXCHA 6AH A与6AH地址中的内容交换MOVX DPTR A 交换结果送外部RAM 32 3 3 5堆栈操作指令所谓堆栈是在片内RAM中按 先进后出 后进先出 原则设置的专用存储区 数据的进栈出栈由指针SP统一管理 可实现对数据或断点地址的保护 堆栈的操作有如下两条专用指令 PUSHdirect SP SP 1 SP direct POPdirect direct SP SP SP 1前一条指令是进栈指令 其功能是先将栈指针SP的内容加1 使它指向栈顶空单元 然后将直接地址direct单元的内容送入栈顶空单元 后一条指令是出栈指令 其功能是将SP所指的单元内容送入直接地址所指出的单元中 然后将栈指针SP的内容减1 使之指向新的栈顶单元 注意 进栈 出栈指令只能以直接寻址方式来取得操作数 不能用累加器或工作寄存器Rn作为操作数 33 例 设 30H x 40H y 试利用堆栈指令编出30H和40H单元中内容相交换的程序 MOVSP 70HPUSH30HPUSH40HPOP30HPOP40HPUSHACCPUSHA 34 算术运算类指令可以完成加 减 乘 除等各种操作 全部指令都是8位数运算指令 如果需要作16位数的运算则需编写相应的程序来实现 算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV 进位 借位 标志CY 辅助进位标志AC和奇偶标志位P 3 4 1加法指令ADDA data A A dataADDA direct A A direct ADDA Rn A A Rn ADDA Ri A A Ri 3 4算术运算类指令 35 这组指令的功能是把源操作数所指出的内容与累加器A的内容相加 其结果存放在A中 该组指令对PSW中各标志位的影响情况如下 进位标志CY 如D7位向上有进位 则CY 1 否则CY 0 半进位标志AC 如D3位向上有进位 AC 1 否则AC 0 溢出标志OV 若D7 D6位只有一个向上有进位 OV 1 若D7 D6同时有进位或同时无进位时 OV 0 奇偶标志P 当A中 1 的个数为奇数时 P 1 为偶数时 P 0 36 例3 8设A 94H 30H 8DH 执行指令ADDA 30H 操作如下 10010100 10001101100100001结果 A 21H CY 1 AC 1 OV 1 P 0参加运算的两个数 可以是无符号数 0 255 也可以是有符号数 128 127 上例中 若把94H 8DH看作无符号数相加 结果中CY 1 表示运算结果发生了溢出 结果超出了8位 此时溢出的含义是向高位产生进位 所以确定结果时不能只看累加器A的内容 而应该把CY的值加到高位上 才可得到正确的结果 即结果为121H 若把94H 8DH看作有符号数 补码表示的 结果中OV 1 它表示运算结果发生了溢出 A中的值是个错误的结果 37 3 4 2带进位加法指令ADDCA data A A data CY ADDCA direct A A direct CY ADDCA Rn A A Rn CY ADDCA Ri A A Ri CY 这组指令的功能是把源操作数所指出的内容与累加器A的内容相加 再加上进位标志CY的值 其结果存放在A中 运算结果对PSW标志位的影响与ADD指令相同 需要说明的是 这里所加的进位标志CY的值是在该指令执行之前已经存在的进位标志值 而不是执行该指令过程中产生的进位标志值 38 例3 9设 A AEH R1 81H CY 1 执行指令ADDCA R1 则操作如下 1010111010000001 1 CY 100110000结果 A 30H CY 1 OV 1 AC 1 P 0带进位加法指令主要用于多字节数的加法运算 因低位字节相加时可能产生进位 而在进行高位字节相加时 要考虑低位字节向高位字节的进位 因此 在进行高位字节相加时必须使用带进位的加法指令 39 例3 10设有两个无符号16位二进制数 分别存放在30H 31H单元和40H 41H单元中 低8位先存 写出两个16位数的加法程序 将和存入50H 51H单元 设和不超过16位 解 由于不存在16位数的加法指令 所以只能先加低8位 后加高8位 而在加高8位时要连低8位相加的进位一起相加 编程如下 MOVA 30H 取一个加数的低字节送A中ADDA 40H 两个低字节数相加MOV50H A 结果送50H单元MOVA 31H 取一个加数的高字节送A中ADDCA 41H 高字节数相加 同时加低字节产生的进位MOV51H A 结果送51H单元 40 3 4 3带借位减法指令SUBBA data A A data CY SUBBA direct A A direct CY SUBBA Rn A A Rn CY SUBBA Ri A A Ri CY 减法指令对PSW中各标志位的影响情况如下 借位标志CY 如D7位向上需借位 则CY 1 否则CY 0 半借位标志AC 如D3位向上需借位 AC 1 否则AC 0 溢出标志OV 若D7 D6位只有一个向上有借位 OV 1 若若D7 D6位同时有借位或同时无借位时 OV 0 奇偶标志P 当A中 1 的个数为奇数时 P 1 为偶数时 P 0 注 减法运算只有带借位减法指令 而没有不带借位的减法指令 若要进行低字节的减法运算 应该先用指令将CY清0 然后再执行SUBB指令 41 例3 11设 A DBH R4 73H CY 1 执行指令SUBBA R4则操作如下 11011011 DBH 1101101101110011 73H 10001101 73H补码 1 CY 11111111 1补码 011001111001100111 a 常规减法 b 减法变补码相加结果 A 67H C 0 AC 0 OV 1 P 1 由上述二式可见两种算法的最终结果是一样的 在此例中 若DBH和73H是两个无符号数 则结果67H是正确的 反之 若为两个带符号数 则由于产生OV 1 使得结果是错误的 因为负数减正数其结果不可能是正数 OV 1 就指出了这一错误 42 3 4 4加1指令INCA A A 1INCdirect direct direct 1INCRn Rn Rn 1INC Ri Ri Ri 1INCDPTR DPTR DPTR 1这组指令的功能是将操作数所指定单元的内容加1 3 4 5减1指令DECA A A 1DECdirect direct direct 1DECRn Rn Rn 1DEC Ri Ri Ri 1这组指令的功能是将操作数所指定单元的内容减1 加1 减1指令均不影响PSW中的OV CY AC标志 43 例 已知A 8FH R0 55H 56H 0BBH DPTR 2001H 执行如下程序后A R0 56H和DPTR中的内容是什么 INCAINCR0INC56HINC R0INCDPTRA 90H R0 56H 56H 0BDH DPTR 2002H 44 例 已知 A 0DFH R1 40H R7 19H 30H 00H和 40H 0FFH 问 A和PSW各标志位状态如何 DECA A 0DEH P 0DECR7 R7 18H PSW不变DEC30H 30H 0FFH PSW不变DEC R1 40H 0FEH PSW不变 45 3 4 6乘 除法指令1 乘法指令MULAB BA A B 指令功能 把累加器A和寄存器B中的两个8位无符号数相乘 所得16位乘积的低8位放在A中 高8位放在B中 乘法指令执行后会影响三个标志 若乘积小于FFH 即B的内容为0 则OV 0 否则OV 1 CY 0 奇偶标志P仍按A中1的奇偶性来确定 例3 12已知 A 80H B 32H 执行指令MULAB结果 A 00H B 19H OV 1 CY O P 0 46 2 除法指令DIVAB A A B 之商 B A B 之余数功能 对两个8位无符号数进行除法运算 其中被除数存放在累加器A中 除数存放在寄存器B中 执行后 商存于累加器A中 余数存于寄存器B中 除法指令执行后也影响三个标志 若除数为0 即B 0 时 OV 1 表示除法没有意义 若除数不为0 则OV 0 表示除法正常进行 CY 0 奇偶标志P仍按A中1的奇偶性来确定 例3 13已知 A 87H 135D B 0CH 12D 执行指令DIVAB结果 A 0BH B 03H OV 0 CY 0 P 1 47 3 4 7十进制调整指令格式 DAA功能 对A中刚进行的两个BCD码的加法结果自动进行修正 该指令只影响进位标志CY 所谓BCD码就是采用四位二进制编码表示的十进制数 四位二进制数共有十六个编码 BCD码是取它前十个的编码0000 1001来代表十进制数的0 9 这种编码简称为BCD码 如果两个BCD码数相加 结果也是BCD码 则该加法运算称为BCD码加法 在单片机中没有专门的BCD码加法指令 要进行BCD码加法运算 也要使用加法指令ADD或ADDC 然而计算机在执行ADD或ADDC指令时 是按照二进制规则进行的 对于4位二进制数是按逢16进位 而BCD码是逢十进位的 二者存在进位差 因此用ADD或ADDC指令进行BCD码相加时 可能会出现错误 使用DAA能对运算结果自动进行修正 使用方法 在上述加法指令后面紧跟一条DAA指令 48 例3 14试编写程序 实现95 59的BCD码加法 并将结果存入30H 31H单元 MOVA 95H 95的BCD码数送A中ADDA 59H 两个BCD码相加 结果在A中DAA 对相加结果进行十进制调整MOV30H A 十位个位的BCD码之和送30HMOVA 00H A清0ADDCA 00H 加进位 百位的BCD码 DAA BCD码相加后 用调整指令MOV31H A 存进位第一次执行DAA指令的结果 A 54H CY 1 最终结果 31H 01H 30H 54H 49 若要进行BCD码减法运算 也应该进行调整 但不存在十进制减法调整指令 因此可将减法改为加法 加减数的补数 两位十进制数是对100取补的 例如减法60 30 30 也可以改为补数相加 60 100 30 130去掉进位 就能得到正确的结果 例3 15编写程序实现十进制减法 计算87 38 CLRC 减法之前 先清CY位MOVA 9AH 9AH 即100 送A中SUBBA 38H 做减法 38的补数送A中ADDA 87H 38的补数与87做加法 DAA 对相加结果进行调整 50 分析 减数求补数与被减数相加1001101001100010 00111000 100001110110001011101001 十进制调整11101001 01100000101001001去掉进位 取调整结果的低8位 即得结果为十进制数49 显然是正确的结果 51 逻辑运算的特点 按位进行操作 逻辑运算包括与 或 异或三种 此外还有移位指令以及对累加器A清零和求反指令 3 5 1逻辑与运算指令ANLA data A A dataANLA direct A A direct ANLA Rn A A Rn ANLA Ri A A Ri ANLdirect A direct direct A ANLdirect data direct direct data指令应用 用于将某些位屏蔽 即使之为0 方法是 将要屏蔽的位和 0 相与 保留不变的位同 1 相与 3 5逻辑运算及移位类指令 52 3 5 2逻辑或运算指令ORLA data A A dataORLA direct A A direct ORLA Rn A A Rn ORLA Ri A A Ri ORLdirect A direct direct A ORLdirect data direct direct data指令应用 用于将某些位置位 即使之为1 方法是 将要置位的位和 1 相或 要保留不变的位同 0 相或 53 3 5 3逻辑异或运算指令XRLA data A A dataXRLA direct A A direct XRLA Rn A A Rn XRLA Ri A A Ri XRLdirect A direct direct A XRLdirect data direct direct data指令应用 用于将某些位取反 方法是 将需求反的位同 1 相异或 要保留的位同 0 相异或 54 例3 16将累加器A的低4位送到P1口的低4位输出 而P1的高4位保持不变 解 这种操作不能简单地用MOV指令实现 而可以借助与 或逻辑运算 编程如下 ANLA 0FH 屏蔽A的高4位 保留低4位ANLP1 0F0H 屏蔽P1的低4位 保留高4位ORLP1 A 通过或运算 完成所需操作例3 17试编程 使内部RAM30H单元中的低2位清0 高2位置1 其余4位取反 解 ANL30H 0FCH 30H单元中低2位清0ORL30H 0C0H 30H单元中高2位置1XRL30H 3CH 30H单元中间4位变反 55 3 5 4 累加器清零 取反指令累加器清零指令 CLRA A 0累加器按位取反指令 CPLA A 清零和取反指令只有累加器A才有 它们都是一字节指令 如果用其他方式来达到清零或取反的目的 则都为二字节的指令 MCS 51系列单片机只有对A的取反指令 没有求补指令 若要进行求补操作 可按 求反加1 来进行 以上所有的逻辑运算指令 对CY AC和OV标志都没有影响 只在涉及到累加器A时 才会影响奇偶标志P 56 例 已知 30H单元中有一数x 试写出对它求补的程序 MOVA 30HCPLAINCAMOV30H A 57 例 在下图中 若x y和z的三个输入信号放在X Y和Z单元 试编出可以模拟该电路功能的程序 并把电路的输出信号送入F单元 MOVA XANLA YMOVR1 AMOVA YXRLA ZCPLAORLA R1MOVF A 58 3 5 5循环移位指令移位指令只能对累加器A进行移位 共有循环左移 循环右移 带进位的循环左移和右移四种 循环左移RLA Ai 1 Ai A0 A7循环右移RRA Ai Ai 1 A7 A0带进位循环左移RLCA A0 CY Ai 1 Ai CY A7带进位循环右移RRCA A7 CY Ai Ai 1 CY A0前两条指令的功能分别是将累加器A的内容循环左移或右移一位 执行后仅影响PSW中的P标志 后两条指令的功能分别是将累加器A的内容带进位位CY一起循环左移或右移一位 执行后影响PSW中的进位位CY和奇偶标志位P 59 以上移位指令 可用图形表示 如图3 6所示 60 举例 例3 18 设 A 08H 分析下面程序执行结果 1 RLA A的内容左移一位 结果 A 10HRLA A的内容左移一位 结果 A 20HRLA A的内容左移一位 结果 A 40H即左移一位 相当于原数乘2 原数小于80H时 2 RRA A的内容右移一位 结果 A 04HRRA A的内容右移一位 结果 A 02HRRA A的内容右移一位 结果 A 01H即右移一位 相当于原数除2 原数为偶数时 61 例 已知M1和M1 1单元中有一个16位的二进制数 M1 低8位 请编程令其扩大到二倍 CLRCMOVR1 M1RLCAMOV R1 AINCR1MOVA R1RLCAMOV R1 A 62 3 6控制转移类指令 51系列单片机有比较丰富的控制转移指令 包括无条件转移指令 条件转移指令和子程序调用及返回指令 这类指令的特点 自动改变PC的内容 使程序发生转移 3 6 1无条件转移指令有四条无条件转移指令 提供了不同的转移范围 可使程序无条件地转到指令所提供的地址上去 1 长转移指令LJMPaddr16 PC addr16功能 把指令中给出的16位目的地址addr16送入程序计数器PC 使程序无条件转移到addr16处执行 16位地址可寻址64KBROM 故称为长转移指令 长转移指令是三字节指令 依次是操作码 高8位地址 低8位地址 63 2 绝对转移指令AJMPaddr11 PC PC 2 PC10 0 addr11这是一条二字节指令 其指令格式为 a10a9a800001a7a6a5a4a3a2a1a0指令中提供了11位目的地址 其中a7 a0在第二字节 a10 a8则占据第一字节的高3位 而00001是这条指令特有的操作码 占据第一字节的低5位 绝对转移指令的执行分为两步 第一步 取指令 此时PC自身加2指向下一条指令的起始地址 称为PC当前值 第二步 用指令中给出的11位地址替换PC当前值的低11位 PC高5位保持不变 形成新的PC值 即转移的目的地址 64 11位地址的范围为00000000000 11111111111 即可转移的范围是2KB 转移可以向前也可以向后 如图3 7所示 但要注意转移到的位置是与PC 2的地址在同一个2K区域 65 例3 19分析下面绝对转移指令的执行情况 1234H AJMP0781H分析 在指令执行前 PC 1234H 取出该指令后 PC 2形成PC当前值 它等于1236H 即0001001000110110B 指令执行过程 用指令给出的11位地址11110000001B替换PC当前值的低11位 即新的PC值为1781H 所以指令执行结果就是转移到1781H处执行程序 应注意 只有转移的目的地址与PC当前值在2K范围之内时 才可使用AJMP指令 超出2K范围 应使用长转移指令LJMP 66 3 短转移指令SJMPrel PC PC 2 PC PC relSJMP是无条件相对转移指令 该指令为双字节 rel是相对转移偏移量 指令的执行分两步完成 第一步 取指令 此时PC自身加2形成PC的当前值 第二步 将PC当前值与偏移量rel相加形成转移的目的地址送PC中 即 目的地址 PC 2 relrel其范围为 128 127 这条指令的优点是 指令给出的是相对转移地址 不具体指出地址值 当程序地址发生变化时 只要相对地址不发生变化 该指令就不需要作任何改动 67 4 变址寻址转移指令 称散转指令 间接转移指令 JMP A DPTR PC A DPTR 指令的功能 把累加器A中的8位无符号数与基址寄存器DPTR中的16位地址相加 所得的和作为目的地址送入PC 该指令特点 转移地址可以在程序运行中加以改变 例如 在DPTR中装入多分支转移指令表的首地址 而由累加器A中的内容来动态选择应转向哪一条分支 实现由一条指令完成多分支转移的功能 例3 20设累加器A中存有用户从键盘输入的键值0 3 键处理程序分别存放在KPRG0 KPRG1 KPRG2 KPRG3位置处 试编写程序 根据用户输入的键值 转入相应的键处理程序 68 MOVDPTR JPTAB 转移指令表首地址送DPTRRLA 键值 2 AJMP指令占2个字节JMP A DPTR JPTAB 2 键值 和送PC中 则程序转移到表中某一位置去执行AJMP指令JPTAB AJMPKPRG0AJMPKPRG1AJMPKPRG2AJMPKPRG3KPRG0 KPRG1 KPRG2 KPRG3 69 3 6 2条件转移指令条件转移指令是指当某种条件满足时 转移才进行 而条件不满足时 程序就按顺序往下执行 条件转移指令的共同特点是 1 所有的条件转移指令都属于相对转移指令 转移范围相同 都在以PC当前值为基准的256B范围内 128 127 2 计算转移地址的方法相同 转移地址 PC当前值 rel1 累加器判零转移指令JZrel 若 A 0 则转移 PC PC 2 rel 若 A 0 按顺序执行 PC PC 2JNZrel 若 A 0 则转移 PC PC 2 rel 若 A 0 按顺序执行 PC PC 2 70 例 已知 外部RAM中DATA1为始地址的数据块以零为结束标志 试编程将之传送到以DATA2为始地址的内部RAM区 MOVR0 DATA1MOVR1 DATA2LOOP MOVXA R0JZDONEMOV R1 AINCR0INCR1SJMPLOOPDONE SJMP 71 2 比较条件转移指令CJNEA data rel 若 A data 则PC PC 3 CY 0若 A data 则PC PC 3 rel CY 0若 A direct 则PC PC 3 rel CY 0若 A data 则PC PC 3 rel CY 0若 Rn data 则PC PC 3 rel CY 1 72 CJNE Ri data rel 若 Ri data 则PC PC 3 CY 0若 Ri data 则PC PC 3 rel CY 0若 Ri data 则PC PC 3 rel CY 1在使用CJNE指令时应注意以下几点 1 比较条件转移指令都是三字节指令 PC当前值 PC 3 PC是该指令所在地址 转移的目的地址 PC 3 rel 2 比较操作实际就是作减法操作 只是不保存减法所得到的差而将结果反映在标志位CY上 3 CJNE指令将参与比较的两个操作数当作无符号数看待 处理并影响CY标志 因此CJNE指令不能直接用于有符号数大小的比较 若进行两个有符号数大小的比较 则应依据符号位和CY位进行判别比较 73 3 减1条件转移指令DJNZRn rel Rn Rn 1若 Rn 0 则转移 PC PC 2 rel若 Rn 0 按顺序执行 PC PC 2DJNZdirect rel direct direct 1若 direct 0 则转移 PC PC 3 rel若 direct 0 按顺序执行 PC PC 3第一条为二字节指令 第二条为三字节指令 这两条指令对于构成循环程序十分有用 使用中可以指定任何一个工作寄存器或者内部RAM单元为计数器 对计数器赋以初值以后 就可以利用上述指令对计数器进行减1 不为零就进入循环操作 为零就结束循环 从而构成循环程序 74 例3 21试编写程序 将内部RAM以DATA为起始地址的10个单元中的数据求和 并将结果送入SUM单元 设和不大于255 解 对一组连续存放的数据进行操作时 一般都采用间接寻址 使用INC指令修改地址 可使编程简单 利用减1条件转移指令很容易编成循环程序来完成10个数相加 MOVR0 DATA 首地址送间址寄存器R0MOVR7 0AH 计数器R7送入计数初值CLRA 累加器A作累加和 先清0LP ADDA R0 加一个数INCR0 地址加1 指向下一地址单元DJNZR7 LP 计数值减1不为零循环MOVSUM A 累加和存入指定单元SJMP 结束 75 例3 22将外部RAM的一个数据块传送到内部RAM 两者的首地址分别为DATA1和DATA2 遇到传送的数据为 字符 停止传送 MOVDPTR DATA1 外部数据块首地址送DPTRMOVR1 DATA2 内部数据块首地址送R1LP MOVXA DPTR 从外部RAM取数送入ACJNEA 24H LP1 与 的ASC 码比较 不相等转LP1 SJMPLP2 相等 转LP2LP1 MOV R1 A 不是 字符 执行传送INCDPTR 修改源地址指针INCR1 修改目的地址指针SJMPLP 转传送下一个数据LP2 SJMP 结束 76 以上条件转移指令都是相对转移指令 转移的范围有限 若要在大范围内实现条件转移 可将条件转移指令和长转移指令LJMP结合起来加以实现 例如 根据A和立即数80H比较的结果转移到标号NEXT1 其转移的距离已超过了256字节 则可用下述指令来实现 CJNEA 80H NEXT 不相等 则转移 相等 按顺序执行SJMPNEXT2 处理完 跳到NEXT2NEXT LJMPNEXT1 长转移至NEXT1CJNE与LJMP两条指令的结合 可以实现在64KB范围内的条件转移 其中的SJMPNEXT2指令是在执行完两数相等的处理后 转移到继续执行的位置 以免也要去执行LJMP指令 造成程序逻辑上的混乱 77 3 6 3子程序调用及返回指令调用子程序的程序称之为主程序 主程序和子程序之间的调用关系可用图3 8表示 从图中可看出 子程序调用要中断原有指令的执行顺序 转移到子程序的入口地址去执行 与转移指令不同的是 子程序执行完毕后 要返回到原来被中断的位置 继续往下执行 子程序调用指令必须能将程序中断位置的地址保存起来 一般都是自动将断点地址放在堆栈中保存 78 在子程序中再调用其他子程序 称为子程序嵌套 二层子程序嵌套过程如图3 9 a 图3 9 b 为二层子程序调用后 堆栈中断点地址存放情况 调用和返回构成了子程序调用的完整过程 为了实现这一过程 必须有调用指令和返回指令 调用指令在主程序中使用 而返回指令则是子程序中的最后一条指令 79 1 子程序调用指令LCALLaddr16 PC PC 3SP SP 1 SP PC 7 0SP SP 1 SP PC 15 8PC addr16ACALLaddr11 PC PC 2SP SP 1 SP PC 7 0SP SP 1 SP PC 15 8PC10 0 addr11LCALL指令称为长调用指令 三字节 addr16是子程序的16位入口地址 长调用指令调用范围为64KB 80 ACALL指令称为绝对调用指令 其指令格式为 a10a9a810001a7a6a5a4a3a2a1a0该指令的功能是 先将PC加2 指向下条指令地址 即断点地址 然后将断点地址压入堆栈 再把指令中给出的子程序低11位入口地址装入PC的低11位上 PC的高5位保持不变 使程序转移到对应的子程序入口处 绝对调用指令调用范围为2KB 2 返回指令RET PC15 8 SP SP SP 1PC7 0 SP SP SP 1功能 从堆栈中自动取出断点地址送入程序计数器PC 使程序返回到主程序断点处继续执行 81 RETI PC15 8 SP SP SP 1PC7 0 SP SP SP 1RETI指令是中断返回指令 放在中断服务子程序的末尾 其功能也是从堆栈中自动取出断点地址送入程序计数器PC 使程序返回到主程序断点处继续往下执行 同时还清除中断响应时被置位的优先级状态触发器 注意 RET和RETI不能互换使用 在子程序或中断服务子程序中 PUSH指令和POP指令必须成对使用 否则 不能正确返回主程序断点位置 82 3 6 4空操作指令NOP PC PC 1这是一条单字节指令 该指令不产生任何操作 只是使PC的内容加1 指向下一条指令 它又是一条单周期指令 执行时在时间上消耗一个机器周期 因此 NOP指令常用来实现等待或延时 83 MCS 51系列单片机其特色之一就是具有丰富的布尔变量处理功能 布尔变量即开关变量 它是以位 bit 为单位来进行操作的 也称为位变量 位操作指令是以进位标志CY作为位累加器 在位指令中直接用C表示 位操作类指令的对象 一是内部RAM中的位寻址区 即20H 2FH中的128位 二是特殊功能寄存器中位寻址的各位 位地址在指令中都用bit表示 bit有四种表示形式 一是采用直接位地址表示 二是采用字节地址加位序号表示 三是采用位名称表示 四是采用特殊功能寄存器加位序号表示 3 7位操作类指令 84 3 7 1位变量传送指令MOVC bit CY bit MOVbit C bit CY 指令功能 以bit表示的位和CY之间进行数据传送 注意 两个可寻址位之间没有直接的传送指令 例3 23将40H位的内容传送到20H位 解 传送可以通过CY来进行 但要注意保持原有CY的值不被破坏 MOV10H C 暂存CY内容MOVC 40H 40H位的值送CYMOV20H C CY的值送20H位MOVC 10H 恢复CY内容上述指令均属位操作指令 因用CY作累加器 指令中的地址都是位地址 不是存储单元的地址 85 3 7 2位置位 清零指令CLRC CY 0CLRbit bit 0SETBC CY 1SETBbit bit 1上述指令的功能是对CY及可寻址位进行清零或置位操作 3 7 3位逻辑运算指令ANLC bit CY CY bit ORLC bit CY CY bit 这两条指令的功能是将CY的内容与位地址中的内容进行逻辑与 或操作 结果送入CY中 86 ANLC bit CY CY ORLC bit CY CY 这两条指令的功能同上 也是进行与 或运算 斜杠 表示将该位值取出后 先求反 再参加运算 不改变位地址中原来的值 CPLC CY CPLbit bit 指令的功能 把CY或位地址中的内容取反 在位操作指令中 没有位的异或运算 如果需要 可通过上述位操作指令实现 87 例3 24设E B D都代表位地址 试编写程序完成E B内容的异或操作 并将结果存入D中 解 可直接按D E B来编写 MOVC B 从位地址中取数送CYANLC E CY B MOVD C 暂存MOVC E 取另一个操作数ANLC B CY E ORLC D 进行E B运算MOVD C 运算结果存D位利用位逻辑运算指令 可以获得组合电路逻辑功能 88 3 7 4位控制转移指令位控制转移指令都是条件转移指令 它以CY或位地址bit的内容作为转移的判断条件 1 以CY为条件的转移指令JCrel 若 CY 1 则转移 PC PC 2 rel若 CY 1 按顺序执行 PC PC 2JNCrel 若 CY 0 则转移 PC PC 2 rel若 CY 0 按顺序执行 PC PC 2 89 2 以位状态为条件的转移指令JBbit rel 若 bit 1 转移 PC PC 3 rel若 bit 1 顺序执行 PC PC 3JNBbit rel 若 bit 0 转移 PC PC 3 rel若 bit 0 顺序执行 PC PC 3JBCbit rel 若 bit 1 转移 PC PC 3 rel 同时bit 0若 bit 1 顺序执行 PC PC 3注意 JB和JBC指令的区别 两者转移的条件相同 所不同的是JBC指令在转移的同时 还能将直接寻址位清0 即一条JBC指令相当于两条指令的功能 90 例3 25试编程 在8051的P1 7位输出一个方波 方波周期为6个机器周期 SETBP1 7 使P1 7位输出 1 电平NOP 延时2个机器周期NOPCLRP1 7 使P1 7位输出 0 电平NOP 延时2个机器周期NOPSETBP1 7 使P1 7位输出 1 电平SJMP 暂停若在P1 7位输出连续方波 应如何修改程序 请试编程 LOOP LOOP 91 例3 26试分析 执行完以下程序 程序将转至何处 ANLP1 00H P1 00HJBP1 6 LP1 因P1 6 0 程序按顺序执行JNBP1 0 LP2 因P1 0 0 程序发生转移 转至LP2 LP1 LP2 使用位操作指令可以使程序设计变得更加方便和灵活
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!