keil 添加单片机型号中53h加0fch等于多少

2011年4月_单片机原理及应用试题_2358_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2011年4月_单片机原理及应用试题_2358
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢单片机的指令
第十四课 单片机的指令
控制转移类指令
控制转移类指令共有
分为无条件转移指令
条件转移指令和返回及调用指令三大类
下 面我们分别加以学习
无条件转移类指令
1无条件绝对转移指令
2无条件长转移指令
3无条件相对转移指令
在讲解上面这三条指令之前先来认识一下三个符号
其中 add11 和 add16 表 示外部 ROM 的 16 位和 11 位地址
前面我们已经讲过
单片机的外部 ROM 可以扩展到 64K
add16 就表
示 64K 程序存储器的任何地址
LJMP 指令可以跳转到程序的任何地方
而 add11 则表示下 一条指令的 2K 页面
SJMP 指令只能跳转到程序的 2K 范围之内
rel 表示 8 位的偏移量
其 范围是下一条指令第一字节的前 128 到后 127 个字节(即-128-+127)
介绍完了三个符号
再看上面的 三条转移类指令
如果要仔细分析的话
它们之间其实区别很大
但在初学时
我们可以不理会这么多
统统把它们理解成
*JMP 标号比如 SJMP
就是跳转到有 LOOP 标号处
所有用 SJMP
或 AJMP 的地方都可以用 LJMP 来替代
因此在初学时
需要跳转时可以全不采用 LJMP 代替
下面再来 看第 4 条跳转指令
4无条件间接转移指令
这条指令的用途也是跳转
跳转到什么地方去呢
这可不能由标号简单地决定了
让我们从一个 实际的例子入手吧
将 TAB 所代表的地址送入 DPTR
A 中的值乘 2
详见下面的说明
应用背景介绍
在单片机开发中
经常要用到键盘
见下面的 9 个按键的键盘图
我们的要求是
当按下功能键 A
G 时去完成不同的功能
这用程序设计语言来表达的话
按下不同的键去执 行不同的程序段
以完成不同的功能
怎么样来实现这个功能呢
前面的程序读入的是按键的值
A'键后获得的键值是
B'键后获得的 值是
然后根据不同的值进行跳转
就转到 S1 处执行
到底如何来实现这一功能呢
先从程序的下面看起
是若干条 AJMP 语句
这若干条 AJMP 语句最后在存储器中是这样存放的
见 图也就是每个 AJMP 语句都占用了两个存储器的空间
并且是连续存放的
而 AJMP S1 存放的地址是
----------------
到底 TAB 等于多少
我们不需要知道
把它留给汇编程序来算好了
下面我们来看这段程序的执行过程
第 1 条 MOV
#TAB 执行完了之后
DPTR 中的值就是 TAB
第 2 条是 MOV
我们假设 R0 是由按键处理程序获得的键值
R0 中的值是
R0 中的值是
现在我们假设按下的是
则执行完第 2 条指令
A 中的值就是
1并且按照我们的分析
后应当执行 S2 这段程序
让我们来看一看是 否是这样呢
第 4 条指令是将 A 中的值乘
2即执行完第 4 条指令后 A 中的值是
就执行 JMP
@A+DPTR 了
现在 DPTR 中的值是
TAB而 A+DPTR 后就是
执行完这条 程序后
将会跳到 TAB+2 这个地址处继续执行
看一看在 TAB+2 这个地址里面放的是什么
就是 AJMP S2
马上又执行 AJMP
S2 这条指令
程序将跳到 S2 处往下执行
这与我们的要求相符合
请大家自行分析按下键
之后的情况
这样我们用
这条指令就实现了按下一个键跳转到相应程序段去执行的这样一个要
再提一个问题
为什么取得键值后要乘
如果例程下面的所有指令换成
LJMP S1,LJMP
这段程序还能正确地执行吗
应该怎么改
条件转移类指令 条件转移类指令就是在满足一定的条件后进行相对转移
累加器为 0 转移指令
累加器非 0 转移指令
条指令的功能是
否则顺序执行执行本指令的下一条指令转移到 什么地方去呢
如果按照传统的方法
就要算偏移量
好在现在我们可以借助于机器汇编了
因此这条指令我们可以这样理解
即转移到标号处
下面举一个例子来加以说明
在执行上面这段程序前如果 R0 中的值是
就转移到 L1 标号处执行
因此最终的执行结 果是 R1 中的值为 0FFH
而如果 R0 中的值不等于
0则顺序执行
也就是执行
----------------
最终的执行结果是 R1 中的值等于
0把这个例子中的 JZ 改成 JNZ 试试吧
看看程序执行的结果是什 么 这里注意一点
#0FFH 这条指令的位置不能大于-128 到+127
我好象刚才
比较转移指令
第 1 条指令的功能是将 A 中的值和立即数 data 比较
如果两者相等
就顺序执行
如 果不相等
我们可以将 rel 理解成标号
#data,标号
这样利用这条 指令
我们就可以判断两数是否相等
这在很多场合是非常有用的
但有时还想知道两数比较之后哪个
本条指令也具有这样的功能
如果两数不相等
则 CPU 还会反映出哪个数大
这是用 CY进位位来实现的
如果前面的数A 中的大
因此在程序转移后 再次利用 CY 就可判断出 A 中的数比 data 大还是小了
上面的程序中有一条指令我们还没学过
这条指令的原型是 JC
rel,作用和上面的 JZ 类
但是它是判 CY 是
则转移到 JC 后面的标号处执行
则顺序执行
分析一下上面的程序
则顺序执行
如果A不等于 10H
处继续执行
再次进行判断
将顺序执行
即执行 MOV
指令而如果A&10H
则将转移到 L2 处指行
即执行 MOV
#0FFH 指令因此最终结果是
本程序执行前
如果R0=10H
如果R0&10H
如果R0&10H
弄懂了这条指令
其它的几条就类似了
第 2 条是把 A 当中的值和直接地址中的值比较
第 3 条 则是将直接地址中的值和立即数比较
第 4 条是将间址寻址得到的数和立即数比较
这里就不解释了
请大家自行分析一下
下面给出几个相应的例子
把 A 中的值和 10H 中的值比较注意和上题的区别
把 10H 中的值和 35H 中的值比较
把 R0 中的值作为地址
从此地址中取数并和 35H 比较
循环转移指令
条指令在前面的实验中已经有详细的分析
这里就不解释了
其它的也一样
调用及返回指令
在前面的实验中
我们已用过了子程序
只是我们并没有明确地介绍子程序是干什么用的
为什么 要用子程序呢
我们数学老师布置了 10 道算术题
每一道题中都包含一个
----------------
我们可以有两种选择
第一种选择
每做一道题
都把这个算式算一遍
第二种选择
我 们可以先把这个结果算出来也就是 21放在一边
然后要用到这个算式时就将 21 代进去
方法哪种更好呢
那就不必多言了吧
设计程序时也是这样
有时候一个功能会在程序的不同地方反复
我们就可以把这个功能设计成一段程序
每次需要用到这个功能时就
这就是子程 序的用途所在
当然实际上子程序的作用还远不止这些
后面我们还会更详细地讲解子程序的用法
主程序调用了子程序
子程序执行完之后必须再返回到主程序继续执行
一去不回头
那么回到什么地方呢
就是回到调用子程序的下面一条指令处继续执行
大家可以回去看一下前面的实
是不是这样做的
上面两条指令都是在主程序中调用子程序
两者的区别大家结合前面的知识可以自己分析一下
同样作为初学者
我们可以不必加以区分
也就是说可以用 LCALL 指令代替 ACALL
子程序返回
RET 用于子程序返回
RETI 用于中断程序返回
这是有区别的
可不能用错了
至于什么是中断
我们讲到中断时再来解释
如何从子程序返回呢
就是执行 RET 指令
看一下前面的实验
空操作指令
所谓空操作
就是什么事也不干
停一个机器周期
一般用作短时间的延时
不要以为它没用
其实作用还是不小的
等你入门了就知道了
本课的内容是控制转移类指令
这些指令在单片机中起着非常重要的作用
请大家务必搞清楚它 们的作用和功能
第 14 课习题
控制转移类指令分为几大类
SJMP 的区别是什么
什么是子程序
用实验仪编一段程序
要求按一个键盘时 LED1 闪一秒
按另一个按键后 LED1 闪 0.5 秒
----------------
第十五课 单片机的指令
位及位操作指令
位操作指令也叫布尔操作指令
什么是布尔指令
它有什么用呢
这个问题稍微有点复杂
我只 能给大家简单的介绍一下
在 MCS-51 系列单片机中
有一个功能很强的布尔处理器
它实际上是一个
独立的一位处理器
它有一套专门处理布尔变量布尔变量也叫开关变量
就是以位作为单位的运算和 操作的指令子集
以完成对布尔变量的传送
控制等操作
这个子集的指令就是布尔操
那么为什么要有这样的一套的指令系统
它是如何操作的呢
大家接着往下看
位寻址的概念
为什么要位寻址呢
单片机不是可以有多种寻址方式吗
大家是否还记得
我们第十三课做的那 个流水灯实验
也就是对一盏灯的亮和灭进行控制
而之前我们学的指令却全都
字节的移动
用字节来处理一些数学问题比 如控制空调的温度
电视机的音量等等非常直观
可以直接用数值来表示
可是如果用它来控制一个
开关的打开或者合上
一个灯的亮或者灭
就有些不直接了
比如我们前面课上的那个流水灯的实验
我们把数值送往 P1 口之后并不能马上知道是哪个 LED 灭了
而是要化成二进制后才能知道
在工业控 制中有很多场合需要处理这类单个的开关输出
比如一个继电器的吸合或者释放
一个指示灯的亮或者
用字节来处理就显得有些麻烦了
所以在 51 系列单片机中就特意引入了一个位处理机制
那么位 处理器有多少地址空间
哪些特殊功能寄存器可以直接进行位寻址呢
可位寻址的特殊功能寄存器
在 89C51 单片机中
内部 RAM 的范围是 00H-7FH 之间
其中可位寻址的低 128 位处于内部 RAM 的
20H-2FH 字节单元
其位地址从 00H-7FH
看下面的表
在物理实体上它们与原来的以字节寻址的 RAM 及端口是完全一样的
换句话说这些 RAM 单元及端
口都可以有两种用法
比如用 28H.5 和 45H 是一样的
从 80H 单元开始除了程序计数器 PC 和 4 个工作寄存器区外
每 8 个字节还安排了 21
个特殊功能寄存器89C52 有 26 个这些 SFR 都有一个共同的特点
就是其字节地址均可被 8 整除
大家回到前面看一下第九课的表格
这些 SFR 都是具有位寻址功能的
也就是说这些 RAM 单元的每一个 位都可以直接用这个地址来对其直接进行操作
了解了位操作的原理
再来看位操作的指令
----------------
位操作指令
1位传送指令
这两条指令的功能是实现进位位和其它位地址之间的数据传递这里 bit 就是位的意 思例如
MOV P1.0,CY
将 CY 中的状态送到 P1.0 引脚上去如果是做算术运算
我们就可以通过观
察 P1.0 端口知道现在 CY 是多少了再如
将 P1.0 的状态送给 CY
2位清零指令
第 1 条指令使 CY=0
第 2 条指令使指定的位地址等于
3位置 1 指令
第 1 条使 CY=1
第 2 条使指定的位地址等于
使 P1.0 为
第 1 条使 CY 等于原来的相反的值
1第 2 条使 指定位的值等于原来相反的值
以我们做过的实验为例
如果原来灯是亮的
则执行本指令后灯就灭了
反之就是灯亮
第 1 条 CY 位与指定的位地址的值相
与结果送回 CY
第 2 条先将指定的位地址中 的值取出后取反
再和 CY 相
与结果送回 CY
指定的位地址中的值本身并不发生变
执行本指令前
灯灭则执行完本指令后 CY=0
而 P1.0 仍等于
1可用下列程序进行验证
将做完的结果送 P1.1,结果应当是 P1.1 上的灯亮
而 P1.0 上的灯还是
这两条指令的功能大家自行分析吧
然后对照上面的例程
自己编一个验证程序
看看自己想得 对不对
7判 CY 条件转移指令
----------------
这两条指令叫做判 CY 转移指令
第 1 条指令的功能是如果 CY 等于
如果 不等于
就顺序执行
那么转移到什么地方去呢
我们可以这样理解
即如果等于
就转到标号处执行
第 2 条指令则和第 1 条指令正好相反
即如果 CY=0 就转移
转移到什么地方
我们同样可以这样理解
8判位变量转移指令
第 1 条指令是如果指定的 bit 位中的值是
否则就顺序执行
转移到什 么地方
同样我们可以这样理解
第 2 条指令请大家自行分析一下
9判位变量转移并将该位清零
这条指令同 JB
rel 的区别在于判
转移的同时清除该位
为什么要这样做
以后我们会讲到
接下来我们做一个这方面的实验
位操作指令实验
0000H LJMP
P3.4,L2P3.4 上接有一只按键
P3.5,L3P3.5 上接有一只按键
P1,#00H LJMP
P1,#0FFH LJMP
把上面的程序下载到实验板上
看看有什么现象
按下接在 P3.4 上的按键
P1 口的灯全亮
松开或再按
灯并不熄灭
然后按下接在 P3.5 上的按键
灯就全灭了
这不就是工业 控制中经常用到的启动
停止功能吗
怎么做到的呢
将 0FFH 送入 P3 口
的引线都处于高电平
然后执行 L1
如果 P3.4 是高电平键没有按下则顺序执行 JNB
P3.5,L3 语
如果 P3.5 是高电平键没有按下则顺序执行 LJMP
这样就不停地检测 P3.4 和
如果有一次 P3.4 上的按键按下去了
则转移到 L2执行 MOV
#00H使灯全亮
直到检测到 P3.5 为
0就转去 L3执行 MOV
#0FFH使灯全灭
如此不断地循环就可以了
这里提一个问题
我们这个实验中控制的是一个字节既整个 P1 口如何 来实现一位比如 P1.0的控制呢
其实很简单
只要把程序改一下就可以了
0000H LJMP
30H START:MOV
----------------
P3.4,L2P3.4 上接有一只按键
P3.5,L3P3.5 上接有一只按键
P1.0亮 LED1
P1.0暗 LED1
尽管实际的程序还要考虑按键的去抖动问题
但程序的基本结构和流程是实用的
这样的程序就 能完成我们对工业控制中一个继电器的控制目的
如果现在让您用单片机控制一台电机的正反 转应该没有问题了吧
最后提个问题
能不能把本程序改用 JB 指令来写
如果行的话
该怎 么写呢
既然讲到了位操作指令
就一定要讲讲位操作指令的写法
在很多的程序中
常常这样写程序
以 PSW.7 为例
大家还记得 PSW 是什么
对了是程序状态字寄 存器
那么 PSW.7 是什么意思呢
其实说穿了很简单就是把 PSW 的第 7 位清零
第 7 位是什么
也太没记性了
这样一来 CLR
20H.02 也应该懂了吧
这一课我们讲述了位操作指令的编程方法
事实上正是由于单片机有了位操作机制
才使得其编程 变得十分的简单和方便
希望大家把这部分的内容搞清楚
到本课为止
单片机的指令已经全部讲完
也许有些您已经记住了
而有些可能还记不住
或者说 还不会使用
我们以后还会在具体的实验中再来讲解它们
下一课我将向大家讲解单片机程序 的设计方法
这可是蛮重要的哦
第 15 课习题
位寻址与字节寻址的区别在哪里
单片机中哪些 RAM 和 SFR 是可以位寻址的
写一段程序
使两个 LED 灯交替地亮或灭
类似于工业控制中的正反转功能
----------------
版权所有: 2007
Email: qq: 上传我的文档
 下载
 收藏
