好文档 - 专业文书写作范文服务资料分享网站

51单片机教程

天下 分享 时间: 加入收藏 我要投稿 点赞

指令说明将累加器A逐位取反相当于数字电路的非逻辑例如A=12H CPL A 12H化为二进制是00010010逻辑取反后为11101101即A=EDH (3) RL A

指令说明将累加器A的值逻辑左移例如A=12H RL A化为二进制为00010010逐位左移后为0010100即24H这里把第7位移到了第0第0位移到了第1位第1位移到了第2位其余的依次类推 4RLC A

指令说明加上进位位CY并逻辑左移例如CY=1 A=12H RLC A加上进位位CY后1 00010010逻辑左移变为0 00100101即CY=0A=25H 5RR A

指令说明将累加器A中的值逻辑右移同RL A类似 6RRC A

指令说明加上进位位CY并逻辑右移同RLC A类似 7SWAP A

指令说明将A中的值的高低4位进行交换例如A=39HSWAP A之后A中的值就是93H怎么正好是这么前后交换呢因为这是一个十六进制数每1个十六进位数代表4个二进制数注意?如果是这样的A=39D后面没加H执行SWAP A之后可不是A=93要将它化成二进制数再算39D化为二进制是10111也就是00010111高4位是0001低4位是0111交换后是01110001也就是71H即113D 2两个寄存器之间的逻辑运算指令

上面的指令都是针对累加器A的逻辑运算指令也就是说对一个寄存器的逻辑运算那么如果两个寄存器之间的逻辑运算又是怎么样的呢接着往下看

1ANL A,Rn A与Rn中的值按位与'结果送入A中

ANL A,direct A与direct中的值按位与'结果送入A中

ANL A,@Ri A与间址寻址单元@Ri中的值按位与'结果送入A中 ANL A,#data A与立即数data按位与'结果送入A中

ANL direct,A direct中值与A中的值按位与'结果送入direct中

ANL direct,#data direct中的值与立即数data按位与'结果送入direct中

指令说明什么是逻辑与数字电路中我们已经学过就是F=A*B简记为全1出1有0出0如果忘了没关系找本书再看一下这里就不详细的阐述了

例如71H和56H相与将两数写成二进制形式71H 01110001 和56H 00100110逐位相与结果 就是00100000 即20H从上面的例子可以看出两个参与运算的值只要其中有一个位上是0则这位的结果就是0两个同是1结果才是1是不是符合逻辑与的结果

知道了逻辑与指令的功能后逻辑或和逻辑异或的功能就很简单了逻辑或是逐位相或即有1出1全0出0例71H和56H相或结果就是77H而异或则是逐位异或即相同出0相异出1仍旧71H和56H相异或结果是57H两个寄存器之间的逻辑或以及逻辑异或的指令如下

2ORL A,Rn A与Rn中的值按位或'结果送入A中

ORL A,direct A与direct中的值按位或'结果送入A中

ORL A,@Ri A与间址寻址单元@Ri中的值按位或'结果送入A中 ORL A,#data A与立即数data按位或'结果送入A中

ORL direct,A direct中值与A中的值按位或'结果送入direct中

ORL direct,#data direct中的值与立即数data按位或'结果送入direct中 3XRL A,Rn A与Rn中的值按位异或'结果送入A中

XRL A,direct A与direct中的值按位异或'结果送入A中

44

XRL A,@Ri A与间址寻址单元@Ri中的值按位异或'结果送入A中 XRL A,#data A与立即数data按位异或'结果送入A中

XRL direct,A direct中值与A中的值按位异或'结果送入direct中

XRL direct,#datadirect中的值与立即数data按位异或'结果送direct中

连续好几节课将讲了许多的基本知识大家是不是又觉得有些枯燥和无聊了别急,接下来让我们轻松一下做一个实验来证明一下几节课所学的内容 三LED灯流动的实验这是很经典的哦 1实验程序

ORG 0000H ; LJMP START ; ORG 30H ; START:MOV SP,#5FH ; MOV A,#80H ; LOOP:MOV P1,A ; RL A ; LCALL DELAY ; LJMP LOOP ; DELAY:MOV R7,#255 ; D1:MOV R6,#255 ; D2:NOP NOP NOP NOP

DJNZ R6,D2 ; DJNZ R7,D1 ; RET ; END

好久没做实验了大家还记得实验的步骤吗调试编译下载看到了什么有一个暗点在流动想象一下如果我们把P1.0-1.7的LED换成8只可控硅来控制霓虹灯是不是就有点实用价值了

2程序分析

前面的ORG 0000HLJMP STARTORG 30H我们都讲过了从START开始MOV SP#5FH这叫初始化堆栈在本程序中有无此句无关紧要不过我们慢慢开始接触正规的编程我也就慢慢地给大家培养习惯吧MOV A#80H将80H这个数送到A中去干什么呢不知道往下看MOV P1A将A中的值送到P1端口去此时A中的值是80H所以送出去的也就是80H因此P1口的值是80H也就是二进制10000000对应P1.7-P1.0这8位我们应当知道此时P1.7接的LED8是不亮的而其它的LED都是亮的所以就形成了一个暗点继续往下看RL A将A中的值进行左移算一下移之后的结果是什么对了是01H也就是二进制00000001这样应当是接在P1.0上的LED1不亮了而其它的都亮了从现象上看就是暗点移到了后面然后是调用延时程序这里有一条指令NOP它是空操作指令也就是什么都不做用于短暂的延时其他的指令我们很熟悉了就是让这个暗点暗一会儿然后又跳转到LOOP处LJMP LOOP请大家计算一下下面该哪个灯不亮了对了应当是接在P1.1上灯不亮了这样依次不断的循环就形成了暗点流动的现象 3提几个要求继续实验 1如何实现亮点流动 2如何改变流动的方向

45

3如何实现几个灯的同时流动? 四指令练习

结合前面所学习的知识自己进行练习

请写出下列每条指令的执行结果并用DUG8051软件进行验证看结果是否正确 MOV A#24H MOV R0#37H ORL AR0 XRL A#29H MOV 35H#10H ORL 35H#29H MOV R0#35H ANL A@R0 五本课总结

本课的主要内容是算术运算类指令和逻辑运算类指令在很多的教科书中都把它们归为一类可见它们之间还是有一定联系的大家可以自行找一下其中的规律这里再罗嗦一句学习单片机重在实践希望大家多多动手哦只有通过动手才能掌握课堂知识 六第13课习题

1 算术运算类指令和逻辑运算类指令的区别在哪里

逻辑与逻辑或逻辑异或的运算结果是什么 2

什么是有符号数? 无符号数?什么是整数?什么是浮点数? 3

计算一下68H+ADH的加法结果 4

46

第十四课 单片机的指令

控制转移类指令 一

控制转移类指令共有17条分为无条件转移指令条件转移指令和返回及调用指令三大类下面我们分别加以学习

1无条件转移类指令

1无条件绝对转移指令AJMP addr11 2无条件长转移指令LJMP addr16 3无条件相对转移指令SJMP rel

在讲解上面这三条指令之前先来认识一下三个符号add11add16rel其中add11和add16表示外部ROM的16位和11位地址前面我们已经讲过单片机的外部ROM可以扩展到64Kadd16就表示64K程序存储器的任何地址换句话说LJMP指令可以跳转到程序的任何地方而add11则表示下一条指令的2K页面也就是说SJMP指令只能跳转到程序的2K范围之内rel表示8位的偏移量其范围是下一条指令第一字节的前128到后127个字节(即-128-+127)介绍完了三个符号再看上面的三条转移类指令如果要仔细分析的话它们之间其实区别很大但在初学时我们可以不理会这么多统统把它们理解成*JMP 标号比如SJMP LOOP就是跳转到有LOOP标号处原则上所有用SJMP或AJMP的地方都可以用LJMP来替代因此在初学时需要跳转时可以全不采用LJMP代替下面再来看第4条跳转指令

4无条件间接转移指令JMP @A+DPTR

这条指令的用途也是跳转跳转到什么地方去呢这可不能由标号简单地决定了让我们从一个实际的例子入手吧

MOV DPTR#TAB 将TAB所代表的地址送入DPTR MOV AR0 从R0中取数详见下面说明 MOV B#2 MUL AB

详见下面的说明 A中的值乘2

JMP A@A+DPTR 跳转

TAB: AJMP S1 跳转表格 AJMP S2 AJMP S3

应用背景介绍在单片机开发中经常要用到键盘见下面的9个按键的键盘图我们的要求是当按下功能键AG时去完成不同的功能这用程序设计语言来表达的话就是按下不同的键去执行不同的程序段以完成不同的功能怎么样来实现这个功能呢

看图前面的程序读入的是按键的值如按下A'键后获得的键值是0按下B'键后获得的值是1等等然后根据不同的值进行跳转如键值为0就转到S1处执行如键值为1就转到S2处执行到底如何来实现这一功能呢

先从程序的下面看起是若干条AJMP语句这若干条AJMP语句最后在存储器中是这样存放的见图也就是每个AJMP语句都占用了两个存储器的空间并且是连续存放的而AJMP S1存放的地址是

47

TAB 到底TAB等于多少我们不需要知道把它留给汇编程序来算好了

下面我们来看这段程序的执行过程第1条MOV DPTR#TAB执行完了之后DPTR中的值就是TAB第2条是MOV AR0我们假设R0是由按键处理程序获得的键值比如按下A键R0中的值是0按下B键R0中的值是1以此类推现在我们假设按下的是B键则执行完第2条指令后A中的值就是1并且按照我们的分析按下B后应当执行S2这段程序让我们来看一看是否是这样呢第3条第4条指令是将A中的值乘2即执行完第4条指令后A中的值是2下面就执行JMP @A+DPTR了现在DPTR中的值是TAB而A+DPTR后就是TAB+2因此执行完这条程序后将会跳到TAB+2这个地址处继续执行看一看在TAB+2这个地址里面放的是什么就是AJMP S2这条指令因此马上又执行AJMP S2这条指令程序将跳到S2处往下执行这与我们的要求相符合请大家自行分析按下键ACD之后的情况

这样我们用JMP @A+DPTR这条指令就实现了按下一个键跳转到相应程序段去执行的这样一个要求再提一个问题为什么取得键值后要乘2呢如果例程下面的所有指令换成LJMP即LJMP

这段程序还能正确地执行吗如果不能应该怎么改 S1,LJMP S2

条件转移类指令

条件转移类指令就是在满足一定的条件后进行相对转移

累加器为0转移指令JZ rel 累加器非0转移指令 JNZ rel

第条指令的功能是如果(A)=0则转移否则顺序执行执行本指令的下一条指令转移到什么地方去呢如果按照传统的方法就要算偏移量很麻烦好在现在我们可以借助于机器汇编了因此这条指令我们可以这样理解JZ 标号即转移到标号处下面举一个例子来加以说明

MOV AR0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END

在执行上面这段程序前如果R0中的值是0的话就转移到L1标号处执行因此最终的执行结果是R1中的值为0FFH而如果R0中的值不等于0则顺序执行也就是执行 MOV R1#00H指令

48

51单片机教程

指令说明将累加器A逐位取反相当于数字电路的非逻辑例如A=12HCPLA12H化为二进制是00010010逻辑取反后为11101101即A=EDH(3)RLA指令说明将累加器A的值逻辑左移例如A=12HRLA化为二进制为00010010逐位左移后为0010100即24H这里把第7位移到了第0第0位移到了第1位第1位移到了第2位其余的依次类推
推荐度:
点击下载文档文档为doc格式
6dlnp7qvor0wk4t3w2fu
领取福利

微信扫码领取福利

微信扫码分享