慎用51单片机中的RET指令

发布者:TranquilSoul最新更新时间:2016-05-17 来源: eefocus关键字:51单片机  RET指令 手机看文章 扫描二维码
随时随地手机看文章
 题目:已知有四个按键依次连接单片机中的P3口的0到3的IO口,有四个LED灯连接P1的0到3 IO口,写一程序,满足以下条件:当按下按一个按键,对应的LED会发亮,比如

按下P3.0的按键,连接P1.0的LED就发亮。y

以下是我同学编写的程序:

org 0000h
mov P1,#0ffh
loop:
jnb P3.0,led1;*
jnb P3.1,led2;*
jnb P3.2,led3;*
jnb P3.3,led4;*
ljmp loop
led1:
clr P1.0
ret
led2:
clr P1.1
ret
led3:
clr P1.2
ret
led4:
clr P1.3
ret
end 

程序的意图是,制造一个死循环,不断检查按键是否按下,如果按下,就令对应的灯亮。程序经过测试,能够满足题目的要求。

 

但是,问题出现在上面带*号的那一部分代码,程序意图是想要当P3的某个位为0的时候,就调用LED灯的子程序,执行CLR P1.0语句,再返回到原来程序调用子程序的地方继续执行代码。

 

我对的子程序的理解是:在一个地方启动一段代码,当这段代码运行完毕之后,就返回到原来的地方继续运行剩下的代码。

 

那么CPU单片机是如何返回原来的地址的呢?

 

首先,当程序执行到A处进入子程序时,将A的下一个条指令(即PC+2所指的地方)压入栈中,即将栈指针SP+1,PCL进栈,SP再加1,PCH进栈。

 

然后,把PC的值改为子程序代码的入口。

 

子程序执行完毕之后,从栈中弹出原来的PC值,赋值给当前的PC寄存器。


最后,程序返回到原来调用子程序的地方的下一条指令继续运行。

(详细步骤请查看RET和ACALL,LCALL指令)

 

上面的代码很明显想调用一个子程序,但是51单片机中,只有ACALL和LCALL指令会在跳转前讲PC+2值压栈,其他跳转指令都不会。

 

代码中使用了JNB作为跳转指令,所以并没有压栈,但是当跳转之后遇到RET,还是一如既往地弹栈,这样,只有出,没有进,会导致堆栈不平衡。

 

但为什么这个程序依然有效呢?

 

这个因为SP初始指针指向了一个空白的单元(全是0),所以,当遇到RET后,把PC寄存器给初始化,程序由头开始重新执行,阴差阳错地满足的题目的要求。

 

所以RET指令必须和ACALL和LCALL配套使用,才能组成为真正意义上的子程序

关键字:51单片机  RET指令 引用地址:慎用51单片机中的RET指令

上一篇:51特殊功能寄存器
下一篇:51单片机中的串口中断模式

推荐阅读最新更新时间:2024-03-16 14:54

51单片机矩阵键盘C程序
主程序1: void main() { uchar i,j,k i=0; j=0; while(1) { i=key();//键盘循环扫描,其值赋给变量数组table if(i!=0)//键盘子程序返回值非0,即有按键按下 { table =i;//将值存在变量数组中 j++; } if(j==6) { j=0; for(k=0;k 6;k++)//当数组存满6位时核对 { P3=table ;//P3接有一排指示灯 delay (1000);
[单片机]
按键控制51单片机上面硬件的功能
按键一二三对应51单片机上不同的功能 例如跑马灯,蜂鸣器,呼吸灯,中断之类的 #define FSCLK 11059200 //晶振频率为 11.0592MHz #include STC12C5A60S2.h #include key_scan.h #include intrins.h #define LED_PORT P0 sbit BEEP=P1^4; unsigned int n = 0; unsigned int t = 0; unsigned char xx = 127; unsigned char p; unsigned char m; #define uchar unsig
[单片机]
基于51单片机的超声波测距设计(带温度补偿)
利用STC89C52单片机、超声波模块(HC-RS04)、DS18B20数字温度传感器和LCD1602液晶显示模块制作一个超声波测距仪,液晶屏第一行显示温度和超声波速度“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”。 所设计的测距仪测量单位为米,精确到小数点后面3位(毫米),测量范围:0.05m~5m。 (一)基本部分 1、液晶显示功能 (1)开机时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=0.000m” (2)操作对应的功能按键时,液晶屏第一行显示温度和超声波速度,例如“T:30°C V:349m/s”,第二行显示测量距离“S=X.XXXm”
[单片机]
汇编写51单片机之循环点亮LED
二话不说,先上代码: ORG 0000H AJMP MAIN MAIN:SETB P1.0 LCALL DELAY CLR P1.0 LCALL DELAYA AJMP MAIN DELAY: MOV R7,#255 D1: MOV R6,#255 D2: DJNZ R6,D2 DJNZ R7,D1 RET DELAYA: MOV R7,#100 K1: MOV R6,#100 K2: DJNZ R6,K2 DJNZ R7,K1 RET END 让我从头到尾来分析这整个程序:首先,这段程序是用于循环点亮P1.0这个灯的。 ORG 0000H ;这句话我们说过他的作用了,不懂的往前看。 AJMP MAIN ;这句话分成两个部
[单片机]
51单片机—串口通信
. 串行通讯与并行通信 数字信号是八位二进制数,可以使用信号线传输,一种方案是使用一条数据线按照次序一位一位的传送,每传送完8位为一个字节,这就是串行通信。还有一种方法是使用八条数据线同时传送8个位的数据,一次传送一个字节,这就是并行通信。 俩种通信方式图示如下: 并行通信 特点为传输速度快,控制简单,但远距离传输时成本较高且接收方同时接收各位比较难 串行通信 特点为传输线少,远距离传输时成本低,但数据传输比并行通信复杂 同步通信与异步通信 串行通信分为同步通信与异步通信 1.同步通信 顾名思义,同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。数据以位的形式连续发送,且传送的字符之
[单片机]
<font color='red'>51单片机</font>—串口通信
基于C51单片机的多路开关状态显示电路原理图
如下图所示, AT89S51 单片机的 P1.0 - P1.3 接四个发光二极管 L1 - L4 ,P1.4 - P1.7 接了四个开关 K1 - K4 ,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 1 . 把 “ 单片机系统 ” 区域中的 P1.0 - P1.3 用导线连接到 “ 八路发光二极管指示模块 ” 区域中的 L1 - L4 端口上; 2 . 把 “ 单片机系统 ” 区域中的 P1.4 - P1.7 用导线连接到 “ 四路拨动开关 ” 区域中的 K1 - K4 端口上。
[单片机]
基于C<font color='red'>51单片机</font>的多路开关状态显示电路原理图
光照强度预警器(AD转换)
本程序与MQ-3酒精浓度报警器一样,都是将对应的模拟信号转换为数字信号,然后通过单片机监控预警,程序也基本相同,接线方法也一样,AD转换器型号为AD0804。相关工程文件、开发板电路图以及模块资料在最下方附件下载。 关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。 /*************************************说明*********************************** 此程序只采集模块信号的大小 需要转换为对应的值 还需要转换公式
[单片机]
基于51单片机P0口的片外数据存储器扩展
随着单片机运算速度和处理能力的不断提高,其在各个领域得到更广泛的应用。然而。随着其应用领域的不断扩大及集成化的不断提高,其内部资源已不能满足实际需求,往往需要对其内部资源进行扩展。经典的扩展方法主要是通过地址总线、数据总线即P0、P2口,以及控制线ALE、*****等来进行数据或程序存储器的扩展,最大寻址空间可达64KB,但这种方法占用端口较多,在有些情况下不能满足需求。这里以MCS-8051系列单片机为例,介绍一种新的片外数据存储器扩展方法,仅用单片机的P0口、P1.6及P1.7共10个端口便可实现256 KB数据存储器的扩展。 1 总体设计思路 MCS-8051单片机片内部存储空间为256 B,有P0、P1、P2、P
[单片机]
基于<font color='red'>51单片机</font>P0口的片外数据存储器扩展
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved