




已阅读5页,还剩196页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章MCS 51单片机的指令系统和时序 本章内容 指令的格式 指令的功能 指令在执行时所包含的操作 指令的长度 执行时间 本章目录 2 0震荡器 时钟电路和CPU的时序2 1指令系统概述2 2寻址方式2 3数据传送指令2 4算逻运算和移位指令2 5控制转移和位操作指令2 6位操作指令2 7汇编语言的构成及伪指令 MCS 51内部有一个高增益反相放大器 在单片机引脚的XTAL1和XTAL2分别是此放大器的输入和输出端 与作为反馈元件的晶体一起构成了一个自激震荡器 如果使用外部震荡器信号 其外来的信号加在XTAL1的引脚上 XTAL1 XTAL2 XTAL2XTAL1 NC 外时钟 使用外时钟时的电路连接 3 1 1震荡器 与时钟电路 20P 20P 3 1 2MCS 51单片机的时序 关于时序的基本概念 时序 CPU执行指令时所需控制信号的时间顺序 时序图中时间参数的描述 时钟周期 机器周期 指令周期 返回 时钟周期T 时序中最小的时间单位 由外接晶体或外输入时钟来决定 其值为石英振荡器频率fosc的倒数 例如 在单片机外接12MH的晶体 则单片机的系统时钟的频率为12M 时钟周期为1 12 s T 机器周期 完成特定功能所需要的时间 机器周期由12个时钟周期构成 为了描述方便将其分6个状态 S1 S6 每个状态又分为P1和P2两拍 既 S1P1 S1P2 S2P1 S2P2 S3P1 S3P2 S6P1 S6P2一种描述时序图时间参数的定标方法 T S2 S6 S5 S4 S3 机器周期 P1 S1 P2 指令周期 既执行一条指令所需要的时间 它是时序图中最大的时间单位 在MCS 51系统中 不同的指令它所包含的机器周期数不同 它们分别是 1 单机器周期指令 2 双机器周期指令 3 四机器周期指令 假设 我们使用一个12M的晶体震荡器 那么一个机器周期为 1 12 s 12 1 1 s 两个机器周期为 1 12 s 12 2 2 s 四个机器周期为 1 12 s 12 4 4 s 可见指令的运算速度与它所包含的机器周期数有关 机器周期数越少 执行的速度就越快 MCS 51单片机的指令系统除了乘 除法指令为四个机器周期外 其余都是单周期和双周期指令 指令的字节数 MCS 51单片机的指令系统有 单字节 占用1个ROM存储单元 1个字节 双字节 占用2个ROM存储单元 2个字节 三字节指令 占用3个ROM存储单元 3个字节 返回 ROM ROM ROM 单字节指令 双字节指令 三字节指令 问题 指令的字节数与指令执行的时间是什么关系 指令的字节数越多 其执行的时间就越长 指令的字节数越少 执行就越快 要回答此问题 只能从指令执行的时序中寻找答案 指令特点 在程序存储器ROM中仅占一个存储单元 在ALE第一次有效 S2P1 时 从ROM中读取指令的操作码 送入指令寄存器IR中并译码执行 在ALE第二次有效时 封锁PC加一 使第二次读数无效 一 单字节单周期指令的时序 机器周期 读操作码一 读操作无效 ALE 返回 S1 S2 S6 S5 S4 S3 注意 每一个机器周期出现两次ALE信号 ALE信号对应这从ROM中读指令 所以在一个机器周期中CPU可以完成两次取指操作 3 对于单字节单周期的指令 CPU通过译码后封死PC 取消第二次取指 实际上指令的后半部不做任何工作 指令特点 指令长度为两个字节 并存储在ROM相邻的两个单元中 要想完整的将这样的指令执行完 必须从ROM中读两次操作码 OP2 2 OP2 1 n 1n 程序ROM PC 二 双字节单周期指令时序 返回 在ALE第一次有效时 CPU从ROM的n单元中取出指令的第一个字节OP2 1 并送入IR译码 通过译码CPU知道这是一条双字节指令 所以使PC加一 指向n 1单元 在ALE第二次有效时 从ROM的n 1单元取出指令的第二个字节OP2 2送入IR进行译码 并产生对应的操作 最后在S6P2时完成本条指令的运行 S1 S2 S6 S5 S4 S3 机器周期 读操作码一 读操作码二 ALE OP2 2 OP2 1 n 1n 程序ROM PC 指令特点 单字节 却需要两个机器周期运行 如 INCDPTRDPTR为两个8位的寄存器 加一时 必须分两步完成 既第一步DPL加一 如果DPL加一有进位则还要进行第二步对DPH加一 参见教科书 502页附表 三 单字节双周期指令的时序 返回 在指令周期的第一个ALE时 将ROM中的操作码OP取出 经IR译码后得知为单字节双周期指令 所以一面执行该指令 同时封锁后面三次ALE有效时的PC 1 在第二个机器周期的S6P2时 完成操作 S1 S2 S6 S5 S4 S3 机器周期1 读操作码 读无效 S1 S2 S6 S5 S4 S3 读无效 读无效 机器周期2 ALE 小结 在MCS 51的111条指令中 可以分为六种基本的时序 1 单字节单周期指令 4 双字节单周期指令 2 单字节双周期指令 5 双字节双周期指令 3 单字节四周期指令 6 三字节双周期指令 返回 2 1MCS 51指令系统的概述 MCS 51共有111条指令 其长度 字节数 和执行时间 指令周期 各不相同 2 1 1指令格式2 1 2指令的三种表示形式2 1 3指令的字节数2 1 4指令的分类 继续 2 1 1指令格式 指令格式 既指令的结构形式 操作码 操作数或操作数地址 由操作码和操作数 或操作数地址 两部分构成 举例 MOVA 0FFHADDA R0 返回 指令的表示形式是识别指令的标志 1 二进制的表示形式 以 累加器的内容 08H 为例 00100100B操作码OP 加法 00001000B操作数DATA 08H 特点 直接存储在程序存储器ROM中 被CPU直接识别 运行的指令形式 也称机器码 缺点 不便于人工阅读 记忆和调试修改 2 1 2指令的三种表示形式 2 十六进制表示方式 它是对二进制形式的一种简化 00100100B24H00001000B08H在实验室等少数环境下 可以将这种形式作为输入程序的一种辅助手段 但是 这种形式的指令格式必须由对应的监控程序把它们翻译成二进制的 机器码 后存入程序存储器并运行 二进制表示的形式十六进制表示的形式 3 指令的 助记符 方式 汇编格式 00100100B24H00001000B08HADDA 08H一种由英文单词或字母 数字来表征指令功能的形式 便于阅读 书写和交流 这种 汇编 格式的指令必须把它 翻译 为二进制形式 机器码 后才能为CPU所识别和执行 编程者首先使用汇编格式书写 汇编语言源程序 然后借助于汇编程序将其 编译 为二进制机器码并送入到单片机ROM单元中并由CPU执行 二进制表示形式十六进制表示汇编格式 返回 2 1 3指令的字节数 在指令系统中 因寻址方式不同 指令在程序存储器ROM中所占字节数也各不相同 分为单字节 双字节和三字节 单字节指令 49条 分无操作数 有操作数两种 无操作数 如INCDPTR10100011BINCA00000100B 特点 操作数隐含在操作码中 含有操作数寄存器名称的单字节指令 如 MOVA R011101000BMOVA R111101001B 特点 寄存器名以三位数代码的形式在指令的后三位 双字节指令 46条 分两种情况 指令中含有一个操作数 例如 汇编格式 MOVA data机器码 01110100Bdata或 78H data n n 1 mova data 双字节指令在程序存储器的存放示意图 8位的操作数 指令中含有一个8位的操作数的地址 汇编格式 MOVA direct机器码 E5H direct如 MOVA 20H 将RAM20H中的数据送A n n 1 mova direct 8位的RAM地址 三字节指令 16条 指令中的操作数为双字节 MOVDPTR data161001000B data15 8 data7 0 指令中分别包含1个字节的操作数和1个字节的操作数地址 MOVdirect data举例 MOV20H 0FFH MOVdptr data16 MOVdirect data 三字节指令在存储器中存放的方式示意图 指令的字节数与指令的运行时间 指令的字节多是否意味着指令周期就长 从表中可见 指令的字节数与指令周期不是对等的关系 返回 2 1 4指令的分类 按照指令的功能 可将111条指令分为五大类1 数据传送类指令2 算术运算指令3 逻辑操作和循环移位指令4 控制转移类指令5 位操作指令 1 数据传送类指令 完成数据的传送 特点 有8位 16位两种传送指令 除了以累加器A为目标的传送对奇偶位PSW P有影响外 其余的传送类指令对PSW无影响 2 算术运算指令 用于操作数的加 减 乘除运算 特点 多数情况下 操作数之一在累加器A中 结果也保留在A中 运算结果要影响PSW 进位标志 奇偶和溢出标志等 3 逻辑操作和循环移位指令 操作数之间的逻辑加 与 取反和异或等操作 特点 多数情况下一个操作数在A中 结果也存于A 移位指令分为左移 右移和带进位和不带进位几种情况 逻辑类指令基本不影响PSW的内容 4 控制转移类指令 无条件转移 条件转移 调用和返回 特点 通过修改程序指针PC的内容 使CPU发生转移 从而改变程序的流向 这也是唯一一种间接修改程序指针PC的指令 5 位操作指令 位传送 类似于字节传送 对bit进行传送 位置位 复位 对某一位置一或清零 位运算 对某一位进行逻辑与 或 取反等 位控条件转移 对某一位的状态进行判断 满足条件转移 特点 按位操作 指令中所涉及到的地址皆为 位地址 这类指令基本不影响PSW的内容 继续 2 2寻址方式 在指令的操作数位置上 用于表征 寻找操作数的方法定义为 寻址方式 正确的理解 掌握寻址方式 是学习 使用指令的关键 在MCS 51单片机中 共使用了七种寻址方式 继续 1 寄存器寻址2 直接寻址3 立即数寻址4 寄存器间接寻址5 变址寻址 6 相对寻址 7 位寻址 七种寻址方式 2 2 1寄存器寻址 指令中含有一个存有操作数的寄存器Rn n 0 7 MOVA Rn 返回 例如 MOVA R7 将寄存器R7中的内容送累加器A中MOV20H R0 将寄存器R0中的数据送内存20H单元 特点 寄存器寻址方式的指令大多是单字节指令 寄存器的3位代码与操作码OP共同占用一个指令字节 以MOVA R7为例 使用R7寄存器 所以rrr 111 既指令的机器码为 0EFH 11101rrr 操作码OP 寄存器代码111 E8H EFH MOVA R7 ROM的一个字节 2 2 2直接寻址 指令本身直接给出操作数在RAM中的地址 MOVA direct其中 direct为8位的RAM地址如 MOVA 30H 将RAM30H单元数据送累加器A 如 MOVA 30H 将RAM30H单元内容送累加器这里30H是操作数在RAM中的地址 直接寻址的指令长度是两个或三个字节 n n 1 30H 累加器A 直接寻址示意图 使用直接寻址应注意的三个问题 1 指令助记符中direct是用16进制数表示的操作数地址 当地址恰好在SFR区域时 指令也可以用寄存器名来表示 如 MOVA 80H可以写成MOVA P0后者用SFR中寄存器的名字取代它的物理地址80H 它更容易阅读和交流 所以我们提倡使用SFR中寄存器名称来代替直接地址 如 MOVA SBUF 串口数据缓冲器数据送AMOVIE 00H 初始化中断允许寄存器MOVTH1 0FEH 为定时器1赋初值应当注意 在编译时 汇编程序要先将寄存器名字转换为直接地址 然后再翻译成机器码 2 当直接地址时在工作寄存器区中时 可以使用两种寻址方式来访问 参见57页 如 MOVA 00H 将RAM中00H单元数据送累加器AMOVA R0 将工作寄存器R0的内容送累加器A这里使用了不同的寻址方式 其指令的结构也不相同 前者是 11100101 0E5H 00000000 00H 双字节 后者的机器码是 11101000 0E8H 单字节 在物理结构上 R0与RAM的00H单元恰好是同一单元 所以不同的指令而执行结果是一样的 类似的还有累加器A INCA寄存器寻址方式 单字节 INCACC直接寻址方式 双字节 INC0E0H直接寻址方式 双字节 3 在指令系统中 字节地址与位地址是完全不同的概念 前者用direct表示 而后者用bit表示 但在指令中都是用16进制表示的数 如 MOVA 20H 将RAM的20H单元内容送AMOVC 20H 将位寻址区中的位地址为20H位内容送PSW中的Cy中 片内RAM 20H 2FH 中的位寻址区结构图 2FH 20H 字节地址 返回 24H 位地址 返回前一次 2 2 3立即寻址 指令中直接含有所需要的操作数data MOVA datadata称为8位或16位的 立即数 使用 作前缀 如 MOVA 30H 将8位立即数送累加器AMOVDPTR 2000H 16位立即数送DPTR寄存器 返回 注意 MOVA 30HMOVA 30H两者的区别 立即数寻址的指令长度为2或3个字节 n n 1 ROM 累加器A MOVA 30H ROM DPTR MOVDPTR 2000H 指令执行流程 2 2 4寄存器间接寻址 指令中含有保存操作数地址的寄存器Ri i 0 1 MOVA RiCPU首先从Ri找到操作数地址 然后再从该地址中找到操作数x MOVR0 30H 立即数送R0寄存器MOVA R0 从RAM的30H单元取数送累加器A 注意 MOVA R0和MOVA R0指令的区别 30H R0 00H 累加器A 1 2 3 使用间接寻址时应注意的几个问题 使用间址指令前 往往要事先为间址寄存器Ri赋初值 只能使用R0 R1作间址寄存器 即Ri i 0 1 间址可访问片内RAM 也是访问片外RAM唯一的方式 对于片内RAM使用Ri寄存器 寻址范围00H FFH MOVA Ri访问内部RAM单元 对片外RAM可以 使用Ri 寻址范围为00H FFH 256字节 使用DPTR做间址寄存器 寻址范围为0000H FFFFH 64K MOVXA Ri 访问外RAM单元 范围256字节MOVXA DPTR 访问外RAM单元 范围64K字节 注意 Ri DPTR应事先装入地址 间址方式不能访问SFR单元 如下面的程序是错误的 MOVR1 80HMOVA R1因为80H为SFR的物理地址对于SFR只能采用直接寻址的方式访问 MCS 51片内 片外数据存储器示意图 特殊功能寄存器SFR 通用数据存储器 80H7FH 00H FFH 片内数据存储器片外数据存储器256B个字节64KB个字节 片外数据存储器RAM64KB 0000H FFFFH 注意 1 访问片内RAM20H存储单元 MOVA 20H2 访问片外RAM存储单元 MOVR0 20HMOVXA R03 尽管片内与片外的RAM单元的00H FFH地址相重叠但由于指令的不同不会发生地址混乱 返回 2 2 5变址寻址 指令使用DPTR或PC中的内容作为基地址 再与累加器A的内容相加 其和作为操作数地址 如 MOVCA A PC PC内容为基地址与A的内容相加得操作数地址 并将此操作数送AMOVCA A DPTR DPTR内容为基地址与A的内容相加得操作数地址并将此操作数送A这是访问程序存储器ROM中数据的唯一的寻址方式 变址寻址方式用于查表操作 而数据表是建立在程序存储器ROM中 举例 已知ROM中的0300H 0309H为0 9的平方表 试编程 求A中数据的平方 设A 02H MOVDPTR 0300H 指针DPTR赋表头地址MOVCA A DPTR 从0302H单元取数4送A这里 DPTR提供平方表的基地址 A的内容为偏移量 变址寻址示意图 02H 0300H ALU 0302H 累加器A DPTR 0300H DPTR 02H A 0302H MOVCA A DPTR 返回 0300H ROM 平方表 2 2 6相对寻址 转移指令使用的一种寻址方式 MCS 51单片机的指令系统中 有两类转移指令 相对转移 2个或3个字节 绝对转移 3个字节 在绝对转移指令中 指令直接给出转移的目标地址 2字节地址 如 LJMP0100H 即0100H PC 而相对转移指令中给出一个转移地址的偏移量rel 在执行中将当前PC值与偏移量rel 补码 相加 形成实际转移的目标地址 SJMPrel如 SJMP03H执行的操作是 PC 03H PC即用rel修改PC值实现转移 03H 2002H ALU 2005H 累加器A PC 2002H 03H2005H 操作码 偏移量 例如 SJMP03H 机器码80H 03H 2000H 2002H 当前PC值 LOOP 由于偏移量rel为带符号的8位补码 所以控制程序转移的范围为 127 128 相对寻址使用中应注意的问题 与绝对寻址相比 相对寻址具有很好的 浮动性 因此是编程人员普遍使用的一种寻址方式 使用时 要注意3点 CPU进行地址计算时 PC取值是执行本条转移指令后的地址值 以上面的例子说明 指令本身的首地址是2000H 执行完后变为2002H 因为本条转移指令长度为2 即PC 2 rel PC PC 2005H 如果使用三字节的相对转移指令 则PC PC 3 rel 返回上一页 偏移量的计算 rel 目标地址 源地址 2 2字节相对转移指令 或 rel 目标地址 源地址 3 3字节相对转移指令 结果用补码的形式书写 为了减少计算量 汇编程序允许使用 符号地址 代替偏移量 如 SJMPloop1汇编程序在汇编时 自动计算rel 并将结果进行替换 如果转移地址超过相对寻址的范围 127 128 时 在编译时系统会提示出错 这是编程者常见到问题 绝对转移和相对转移的指令 部分 绝对转移 LJMPaddr16如 LJMP2000H 三个字节 OP addH addrL LCALL2100H 子程序长调用相对转移 SJMPrel 无条件短转移DJNZRn rel Rn 1 Rn Rn 0则转JZrel A 0则转 二字节 JNZrel A 0则转 二字节 CJNEA data rel A data转 三字节 返回 2 2 7位寻址 指令的形式同直接寻址相似 不同的是 指令中的地址是 位地址 参见57页 而不是字节地址 MOVC bit如 MOVC 20H 将为地址为20H中的内容送Cy中 类似的还有逻辑运算指令等 作为嵌入式控制器 CPU更多的是处理 开关量 而不单纯是字节结构的数据 因此MCS 51在指令设计上刻意设计了大量的 布尔操作 即位操作 这为系统应用带来了很大的方便 MCS 51单片机控制 检测系统 驱动器 电动机 外设1 外设2 状态信号 状态信号 控制信号 在MCS 51的硬件设计中 在片内RAM区中还专门开辟了一个 位寻址区 布尔变量可以按位进行存储操作 除了RAM中的位寻址区外 大多SFR 地址能够被8整除的 都可以按位寻址 这对编程尤为重要 参见59页 举例 SETB90H 将P1口的D0位置一为了增加程序的可读性 凡在SFR中的位地址都可以使用符号来替代 如本例中 完全可以使用下面的指令格式 SETBP1 0 将P0口的的D0位置一又如 SETBEA SETB0AFH 开中断SETBTR0 SETB8CH 启动定时器这种指令在编译时 是要先将符号地址进行转换的 继续 2 3数据传送指令 2 3 0传送指令的特点2 3 1内部数据传送类指令2 3 2外部数据传送类指令2 3 3堆栈操作指令2 3 4数据交换指令 继续 数据传送是编程中使用最多 最主要的操作 传送分为 单片机内部各单元之间的内部数据传送 单片机内部与外部之间的外部数据传送 在指令中 必须指定被传送数据的源地址和目标地址 在传送过程中 源地址的内容不被改变 COPY 传送类指令除了以累加器A为目标的传送对PSW的P有影响外 其余的传送类指令对PWS一概无影响 2 3 0传送指令的特点 举例 MOVA R0 将R0寄存器中的数据送累加器A中 注意寻址方式 指令通式 MOV 返回 由右向左传送 2 3 1内部数据传送类指令 特点 指令的源操作数和目的操作数都在单片机内部 按照寻址方式进行分类 1 立即寻址型传送指令 2 直接寻址型传送指令 3 寄存器寻址型传送指令 4 寄存器间址型传送指令 5 内部数据传送类指令的使用 继续 1 立即寻址型传送指令 特点 原操作数是立即数 处在指令的第二或第三字节 所以这类指令都是多字节指令 有如下4条 MOVA data A data 双字节指令 MOVRn data Rn data 双字节指令 MOV Ri data Ri data 双字节指令 MOVdirect data direct data 三字节指令 这类指令多用于程序的初始化 如 MOVR0 20H R0 20HMOVA 00H 累加器A清零 立即寻址指令举例 已知 R0 20H 试问单片机执行如下指令后 累加器A R7 20H和21H单元中的内容是什么 MOVA 18H 立即数18H送累加器AMOVR7 28H 立即数28H送寄存器R7MOV R0 38H 立即数38H送内存20H单元MOV21H 48H 立即数48H送内存21H单元 返回 2 直接寻址型传送指令 特点 指令中至少含有一个源操作数或目的操作数的地址 是2个或3个字节的指令格式 其中直接地址在第2或第3个字节上 这类指令有如下5条 MOVA directMOVdirect AMOVRn directMOV Ri directMOVdirect2 direct1 注意 direct为内部寄存器 RAM和SFR的地址 即direct适用于片内所有的地址 寄存器 SFR和RAM 直接寻址指令举例 MOVA 30H 内存RAM30h单元数据送AMOV50H A A中内容送RAM的50h单元MOVR6 31H RAM的30h内容送R6寄存器MOV Ri 30H RAM30h内容送Ri指定的RAM单元MOVP1 32H RAM32h内容送P1口 p1 符号地址 MOV90H 32H 同上 试比较两种表示方法 一个指令两种写法 返回 3 寄存器寻址型传送指令 指令中含有存放操作数的寄存器名Rn其中 n 0 1 2 3 4 5 6 7 共有如下三条 MOVA RnMOVRn AMOVdirect Rn 返回 4 寄存器间接寻址型传送指令 指令特点 指令中Ri中存放的不是操作数本身 而是操作数在RAM中的地址 i 0 1 格式如下 MOVA RiMOV Ri AMOVdirect Ri 注意 Ri中存放操作数的地址是有所选择的 只有非SFR的RAM单元才能使用这种寻址方式 寄存器间接寻址指令举例 已知 40h 11h 41h 22h R0 40h和R1 41h 试问 下面的指令执行后 累加器A RAM的40h 41h和42h单元中的内容是什么 MOVA R0 RAM40h单元内容11h送AMOV R1 A A中的11h送RAM的41h单元MOV42H R1 RAM的41h单元内容11h送RAM42h中 返回 5 内部数据传送类指令的使用 1 不能根据主观意愿去 创造 指令 例如 要将R0中的数据传送到R1中 如何使用指令去完成上面的操作 MOVR1 R0是否可以 回答是否定的 因为在MCS 51的指令系统中没有此条指令 只能使用 MOVA R0或 MOV01h 00hMOVR1 A因此 必须从MCS 51的指令表中选择使用指令 MCS 51内部数据传送类指令方式图 累加器A direct直接寻址 Ri间址 Rn寄存器 Data立即数 返回上一次 2 以累加器A为目的寄存器的传送指令会影响PSW中的奇偶位P 而其余的指令对PSW均无影响 3 会正确地估计指令的字节 凡是包含有立即数 直接地址的指令 都应当在原有的基础上加1或2 举例 mova Ri 个字节mova direct 个字节movdirect data 个字节movdirect2 direct1 个字节 4 对于同一问题可以有不同的编程方法 使用不同的方法虽然都可以实现题目的要求 但从指令长度 运行时间和可阅读性上等综合因素考虑 不同的方法就有合理和不合理 优化和繁杂之分 所以 在学习指令系统和编程时开始就要养成一个好的 合理的编程习惯 5 注意给程序进行正确的注释 这对于阅读 编写和修改程序都是非常重要的 下面就是一些注释的例子 MOVA 30H 30h AMOVA R0 R0 AMOV40H 30H 30h 40hMOVA Ri Ri A 内部传送类指令举例 试编出把30h和40h单元内容进行交换 MOVA 30H 30h AMOV30H 40H 40h 30hMOV40H A A 40h 累加器A 30H 40H 返回 2 3 2外部数据传送类指令 1 16位数传送指令 2 外部ROM的字节传送 3 外部RAM的字节传送指令 继续 1 16位数传送指令 MCS 51指令系统中唯一的一条16位数据传送类指令 MOVDPTR data16DPTR是单片机内部SFR中的两个寄存器DPH DPL组合而成 其中DPH为高八位 DPL为低八位 DPTR是一个专门用于访问外部存储器的间址寄存器 寻址能力为64K 0 65535 返回 2 从ROM中的字节传送指令 这类指令有两条 都属于变址寻址指令 MOVCA A DPTR A A DPTR MOVCA A PC PC PC 1 A A PC ROM单元地址由A和DPTR或PC内容相加获得 该指令称为 查表 指令 前者用DPTR作为基地址 使用前先将数据表的首地址送入DPTR中 累加器A的内容作为查表偏移量 两者相加得到表中数据地址并取出送A 后者是以程序计数器PC为基地址 由于PC的内容与该指令在ROM中的位置有关 并且PC的值是不能随便修改的 所以选择PC作基地址时 往往要通过累加器A进行 查表修正 举例 已知累加器A中存有0 9范围内的数 试用查表指令编写出查找出该数平方的程序 1 采用DPTR作基址寄存器 设平方表的首地址为2000h 累加器A中的内容恰好是查表的偏移量 首先将表的起始地址2000h送入DPTR中 MOVDPTR 2000H 指针赋值MOVCA A DPTR 查表得平方值送A 2000h 2009h 2008h 2007h 2006h 2005h 2004h 2003h 2002h 2001h 2 采用PC作基址寄存器 ORG1FFBH1FFBH74dataADDA data data 02h1FFDH83HMOVCA A PC PC 1FFE1FFEH80FEHSJMP 2000H00HDB0 平房表首址2001H01HDB12002H04HDB42003H09HDB92004H10HDB162005H19HDB25 2009H51HDB81ENDdata为MOVC指令首地址与表头地址之间的单元数 2000h 2009h 2008h 2007h 2006h 2005h 2004h 2003h 2002h 2001h 1FFFh 1FFEh 1FFDh 1FFCh 1FFBh 通过A进行修正 使用MOVCA A PC指令的特点 程序与数据表在ROM中的位置是可以浮动的 只要MOVC指令与表之间的距离不变 则程序可以在ROM中的任意位置上 浮动 程序具有可修改性 节省DPTR寄存器 与使用MOVCA A DPTR指令不同 使用前应当对A中的偏移量加以个 修正值 修正值的大小为 MOVC指令与表头之间的字节数 返回 设 单片机使用片外ROM 且要执行的是一条 movca a dptr指令 设a dptr 2000H PSENP2口MCS 51P0口ALE D7 D0CP CSA15 A864KROMA7 A0D0 D7 A15 A8 PC A7 A0 OP A7 A0 常数 Psen P2口 P0口 访问外部程序存储器ROM的时序 S1 S2 S6 S5 S4 S3 ALE A15 A8 DPTR A 返回前一次 74LS373 P0口输出低8位地址 P2口输出高8位地址 1 在S2P1时刻 P2口输出外部ROM的高八位地址A15 A8 P0口输出低八位地址A7 A0 这时地址是由程序计数器PC提供的ROM中的指令地址 2 在ALE的下降沿 P0口的数据 低八位地址 被锁存到74LS373中 3 在S3P2到S4P1期间 psen变低电平时 外部程序ROM被选中 ROM输出端的三态门被打开 被选中单元中的指令movca a dptr送到P0口上 且在S4P2时指令经P0口送至CPU的IR中 返回上一页 返回 4 CPU对指令译码后 在S4P2时进行常数地址计算并由P0 P2口输出 P0口输出低8位地址00H P2口输出地址高八位20H 5 在S5P2时 ALE将常数地址的低八位00H锁存 6 在S6P1时 psen 0 外部ROM被再次选中打开 按照单片机所提供的16位地址 将外部ROM中的常数经P0口在S6P2时刻送入累加器A A15 A8 PC A7 A0 OP A7 A0 常数 Psen P2口 P0口 S1 S2 S6 S5 S4 S3 ALE A15 A8 DPTR A 取外部ROM中的指令 执行指令 取常数 MOVCA A DPTR指令执行的两个步骤 3 外部RAM的字节传送指令 实现外部RAM和累加器A之间的数据传送 只能使用寄存器间址的寻址方式 在MOVX指令模式下 单片机的P0 P2口做访问外部数据的地址和数据的总线 其中 P0口做低8位地址和数据的复用总线 P2口做高8位地址总线 MOVXA Ri使用Ri寄存器间址寻址范围0 255hMOVX Ri A在硬件电路中P2口不用 MOVXA DPTR使用DPTR间址 寻址范围0 65535hMOVX DPTR A在硬件电路中 使用P0口输出低8位 P2口输出高8位外部RAM地址 外部RAM的字节传送指令举例 已知外部RAM的88H单元有一个数x 试编程将x送外部RAM的1818H单元 解 外部RAM中的数据是不能直接传送的 因此必须使用两次MOVX指令完成此操作 ORG2000HMOVR0 88H 为8位指针赋值MOVDPTR 1818H 为16位指针赋值MOVXA R0 取x到累加器AMOVX DPTR A x送RAM的1818h单元SJMP 停机END 返回 设外部RAM2000H单元中有一个数x 且DPTR中已存有该数地址2000H 则CPU执行外部ROM中的指令 MOVXA DPTR 将外RAM的x送A WR RDP2口MCS 51P1口ALE D7 D0 CP WR RDA15 A8A7 A064KRAMD0 D7 S1 S2 S6 S5 S4 S3 S1 S2 S6 S5 S4 S3 ALE Psen A15 A8 PC A15 A8 DPH A7 A0 指令 A7 A0 数据 RD P2口 P0口 选中外部RAM 读外部数据存储器RAM的指令时序 返回前一次 1 在S2P2时 ALE的第一个下降沿将P0口输出的外程序ROM的低八位地址锁存到74LS373锁存器中 2 在S3P2的Psen为低电平时 选中外ROM 并根据单片机P0 P2口输出的16位地址选中movx指令 单字节 通过P0口送至单片机内部IR中译码 经译码后产生下列的一系列操作 3 CPU将DPTR中的高8位 20H 送P2口输出 低八位 00H 经P0口输出 节在S5P1时ALE第二次下降沿时 将P0口的低八位地址锁存 4 在第二个机器周期的S1 S3中单片机输出 RD信号 低电平 选中外部RAM 并根据单片机提供的2000H这16位地址中取出数据x 5 CPU在S2 S3期间 将外部RAM2000H单元送到P0口上的数据送入累加器A中 上一页 上述过程可以分成两个指行的阶段 1 根据PC所指定的程序存储器的地址 将movx指令从片外ROM中取出 2 经译码后将DPTR提供的外数据存储器RAM中的数据地址取出数据 经P0口送累加器A 控制信号 在第一阶段CPU产生 Psen信号用来选通外部程序存储器ROM 在第二阶段CPU输出 RD信号 低电平 用来选通并读取外部数据存储器RAM的数据 注意 CPU在执行MOVX指令时的2个周期中的第2个机器周期缺少一个ALE波形 访问外部存储器指令的特点 使用MOVX或MOVC指令来访问外部存储器 此时 P0 P2作为地址和数据总线 执行MOVX指令访问RAM时 CPU产生 RD或 WR信号 因此 RD WR应当与外RAM的读 写控制端连接 执行MOVC指令访问ROM时 CPU产生 psen信号来选通外ROM 因此 此信号应当与ROM的片选连接 2 3 3堆栈操作指令 堆栈操作是一种特殊的保护数据的传送指令 堆栈 一个用来保存程序断点 数据的存储区域 在51单片机中 栈区可以使用片内RAM的任意位置 具体由指针SP来确定 系统上电时 SP 07h 1 进栈操作 PUSHdirect sp 1 sp direct sp 2 出栈操作 POPdirect sp direct sp 1 sp 堆栈操作指令举例 一 产生延时的子程序delay org0800hdelay pushpswpush00hpush01hmovr0 00hLoop1 movr1 00hLoop2 djnzr1 loop2djnzr0 loop1pop01hpop00h思考题 为什么R0 R1的poppsw内容要进栈 ret SP 堆栈操作指令举例 二 堆栈操作指令除了可以在子程序的设计中 对主程序的数据进行保护 还可以根据堆栈操作的特点完成一些特殊的操作 举例 设片内RAM的30h单元存有x 40h单元存有y 试将两个单元内容互换 push30h x进栈push40h y进栈pop30h y送30H单元pop40h x送40H单元 SP 07h 40h 30h 继续 PUSH POP指令使用的寻址方式为直接寻址 所以pusha是错误的 应当是pushacc或push0e0h 同理 pushr0也是错误的 应当为 push00h 进栈操作是堆栈向上 生长 的过程 即sp 1 出栈则相反 系统上电时 SP 07h SP的值可以根据需要进行修改 在确定SP值时要考虑对栈区对数据区的影响 以避免两者冲突 如 在程序的初始化时加一条 MOVSP 60H即将堆栈的起始位置上移到RAM的60H单元 使用PUSH POP指令要注意事项 2 3 4数据交换指令 为提供一种方便的累加器和寄存器 RAM之间的数据交换 避免了使用mov指令交换时的不便 格式 XCHa Rn a RnXCHa direct a direct XCHa Ri a Ri XCHDa Ri a3 0 Ri 3 0低四位交换举例 将R1和R2的内容交换 MOVA R1 取数据送AXCHA R0 与R0交换MOVR1 A 送回到R1 数据交换指令举例 一 举例 已知 片外RAM20h单元 内部RAM20h单元分别有数x和y 试编程互将两数相交换 movR1 20h 指针赋初值movxa R1 x axcha R1 交换a 20h y amovx R1 a y 20h 片外RAM y x 20h 20h 累加器A 1 2 3 数据交换指令举例 二 已知RAM50h单元有一个0 9范围内的数 试编程将它变成相应的ASCII码 解 0 9的ASCII码是30h 39h 两者相差30h 方法一 对50h单元的数据高四位组装一个30h movr0 50h 指针赋值mova 30h 30h Axchda r0 A3 0 r0 3 0 在A中组成ASCII码mov r0 a A中的ASCII送回50h单元 50h 00110101 A 30h 交换后A 35h 1 2 继续 2 4算逻运算和移位指令 功能 完成算术运算 逻辑运算和循环移位三大功能 特点 大多指令都要由累加器A来存放一个源操作数 并把操作结果放回累加器A中 2 4 1 算术运算指令 2 4 2 逻辑运算指令 2 4 3 移位指令 继续 2 4 1 算术运算指令 不带进位的加法指令 ADD 1 加法指令 带进位的加法指令 ADC 加1指令 INC 编程举例 2 减法指令 带进位的减法指令 SUBB 减1指令 DEC 3 十进制调整指令 DAA 4 乘法和除法指令 MULDIV 继续 加法指令 一 不带进位的加法指令 格式 ADDA Rn A Rn AADDA direct A direct AADDA Ri A Ri AADDA data A data A 注意 1 参加运算的数据都应当是8位的 结果也是8位并影响PSW 2 根据编程者的需要 8位数据可以是无符号数 0 255 也可以是有符号数 127 128 3 不论编程者使用的数据是有符号数还是无符号数 CPU都将它们视为有符号数 补码 进行运算并影响PSW 不带进位的加法指令举例 一 试分析执行下列指令后累加器A和PSW中各标志的变化 MOVA 19HCy 0 ADDA 66HAC 0OV CP CS 025A 00011001BP 1 102data 01100110B127001111111B1 若两数都是无符号数 则因Cy 0无溢出 25 102 127 2 若两个数是有符号数 则因OV 0无溢出 cy 000CPCSAC 不带进位的加法指令举例 二 试分析执行下列指令后累加器A和PSW中各标志的变化 MOVA 5AHCy 0 ADDA 6BHAC 0 OV CP CS 190A 01011010BP 0 107data 01101011B197011000101BCPCSAC1 若两数是无符号数 因Cy 0无溢出 90 107 1972 若两数是有符号数 因OV 1 故有溢出 两个正数相加后变为负数 很明显结果是不正确的 加法指令 二 带进位的加法指令 格式 ADDCA Rn A Rn Cy AADDCA direct A direct Cy AADDCA Ri A Ri Cy AADDCA data A data Cy A 注意 这里的Cy是指令执行前的Cy 对PSW的影响同ADD指令 加1指令 修改指针专用 格式 INCA 累加器A加一INCRn Rn 1 RnINCdirect 内存单元数据加一INC Ri 内存单元数据加一INCDPTR dptr 1 dptr 注意 1 除了第一条对PSW的P有影响外 其余对PSW均无影响 2 由于上面的原因 INC指令不能作为一般的数据算术运算使用 为什么 而常用于修改数据指针等控制 循环语句中使用 返回本节目录 编程举例 已知M1 M2单元中存有两个16位无符号数X1 X2 低位在前 试写出X1 X2 并将结果放入M1 M1 1单元 低8位在M1单元 设两数之和不会超过16位 65535 M1 M1 1 M2 M2 1 返回本节目录 解 MOVR0 M1 x1指针赋初值MOVR1 M2 x2指针赋初值MOVA R0 取x1低8位送AADDA R1 x1与x2低8位相加 影响Cy位 MOV R0 a 低8位和送m1单元INCR0INCR1 修改指针MOVA R0 取x1的高8位送AADDCA R1 x1与x2的高8位和Cy相加MOV R0 A 结果送M1 1单元 减法指令 带进位的减法指令 在MCS 51单片机的指令系统中 只有 带进位的减法SUBB 减一DEC两种指令 1减法指令 格式 SUBBA Rn A Rn Cy ASUBBA direct A direct Cy ASUBBA Ri A Ri Cy ASUBBA data A data Cy A 使用减法指令要注意的几个问题 1 在单片机内部 减法指令实际上是采用补码的加法实现的 但要判定减法结果编程者可以按二进制减法法则验证 2 无论相减两数是无符号数还是有符号数 减法操作总是按有符号数来处理 影响PSW中相关的标志 详见举例 3 在MCS 51的指令系统中没有不带Cy的减法 所以在使用SUBB指令前必须使用一条清除Cy的指令 CLRC 减法指令应用举例 试分析执行下列指令后累加器A和PSW中各标志的变化 CLRCMOVA 52H01010010B 82SUBBA 0B4H10110100B 7682a 01010010 76data 10110100158110011110 62H 98手工计算CPCSAC101 分析 CPU的计算得 98 很明显答案是错误的 原因是OV 1 既产生了溢出 所以 对于符号数的减法在运算后一定要检测OV 1 返回本节目录 减一指令 修改指针专用 格式 DECA 累加器A减一DECRn Rn 1 RnDECdirect 内存单元数据减一DEC Ri 内存单元数据减一 注意 1 除了第一条对PSW的P有影响外 其余对PSW均无影响 2 由于上面的原因 DEC指令一般不作为数据算术运算使用 因为不能对PSW的OV等位产生影响 它主要用于修改数据指针在循环语句中使用 返回本节目录 十进制调整指令 在CPU进行BCD码运算时 必须在运算后进行十进制调整 这是因为 CPU没有专用的BCD码加 减法指令 只能使用二进制加法指令再通过调整实现BCD码的运算 格式 DAA 若AC 1或A3 0 9 则A 06h A 若Cy 1或A7 4 9 则A 60h A 注意 1 DAA指令必须紧跟在加法指令之后 2 DAA指令只适用于加法指令的调整 十进制调整指令应用举例 一 BCD加法运算 试写出完成85 59的BCD码的加法程序 MOVA 85HADDA 59HDAASJMP 85a 10000101B 59dtat 01011001低4位 9 所以加06h 00000110B11100100B高4位 9 所以加60h01100000B101000100B结果为144h 1包含在Cy 注意 144H是用16进制数来表示十进制 既BCD码 十进制调整指令应用举例 二 BCD减法运算 由于DAA指令只能对BCD码的加法进行调整 所以遇到BCD码的加法时就要将其减法变为加法运算 然后再使用DAA指令进行调整 减法变加法就是使用BCD码的补码运算法则 将被减数 减数变为被减数 减数的补码 减数的补码 BCD码的模 减数其中BCD码的模为100H 99H 01H 9AH 已知 在M1 M2中分别存有被减数91和减数36 试编程求19 36并将结果存入M3单元 解 1 算法 91 36 91 100 36 91 9A 36 2 编程 CLRC 清除CyMOVA 9AH BCD码的模100送ASUBBA M2 计算减数的补码 结果在A中 ADDA M1 被减数 减数的补码 结果在A中 DAA 十进制调整MOVM3 A 结果送M3单元CLRC 清除进位位 不要Cy 返回本节目录 乘法和除法指令 这是MCS 51单片机唯一的一类单字节4周期指令 它相当于4条加法指令的运行时间 格式 MULAB a b ba b存高8位 a存低8位 DIVAB a b a b a存商 b存余数 注意 指令对标志的影响 1 在乘法指令中对PS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教部编版四年级语文下册《习作:我的动物朋友》示范公开课教学课件
- 区域环境专家年终总结
- 上海市奉贤区南桥镇十学校2026届九上化学期中学业水平测试试题含解析
- 黑龙江省哈尔滨双城区六校联考2026届英语九年级第一学期期末调研模拟试题含解析
- 云南省昆明市四校联考2026届九年级化学第一学期期中统考模拟试题含解析
- 2026届广东省深圳市龙岗区石芽岭学校九年级英语第一学期期末预测试题含解析
- 河北省保定市莲池区冀英学校2026届九上化学期中综合测试模拟试题含解析
- 2026届黑龙江省齐齐哈尔市昂溪区化学九上期中预测试题含解析
- 农村蔬菜基地合作协议7篇
- 禹阳离婚协议中子女抚养费及教育费用分担协议
- 【公开课】种子植物+第2课时课件-2024-2025学年人教版生物七年级上册
- 培训企业台账管理制度
- 职业院校模块化课程体系构建与实践研究
- 2024年贵州贵州贵安发展集团有限公司招聘笔试真题
- 人教部编版四年级上册语文第1单元(看拼音写词语)
- T/CAQI 70-2019管道直饮水系统安装验收要求
- 房屋在别人名下协议书
- 江苏省2025年中职职教高考文化统考数学试题
- 节能锅炉售卖合同协议
- 广东市政工程施工安全管理资料统一用表 上册
- 智能型大型变压器企业数字化转型与智慧升级战略研究报告
评论
0/150
提交评论