51单片机程序深入编写裸机代码有助于了解硬件的特性

发布者:火箭飞人最新更新时间:2020-02-01 来源: elecfans关键字: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单片机程序深入编写裸机代码有助于了解硬件的特性

上一篇:基于单片机的电动模型汽车自动控制系统设计
下一篇:单片机测量三相电网功率因数的接口电路分析

推荐阅读最新更新时间:2024-10-12 16:07

DVB-S2中BCH译码器的硬件设计
1 引言 第二代数字卫星广播标准DVB-S2自发布以来一直广受关注,他采用了由BCH外码和LDPC内码级联而成的前向纠错编码(FEC)系统,有效地降低了系统解调门限,几乎可以接近香农限,此外还使用了多种具有高频带利用率的调制方式,大幅度提高了信道传输能力。DVB-S2技术上的突破扩大了他的应用范围,服务范围包括广播业务(BS)、数字新闻采集(DSNG)、数据分配/中继,以及Internet接人等交互式业务。同时新的编码技术使其可以工作在更为恶劣的信道环境中,保证了卫星传输的通信质量。卫星数字电视直播产业已经在全球形成发展热点,随着业务的拓展,数字卫星接收机将具有广阔的市场前景。 DVB-S2的前向纠错系统(FEC)中配合LDP
[应用]
基于TMS32OLF24O7A的教育机器人硬件系统设计
摘要:本论文的主要目的就是设计一种基于DSP的模块化教育机器人硬件系统。该教育机器人是以智能小车为载体基于 TMS320LF2407 A微控制器的嵌入式控制平台及编程环境的一款开放式的机器人控制系统,以各传感器模块设计应用为核心,采用模块化设计思想进行设计,包括系统总体框架的设计、无线通信模块和系统电源、电机驱动硬件电路模块的设计。 关键词:教育机器人; TMS320LF2407A ;传感器;硬件模块 0 引言 智能机器人作为一个高新科技的综合体,直接反应了一个国家信息技术的发展水平,受到了社会各界的高度重视。最近这些年,在我国大学里已经将机器人作为机械电子学、计算机技术、人工智能等的载体广泛适用于工科本科生的讲授课程,
[工业控制]
基于TMS32OLF24O7A的教育机器人<font color='red'>硬件</font>系统设计
51单片机 8255 18b20 数码管显示温度C程序
#include reg52.h #include absacc.h #include intrins.h #define uint unsigned int #define uchar unsigned char #define PA 0x7cff //PA口 #define PB 0x7dff //PB口 #define con 0x7fff //控制字 sbit A8=P2^0; //地址线A0 sbit A9=P2^1; //地址线A1 sbit cs=P2^7; //片选 sbit wr=P3^6; //读端口 uint temp; uchar tplsb
[单片机]
液位传感器的接线及其硬件组态
1、液位传感器及硬件接线       LT100 液位变送器是基于浮力原理设计,用于测量液位并传送测量数据的仪表,它适用于敞口或密封的各种容器,可输出4-20mA标准电流,还可进行界面液位的测量。液位传感器与S7-300模拟量模块的接线示意如图1所示。   图1 液位传感器与模拟量模块的接线示意       图2是采用6ES7331-7KF02-0AA0模拟量输入模块与LT100液位传感器的具体接线图。   图2 液位传感器与模拟量模块的具体接线 2、硬件组态       (1)模拟量模块的硬件组态如图3所示。   图3模拟量模块硬件组态       (2)进行常规属性设置。       (3)进行模拟量输入
[嵌入式]
51单片机锁存器详解
P0口作为分时复用接口,既要作为数据总线口,又要作为地址总线口 输出的低8位地址需要用8位锁存器锁存 ALE的下降沿将P0口输出的低8位地址锁存 • 对于锁存器: ○ /OE为输出使能端 § /OE有效时,三态门导通 § /OE无效时,三态门高阻(任何数据或信息都不能通过) ○ /LE为数据输入锁存信号 § /LE有效时(低电平),数据锁存在锁存器内 § /LE无效时(高电平),输入数据直通到锁存器输出端(下图绿色部分) • 当单片机与锁存器构成总线扩展电路时: ○ ALE-------/LE(或者是CP) ○ GND------/OE § ALE=1时,/LE无效,输入的地址
[单片机]
<font color='red'>51单片机</font>锁存器详解
ICO和传销,区别越来越小
币圈江湖,流传着不计其数的造富神话。然而对于处在币圈食物链底端的普通投资者,在疯狂的资本市场面前,“被收割”始终是个大概率事件,而赚钱的故事仍只是个江湖传说。   最近,记者与一个被收割的“韭菜”聊了聊。也许,你会认为这个韭菜有点“执迷不悟”,因为被收割多次,热情依然不减。而这种背后的心理,可能是:我知道他们在击鼓传花,他们也知道自己是击鼓传花,他们也知道我知道他们在击鼓传花,而鼓声仍不绝,因为最后一棒如果不是我,那我就能赚钱。   以下为其对创业家&i黑马的口述节选。   正式进入币圈是今年年初的事,刚开始的心态是好玩。   出于好奇,去年12月我买了链克的 硬件 玩客云。什么都没有做,但它上面的累计数每天都在变动,感觉像数字挖
[嵌入式]
51单片机bit、sbin、sfr、sfr_16有什么区别
51单片机bit、sbin、sfr、sfr_16区别分析 1.bit和sbit都是C51扩展的变量类型。 bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。 sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。 2.bit位标量 bit位标量是C5
[单片机]
红外遥控接收模块+普中51单片机+江科大自化协
1 实验现象   LCD1602上显示红外解码遥控器地址、键值。通过红外遥控器,按下某个按键时,遥控器通过红外发光二极管发射红外线,红外一体化接受头接受信号,并对其解码,单片机处理相应的信息,将得到的数据显示在LCD1602上。 2 实验原理 红外遥控是一种无线、非接触控制技术,具有抗干扰性能力强,信息传输可靠,功耗低、成本低、易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,在工业设备中也得到广泛应用。 什么是红外线?红外线是一种肉眼看不见的光。红外线是波长介于微波和可见光之间的电磁波,波长在760nm和1000nm之间,是波形比红光长的非可见光。 如何发出红外光?红外发射二极管就可以发出红外线。最常用的红外发射管
[单片机]
红外遥控接收模块+普中<font color='red'>51单片机</font>+江科大自化协
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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