1、第三章80C51单片机指令系统 心不可不虚 虚则义理来居 80C51的指令系统 共有111条指令 按其功能可分为五大类 数据传送类指令 28条 算术运算类指令 24条 逻辑运算类指令 25条 控制转移类指令 17条 布尔操作 位 类指令 17条 80C51单片机指令分类 本讲教学内容 数据传送类指令 心不可不虚 虚则义理来居 Rnn 0 7 表示当前寄存器组的8个通用寄存器R0 R7中的一个 Rii 0 l 可用作间接寻址的寄存器 只能是R0 R1两个寄存器中的一个 direct内部的8位地址 既可以指片内RAM的低128个单元地址 也可以指特殊功能寄存器的地址或符号名称 因此 direct表
2、示直接寻址方式 data指令中所含的8位立即数 data16指令中所含的16位立即数 指令系统中使用符号说明 心不可不虚 虚则义理来居 rel相对转移指令中的偏移量 为8位带符号数 为SJMP和所有条件转移指令所用 转移范围为相对于下一条指令笫一字节地址的 128 127 DPTR数据指针 A累加器 BB寄存器 C进位标志位 是布尔处理机中的累加器 也称之为累加位 间址寄存器的前缀标志 某寄存器或某单元的内容 由 寻址的单元中的内容 箭头左边的内容被箭头右边的内容所取代 心不可不虚 虚则义理来居 数据传送类指令 数据传送指令按功能又可分为 内部RAM数据传送指令 外部数据存储器读写指令 程序存
3、储器读指令 数据交换指令 堆栈操作指令 助记符有MOV MOVX MOVC XCH XCHD SWAP PUSH POP等八种 心不可不虚 虚则义理来居 数据传送指令的一般操作是把源操作数传送到目的操作数 属于拷贝性质 而不是搬移性质 这类传送指令的格式为 MOV 目的操作数 源操作数 数据传送类指令 心不可不虚 虚则义理来居 主要用于80C51内部RAM单元 累加器 通用寄存器和专用寄存器之间的数据传送 1 8位立即数传送指令MOVA data MOVdirect data direct dataMOV Ri data MOVRn data 内部RAM数据传送指令 心不可不虚 虚则义理来居
4、2 16位数据传送指令MOVDPTR data16 DPTR data16这是80C51中唯一的一条16位指令 此指令把16位常数装入数据指针DPTR 即数据高8位送入DPH寄存器 数据低8位送入DPL寄存器 例 执行指令MOVDPTR 1234H执行结果 DPH 12H DPL 34H 心不可不虚 虚则义理来居 3 内部RAM单元之间的数据传送指令MOVdirect Rn direct Rn MOVdirect2 direct1 direct direct MOVdirect Ri direct Ri MOV Ri direct Ri direct MOVRn direct Rn direc
5、t 心不可不虚 虚则义理来居 4 通过累加器A的数据出传送指令MOVA Rn A Rn MOVA direct A direct MOVA Ri A Ri MOVRn A Rn A MOVdirect A direct A MOV Ri A Ri A 心不可不虚 虚则义理来居 例 请编程将片内RAM30H单元的内容传送至片内RAM50H单元 心不可不虚 虚则义理来居 这组的功能是实现累加器A与外部数据存储器之间传送一个字节数据的指令 只能通过累加器A采用间接寻址方式访问外部数据存储器 有Ri和DPTR两种间接寻址方式 采用R0或R1作间址寄存器时 可寻址256个外部数据存储器单元 采用16位D
6、PTR作间址可寻址整个64KB片外数据存贮空间 低8位 DPL 由P0口进行分时使用 高8位 DPH 由P2口输出 外部数据的传送指令组 心不可不虚 虚则义理来居 MOVXA RiMOVXA DPTRMOVX Ri AMOVX DPTR A 外部数据的传送指令组 心不可不虚 虚则义理来居 例 请编程将片外RAM30H单元的内容传送给片外RAM50H单元 执行指令 MOVR1 30HMOVR0 50HMOVXA R1MOVX R0 A 心不可不虚 虚则义理来居 例 某应用系统外扩了8K字节RAM 要求把内部RAM的20H单元内容发送到外部RAM的800H单元中 执行指令 MOVDPTR 800H
7、 外部数据存储器地址指针MOVR0 20H 内部数据存储器地址指针MOVA R0 取内部数据存储器20H单元内容MOVX DPTR A 送外部数据存储器800H单元 心不可不虚 虚则义理来居 例 某应用系统外扩了8K字节RAM 要求把内部RAM的20H 2FH单元内容发送到外部RAM的800H 80FH单元中 执行指令 MOVDPTR 800HMOVR0 20HMOVR7 10HAGAIN MOVA R0MOVX DPTR AINCR0INCDPTRDJNZR7 AGAIN 心不可不虚 虚则义理来居 MOVCA A PCMOVCA A DPTR这两条指令的功能均是从程序存储器中读取数据 如表格
8、 常数等 执行过程相同 其差别是基址不同 因此适用范围也不同 累加器A为变址寄存器 而PC DPTR为基址寄存器 DPTR为基址寄存器时 允许数表存放在程序存储器的任意单元 称为远程查表 PC为基址寄存器时 数表只能放在该指令单元往下的256个单元中 称为近程查表 编程时需计算A值与数表首址的偏移量 程序存储器数据传送指令 或称查表指令 心不可不虚 虚则义理来居 例3 求平方数 远程查表法 MOVDPTR TABLE 指向表首址MOVCA A DPTR 查表得到平方数MOV20H A 存平方数HERE SJMPHERETABLE DB00H 01H 04H 09H 平方表02 92DB16H
9、25H 36HDB49H 64H 81H 心不可不虚 虚则义理来居 例4 求平方数 近程查表 ADDA rel 修正偏移量MOVCA A PC 查表得到平方数MOV20H A 存平方数HERE SJMPHERETABLE DB00H 01H 04H 09H 16H 平方表02 92DB25H 36H 49H 64H 81H注 rel TABLE 查表指令地址 1 MOVC指令为单字节 心不可不虚 虚则义理来居 1 字节交换指令XCH组XCHA Rn A Rn direct RiXCHA directXCHA Ri这类指令的功能是将累加器A与源操作数的字节内容互换 例 设 R0 30H A 3F
10、H 片内 30H BBH 执行指令XCHA R0执行结果 A BBH 30H 3FH 数据交换指令 心不可不虚 虚则义理来居 2 半字节交换指令组XCHDA Ri将Ri间接寻址单元的低4位内容与累加器A的低4位内容互换 而它们的高4位内容均不变 例 设 R0 20H A 36H 00110110B 内部RAM中 20H 75H 0111010lB 执行指令 XCHDA R0结果为 20H 01110110B 76H A 00110101B 35H 心不可不虚 虚则义理来居 3 累加器A的高低半字节交换指令SWAPA该指令将累加器A的高 低半字节交换 该操作也可看作是四位循环指令 见图3 8 例
11、 设 A 36H 00110110B 执行SWAPA指令 执行结果为 A 63H 01100011B 由于十六进制数或BCD码都是以四位二进制数表示 因此XCHD和SWAP指令主要用于实现十六进制数或BCD码的数位交换 心不可不虚 虚则义理来居 堆栈操作指令组 PUSHdirectPOPdirect入栈 PUSH 操作指令又称 压栈 操作 指令执行后栈指针 SP 1指向栈顶上一个空单元 将直接地址direct单元内容送入SP所指示的堆栈单元 此操作不影响标志位 出栈 POP 操作指令 又称 弹出 操作 由栈指针 SP 所寻址的片内RAM中栈顶的内容 SP 送入直接寻址单元direct中 然后执
12、行 SP 一1并送入SP 此操作不影响标志位 心不可不虚 虚则义理来居 30H 31H SP SP SP 1 SP SP 31H SP 30H direct PUSHdirect 心不可不虚 虚则义理来居 30H 31H SP SP SP 1 SP SP 31H SP 30H direct POPdirect 心不可不虚 虚则义理来居 例 中断响应时 SP 30H DPTR的内容为0123H 执行入栈指令其结果怎样 PUSHDPL 低8位数据指针寄存器DPL内容入栈PUSHDPH 高8位数据指针寄存器DPH内容入栈 31H 32H SP 执行结果 第一条指令 SP 1 31H SP DPL 2
13、3H 31H 第二条指令 SP 1 32H SP DPH 01H 32H 所以片内RAM中 31H 23H 32H 01H SP 32H 心不可不虚 虚则义理来居 例 设 SP 32H 片内RAM的30H 32H单元中的内容分别为20H 23H 01H 执行下列指令的结果怎样 POPDPH SP 32H 01H DPH SP 1 32H 1 31H SPPOPDPL SP 31H 23H DPL SP 1 31H 1 30H SPPOPSP SP 1 2FH SP SP 30H 20H SP第三条指令为特殊情况 先执行 SP 1 2FH 后装入由栈顶退出的值 所以执行后 SP 20H 心不可不
14、虚 虚则义理来居 例5 检查传送结果已知内部RAM 10H 00H 30H 40H 40H 10H P1口为11001010B 分析指令执行后各单元内容 MOVR0 30HMOVA R0MOVR1 AMOVB R1MOV R1 P1MOVP2 P1MOV10H 20H执行结果 10H 20H 30H 40H 40H CAH P1 P2 CAH A 40H B 10H R0 30H R1 40H 心不可不虚 虚则义理来居 例6 将4位BCD码倒序 设内部数据存储器2AH 2BH单元连续存放有4位BCD码数符 试编一程序把4位BCD码数符倒序排列 2AH 2BH 2AH 2BH a3a2a1a0a0a1a2a3 心不可不虚 虚则义理来居 MOVR0 2AHMOVR1 2BHMOVA R0 2AH单元内容送ASWAPA A的高4位与低4位交换 a2a3 MOV R0 AMOVA R1 2BH单元内容送ASWAPA A的高4位与低4位交换 a0a1 XCHA R0 2AH与2BH单元内容交换MOV R1 AHERE SJMPHERE 心不可不虚 虚则义理来居 图3 7数据传送指令示意图 心不可不虚 虚则义理来居 图3 8半字节交换指令示意图 心不可不虚 虚则义理来居 图3 10CJNE指令执行流程图