51单片机的启动代码究竟里面写了什么

发布者:SereneSerenity最新更新时间:2023-06-26 来源: elecfans关键字:51单片机  启动代码  kei 手机看文章 扫描二维码
随时随地手机看文章

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:

图片

keil创建新项目时,提示是否添加启动文件


一般情况下,需要选择“是”。当然,也可以选择不加。那么,这个启动文件的作用是什么?什么情况下需要加,什么情况下可以不加?


今天我们就来详细了解一下这个启动文件的内容,看明白这个内容后,我们就会有种恍然大悟的感觉:“哦,原来是这样啊!”

启动代码第一段

▼以下是启动代码原文第一段:

strongerHuang • 来源:老马识途单片机 • 作者:老马识途单片机 • 2021-09-22 10:15 • 1508次阅读

 0

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:



图片


keil创建新项目时,提示是否添加启动文件


一般情况下,需要选择“是”。当然,也可以选择不加。那么,这个启动文件的作用是什么?什么情况下需要加,什么情况下可以不加?


今天我们就来详细了解一下这个启动文件的内容,看明白这个内容后,我们就会有种恍然大悟的感觉:“哦,原来是这样啊!”


启动代码第一段


▼以下是启动代码原文第一段:


$NOMOD51

;------------------------------------------------------------------------------

;  This file is part of the C51 Compiler package

;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.

;  Version 8.01

;

;  *** <<< Use Configuration Wizard in Context Menu >>> ***

;------------------------------------------------------------------------------

;  STARTUP.A51:  This code is executed after processor reset.

;

;  To translate this file use A51 with the following invocation:

;

;     A51 STARTUP.A51

;

;  To link the modified STARTUP.OBJ file to your application use the following

;  Lx51 invocation:

;

;     Lx51 your object file list, STARTUP.OBJ  controls

;

;------------------------------------------------------------------------------

;

;  User-defined  Power-On Initialization of Memory

;

;  With the following EQU statements the initialization of memory

;  at processor reset can be defined:

;

;  IDATALEN: IDATA memory size <0x0-0x100>

;      Note: The absolute start-address of IDATA memory is always 0

;            The IDATA space overlaps physically the DATA and BIT areas.

IDATALEN        EQU     80H

;

;  XDATASTART: XDATA memory start address <0x0-0xFFFF> 

;      The absolute start address of XDATA memory

XDATASTART      EQU     0     

;

;  XDATALEN: XDATA memory size <0x0-0xFFFF> 

;      The length of XDATA memory in bytes.

XDATALEN        EQU     0      

;

;  PDATASTART: PDATA memory start address <0x0-0xFFFF> 

;      The absolute start address of PDATA memory

PDATASTART      EQU     0H

;

;  PDATALEN: PDATA memory size <0x0-0xFF> 

;      The length of PDATA memory in bytes.

PDATALEN        EQU     0H

;

;

▼以下是启动代码第一段的翻译:


不使用预先定义的SFR。就是告诉汇编器不使用预定义的寄存器名,因为汇编器内部定义了51的寄存器名,但在实际使用时会用51的扩展芯片例如52之类的,如果包含了52的头文件就会出现重复定义所以要先声明一下不适用汇编器内部定义的寄存器名。


这个文件是C51编译器包的一部分


版权所有(c) 1988-2005 Keil Elektronik GmbH和Keil Software, Inc。


版本8.01


*** <<使用上下文菜单中的配置向导>>> ***


----------------------------------------------------


STARTUP.A51里面的代码在处理器复位后执行。


用下面的命令行语句调用A51进行编译产生目标文件,


A51 STARTUP.A51


用下面的命令行语句调用BL51连接器把STARTUP.OBJ目标文件连接到程序代码中,


Lx51 invocation:


Lx51调用


---------------------------------------------------


Lx51 调用目标文件列表, 由STARTUP.OBJ 目标文件控制


用户自定义上电后需要初始化的储存区域(初始化RAM区的数据)


在处理器复位时通过下列EQU伪指令来初始化内存(RAM单元)


IDATALEN:IDATA存储区的大小<0-256>,可以根据自己的选择修改


IDATA绝对的起始地址总是0


IDATA区涵盖DATA和BIT区(DATA区(直接寻址区)以及 BIT区 (位寻址区)),;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化


XDATA存储区的起始地址<0x0-0xFFFF>


XDATA内存的绝对起始地址。


XDATA存储器空间的绝对起始地址为0,


XDATA空间的大小


XDATA空间的长度以字节为单位


说明xdata的字节数清0,该值默认为0


PDATA空间的大小


PDATA存储器的空间的绝对起始地址


需用0进行初始化的PDATA存储器的空间字节数


在51系列中data、idata、xdata、pdata的区别:


data:固定指前面0x00-0x7f的128个RAM。


idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。


