51单片机程序执行流程详细分析

最新更新时间:2015-03-14来源: 互联网关键字:51单片机  程序执行 手机看文章 扫描二维码
随时随地手机看文章
单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。

若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个念头起源于最初见到每个51程序里面的主函数里面最终都挂一个while(1);语句。为何要加一句while死循环让程序停留在main函数中呢。将while(1);语句去掉有什么影响么?

写一个很简单的程序试一下。

 

 

执行以上程序,由P1端口控制的流水灯闪了一下。程序最终进入while(1);里纠缠去了,这个到好解释。

现将while(1);语句屏蔽掉。我还以为程序不能被正确执行了呢,因为退出了main主函数,就像Render需要循环来实现一样(尽管刚刚闪灯的程序不在循环之内,但我还是不由产生了这一错觉)。程序执行的结果是:流水灯不停的闪烁!

看到这个现象后的猜想及动作^-^:

(1) 这块板坏了吧!(在带操作系统如linux字符界面下运行一个不带死循环的C语言文件完毕后就会返回到linux shell程序中)。赶紧换个板再测试一下,显然还是一样的结果。

(2) 单片机中将一直执行main函数中的最后一个(些)语句?(基于带OS平台下运行标准C语言文件的经验,可从来没有想过是main函数被多次调用或多次进入)

(3) 单片机内将C语言指令取出来加载到单片机内,单片机内自动生成一个主程序循环执行C语言中main函数的内容?(虽然很荒唐,还是想了)

(4) 赶快谷歌百度一下单片机的执行流程(虽然在谷歌百度时以“51单片机程序执行流程”搜索,没有搜到相关内容)。换朴实的搜索词:“51单片机 main”。然后就出现跟我一样带有疑问的问题:为什么main函数中不加while(1);语句之后程序会反复执行呢?回答的关键词包括“程序跑飞、看门狗、复位”。

(5) 趁上嵌入式的机会将“51单片机程序执行流程”搬出来并向老师讲述了我所写程序的得到的现象,包括我怎么验证呀等等。

老师的回答:Keil C51程序自动加载了一个名为”STARTUP.A51”的文件,在这个文件里面进行了一系列的初始化操作后进入用户编写的C语言程序入口main函数中,main函数执行完毕后,STARTUP.A51文件后有一句跳转到程序入口main函数的语句,所以会再次进入C语言主程序main函数中执行相关内容。

然后我用keil软件模拟了运行一下以上那一段代码:

 

 

程序开始运行就在程序入口main函数的第一条语句之处,Disassembly窗口是c语言代码与汇编代码相对应的窗口,前面是地址,后面的是C语言对应的汇编语句。下面的窗口是相应文件的运行代码的位置,由黄色箭头指向当前正要执行的代码。然后点击单步运行工具条,指导跳出main函数为止,程序跳转到STARTUP.A51中的以下代码位置:

 

 

继续点击单步调试直到进入一个循环中:

 

这里是一个循环,根据DJNZ指令的功能:每执行一次DJNZ RO, IDATALOOP就将R0的值减1,若R0的值不为0则就跳到IDATALOOP地址去。很显然这是一个循环,那么RO的值是多少呢,在以下窗口显示:

 

 

可见r0的初值为0x7f,这里将要循环0x7f(128)次,具体在这里r0值的含义可查看一下子的。那么在这个循环之后程序又将去哪里呢?跳过这个循环后程序运行的地方如下:

 

 

再单步运行一次:

 

 

根据Disassembly的内容,此条语句执行了就又要回到main函数中去了,执行一下试试:

 

 

是的!

所以,在51单片机中,程序的执行流程就是会不断( 以r0的值作为延迟条件, 具体含义可继续探索 )的进入main函数中执行main函数中的代码。

为什么我们在linux等上面运行不带死循环的C语言代码后程序就会自行终止呢?这是不同的操作流程:

(1) C51单片机不带OS(操作系统),代码的执行形势在此看来就由STARTUP.A51来安排了,没有一个更大的程序来管理怎么调用main函数。

(2) 像Linux这类的平台是带了OS的,运行一个C语言程序对linux来说就是一个任务,除了运行C语言程序这个任务外还有其它的任务。当运行一个C语言程序完毕时,此次的任务也算是完成了。如在linux shell界面运行一个文件名为“hello.c”功能为输出“hello world!”的C语言程序,过程如下:

编译:gcc hello.c –o hello

运行:./hello

在运行hello可执行文件时,可以当做是shell调用了hello这个可执行程序。在hello运行完毕后,将返回值等返回给shell界面。整个C语言文件的生死全有linux shell程序管理。

归其原因,还是代码规定的机制不一样吧。

关键字:51单片机  程序执行 编辑:探路者 引用地址:51单片机程序执行流程详细分析

上一篇:用FPGA来加速采用OpenCL的多功能打印机图像处理
下一篇:单片机程序设计中的“分层思想”

推荐阅读最新更新时间:2023-10-12 22:53