粉丝量:15
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
单片机练习题答案
下载积分:1000
内容提示:单片机练习题答案
文档格式:DOC|
浏览次数:21|
上传日期: 14:05:05|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
单片机练习题答案
关注微信公众号单片机试题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机试题
&&主要是填空、选择、判断、程序阅读,后面大题目比较简单对于基础比较差的同学很适用,答案会在本人另外一篇文档里,欢迎下载
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢当前位置: >>
第3章 80C51单片机指令系统
单片机原理与应用Principle & Application of MCU第3章 80C51单片机指令系统郭淑艳 QQ 生命科学大楼6-3-17南方医科大学 生物医学工程学院 2012.3 教学内容和要求?教学内容? ?80C51单片机指令寻址方式 按功能分类介绍80C51单片机指令 掌握数据传送类指令、算术运算类指令、逻辑运算及 移位类指令、控制转移类指令和位操作类指令等。 熟悉80C51单片机指令寻址方式。 了解80C51单片机指令的字节数、指令周期、对于标志 位的影响。?教学要求?? ? 指令和指令系统?指令是人与计算机进行交流的语言,它规定了计 算机的基本操作,一条指令对应一项基本操作。单片机所能执行的指令的集合组成了它的指令系?统,由计算机生产厂商定义,不同系列单片机的指令系统不尽相同,无法移植。?其差异多表现在指令的二进制代码、指令助记符、指令功能、指令条数和指令长度等。 80C51单片机汇编语言指令的格式?由四部分组成:[标号:] 操作码 [操作数1,] [操作数2,] [操作数3] [;注释] LOOP: MOV A, R0 ;将R0的内容送到累加器A中[]中的内容不是必需的, 指令格式的顺序是不能更改的。 标号?? ???对指令做标记,便于编程时找到该条指令,例如 分支程序和循环程序的跳转、子程序调用都需要 用到标号,在调试中也方便查找和修改。 等于指令在存储空间的实际地址,具有唯一性。 标号必须以字母开头,后跟1-8个数字、字母、下 划线等,以冒号“:”结尾。 不能与系统保留字(指令助记符、汇编伪指令、 寄存器名等)相同。 在其它指令中可把标号作为操作数进行引用。 【例】下面哪些符号是合法的标号?? ? ? ? ? ?(1)ABB (2)LOOP (3)A+B (4)123 (5)a@b (6)y_ou? ? ? ? ? ?(7)_you (8)you (9)mov (10)mov1 (11)da (12)add 操作码? ?用于规定指令进行什么操作用英文缩写表示,如加法ADD、减法SUBB、 传送MOV等 操作码与操作数之间用空格分隔,操作数 与操作数之间用“,”隔开 在指令中不能缺少操作码 操作码是给定的,不能自创??? 注释??? ?对语句或程序简要说明,帮助阅读、理解 源程序 该部分内容不会被编译成为目标代码,不 影响程序的执行。 可有可无,不是必备的。 以分号“;”开始,多行注释时每行都要 有“;”。 【例】根据指令的格式要求,说出 下面哪些指令是合乎语法的???? ? ? ? ?(1)L1:MOV SP,#30H (2)CJNE A,#5,NEXT (3)JMP:L1 (4)THIS IS:MOV ACC,B (5);THIS IS MOV ACC,B (6)ADD:SP,C,L (7)ADD A,#12H合乎语法的有:(1)(2)(5)(7) 80C51单片机指令寻址方式? ?操作数是指令操作的对象,寻找操作数的 方法称为指令寻址方式。 80C51单片机指令系统共有7种寻址方式。立即寻址方式 ? 寄存器寻址方式 ? 直接寻址方式 ? 寄存器间接寻址方式 ? 变址寻址方式 ? 相对寻址方式 ? 位寻址方式? 立即寻址方式???指令的操作数直接在指令中给出,称为立 即数,“#”前缀。#data #data16 8位立即寻址 MOV A,#20H ;(A)←20H 16位立即寻址 MOV DPTR,#3456H ;(DPH)←34H?仅一条;(DPL)←56H?立即数可以多种进制表达?十六进制后缀H、二进制后缀B、十进制带后缀 D或省略。 MOV A,#0BH MOV A,#1011BMOV A,#11D MOV A,#11 寄存器寻址方式?操作数在寄存器中,以符号名称来表示寄 存器,主要对象是通用寄存器R0-R7。INC R3 ;(R3)←(R3)+1 直接寻址方式?操作数直接以存储单元地址的形式给出。?注意与立即寻址方式的区别。MOV A,70H;(A)←(70H)ROM 寄存器间接寻址方式?寄存器中存放的是操作数的地址,而不是 操作数本身,即操作数是通过寄存器间接 得到的。MOV A,@R0 ;(A)←((R0))与MOV A,R0的区分 寄存器间接寻址范围?采用@Ri(@R0、@R1)? ?MOV A,@R0;MOV R0,#20H MOV A,@R0内部RAM低128单元 对特殊功能寄存器不能使用!MOV R0,#80H?采用@DPTR、 @R0、@R1?MOV A,@R0外部RAM 64KB?堆栈操作指令?MOVX A,@DPTR ;(A)←((DPTR)) MOVX @R0,A ;((R0))←(A) ,P2作为高位地址SP 用@Ri间接寻址方式的传送指令MOVX A,@Ri MOVX @Ri,A ;(A)←((P2)(Ri)) ;((P2)(Ri))←(A)((P2)(Ri))表示以(P2)为高8位地址,以(Ri) 为低8位地址的片外数据存储器单元。 (P2为MCS-51单片机的P2口,其第二功能为 传送地址的高8位。) 变址寻址方式?以程序计数器PC或数据指示器DPTR中的内 容为基地址,加上累加器A(变址寄存器) 中的内容作为操作数的地址。MOVC A,@A+DPTR ;(A)←((A)+(DPTR)) ?!变址寻址方式只能对程序存储器ROM进行 寻址.MOVC A,@A+PC JMP @A+DPTR ;(A)←((A)+(PC)) 相对寻址方式?目的地址=转移指令地址+转移指令字节数 +rel?通常采用标号:JMP LOOP,不需计算。 835AH SJMP 35H ;835AH + 02H + 35H = AH SJMP E7H ;E7H是负数19H的补码 ;835AH + 02H - 19H = 8391H 位寻址方式? ?位地址表示: MOV C,00H单元地址加位数表示:MOV C,20H.0?内部RAM中的位寻址区(20H-2FH),位地址范围00H-7FH。?专用寄存器中的可寻址位(特殊功能寄存器的单元地址能被8整除 可位寻址80H 90H?)。?【例】 对于PSW(D0H)的第3位是RS0(D3H)进行清零操 作。 直接使用位地址: CLR D3H 位名称表示: CLR RS0 单元地址加位数: CLR D0H.3 专用寄存器加位数: MOV PSW.3 寻址方式对应的存储空间寻址方式 立即寻址 寄存器寻址 直接寻址 寄存器间接寻 址 对于存储空间 片内数据存储空间 R0-R7、A、DPTR等 片内RAM中00H-7FH及特殊功能寄存器 片内RAM中00H-7FH及片外数据存储空间64K变址寻址 相对寻址位寻址程序存储空间 以PC为基址的前后各127字节的程序存储空 间 片内位寻址区20H-2FH及可位寻址的特殊功 能寄存器80H-FFH 80C51单片机的指令系统 --111条指令?按功能分:? ? ? ??数据传送类指令 算术运算类指令 逻辑运算类指令 控制转移类指令 位操作类指令 单字节 双字节 三字节 单周期 双周期 四周期 49条 45条 17条 64条 45条 2条29条 24条 24条 17条 17条?按字节数分:? ???按周期数分:? ?? ?80C51指令中使用的符号的意义I当前寄存器组的8个通用寄存器R0~R7(n=0~7) 可用作间接寻址的寄存器,只能是R0、R1两个寄存 器,所以i=0、1 direct 8位直接地址,在指令中表示直接寻址方式,寻址范 围为256个单元 #data 8位立即数 #data16 16位立即数 addr16 16位目的地址,只在LCALL和LJMP指令中使用 addr11 11位目的地址,只在ACALL和AJMP指令中使用Rn Ri ?80C51指令中使用的符号的意义II相对转移指令中的偏移量,为8位带符号补码数 内部RAM中的直接寻址位 间址寄存器的前缀标志 加在位地址前面,表示对该位取反 某寄存器或某单元的内容 由“×”间接寻址的单元中的内容。 箭头左边的内容被箭头右边的内容所取代rel bit @ / (×) ((×)) ←另,指行指令对标志位影响的表示符号为:“√”有影响,“×”无影响 数据传送类指令? ?指令格式: MOV &目的操作数&,&源操作数& 作用:将数据从存储器某个地址单元传送到存储器另 一个地址单元的指令。? ? ?内部RAM数据传送指令组外部数据存储器读/写指令 程序存储器读指令组??数据交换指令组堆栈操作指令组 立即数传送指令MOV A,#data MOV direct,#data MOV @Ri,#data MOV Rn,#(A)←机器码:(direct)←机器码:((Ri))←机器码:(Rn)←机器码:0111 1rrr dataMOV DPTR,#data16;(DPTR)←#data16 ;机器码: data15~8 data7~0 内部RAM单元之间的数据传送指令MOV direct,R(direct)←(Rn ) ;机器码:1000 1rrr direct MOV Rn,(Rn)←(direct) ;机器码:1010 1rrr direct MOV direct,@R(direct)←((Ri)) ;机器码:i direct ? 注意:不影响标志位 MOV @Ri,((Ri))←(direct) ;机器码:i direct MOV direct,(direct)←(direct) ;机器码: direct direct 通过累加器A的数据传送指令MOV MOV A,direct A,@R(A)←(direct);机器码:1110;(A)←((Ri)) ;机器码:11100101 direct011i 1rrrMOVA,Rn;(A)←(Rn);机器码:1110? MOV direct,A 对奇偶标志位P有影响 ;(direct)←(A);机器码:1111MOV @Ri,A MOV Rn,A ;((Ri))←(A) ;(Rn)←(A)0101direct011i 1rrr机器码:1111 机器码:1111 ?若要完成以下的数据传送,应如何用51指 令来实现? MOV A,R7? ? ?R7内容传送到R4MOV R4,A MOV DPTR,#0020H MOVX A,@DPTR MOV R0,A MOV A,#00H MOV DPTR,#2000H MOVC A,@A+DPTR MOV R2,A外部RAM 20H单元内容送R0ROM 2000H单元内容送R2?外部RAM 0456H的内容送外部RAM 0078H单元。MOV DPTR,#0456H MOVX A,@DPTR MOV DPTR,#0078H MOVX @DPTR,A 已知(30H)=40H,(40H)=10H,(10H)=00H,P1=CAH, 请写出执行以下程序段后有关单元的内容。MOV R0, #30H MOV A, @R0 MOV R1, AMOV B, @R1MOV @R1, P1 MOV A, @R0 MOV 10H, #20H MOV 30H, 10H(30H)=20H,(40H)=0CAH, (10H)=20H,P1=CAH (R0)=30H, A=40H (R1)=40H, (B)=10H 外部数据存储器读/写指令?DPTR作为间址寄存器的外部RAM单元读/写指令。 MOVX A,@DPTR MOVX @DPTR,ARi作为间址寄存器的外部RAM单元读/写指令。 MOVX A,@Ri MOVX @Ri,A??注意:R0、R1作为间址寻址寄存器操作外部RAM时, 需预先对改变P2口锁存器的值。 【例】编程实现将0100H、0102H单元中 内容分别传送到片内存储区30H和32H。?分析:数据存储空间从0100H开始必然为外部数据存储器空间,此时要用MOVX指令 和@DPTR寻址方式对此单元进行操作。?程序:;将外存储区地址给寄存器DPTR ;利用DPTR间接寻址的内容先传入A ;再将A中内容送入片内30HMOV DPTR,#0100H MOVX A,@DPTR MOV 30H,A MOV DPTR,#0102H MOVX A,@DPTR MOV 32H,A 【例】编写程序完成下列操作:① 将地址为3000H的片外数据存储器单元的内容21H传送到片内地址为30H的单元 中。② 将寄存器R5中的内容32H传送到片外地址为3010H的 数据存储器单元中。?分析:因为没有片外数据存储器与片内数据存储器直接传送指令,所以必须通过累加器A进行中转。 注意:在使用MOVX指令传送数据之前,必须先将片外数据存储器的地址赋给DPTR。?程序:① MOV DPTR,#3000H ;(DPTR)←3000H MOVX A,@DPTR ;(A)←((DPTR))=(3000H)=21H MOV 30H,A ;(30H)←(A)=21H ② MOV A,R5 MOV DPTR,#3010H MOVX @DPTR,A ;(A)←(R5)=32H ;(DPTR)←3010H ;((DPTR))=(3010H)←(A)=32H 【例】 用@Ri间接寻址方式的传送 指令完成上例程序。① MOV P2,#30H ;(P2)←30H MOV R0,#00H ;(R0)←00H MOVX A,@R0 ;(A)←((P2)(R0))=(3000H)=21H MOV 30H,A ;(30H)←(A)=21H ② MOV A,R5 MOV P2,#30H MOV R1,#10H MOVX @R1,A ;(A)←(R5)=32H ;(P2)←30H ;(R1)←10H ;((P2)(R1))=(3010H)←(A)=32H 【例】编程实现将片外40H、51H单元中 内容分别传送到并行接口P1和P3中。?分析:外部数据存储空间要用MOVX指令和@DPTR或@Ri间址寻址方式对此单元内容 进行操作。?程序: MOV R0,#40H MOV P2,#00H MOVX A,@R0 MOV P1,A MOV R0,#51H MOVX A,@R0 MOV P3,A MOV DPTR,#0040H MOVX A,@DPTR MOV P1,A MOV DPTR,#0051H MOVX A,@DPTR MOV P3,A或 程序存储器读指令组? ?对程序存储器只能读不能写。 程序存储器读指令,只能通过累加器A进 行 :MOVC A,@A+DPTR MOVC A,@A+PC?包括内部程序存储器和外部程序存储器 将ROM中4000H单元内容送至片内RAM 的75H单元中。?程序:MOV A,#00H MOV DPTR,#4000HMOVC A,@A+DPTRMOV 75H,A 【例】 查表程序?查表程序:将A低半字节中的BCD数转转换为ASCII码ASCII码 30H 31HBCD码 B0010B? 100132H? 39H
【例】设在程序存储器地址为1000H~1009H的存储单元中存 放0~9的平方表,30H单元中存放变量X,任给X的值,求出 Y=X2,并将Y存入40H单元中。?采用变址寻址的方式求X的平方,首先将DPTR指向 平方表的首地址1000H,然后将30H单元中的X(如 02H)传送到累加器A中,由(A)+(DPTR)可得到X平方 单元的地址(如1002H),由变址寻址指令 MOVC A, @A+DPTR可将1002H单元内2的平方值04H送入累加器 A,再由A传送到变量Y所在单元40H单元中。MOV DPTR,#TAB ;(DPTR)←1000H,DPTR指向平方表首地址 MOV A,30H ;(A)←(30H)=02H,设X=2,取X到累加器A MOVC A,@A+DPTR ;(A)←((A)+(DPTR))=(02H+1000H)=(1002H)=04H MOV 40H,A ;(40H)←(A)=04H,存Y到40H单元 ORG 1000H TAB:DB 0,1,4,9,16,25,36,49,64,81 【例】分别用两条查表指令编写一段子程序,功能为:根 据累加器A中的数(0~9之间)查找平方表,求出相应的平 方数,放在内部RAM的30h单元中。SQUARE: MOV DPTR,#TAB MOVC A,@A+DPTR MOV 30H,A RET TAB: DB 0,1,4,9,16,25,36,49,64,81 SQUARE: ADD A,#4 MOVC A,@A+PC MOV 30H,A RET TAB: DB 0,1,4,9,16,25,36,49,64,81或 整字节交换?在内部RAM与A之间进行XCH A,Rn XCH A,direct XCH A,@R(A) ;(A) ;(A) (Rn) (direct) ((Ri))【例】利用XCH指令将R3与R4的内容交换数据。 XCH A,R3 XCH A,R4【例】将A与内部RAM的30H的内容交换数据。 XCH A,30H【例】将寄存器DPH和DPL内容交换一下。XCH A,DPH XCH A,DPL 半字节交换?在内部RAM与A之间进行。XCHD A,@R(A)3-0→←((Ri))3-0 高低半字节交换SWAP A ; (A)3-0→←(A)7-4【例】使用SWAP指令将内存33H中的两个BCD码交换位置。 MOV A,33H ;将33H中内容送入A中 SWAP A ;A的高4位与低4位内容互换, (A)3-0→←(A)7-4 MOV 33H,A ; 将交换过的数据传回到33H中 , (33H)3-0→←(33H)7-4 【例】已知:(R0)=20H,(20H)=75H, (A)=3FH 。执行下列指令后R0、A、20H单元 内容为多少?XCH A,@R0 XCHD A,@R0 SWAP A?上述分析可知,运行程序后,(R0)=20H,(A)=F7H,(20H)=35HXCH A,@R0;(A)?((R0))=(20H),(A)=75H,(20H)=3FH XCHD A,@R0;(A)0~3 ? ((R0))0~3,(A)=7FH, (20H)=35H SWAP A;(A)0~3 ? (A)4~7,(A)=F7H 堆栈操作指令组?进栈、出栈POP direct ←((SP)), SP←(SP)-1PUSHSP←(SP)+1,(SP) ←(direct)【例】利用堆栈操作将R3和R4的内容互换(当前寄存器组 是第0组)PUSH 03H ;R3内容入栈,03H是R3的地址PUSH 04HPOP 03H POP 04H;R4内容入栈,04H是R4的地址;弹出R4的内容送入R3中 ;弹出R3内容送入R4中注意,累加器的栈操作指令:PUSH ACC 若(SP)=26H,(A)=37H,(DPTR)=0CFA8H;执 行以下指令后,试指出SP、A、DPTR的数值。PUSH A PUSH DPL POP ACC POP DPL27H28HSPACCDPL初始PUSH APUSH POP DPL ACC** 37H**A8H26H 27H28H 27H 26H37HA8HA8H 37HPOPDPL(SP)=26H,(A)=37H,(DPTR)=0CF37H 算术运算类指令? ? ?????加法指令组 带进位加法指令组 带借位减法指令组 加1指令组 减1指令组 乘除指令组 十进制调整指令 有符号数和无符号数?对指令使用者来说,8为二进制数可以当作 无符号数(0~255),也可以当作带符号 数,即补码数(-128~127)。例如:8位二进制数,用户可以认 为它是无符号数,即为十进制数211,也可 以认为它是带符号数,即为十进制负数-45。? 加法指令组??加法指令的一个加数是A,另一个源操作数可以是 立即数、寄存器、直接、间接等寻址方式,相加 结果送回A。 影响标志位Cy、AC、OV、P。 带进位加法指令组?进位标志位参加运算。 作加法的注意事项?在求和时,总是把操作数直接相加,而无 须任何变换。+01000【例】若A=, R1=,执行指令ADD A,R1 时,求其和。1 即相加后A=,最前面的1丢失。若认为是无符 号数相加,则A的值代表十进制数187,若认为是带符号 数相加,则A的值为十进制负数-69。 【例】若A=,求执行指令 ADD A,#6BH的结果。?由于两个正数相加结果为负数,表示出现 了溢出,故OV=1,但进位标志Cy=0。 + 在确定溢出标志OV的值时,计算机总是把操作数当作带符号 数来对待。 加法指令还会影响辅助进位标志 AC和奇偶标志P? ?第3位对于第4位有进位时,AC=1。 相加后A中的1的数目为偶数,故P=0。 + 10100 加法对溢出标志的影响例设(A)=53H,(R0)=0FCH,执行指令ADD A,R0后,(A)=,CY=,AC=,OV=,P=(A)=4FH,CY=1,AC=0,OV=0,P=1+ (1) 例设(A)=85H,(R0)=20H,(20H)=0AFH,执行指令ADD A,@R0后,(A)=,CY=,AC=,OV=,P=(A)=34H,CY=1,AC=1,OV=1,P=1 + ) 【例】 将存储单元40H与50H内容相加的和存入60H单元即:(40H) + (50H)→(60H)。【解题思路】由于加法运算前的一个操作数必须存放在累加器A, 因此40H单元中的被加数应送入累加器A中,而A与50H单元相加的和又存放累加器A中,所以应将和从累加器A传送到60H单元中。故程序应由2条传送指令与1条加法指令组成。MOV MOVA,40H 60H,A;A←(40H),取第1个操作数到AADD A,50H;A←(A)+(50H),两个操作数和送A;60H←(A),将运算和送60H单元 【例】双字节无符号数相加。假设两个双字节无符号 数,分别存放在R1、R0和R3、R2中,高字节在前,低 字节在后。编程使两数相加,用R2、R1、R0存放和。R1R0 + R3R2 R2 R1R0对多字节的加法,存在最高位的进位问题。如果高位有进位, 则和的字节数要比加数或被加数的字节数多一个。 此程序较简单,求和的方法与笔算雷同,先加低位,后加高 位,无需画流程图。 ORG 1000H CLR C MOV A,R0 ADD A,R2 MOV R0,A MOV A,R1 ADDC A,R3 MOV R1,A MOV A,#0 ADDC A,#0 MOV R2,A;A取被加数低字节 ;与加数低字节相加 ;存和数低字节 ;A取被加数高字节 ;与加数高字节相加 ;存和数高字节;加进位位 ;存和数进位位SJMP $ END;原地踏步 【例】假设X =2288H已存入41H与40H单元,而 Y=4488H已存入51H与50H单元。编写X+Y的程序,并 将X+Y的和存入61H与60H单元中。分成两个字节加,先加40H和50H,再加41H、51H和Cy。 (41H) (40H)+(51H)(50H)(40H) +(50H)Cy+(41H) +(51H)MOV ADD MOV MOV ADDC MOVA,40H A,50H 60H,A A,41H A,51H 61H,A;(A)←(40H)=88H ;(A)←(A)+(50H)=88H+88H=[1]10H ;(60H)←(A)=10H ;(A)←(41H)=22H ;(A)←(A)+(51H)=22H+44H=66H ;(61H)←(A)=66H 多字节加操作【例】 假设X =2288H已存入41H与40H单元,而MOV A,40H ADD A,50H MOV 60H,A MOV A,41H ADD A,51H MOV 61H,A ;(A)←(40H)=88H ;(A)←(A)+(50H)=88H+88H=[1]10H ;(60H)←(A)=10H ;(A)←(41H)=22H ;(A)←(A)+(51H)=22H+44H=66H ;(61H)←(A)=66HY=4488H已存入51H与50H单元。求X+Y =?分成两个字节加,先加40H和50H,再加41H和51H。 运算结果为X+Y=6610H,而正确运算结果为: X +Y = = 22 44 88H 88HX+Y =67 10H? 【例】3字节无符号数相加?被加数在内部RAM的50H、51H和52H单元中; 加数在内部RAM的53H、54H和55H单元中; 要求把相加之和存放在50H、51H和52H单元 中,进位存放在位寻址区的20H位中。(50H) (51H) (53H) (54H) (50H)+ (53H) (51H)+ (54H) (52H) + (53H) (54H) 52H←(52H)+(55H) 54H←(51H)+(54H)+CY0 (52H) (55H) (55H) (55H)
【例】试将数138和(A)=156的内容相加,并将结果 存储到35H,36H单元中,编写程序并译成机器码,并 指出每条指令执行后Cy、AC、OV、P标志各是什么? MOV A,#156 ;749CH, Cy=0、AC=0、OV=0、P=0ADD A,#138MOV 35H,A; 248AH, Cy=1、AC=1、OV=1、P=1;F535H Cy、AC、OV、P不变CLR AADDC A,#00H MOV 36H,A;E4H Cy、AC、OV不变, P=0;3400H Cy=0、AC=0、OV=0、P=1 ;F536H Cy、AC、OV、P不变 带借位的减法指令组?从累加器A中减去不同寻址方式的操作数以及进 位标志位CY,其差再送回累加器A。没有不带借 位的减法指令 【例】将存储单元40H与50H内容相 减,减得的差存入60H单元中? ?(40H)-(50H)→(60H) 求解此题,只需要将例3-8中的加法指令改 成减法指令即可。由于只有带借位的减法 指令,所以做减法之前必须将借位位CY清 零。CLR C MOV A,40H SUBB A,50H MOV 60H,A ;(CY)←0 ;(A)←(40H) ;(A)←(A)-(50H)-(CY) ;(60H)←(A) 【例】X=2288H,Y=4488H,X、Y已分别存入41H、40H、 51H与50H中,编写程序,将X-Y存入61H与60H中。?解 求解此题,只需要将例3-9中的加法指 令改成减法指令即可。做减法之前应将CY 清零。CLR C ;(CY)←0MOV A,40HSUBB A,50H MOV 60H,A;(A)←(40H);(A)←(A)-(50H)-(CY) ;(60H)←(A)MOV A,41HSUBB A,51H MOV 61H,A;(A)←(41H);(A)←(A)-(51H)-(CY) ;(61H)←(A) 【例】双字节求补。设两个字节原码数存在 R1、R0中,求补后结果存在R3、R2中。ORG 1000H CLR C CLR A 求补采用“模-原码” SUBB A,R0 的方法,因为补码是 MOV R2,A 原码相当于模而言的, CLR A 对于双字节数来说其 SUBB A,R1 MOV R3,A 模为10000H。 SJMP $ END ; Cy←0 ; A←0 ;低字节求补 ;送R2 ; 0A ;高字节求补 ;送R3 加1指令组???按无符号二进制数进行。 当有A参与时,只影响P,其余不影响。 用来修改操作数的地址,以便使用间接寻址的 指令。 减1指令组? ?加1指令的操作不影响PSW的状态。 当有A参与时,只影响P,其余不影响。 DPTR减1?对DPTR没有减1操作的指令。如果要使DPTR完成 减1操作,则需要几条指令来完成。MOV DPL,A MOV A,DPH ;保存结果 ;DPTR高8位PUSH ACC ;保护ACC CLR C 备作减法 ;Cy=0 准MOV A,DPL ;取DPTR低8 位SUBB A,#0MOV DPH,A POP ACC;减可能产生的借位;DPTR-1 ;恢复ACCSUBB A,#1 ;减1 十进制调整指令DA A?专门用于实现BCD码加法的调整指令,对累加器A作BCD码 加法后,进行“加6调整”,调整方法: 若(A)0~3&9或(AC)=1,则(A)0~3←(A)0~3+6。 若(A)4~7&9或(CY)=1, 123456 H + 567890 H 68ACE6 H + 006 660 H 691 246 H??则(A)4~7←(A)4~7+6。 【例】编程实现890。结果存于30H、 31H、32H中,高位存于大地址,低位存于小地址。?很大的两个十进制数相加时,可以按照两种思路来编程。?1、手工将十进制数换算成二进制数,再用多字节相加的方法。 E240H,AA52HMOV A,#40H ADD A,#52H MOV 30H,A MOV A,#E2H ADDC A,#AAHMOV 31H,AMOV A,#01H ADDC A,#08HMOV 32H,A 采用BCD码,123456的BCD码是123456H,567890的BCD码是567890H。2、采用编码的方法,即将十进制数用BCD码表示, 然后用多字节加法,最后再把结果调整为十进制编 码。计算过程: 期望的结果为:123456 H+ 567890 H 68ACE6 H MOV A,#56H ADD A,#90H DA A MOV 30H,A MOV A,#34H ADDC A,#78H123456+ 346 DA A MOV 31H,A MOV A,#12H ADDC A,#56H DA A MOV 32H,A如何修正? 十进制数减法?? ?十进制数减法运算可以用加上减数的补数来进行。两位十 进制数是对100取补的,如减法60-30,也可以改为补数相 加:60+(100-30)=130,丢掉进位位后,得到正确的结果。 100采用8位二进制数AH)来代替,因为这个 十进制数经过十进制调整后为1 B。 无符号数的减法运算:? ? ?(1)求减数的补数(9AH-减数) (2)被减数与减数的补数相加 (3)经十进制加法调整后就得到所求的十进制减法运算结果。?差在A中。 【例】完成十进制数91减36的运算。00 + 10101 + 010101 舍弃进位后,差为十进制数55.CLR C;清进位位 MOV A,#9AH; SUBB A,#36H;求减数的补数 ADD A,91H;加补数完成减法 DA A;十进制调整 CLR C;舍弃进位 【例】用补码进行30-20的十进制运算?解: 由于十进制数30的BCD码与十六进制数30H=在 存储单元中的存放方式是一样的,所以任何一个十进数BCD码在计算 机内的运算都是以十六进制方式进行的,只有在经过十进制调整后, 才能得到运算结果的BCD码值。所以下面将用十六进制运算来表示十进制30-20的运算。?由于MCS-51单片机没有十进制减法调整指令,所以只能用十进制加法 调整指令来完成十进制减法运算。而加法调整指令DA A只能用在加法指令后面,因此必须将减法运算变为加法运算来做,即采用补码运算。现将方法叙述如下:因为2位十制数从00~99共100个,所以2位 十进制数的模M=100,2位十进数x的补码[x]补 = x + M = x + 100 =x + 99 + 1。下面例题来说明十进制减法的运算方法。 ? ? ? ? ? ?30H-20H=30H+[-20H]补=30H+(-20H)+99H+1H=9AH-20H+30H 由上式可得出2位十进制数减法运算的方法如下: ① 先将2位十进数的模M=99H+1=9AH送入累加器A。②用累加器A中的9AH减去减数(如20H)。③再加上被减数(如30H)。 ④最后用DA A指令调整A中的值,即得到十进制减法运算的差 乘除指令组?A、B中为两个无符号数MUL AB A×B=BA DIV AB A÷B=A?BCyOV总是被清0;若乘积大于255,则OV=0,表明乘机在B和A中;若乘机小于或等于255,则OV=1,表明乘积在A中, 而B为0. Cy OV 总是被清0; 除数为0,则OV=1,表明除法无意义;否则OV=0.乘、除指令都为一字节指令,需四个机器周期。 若被乘数为16位无符号数,乘数为8位无符号数,编制乘 【例】 法程序。被乘数的地址为M(低8位)和M+1(高8位), 乘数地址为N,积存入R2、R3和R4三个寄存器中。M+1【分析思路】1)将16位被乘数分为高8位和低 8位,首先由低8位与8位乘数相 乘,积的低8位存入R4,积的高8 位暂存于R3。×+ BR3 A R2 R3M N R4R42)再用16位被乘数的高8位乘以乘数,所得积的低8位应与R3 中的暂存的内容相加,存入R3的结果的一部分,而积的高8位还 要与进位Cy相加才能存入R2,作为积的高8位。最后的积存于 R2、R3、R4,共为24位二进制数。 MOV R0,#MMOV A,@R0INC R0MOV A,@R0MOV B,NMOV B,NMUL ABMUL ABADD A,R3 MOV R3,A MOV A,B ADDC A,#00H MOV R2,AMOV R4,AMOV R3,B 【例】将内部RAM的20H单元中的8位无符号二进制 数转换为3位BCD码,并将结果存放在FIRST(百位) 和SECOND(十位、个位)两单元中。8位无符号二进制数表示的数据范围为0-255,所以用BCD码,最多3 位。可将被转换的数除以100,得到百位数;余数再除以10得十位数; 最后余数即为个位数。设(20H)=0FFH,先用100除,商(A)=02H FIRST;余 数(B)=37H,再用10除,商(A)=05H,余数(B)=05H; 十位BCD数送A高四位后,与个位BCD数相减,得到压缩的BCD 码55H SECOND。 FIRST DATA 22H SECOND DATA 21H ORG 1000H HBCD:MOV A,20H ;取数 MOV B,#100 ;B除数100 DIV AB ;除100 MOV FIRST,A ;百位BCD MOV A,B MOV B,#10 ;B除数10 DIV AB ;除10 SWAP A ;十位数送高位 ORL A,B ;A为(十位、个位)BCD MOV SECOND,A;存十位、个位数SJMP $ END以上几例都是简单程序,可以完成一些特定的功能,若 在程序的第一条指令加上标号,程序结尾改用一条子程 序返回RET指令,则这些可完成某种特定功能的程序段, 均可当作子程序调用。 注意? ? ??? 址大于或等于80H的存储单元为特殊功能寄存器,如地址 0F0H表示B寄存器。 ? 特殊功能寄存器只能用直接地址才能翻译成机器码。如: MOV PSW,10H,必须用PSW的地址0D0H才能翻译成机器码。 ? 对寄存器Rn既可以用其名也可以用其地址。如:MOV 00H,#60H 中00H号单元实际上就是0区中寄存器R0,因此 这条指令所执行的操作与指令MOV R0,#60H所执行的操 作是相同的。 ? 寄存器与寄存器之间不能直接传送,如MOV R0,R1是错 误的。但可用其地址进行直接寻址方式的传送。若R0、R1 在0区,则上条指令可写为:MOV 00H,01H。 【例】设(R0)=10H,(10H)=15H,(90H)=55H, (B)=33H,(R5)=57H,试分析下列指令执行后各寄 存器与存储单元的内容。① MOV A,#30H MOV A,R0 MOV A,90H MOV A,@R0 ② MOV R1,#40H MOV R2,A MOV R3,0F0H ;(A)←30H ;(A)←(R0)=10H ;(A)←(90H)=55H ;(A)←((R0))=(10H)=15H ;(R1)←40H ;(R2)←(A)=15H ;(R3)←(0F0H)=(B)=33H ③ MOV 30H,#50H ;(30H)←50H MOV 00H,#10H ;(00H)=(R0)←10H MOV 0B0H,A ;(0B0H)=(P3)←(A)=15H MOV PSW,10H ;(PSW)=(0D0H)←(10H)=15 MOV 40H,R5 ;(40H)←(R5)=57 MOV 7FH,@R0 ;(7FH)←((R0))=(10H)=15H ④ MOV @R0,#70H ;((R0))=(10H)←70H MOV @R1,A ;((R1))=(40H)←(A)=15H MOV @R0,90H ;((R0))=(60H)←(90H)=55H ⑤MOV DPTR,#2000H ;(DPTR)←2000H 常见指令错误1.MOV A,#1000H ;A←1000HMOV DPTR,#1000H MOV DPTR,#1000H MOVX A,@DPTR MOV A,#10H MOV P2,#10H 或 MOV R0,#00H MOVX A,@R0 3.MOVC A,1000H ;A←(1000H) ROM MOV A,#00H MOV DPTR,#1000H MOVC A,@A+DPTR 4.MOVX 60H,A MOV DPTR,#0060H MOVX @DPTR,A ;片外RAM(60H)←A MOV P2,#00H 2.MOVX A,1000H ;A←(1000H)片外RAM或MOV R1,#60HMOVX @R1,A 5.MOV R0,60H;片内RAM:61H←(60H) MOV P2,#00H MOV 61H,@R0 MOV DPTR,#0060H MOV R0,#60HMOV A,@DPTR INC DPTR MOV @DPTR,A或MOVX A,@R0 INC R0 MOV @R0,A6. XCH R1,R2;R1←→R2 MOV A,R1 XCH A,R2 MOV R1,A 7. MOVX DPTR,#2000H 8. MOVX 60H,@DPTR MOV DPTR,#2000H ;DPTR←2000H ;片内RAM←片外RAMMOVX A,@DPTRMOV 60H,A 【例】编写程序,把A中的高低半字节分别转换为ASCII码,并高位存入 R1,低位存入R2。如:若(A)=4AH,则(R1)=34H,(R2)=41HRESULT EQU 20h ORG 0 mov a,恢复Aanl a,#0fh;取低四位SJMP STARTORG 0030H START:MOV A,#1AHmovc a,@a+查ASCII表 mov Result+1,a sjmp $MOV DPTR,#ASCIITABmov b,暂存AASCIITAB: swap aanl a,#0取高四位 movc a,@a+查ASCII表 DB END;定义数字对应的ASCII表'ABCDEF'mov Result,a 逻辑运算及移位类指令? ??逻辑运算都是按位进行的. 逻辑运算指令,对Cy AC OV标志都没有影 响,只在涉及到累加器A时,才会对奇偶标 志P产生影响。 这条指令用来修改一个输出口时,作为原 始口数据的值将从输出口数据锁存器(P0P3)读入,而不是读引脚状态。 逻辑“与”“或”“异或”运算 指令组? Rn; ? ? ANL? ? ? ? ORL ? A, ? XRL ? ? @ Ri; ? ? ? ? # ? A ? ( A) ? ( Rn) : A ? ( A) ? (direct) : A ? ( A) ? (( Ri)) : A ? ( A) ? dataANL? ? ORL ? direct, XRL ? ?? A ? ? ?#data ?direct ? A) ? (direct) : direct ? (direct) ? data 【例】ANL A,R1 ORL A,R7 ANL A,70H ; A←(A)∧(R1) ; A←(A)∨(R7) ;A←(A)∧(70H)ORL A,70H ;A←(A)∧((R0)) ; A←(A)∨(70H) ; A←(A)+(R4) ANL A,@R0XRL A,R4 ORL A,@R1 XRL A,50H ; A←(A)∨((R1)) ; A←(A)+(50H) ANL A,#07H ; A←(A)∧07H ORL A,#03H XRL A,@R0 ; A←(A)∨03H ; A←(A)+((R0)) ANL 70H,A ;(70H)←(70H)∧(A) ORL 78H,A XRL A,#00H ; (78H)←(78H)∨(A) ; A←(A)+00H ANL P1,#0F0H ;(P1)←(P1)∧0F0H ORL 70H,,#07FH ;(70H)←(70H)∨07FH XRL 30H,A ;(30H)←(30H)+(A) XRL 40H,,#0F0H ;(40H)←(40H)+0F0H 【例】设(A)=07H,(R0)=0FDH,执行指令ANL A,R0 ,(R0)=
(A)=05h,(R0)=0FDH
后,结果:(A)=
。 ∨ 11 0111【例】设(P1)=05H,(A)=33H,执行指令ORL P1,A,结果:(A)= ,(P1)= (A)=33H,(P1)=37H【例】设(A)=90H,(R3)=73H,执行指令XRL A,R3,结果:(A)= ,(R3)= 。 11 0011 (A)=E3H,(R3)=73H 【例】将片内RAM中20H存放的压缩BCD码变成正常BCD码,并存 放于21H、22H中,高位存于大地址,低位存于小地址。如,56 的压缩BCD码表示为56H,正常BCD码表示为05H和06H。MOV R0,#22H;地址送R0 MOV A,20H;压缩BCD码送A中 MOV B,A;暂存于B中ANL A,#0F0H;屏蔽低4位为0,保留高4位SWAP A;交换高低4位,则原来的低4位0移到高位,原来的高4位移到低位 MOV R0@,A;保存这个结果到22H DEC R0;地址减1 MOV A,B;将原来的BCD压缩码再放入A中 ANL A,#0FH;屏蔽高4位为0,保留低4位 MOV @R0,A;保存结果到21H单元 将累加器A的低4位送到P1口的低4位, 而P1口的高4位保持不变。?解题思路:这种操作不便用简单的MOV指令来实现,而可以借助与、或逻辑运算。 MOV R0,A;A内容暂存R0 ANL A,#0FH;屏蔽A的高4位为0,保留低4位ANL P1,#0F0H屏蔽P1口的低4位为0,保留高4位ORL P1,A;完成所需操作MOV A,R0;恢复A的内容 将P1口的中间两位的状态反转。MOV程序为: A,P1 ? ANL A,#BCPL AANL A,#B位对1作异或操作运算,可取反。ANL P1,#BORL P1,A或MOV A,P1XRL A,#B MOV P1,A 异或指令可对如何一个内部RAM单元取反。异或运算有一个特性,即只要使某一单元的每一位都对1作 异或运算,就可对这个单元的内容求反。 XRL direct,#0FFH ;direct←/(direct),/表示取反操作 累加器清0和取反指令组CLR A(清0) CPL A(取反)机器码: 机器码:【例】设(A)=B,执行指令CPL A之后,(A)=BMCS-51中只有对A的取反指令,没有求补指令。若要进行求补操作,可按“求 反加1”来进行。SWAP A(高低半字节交换)机器码:A之后,(A)=5CH【例】设(A)=0C5H,执行指令SWAP对于Cy AC OV标志没有影响,只有涉及A时,才对奇偶标志位P产生影响。 移位指令组移位只能对于A进行 指令: 图示: 机器码:RL A RLC A RR A RRC A; ; ; ;A A A00 11CCA [例]在30H和31H单元有两个BCD码,现要将它们合并放到30H单元,以节省内存 空间。编写相应的程序。?程序MOV R1,#31H;一个BCD码的地址31H送R1MOV A,@R1SWAP A DEC R1 ORL A,@R1 MOV 30H,A;A←(31H);一个BCD码移到高4位,低4位为0 ;指向另一个BCD码的地址 ;另一个BCD码合并到低4位 ;送回30H ??计算机共有3类移位:逻辑移位,算术移位 和循环移位。80C51只有循环移位,而没有 逻辑移位和算术移位指令。 若要进行逻辑移位和算术移位,则可通过 借用循环移位指令间接实现。逻辑右移: CLR C 算术右移: MOV C,ACC.7RRC ARRC A [例]16位数的算术左移。16位数在内存中存放在30H和31H单元,低8位在小地址。CLR C ;进位Cy=0MOV R1,#30HMOV A,@R1 RLC A MOV @R1,A INC R1;操作数地址送R1;低8位送A ;低8位左移,最低位添0,CyA7 ;送回 ;指向高8位MOV A,@R1RLC A MOV @R1,A;高8位送A;A7移入,高8位左移 ;送回 利用为置位指令,可以完成16位数的循环移位。【例】16位二进制数存于30H和31H单元,低8位先存,试编写完成一次循环移位的程序。MOV A,31H ;取出高8位到AMOV C,ACC.7MOV R1,#30H;最高位送Cy;R1为地址指针 ;低8位送A ;低8位移位 ;送回图MOV A,@R1 RLC A MOV @R1,AINC R1MOV A,@R1 RLC A;修改地址指针;取出高8位 ;高8位移位MOV @R1,A;送回 将DPTR的内容循环左移4位PUSH ACC;保存ACCPUSH R0;保存R0 MOV R0,#4;移位次数?程序:AGAIN:MOV A,DPH;取高字节 MOV C,ACC.7;取DPTR的最高位 MOV A,DPL;取低字节 RLC A;循环左移,原DPTR最高位移入最低位 MOV DPL,A;存低字节 MOV A,DPH;取高字节 RLC A;循环左移 MOV DPH,A;存高字节 DJNZ R0,AGAIN;循环,作下一次移位由于需要移 位四次,故 安排了一个 循环程序。 每作一次循 环,对DPTR 循环左移一 次。POP R0;恢复R0POP ACC;恢复ACC 控制转移指令??程序的顺序执行由PC自动加1实现,要改变程序 的执行顺序进行分支转向,应通过强迫修改PC 值的方法来实现,这就是控制转移指令的基本 功能。 转移共分为两类:? ?无条件转移 有条件转移。如何指令系统都有控制转移指令,有了控制转移指令,程 序就有了思考判断能力。 无条件长转移指令?LJMP addr16? ?PC←addr15~0机器码: a15a14a13a12 a11a10a9 a8 a7a6a5a4 a3a2a1a0长转移指令是3字节指令。指令执行后把16位地址送PC,从而 实现程序转移。由于转移范围大,可达64KB,故称为“长转 移”。 无条件绝对转移?AJMP addr11?①PC←(PC)+211a10a9a8a7a6a5a4a3a2a1a0机器码:a10a9a80 a5a4 a3a2a1a0②PC=PC15~?以指令提供的11位地址(addr11)去替换PC的低11位内容,形成新的PC值。?请注意,被替换的PC值是本条指令地址加2以后的PC, 即下一条指令的PC值。?绝对转移指令所能转移的最大范围是210=2KB。 例KWR:AJMP B如果KWR=1030H,则执行该条指令后,程 序转移到1100H如果KWR=3030H时,执行该条指令后,程 序转移到3100H。 无条件短转移?SJMP rel? ??机器码:1000 PC←(PC)+2, PC←(PC)+rel0000 rel 其中,Rel是偏移量,是二进制补码数,所能实现的程序转 移是双向的。编写汇编源程序时,只需要相对转移指令中直 接写上要转向的地址标号就可以了。 在80C51中没有暂停和程序结束指令,但在使用时又需要程 序等待或程序结束。? ? ?HERE:SJMP HERE 或 SJMP $ ? 注:($代表PC的当前值) KRD:SJMP 21H如果KRD标号值为0100H,则跳转的目标地址是H+2=0102H23H 变址寻址转移指令?JMP @A+DPTR? ?PC←(A)+(DPTR) 机器码: 以DPTR为基址,以A为变址。转移的目的地址由A的 内容和DPTR的内容之和来确定,即目的地址 =(A)+(DPTR)。?只要把DPTR的值固定,而给A赋以不同的值,即可实现程序的多分支转移。 如果累加器A中存放待处理命令编号(0-7),程序存储器中存放 着标号为PMTB的转移表,则执行下面的程序,将根据A内命令编号 转向相应的命令处理程序:PM:MOV R1,A;(A)*3A RL A ADD A,R1 MOV DPTR,#PWTB;转移表首址DPTR JMP @A+DPTR PMTB:LJMP PM0;转向命令0处理入口LJMP PM1;转向命令1处理口 LJMP PM2;转向命令2处理口 LJMP PM3;转向命令3处理口LJMP PM4;转向命令4处理口LJMP PM5;转向命令5处理口 LJMP PM6;转向命令6处理口 LJMP PM7;转向命令7处理口 无条件转移指令的范围?长转移指令LJMP的转移范围最大,为64KB。 绝对转移指令AJMP的转移范围为2KB,??短转移指令SJMP的转移范围最小,仅为256B.变址转移指令JMP的转移范围也为64KB。? 条件转移指令组?所谓条件转移,就是设有条件的程序转移。?执行条件转移指令时,若指令中设定的条件满足, 则进行程序转移,否则程序顺序执行。 累加器判零转移指令?JZ当(A)=0时转移,PC←(PC)+2,PC←(PC)+rel机器码: rel?JNZ当(A)≠0时转移,PC←(PC)+2,PC←(PC)+rel 机器码: rel 数值比较转移指令?CJNE A,#data,rel;CJNE A,direct,rel;CJNE @Ri,#data,rel; CJNE Rn,#data,rel;???当第一操作数=第二操作数时不转,(PC)←(PC)+3;否则转移, (PC)←(PC)+3+rel 本指令还影响Cy,当第一操作数≥第二操作数时,Cy=0,因此可实现程 序的三分支。 数值比较转移指令是80C1指令系统中仅有的4条3操作数指令。 [例]执行下面程序后将根据A的内容大于30H、等于30H、小于30H三种情况作不同的处理CJNE A,30H,NOTEQ ;(A)≠(30H),转EQ:┋ NOTEQ: JC LITTEL ┋ LITTEL: ┋;(A)=(30H);C=1,(A)&(30H),转 ;否则C=0,(A)>(30H),顺序执行首页 减1条件转移指令? ?DJNZ Rn, relDJNZ direct, rel?寄存器或直接寻址单元内容减1时,若所得结果为0, 则程序顺序执行;若结果不为0,则程序转移。?这组指令允许程序员把内部RAM单元用作程序循环计算器。 通过延时程序在P1.1输出一个方波脉冲,可以通过修改30H和31H初值,改变延时时间,从而改变方波频率START:SETB P1.1;1P1.1DL:MOV 30H,#03H;03H30H,置初值DL0:MOV 31H,#0F0H;0F0H31H,置初值 DL1:DJNZ 31H,DL1;(31H)-131H,(31H)不为0重复执行 DJNZ 30H,DL0;(30H)-1(30H),(30H)不为0转DL0 CPL P1.1;P1.1求反AJMP DL;转DL 子程序调用与返回指令组?ACALL、LCALL、RET 、RETI??调用指令在主程序中使用,而返回指令则是子程序的 最后一条指令。 1)绝对调用ACALL addr11?该指令把加2以后的PC值自动送堆栈保存起来,待子程序返回 时再出栈送回PC。子程序调用范围是2KB。PC←(PC)+2, SP←(SP)+1,(SP)←(PC7~0) SP←(SP)+1,(SP)←(PC15~8) PC=PC15~11a10a9?a0? ???机器码2字节格式:a10 a9a7 a6a8a51a40a30a20a11a0 若(SP)=60H,标号MA值为0123H,子程序SUB位于 0345H,则执行指令 MA:ACALL SUB 后, (SP)= (62H)= ,内部RAM中堆栈区内(61H)= ,(PC)= 。 ,(SP)=62H,(61H)=25H, (62H)=01H,(PC)=0345H 长调调用LCALL addr16?该指令把加3以后的PC值自动送堆栈保存起来,待子程序返回时再出栈送回PC。?子程序调用范围是64KB。 【例】若(SP)=60H,标号STRT值为0100H,标号DIR值为8100H,则执行指令 STRT:LCALL DIR 后,(SP)=, (61H)=,(62H)=,(PC)= (SP)=62H,(61H)=03H,(62H)=01H,(PC)=8100H 返回指令?RET(子程序返回)?机器码:从堆栈中自动取出断点地址送PC中。? ?不影响任何标志位。 子程序的结尾必须是RET才能返回主程序。?PC←(PC)+1PC15~8←((SP)), SP←(SP)-1 PC7~0←((SP)), SP←(SP)-1 若(SP)=62H,(62H)=07H,(61H)=30H,则执行指 令RET后,(SP)=,(PC)=(SP)=60H,(PC)=0730H 在P1.0-P1.3分别装有两个红灯和两个绿 灯,则实现红绿灯定时切换功能。MAIN: MOV A,#03H ML: MOV P1,A ACALL DL ;切换红绿灯 ;调用延时子程序MXCH:CPL AAJMP ML DL: MOV R7,0A3H ;置延时用常数DL1:DL6:MOV R6,#0FFHDJNZ R6,DL6 ;用循环来延时 DJNZ R7,DL1RET;返回主程序 RETI(中断服务子程序返回)?从堆栈中自动取出断点地址送PC中。?清除中断响应时被置位的优先级状态、开放较低级中 断和恢复中断逻辑。? ? ?PC←(PC)+1 机器码: PC15~8←((SP)), SP←(SP)-1 PC7~0←((SP)), SP←(SP)-1 空操作指令?NOP(空操作) 机器码:? ?CPU不做任何操作,只消耗一个机器周期的时间。 常用于程序等待或时间延迟。 位操作类指令?所谓位操作,就是以位(bit)为单位进行的运算 和操作。位变量也称为布尔变量或开关变量。? ? ? ?位传送指令(2) 置位复位指令(4) 位逻辑运算指令(6) 位控制转移指令(5) 位处理器、位累加器CY(位传送中心) 位寻址区20H-2FH中的128个可寻址位00H-FFH。 特殊功能寄存器中的可寻址位,包括I/O口的可寻址 位:P0 P1 P2 P3。注意,对累加器位的表示应使用ACC,而不能用A,如ACC.0?位处理资源有:? ? ?? 位传送指令组MOV C, bit MOV bit, C?;Cy← (bit)机器码:bit← (Cy)机器码: bit指令中的C就是CY。?bit为位地址区(20H~2FH)及可位寻址的特殊功能寄存器中 的某个位地址。【例】将30H位的内容传送到20H位中。传送必须Cy来进行,注意保持原有Cy的值不被破坏。 MOV 10H,C ;暂存Cy的值MOV C,30HMOV 20H,C MOV C,10H;Cy←(30H);(20H)←C恢复Cy的值 【例】 设(20H)=7FH=B,执行下列指令后20H单元内容为什么?MOV C,07H 解释如下:MOV MOV C,07H 00H,C MOV 00H,C ; (07H)即(20H.7),为0, CY←0 ; (00H)即(20H.0), (20H.0)←0执行二条指令后(20H)=EH。 20H的内容为B,25H的 内容为B,执行下列程序后,20H、25H、 Cy的内容各是什么? MOV MOV MOV MOV C,00H 28H,C C,07H 2FH,C ;Cy←(20H.0),即Cy←0 ;25H.0←(Cy),即25H.0←0 ;(Cy)←(20H.7),即(Cy)←1 ;(25H.7)←(Cy)【例】内部RAM结果: (Cy)=1,(20H)不变,(25H)=B=A4H 【例】16位二进制数存于31H、30H单元,试编写完成一次循环移位的程序。 MOV A,31H MOV C,ACC.7 ;取出高8位到A ;最高位送CyMOV R1,#30HMOV A,@R1 RLC A;R1为地址指针;低8位送A ;低8位移位MOV @R1,AINC R1 MOV A,@R1 RLC A MOV @R1,A;送回;修改地址指针 ;取出高8位 ;高8位移位 ;送回 置位复位指令组?对标志位没有影响。;Cy←0 ;bit←0 ;Cy←1 ;bit←1 机器码: 机器码: 机器码: 机器码: ;CY←0 ; (24H).7← 0 01 10 bit
bitCLR C CLR bit SETB C SETB bitCLR C CLR 27HSETB C; C ←1SETB P1.7 ; P1.7←1 MOV P1,#0FEH ;B ;可以使P1.0上的发 ;光二极管点亮 CLR P1.0 MOV P1,#0F0H ;B ;可以使P1口上的4 ;个发光二极管点亮 8段数码管显示MOV P1,#00H ;显示8. MOV P1,#0FFH;无显示 一个引脚的高低电平,可以通过“光电 耦合器”控制继电器,从而以“弱电” 控制“强电” 位逻辑运算指令组?位逻辑操作有与、或、非三种。 ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit CPL C CPLCy←(Cy)∧(bit) ;Cy←(Cy)∧(bit) ;Cy←(Cy)∨(bit) ;Cy←(Cy)∨(bit) ;Cy←(Cy) ;bit←(bit)/bit (bit)的内容并不改变,只是在运算时,取出bit之后, 先取反,再运算。 指令系统中没有位异或指令,位异或可用若干条指令操作实现。【例】编写程序,完成00H、01H异或操作结果存于02H中。思路:(02H)=((00H) ∧(01H)) ∨((00H) ∧(01H)) MOV C,00H ANL C,/01H ;取一个操作数 ;Cy ←(Cy) ∧ (01H)MOV 02H,CMOV C,00H ANL C,01H ORL C,02H MOV 02H,C;暂存到02H中;取操作数 ; Cy ←C ∧(01H) ;C为异或结果 ;存入02H 用位操作指令可以对组合逻辑电路的功能进行模拟,即以软件方法 实现组合电路的逻辑功能。?【例】编程实现如下图所示逻辑电路的功能。MOV C,P1.1 ANL C,P1.2MOV 20H.0,C MOV C,P1.33ORL C,/P1.4 ANL C,/20H.0MOV P1.5,C 以Cy内容为条件的转移指令? ?JC rel (CY=1转移)JNC rel(CY=0转移)JC 35H ;C=0,顺序执行 ,即(PC)←(PC)+2 ;C=1,转移,(PC)?(PC)+2,(PC)?(PC)+35H 【例】判别累加器A和30H单元内容的大小,若A=(30H),转向LOOP1;若A&(30H),则转向LOOP2,若A&(30H),则转向 LOOP3。设所存的都是无符号数。CJNE A,30H,NEXT ;比较A与(30H) SJMP LOOP1 ;A=(30H)转LOOP1NEXT:JNC LOOP2JC LOOP3;A&(30H)转LOOP2;A&(30H)转LOOP3 【例】判别累加器A和30H单元内容的大小,若A=(30H),转向LOOP1;若A&(30H),则转向LOOP2,若A&(30H),则转向LOOP3。设所存的都是补码 数。A&0, A≥0, A&0, A≥0,B≥0 则A&B B&0 则A&B B&0 则用CJNE指令比较判断 B≥0 则用CJNE指令比较判断1、首先判断操作数的正负。可以将操作数和立即数80H相与,若 结果为零,则为正数,否则,就为负数。 2、然后再用CJNE指令和JC (JNC)指令形成三个分支。 MOV R0,A;暂存A ANL A,#80H ;判别A的正负JNZ NEGMOV A,30H ANL A,#80H;A&0,则转NEG;A≥0,顺序执行 ;判别(30H)的正负JNZ LOOP2SJMP COMP;(30H)&0,则A&30H;(30H)≥ 0,转向COMPNEG:MOV A,30H;ANL A,#80H ;再次判别(30H)的正负JZ LOOP3 ;(30H) ≥ 0,则A&(30H) COMP:MOV A,R0;取出原A值CJNE A,30H,NEXT;比较A与(30H)SJMP LOOP1 ;A=(30H)转LOOP1 NEXT:JNC LOOP2;A&(30H)转LOOP2JC LOOP3;A&(30H)转LOOP3 以bit内容为条件的转移指令? ? ?JB bit, rel(指定位状态为1转移) JBC bit, rel(指定位状态为1转移,并使该位清0) JNB bit, rel(指定位状态为0转移)JBC指令相当与两条指令的功能。JB bit,NEXT┋NEXT: CLR bit 【例】判断累加器中数的正负,为负则跳转到NEG:ANL A,#80H JNZ NEG等价于: JB ACC.7,NEG 一、作业? ? ?简述80C51单片机指令的寻址方式有哪些,并举例说明。 访问特殊功能寄存器SFR,可使用哪些寻址方式? 访问内部RAM、外部RAM单元、程序存储器,分别可使用哪 些寻址方式? 编写程序,把A中的高低半字节分别转换为ASCII码,并存 入R1(高位)、R2(低位)。例:若(A)=4AH,则(R1)=34H, (R2)=41H。? 二、作业?P75 4?在m和m+1单元中存有两个BCD数,将它们合并 到m单元中。编写程序完成。 将内部RAM中从data单元开始的10个无符号数 相加,其和送sum单元。假定相加结果小于255. 编写程序完成。?P75 5? 思考与练习 ?80C51指令系统有几种寻址方式?如果要对特殊功 能寄存器进行操作将使用哪种寻址方式???寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、 变址寻址、位寻址、相对寻址 寄存器寻址 直接寻址?80C51程序段中,怎样识别位地址和字节地址??是否有C参与数据传送类指令、算术运算类指令、逻辑运算及移位 类指令、控制转移类指令和位操作类指令?51指令系统按其操作功能分几大类?? 【例】设R0的内容为32H,A的内容为48H,内部 RAM 32H内容的80H,40H内容为08H,请指出在执 行下列程序段后各单元内容的变化。MOV A,@R0MOV MOV MOV MOVR0 32HMOV A,@R0MOV @ R0,40H MOV 40H,A@ R0,40H 40H,A R0,#40H @ R0,A40H 08HA 48H32H 80H80H08H 80HMOV R0,#40HMOV @ R0,A40H80H 阅读下列程序,说明其功能MOV MOV RL MOV RL RL ADD MOV R0, A, A R1, A A A, @R0, #30H @R0 AR1 A(30H)变为(30H)×10 已知(A)=7AH,(R0)=30H,(30H)=A5H,(PSW)=80H,问执行下列各 指令后的结果(每条指令相互独立)。⑴ XCH A, R0 ;(A)= ;(R0)= ⑵ XCH A, 30H;(A)= ;(30H)= ⑶ XCH A, @R0;(A)= ⑸ SWAP A ⑹ ADD A, R0 ;(A)= ;(A)= ;(Cy)= ;(OV)= ;(A)=30H;(R0)=7AH ;(A)=A5H;(30H)=7AH ;(A)=75H;(R0)=30H;(30H)=AAH ;(A)=A7H ;(A)=0AAH;(Cy)=0;(OV)=0 ;(A)=1FH;(Cy)=1;(OV)=1 ;(A)=20H;(Cy)=1;(OV)=1 ;(A)= 4AH;(Cy)=0;(OV)=0;(R0)= ;(30H)= ;(A)=A5H;(R0)=30H;(30H)=7AH⑷ XCHD A, @R0;(A)=;(R0)= ;(30H)=⑺ ADD A, 30H;(A)= ;(Cy)= ;(OV)= ⑻ ADDC A, 30H;(A)= ;(Cy)= ;(OV)= ⑼ SUBB A, 30H;(A)= ⑽ SUBB A, #30H;(A)= ;(Cy)= ;(OV)=;(Cy)= ;(OV)= ;(A)=C5H;(Cy)=1;(OV)=1 【例】编程实现把外部RAM中从8000H开始的 100个字节数据传送到8100H开始的单元中。MOV R0,#100 MOV DPL,#00H LOOP: MOV DPH,#80H MOVX A,@DPTR MOV DPH,#81H MOVX @DPTR,A INC DPL DJNZ R0,LOOP MOV R0,#00 LOOP: MOV P2,#80H MOVX A,@R0 MOV P2,#81H MOVX @R0,A INC R0 CJNE R0,#100,LOOP或 【例】从内部RAM的24H单元开始存放有30个用ASCII码表示 的字符和数据,现要找B字符,如果找到字符就转移到其处 理程序,若找不到B直至找完则停机。试编程。MOV R0,#30 MOV R1,#23H LOOP:INC R1CJNE @R1,’B’,NEXT SJMP B_PROCESSINGNEXT:DJNZ R0,LOOP SJMP ENDEXP B_PROCESSING: … ENDEXP:SJMP $ 【例】设逻辑表达式为:Y=A(B+C)+D(E+C) ,其中变量A、B、 C分别为P1.0、 P1.4、TF1,D、E、F分别为22H.0、22H.3、 IE1,输出变量Y为P1.5,试编写实现上述逻辑式的汇编程序。 MOV C,P1.4ORL C,TF1ANL C,P1.0 MOV P1.5,CMOV C,22H.3ORL C,IE1 ANL C,22H.0 ORL C,P1.5 MOV P1.5,C 【例】试编一程序将内部RAM的30H~3FH单元 数据传送到外部RAM首址为0F00H的单元中去。MOV R0,#30H MOV DPTR,#0F00H LOOP:MOV A,@R0 MOVX A,@DPTR INC R0 INC DPTR CJNE R0,#40H,LOOP 【例】试编程将内部RAM的26H单元 位2、4、6取反后送P1口。CPL 26H.2 CPL 26H.4CPL 26H.6MOV A,26HMOV P1,A 【例】有两块数据分别在内部RAM的20H~29H、 30H~39H,现将两块数据对换,试编程。MOV A,@R0 XCH A,@R1 MOV @R0,A 【例】MCS-51有哪些逻辑操作功能?设(A)=B, (R4)=B,请分别写出它们进行“与”、“或”、 “异或”操作结果。若将R4内容取反试用什么指令实现?与:B 或:B 异或:B MOV A,R4CPL AMOV R4,A 阅读程序写出结果MOV 21H,#5AH MOV R0,#21H MOV R1,#2FH MOV A,@R0 CPL A MOV @R1,A INC R0 RL A MOV @R0,A MOV 00H,#78H SETB ACC.2 CLR 09H(R0)= (R1)= (21H)= (22H)= (2FH)=(R0)=22H (R1)= 2FH (21H)=58H (22H)=4AH (2FH)=A5H MOV MOV RR MOV SWAP DEC MOV MOV MUL SETB SETB MOV MOV MOV XRL INC SJMPR0,#30H A,#3 A @R0 ,A A R0 @R0,A B,#8 AB B.7 C 7EH,C 00H,#40H @R0,A A,#0FFH R0 $(B)=80H (R0)=30H (30H)=01H (41H)=**结果: (A)=7FH (Cy)=1 (2FH)=80H (40H)= ** 如图所示的显示器 接口电路,请编写 一显示子程序,能 将代码存于RAM 20H 中的字符显示在共 阴极七段LED显示器 上。DISPLAY:MOV A,20H MOV P1,A RET 结束!}

我要回帖

更多关于 keil 添加单片机型号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信