xdata:外部扩展RAM,一般指外部0x0000-0xffff空间。


pdata:外部扩展RAM的低256个字节。


需用0进行初始化的IDATA存储器空间的字节数,IDATALEN只是一个标号(与IDATA不一样哦),EQU只是做宏一样的替换,类似于C语言中的#define uint (unsigned int),以上的代码使得程序以后在碰到IDATALEN时替换成80H。IDATALEN可以定义为你自己喜欢的名字如MyDataLen等。之所以用IDATALEN,一是为了好记,二是为了表明和IDATA有关。


启动代码第二段


我们继续来看看51单片机的启动代码里面都有哪些东西。


▼下面先列出51单片机启动代码第二部分的原文:


;------------------------------------------------------------------------------

;

; Reentrant Stack Initialization

;

;  The following EQU statements define the stack pointer for reentrant

;  functions and initialized it:

;

;  Stack Space for reentrant functions in the SMALL model.

;   IBPSTACK: Enable SMALL model reentrant stack

;      Stack space for reentrant functions in the SMALL model.

IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.

;   IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>

;      Set the top of the stack to the highest location.

IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  

;

;  Stack Space for reentrant functions in the LARGE model.      

;   XBPSTACK: Enable LARGE model reentrant stack

;      Stack space for reentrant functions in the LARGE model.

XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.

;   XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>

;      Set the top of the stack to the highest location.

XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 

;

;  Stack Space for reentrant functions in the COMPACT model.    

;   PBPSTACK: Enable COMPACT model reentrant stack

;      Stack space for reentrant functions in the COMPACT model.

PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.

;

;    PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>

;      Set the top of the stack to the highest location.

PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  

;

原文全是伪指令、宏定义这些东东,看起来确实很头疼啊。我们简单的翻译一下吧。


▼以下是第二段启动代码翻译:


再入函数模拟初始化;


以下用EQU指令定义了再入函数模拟堆栈指针的初始化;


使用SMALL存储器模式时再入函数的堆栈空间;


IBPSTACK EQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1;


IBPSTACKTOP EQU 0FFH+1 ; 将堆栈顶设置为最高地址+1;


使用LARGE存储器模式时再入函数的堆栈空间;


XBPSTACK EQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1;


XBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1;


使用COMPACT存储器模式时再入函数的堆栈空间;


PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1;


PBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1。


▼三种模式解析


这里提到了SMALL,LARGE,COMPACT三种模式。这三种模式究竟有什么含义呢?我们下面就来了解一下。


不同内存模式下的堆栈。Keil 编译器中有三种模式设置。这是由51处理器繁多的寻址模式导致的,不同的寻址模式有不同的效率。


small模式:在small模式中,所有默认变量均装入单片机内部的RAM中,51单片机默认内部RAM只有128B;52单片机默认256B。该模式下的优点是访问速度快,缺点是空间有限。


compact模式:在compact模式中,所有默认变量均位于单片机的256B RAM中,和在small模式中使用关键字 pdata来定义数据变量的效果一样,在该模式下程序总变量空间不能超过256B。


large模式:在large模式中,所有默认变量可放在多达64KB的RAM中,包括内部RAM和外部RAM,这和使用关键字xdata 来定义变量的效果一样。


small:变量存储在内部ram里。


compact:变量存储在外部ram里,使用页8位间接寻址。


large:变量存储在外部Ram里,使用16位间接寻址。


我们一般使用small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去。


compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快。如果超过256字节,那么要不断地进行切换的话,就比较麻烦。compact模式适用于比较少的外部ram的情况。


large模式,是指变量会优先分配到外部ram里。


3种存储方式都支持内部256字节和外部64k字节的ram。区别是变量的优先(或默认)存储在哪里的区别。除非你不想把变量存储在内部ram,才使用后面的compact、large模式。因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式。


关键字:51单片机  启动代码  kei 引用地址:51单片机的启动代码究竟里面写了什么

上一篇:89系列单片机型号编码的组成以及格式解析
下一篇:基于MCS-51单片机I2C总线接口电路的设计

推荐阅读最新更新时间:2024-11-02 04:28