Proteus仿真51单片机C语言程序-单片机间双向通信
简介:单片机之间的双向通信:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。
[单片机]
Proteus仿真<font color='red'>51单片机</font>C语言<font color='red'>程序</font>-单片机间双向通信
50-基于51单片机的智能台灯设计
具体实现功能 系统由STC89C52单片机+L数码管+光敏电阻+人体感应模块+红外接近传感器模块构成。 具体功能: (1)亮度不够且有人靠近时台灯自动亮; (2)靠的太近会提醒坐姿不正(蜂鸣器); (3)附近无人时台灯自动熄灭(30秒),时间可调; (4)根据环境亮度调节等亮度; (5)可手动调节台灯亮度; (6)设定学习时间。 设计背景 台灯已是千家万户的必需生活用品,经常由于忘记关灯而造成巨大的能源浪费。当夜晚来临时,人们又摸黑去开灯,非常不方便。在这里设计了以人体红外辐射(波长为9.5um)传感控制电路。当人体在台灯的范围内且环境光强较弱时,自动感应开灯;当人体太靠近桌面时,台灯自动感应,
[单片机]
50-基于<font color='red'>51单片机</font>的智能台灯设计
MCS-51单片机实用子程序库(四)
(二) MCS-51 浮点运算子程序库及其使用说明 本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合: 1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。 2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、 数制转换等子程序。 3.大型库(FQ51.ASM):包含本说明书中的全部子程序。 为便于读者使用本程序库,先将有关约定说明如下: 1.双字节定点操作数:用 或 来表示存放在由R0或R1指示的连续单元中的数 据,地址小的单元存放高字节。如果 =1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。 2.二进制浮
[单片机]
51单片机控制LED显示汉字
用51单片机控制led显示汉字,电路中行方向由p0口和p2口完成扫描,由于p0口没有上拉电阻,因此接一个4.7k*8的排阻上拉。 如没有排阻,也可用8个普通的4.7k 1/8w电阻。为提供负载能力,接16个2n5551的NPN三极管驱动。 列方向则由4—16译码器74LS154完成扫描,它由89C51的P1.0---P1.3控制。同样,驱动部分则是16个2N5401的三极管完成的。 电路的供电为一片LM7805三端稳压器,耗电电流为100ma左右。 采用一块12*20cm的万能电路板,应当选用质量好些的发光管,(否则有坏点现象, 更换起来较麻烦)首先将256个发光管插入电路板,注意插入方向,同时使
[单片机]
<font color='red'>51单片机</font>控制LED显示汉字
51单片机的4X4矩阵键盘的C语言程序
#include AT89X52.H /////////////////////////////////////////数码管常量///////////////////////////////////////////////////////// unsigned char code table ={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90}; //LED段码 unsigned char code position ={1,2,4,8}; //LED选位码 //////////////////////////////
[单片机]
AT89C51单片机电话遥控报警器电路的设计
1 引 言 由于经济的快速发展,人们生活水平得到较大的提高,生活节奏也越来越快,为此家电遥控和家庭安全也为人们所需要和重视。以AT89C51单片机为核心通过电话进行电器遥控和报警装置主要解决这些问题。他的主要功能有:通过电话可以遥控16路电器通断,遥控路数可以根据需要进行扩展;可以实现电器调压调速控制,有密码设定,保密安全性好;有语言提示,避免盲目操作;可以取消已输入的操作命令;当单片机接收到家中天然气泄露、温度超限和失窃信号后会自动拨打预留电话并报告家中发生的情况。 2硬件电路设计 总体电路设计思路是:电话遥控报警器与家用电话采用并联方式,当有振铃信号时单片机开始记数,前10次铃声内若有人接电话,则遥控报警器被屏蔽,不影响正
[单片机]
AT89C<font color='red'>51单片机</font>电话遥控报警器电路的设计
基于ISP 的简约型51单片机实验板的设计
0 引言 现在市面上通用的51内核单片机主要有ATMEL公司的AT89S51、AT89S52系列,飞利浦公司的P89C51RXX系列和P89LPC900系列。其中AT公司的52系列是51系列的增强版本,飞利浦公司的P89C51RXX系列的内部功能跟AT89S51基本相同,都是增强型51内核。通过比较选择飞利浦公司的P89C51RA2BN单片机,该单片机内部有8K的FLASH ROM程序存储器,可以满足大部分的实验和小系统设计。而且该单片机跟AT89S52相比,还有内部PCA(可编程计数器阵列),和512字节的数据存储器,7个中断源和集成内部硬件看门狗。该单片机的引脚和普通51单片机完全兼容,可以做为51单片机的代换产品。另外
[单片机]
基于ISP 的简约型<font color='red'>51单片机</font>实验板的设计
89C51单片机+X25045构成的看门狗电路
采用89C51单片机和X25045组成的 看门狗电路 ,X25045硬件连接图如图1所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图1电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。   
[电源管理]
89C<font color='red'>51单片机</font>+X25045构成的看门狗电路
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved