条件转移指令:
条件转移指令是指在满足一定条件时进行相对转移。
判A内容是否为0转移指令
JZ rel
JNZ rel
第一指令的功能是:如果(A)=0,则转移,否则顺序执行(执行本指令的下一条指令)。转移到什么地方去呢?如果按照传统的方法,就要算偏移量,很麻烦,好在现在我们可以借助于机器汇编了。因此这第指令我们可以这样理解:JZ 标号。即转移到标号处。下面举一例说明:
MOV A,R0
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指令。最终的执行结果是R1中的值等于0。
第一条指令的功能清楚了,第二条当然就好理解了,如果A中的值不等于0,就转移。把上面的那个例子中的JZ改成JNZ试试吧,看看程序执行的结果是什么?
比较转移指令
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移,同样地,我们可以将rel理解成标号,即:CJNE A,#data,标号。这样利用这条指令,我们就可以判断两数是否相等,这在很多场合是非常有用的。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相等,则CPU还会反映出哪个数大,哪个数小,这是用CY(进位位)来实现的。如果前面的数(A中的)大,则CY=0,否则CY=1,因此在程序转移后再次利用CY就可判断出A中的数比data大还是小了。
例:
MOV A,R0
CJNE A,#10H,L1
MOV R1,#0FFH
AJMP L3
L1: JC L2
MOV R1,#0AAH
AJMP L3
L2: MOV R1,#0FFH
L3: SJMP L3
上面的程序中有一条指令我们还没学过,即JC,这条指令的原型是JC rel,作用和上面的JZ类似,但是它是判CY是0,还是1进行转移,如果CY=1,则转移到JC后面的标号处执行,如果CY=0则顺序执行(执行它的下面一条指令)。
分析一下上面的程序,如果(A)=10H,则顺序执行,即R1=0。如果(A)不等于10H,则转到L1处继续执行,在L1处,再次进行判断,如果(A)>10H,则CY=1,将顺序执行,即执行MOV R1,#0AAH指令,而如果(A)<10H,则将转移到L2处指行,即执行MOV R1,#0FFH指令。因此最终结果是:本程序执行前,如果(R0)=10H,则(R1)=00H,如果(R0)>10H,则(R1)=0AAH,如果(R0)<10H,则(R1)=0FFH。
弄懂了这条指令,其它的几条就类似了,第二条是把A当中的值和直接地址中的值比较,第三条则是将直接地址中的值和立即数比较,第四条是将间址寻址得到的数和立即数比较,这里就不详谈了,下面给出几个相应的例子。
CJNE A,10H ;把A中的值和10H中的值比较(注意和上题的区别)
CJNE 10H,#35H ;把10H中的值和35H中的值比较
CJNE @R0,#35H ;把R0中的值作为地址,从此地址中取数并和35H比较
循环转移指令
DJNZ Rn,rel
DJNZ direct,rel
第一条指令在前面的例子中有详细的分析,这里就不多谈了。第二条指令,只是将Rn改成直接地址,其它一样,也不多说了,给一个例子。
DJNZ 10H,LOOP
3.调用与返回指令
(1)主程序与子程序在前面的灯的实验中,我们已用到过了子程序,只是我们并没有明确地介绍。子程序是干什么用的,为什么要用子程序技术呢?举个例子,我们数据老师布置了10道算术题,经过观察,每一道题中都包含一个(3*5+2)*3的运算,我们可以有两种选择,第一种,每做一道题,都把这个算式算一遍,第二种选择,我们可以先把这个结果算出来,也就是51,放在一边,然后要用到这个算式时就将51代进去。这两种方法哪种更好呢?不必多言。设计程序时也是这样,有时一个功能会在程序的不同地方反复使用,我们就可以把这个功能做成一段程序,每次需要用到这个功能时就“调用”一下。
(2)调用及回过程:主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行,不能“一去不回头”,那么回到什么地方呢?是回到调用子程序的下面一条指令继续执行(当然啦,要是还回到这条指令,不又要再调用子程序了吗?那可就没完没了了……)。参考图1
调用指令
LCALL addr16 ;长调用指令
ACALL addr11 ;短调用指令
上面两条指令都是在主程序中调用子程序,两者有一定的区别,但在初学时,可以不加以区分,而且可以用LCALL 标号,ACALL 标号,来理解,即调用子程序。
(5)返回指令 则说了,子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了,即执行
ret
指令
4.空操作指令
nop
空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。
关键字:单片机 条件转移 循环转移
引用地址:
单片机知识(五)
推荐阅读最新更新时间:2024-03-16 14:47
基于单片机的生日快乐歌
#include reg51.h #define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; //生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar code SONG_TONE = {212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0}; //生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar code SONG_LONG = {9,3,12,12,12,24,9,3,12
[单片机]
轮式移动机器人的循迹设计
1 智能循迹小车总体设计方案 1.1 整体设计方案 1)根据设计要求,确定控制方案。 2)利用Proteus设计合理的硬件原理图。 3)画出程序流程图,使用C语言进行编程。 4)在洞洞板上焊接元器件,然后往单片机内烧录程序。 5)进行调试以实现控制功能。 1.2 整体控制方案确定 图1为智能循迹小车的系统控制框图。黑色引导线是小车进行跟踪的目标,循迹传感器对目标轨迹进行检测,然后将得到的信息反馈给单片机进行处理,单片机处理后给电机驱动发出控制信号对两个直流电机进行控制,从而确保小车可以沿预定的路线正确行驶。 本设计使用两节3,7 V充电电池对整个系统进行供电,主控芯片为STC公司的89C52,直流电机的驱动模块
[单片机]
MSP430单片机与多功能电话留言系统设计
前言
MSP430是最近被中国引进的微处理器。它在超低功耗方面有突出的表现,被业界称为绿色MCU。同时它内部有丰富的片内外围模块,是一个典型的片上系统(SOC)。又是16位的精简指令结构,功能相当强大,被广泛应用于嵌入式系统和智能设备。
一、MSP430系列单片机介绍
TI公司设计的MSP430系列单片机是一种超低功耗的混合信号微控制器。这些微控制器通过16位RISC结构、CPU中的16个寄存器和常数发生器使 MSP430微控制器能达到最高的代码效率;灵活的时钟源可以使器件达到最低的功率消耗;数字控制的振荡器(DCO)可使器件从低功耗模式迅速唤醒,在少于6us的时间内激活到活跃的工作方式。MSP430的
[单片机]
单片机控制的遥控步进电机程序
;遥控电机程序, 按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转 ;0-9步,同时数码管分别显示当前的数字! ;*************************************************************************** org 00h JMP MAIN ORG 30H MAIN: MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH START: JB P3.7,$ ;等待遥控信号出现 SB: MOV R4,#8 ;8毫秒为高 电平 错误 SBA: MOV R5,#250 SBB: JB P3.7,SXB1 DJNZ R5,SBB DJNZ
[单片机]
STMCU应用过程中与电源相关的案例分享
我们在从事STM32单片机的应用开发及调试过程中,往往会碰到各类异常。其中有不少比例的问题跟电源有关。对于一个电子产品而言,电源部分很关键、很重要,但在实际开发调试中,我们偶尔会有意无意的忽视它。这里分享几个实际案例,以加强刺激,加深印象。 毕竟因为电源问题可能导致的异常很多很多,这里分享几个案例算是抛砖引玉,希望大家在调试中对电源方面加以重视。个人认为,往往电源出问题时导致的异常时并不太好分析。多数时候异常表现得更为诡异或没章法。 注:下面提到的案例中异常原因都与电源有关,但并不是说出现类似异常时一定是电源的原因。 下面主要分享五个基于STM32应用的案例。 案例1:STM32芯片的PLL无法正常工作。 有人使用STM3
[单片机]
HOLTEK推出BS82D20A-3 Flash触控单片机
继BS82C16A-3之后,Holtek再度推出新一代内建LED/LCD Driver的Flash触控MCU BS82D20A-3,支持高达20个触控按键,除了保有上一代的优点之外还比上一代触控MCU更省电、触控侦测的更新率更高,并且抗干扰的能力更好,而内建的LED/LCD Driver更俱备4段电流输出控制,可直推LED/LCD不须外挂限流电阻或三极管,大幅简化产品应用零件及降低成本,非常适合于俱备LED/LCD的小家电触控面板应用,BS82D20A-3同时也支持I²C/UART界面,可当主控IC亦可搭配主控MCU专门负责触控按键的侦测或LED/LCD的显示。 BS82D20A-3的特点在于工规 (-40℃ ~ 8
[单片机]
基于单片机的电子琴设计和硬件平台设计
1课题任务 本课题主要是设计一个基于51单片机的开发系统平台,开发平台需包括的基础硬件有:12864液晶显示器、8位发光二极管指示器、TLC5616模块、ADC0832数模转换、蜂鸣器电路、DS18B20温度传感器电路、4*4矩阵电路和DS1302时钟模块。然后根据51单片机开发平台自行设计一个基于51单片机电子琴设计。 设计单片机开发硬件平台 单片机硬件开发平台的基础硬件有:蜂鸣器、LED、LCD12864、TLC5615、ADC0832、DS18B20、DS1302、44矩阵按键和USB-TTL。USB-TTL用于下载程序和给主控供电;蜂鸣器、8位LED和LCD12864是作为开发板的指示部分,其中,蜂鸣器可提供声音警报,
[单片机]
51单片机(STC15W408AS)映射printf函数 串口收发实现
前提:实现串口收发数据 /************************************************* *函数名称:char putchar(char c) *功 能:映射printf *参 数:char c *返 回 值:char *************************************************/ char putchar(char c) { UartPutc((uint8_t)c);//把自己实现的串口打印一字节数
[单片机]