51单片机-中断
#include <reg52.h> #include <intrins.h> unsigned int dd, i; void key() interrupt 0{ if(i == 0) P2 = dd; else{ dd = _crol_(dd,1); P2 = dd; } i++; } void main(){ EA = 1; //中断允许总控制位使能 EX0 = 1; //外部中断0中断允许位 IT0 = 1
[单片机]
<font color='red'>51单片机</font>-中断
MCS-51单片机实用子程序库--浮点数除法
标号: FDIV 功能:浮点数除法 入口条件:被除数在 中,除数在 中。 出口信息:OV=0时,商仍在 中,OV=1时,溢出。 影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节 FDIV: INC R0 MOV A,@R0 INC R0 ORL A,@R0 DEC R0 DEC R0 JNZ DIV1 MOV @R0,#41H;被除数为零,不必运算 CLR OV RET DIV1: INC R1 MOV A,@R1 INC R1 ORL A,@R1 DEC R1 DEC R1 JNZ DIV2 SETB OV ;除数为零,溢出 RET DIV2: LCALL MVR0 ;将 传送到第一工作区中 MOV A,
[单片机]
基于51单片机的DAC0832波形发生器设计
波形发生器是一种常用的信号源,广泛的应用于电子电路、自动控制系统和教学实验等领域,是现代测试领域内应用最为广泛的通用仪器之一。在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源。由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察。 测量被测仪器的输出响应,以分析确定它们的性能参数。信号发生器是电子测量领域中最基本、应用最为广泛的一类电子仪器。它可以产生多种波形信号,如方波、锯齿波、三角波等,因而广泛应用于通信、雷达、导航、宇航等领域 以多种波形发生器为对象,选择单片机、独立按键及D/A转换器,设计相应的电路构成多种波形发生器。 功能要求: 1.有4个功能键,分别用来选择
[单片机]
基于<font color='red'>51单片机</font>的DAC0832波形发生器设计
51单片机-红外遥控
红外遥控器的发送装置和接收装置以及关于载波等一些原理大家可参看《手把手教你学51单片机》文档第16章知识内容,这里笔者只简单说明如何运用该模块并讲解代码的实现。 1.接收装置 HS0038这个元器件是用来接收红外遥控器发送来的信号做处理的,我们知道红外遥控器有21个按键,按下不同的按键,HS0038的信号引脚就会产生不同的时序,我们解析这些时序就可以判断按下的是什么按键。 比如我们用红外遥控器对准开发板上的接收装置HS0038,按下左上角的按键,那么HS0038的信号引脚就会产生一系列的变化如下: 首先是引导码,也就是一开始HS0038信号引脚会拉低信号线9ms左右的时间,然后是4.5ms的高电平时间,这段时序叫做发送端的
[单片机]
<font color='red'>51单片机</font>-红外遥控
8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED
1 原理图 以点亮单片机P2.2端口的LED为例: 从图中不难看出,LED的右边是通过电阻接到VCC,如果要点亮LED就得把LED左边的端口进行拉低,根据二极管的单向导电性,LED正向导通从而LED发光。 2 代码 main.c文件的代码: #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 sbit led=P2^2; //将单片机的P2.2端口定义为led /******************************************************************************* * 函 数 名 : main * 函数功能 :
[单片机]
80<font color='red'>51单片机</font>实战分析(以STC89C52RC为例) | 01 - 点亮一个LED
基于51单片机的金属探测仪
一.硬件方案 本设计的金属探测是根据电磁感应原理制成的,将一金属置于变化的磁场当中时,根据电磁感应原理就会在金属内部产生涡流,涡流产生的磁场反过来又影响原磁场,这种变化可以转换为频率和幅值的变化,供相关电路进行检测。 硬件主要组成:51单片机+LM393+LCD1602液晶+电感线圈+ 按键+蜂鸣器; 二.设计功能 (1)实现金属物质的探测,如硬币,钥匙,金属手机壳等,LED和蜂鸣器实现声光报警。 (2)按键设置探测金属的精度,掉电记忆。 (3)液晶显示测量值,方便记录和更改。 (4)结构简洁,稳固,高效。 三.设计原理图 (1)原理图主要采用AD软件进行设计,如图: (2)Protues仿真图如下: 四.软件
[单片机]
基于<font color='red'>51单片机</font>的金属探测仪
51单片机串口通讯之中断法
程序讲解: /*---------------------------------------------------------------*/ //串口通讯 //按下按钮,单片机发送数据 Come On!\r\n 给主机 //单片机晶振:11.0592MHz //波特率: 9600bps /*-------------------------------------------------------------*/ //包含头文件 #include at89x52.h unsigned char co de tab ={ Come On!\r\n }; #define k1 P3_2 //对应开发板
[单片机]
基于AT89S51单片机的定时报警器电路图
设计一个单片机控制的简易定时报警器。要求根据设定的初始值(1-59 秒)进行倒计时,当计时到0 时数码管闪烁“00”(以1Hz 闪烁),按键功能如下:   (1)设定键:在倒计时模式时,按下此键后停止倒计时,进入设置状态;如果已经处于设置状态则此键无效。 (2)增一键:在设置状态时,每按一次递增键,初始值的数字增1。 (3)递一键:在设置状态时,每按一次递减键,初始值的数字减1。 (4)确认键:在设置状态时,按下此键后,单片机按照新的初始值进行倒计时及显示倒计时的数字。如果已经处于计时状态则此键无效。 图 定时报警器电路原理图
[模拟电子]
基于AT89S<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