51单片机keil提供的启动代码解析(STARTUP.A51)

发布者:chi32最新更新时间:2020-09-23 来源: eefocus关键字:51单片机  keil  启动代  STARTUP  A51 手机看文章 扫描二维码
随时随地手机看文章

1.由Keil C生成的启动代码
程序清单1.1 AT89C51启动代码

$NOMOD51    //不使用51默认的特殊功能寄存器

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

; This file is part of the C51 Compiler package

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

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

; 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

; BL51 invocation:

;

;     BL51 , STARTUP.OBJ

; BL51是Keil使用的链接器(Linker),这是命令行的使用格式

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

;

; User-defined Power-On Initialization of Memory

; 下面将定义一些与存储器初始化相关的符号常量,与ICCAVR相比,Keil把符号常量显式声明出来更容易理解。

; With the following EQU statements the initialization of memory

; at processor reset can be defined:

;

;               ; the absolute start-address of IDATA memory is always 0

IDATALEN        EQU     80H     ; the length of IDATA memory in bytes.

;IDDATALEN指片内128字节RAM,I指internal

XDATASTART      EQU     0H      ; the absolute start-address of XDATA memory

XDATALEN        EQU     0H      ; the length of XDATA memory in bytes.

; XDATA指片外SRAM空间,X指external

PDATASTART      EQU     0H      ; the absolute start-address of PDATA memory

PDATALEN        EQU     0H      ; the length of PDATA memory in bytes.

; PDATA指程序存储器,p指program

; Notes: The IDATA space overlaps physically the DATA and BIT areas of the

;          8051 CPU. At minimum the memory space occupied from the C51

;          run-time routines must be set to zero.

; 注意:8051 CPU的寄存器空间和存储器空间并不是统一编址的,而是通过指令来区分,所以不同的存储区的地址可能重叠(overlap)

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

;

; Reentrant Stack Initilization

;

; The following EQU statements define the stack pointer for reentrant

; functions and initialized it:

; Keil C默认情况不是用堆栈来传递参数的,所以造成函数不可重入(可重入概念参看线程安全和可重入函数一节)。Keil要求用户显示声明函数是否具有可重入属性,以便为C函数调用初始化栈。

; Stack Space for reentrant functions in the SMALL model.

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

IBPSTACKTOP     EQU     0FFH+1 ; set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the LARGE model.    

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

XBPSTACKTOP     EQU     0FFFFH+1; set top of stack to highest location+1.

;

; Stack Space for reentrant functions in the COMPACT model.  

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

PBPSTACKTOP     EQU     0FFFFH+1; set top of stack to highest location+1.

;不同内存模式下的堆栈。Keil 编译器中有三种模式设置:

Small:所有的变量都放在内部RAM区

Compact:所有变量在默认情况下都会放在外部RAM的低256字节中(可由R0寻址)

Large:所有变量都放在外部RAM中(DPTR寻址)

这是由51处理器繁多的寻址模式导致的,不同的寻址模式有不同的效率

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

;

; Page Definition for Using the Compact Model with 64 KByte xdata RAM

;

; The following EQU statements define the xdata page used for pdata

; variables. The EQU PPAGE must conform with the PPAGE control used

; in the linker invocation.

;

PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.

;

PPAGE           EQU     0       ; define PPAGE number.

;

PPAGE_SFR       DATA    0A0H    ; SFR that supplies uppermost address byte

;               (most 8051 variants use P2 as uppermost address byte)

;

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

; Standard SFR Symbols

ACC     DATA    0E0H

B       DATA    0F0H

SP      DATA    81H

DPL     DATA    82H

DPH     DATA    83H

                NAME    ?C_STARTUP

?C_C51STARTUP   SEGMENT   CODE

?STACK          SEGMENT   IDATA

                RSEG    ?STACK

                DS      1

                EXTRN CODE (?C_START)

                PUBLIC ?C_STARTUP

                CSEG    AT      0   //代码段的起始点

?C_STARTUP:     LJMP    STARTUP1    //转跳到STARTUP1程序区中去。

                RSEG    ?C_C51STARTUP

STARTUP1:

//IF ENDIF是条件编译命令,只有当条件为真时,才编译代码

IF IDATALEN <> 0   //如果有IDATA,则把IDATA区的数据清零,类似于清BSS区

                MOV     R0,#IDATALEN - 1

                CLR     A

IDATALOOP:      MOV     @R0,A

                DJNZ    R0,IDATALOOP

ENDIF

//如果有外部数据区,则把外部数据区中从XDATASTART到XDATASTART+ XDATALEN的区域清零

//由于51的储存区类型和编译模型比较多,下面的代码就是根据不同的配置把相应的区域清零

IF XDATALEN <> 0

                MOV     DPTR,#XDATASTART

                MOV     R7,#LOW (XDATALEN)

IF (LOW (XDATALEN)) <> 0

                MOV     R6,#(HIGH (XDATALEN)) +1

ELSE

                MOV     R6,#HIGH (XDATALEN)

ENDIF

                CLR     A

XDATALOOP:      MOVX    @DPTR,A

                INC     DPTR

                DJNZ    R7,XDATALOOP

                DJNZ    R6,XDATALOOP

ENDIF

IF PPAGEENABLE <> 0

                MOV     PPAGE_SFR,#PPAGE

ENDIF

IF PDATALEN <> 0

                MOV     R0,#LOW (PDATASTART)

                MOV     R7,#LOW (PDATALEN)

                CLR     A

PDATALOOP:      MOVX    @R0,A

                INC     R0

                DJNZ    R7,PDATALOOP

ENDIF

IF IBPSTACK <> 0

EXTRN DATA (?C_IBP)

                MOV     ?C_IBP,#LOW IBPSTACKTOP

ENDIF

IF XBPSTACK <> 0

EXTRN DATA (?C_XBP)

                MOV     ?C_XBP,#HIGH XBPSTACKTOP

                MOV     ?C_XBP+1,#LOW XBPSTACKTOP

ENDIF

IF PBPSTACK <> 0

EXTRN DATA (?C_PBP)

                MOV     ?C_PBP,#LOW PBPSTACKTOP

ENDIF

//该处是初始化堆栈指针

                MOV     SP,#?STACK-1

; This code is required if you use L51_BANK.A51 with Banking Mode 4

; EXTRN CODE (?B_SWITCH0)

;               CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0

[1] [2]
关键字:51单片机  keil  启动代  STARTUP  A51 引用地址:51单片机keil提供的启动代码解析(STARTUP.A51)

上一篇:51单片机堆栈的分析
下一篇:串口的工作方式

推荐阅读最新更新时间:2024-11-07 17:20

MCS-51单片机之液晶显示
用MCS-51单片机来驱动液晶显示本已不属于单片机本身的知识了,我所用到的液晶是1602液晶屏,主要是要自已去查看相关芯片的文档,所以自然对英语阅读能力是一个不小的挑战.在看文档的时候,我们也只需要注意几个相对重要的问题,而不用面对大篇的文档而不知何去何从,第一重要当然是液晶的时序图了,只有掌握了时序图后我们才能写出合理正确的程序,除此之外,还有相关引角的作用也是必不可少的. 在编写相关程序时,首先是将相关位进行设置,将RW接地即可,还有就是要合理设置RS位和EN位了,它们分别是读写选择位,命令数据先择位,使能位了,在操作时序的时候,我们主要也是来操作EN位来以时序进行控制的所以,她是极其重要的.接下来,我们就可以向芯片写
[单片机]
51单片机中断响应的条件
讲到这儿,我们依然对于计算机响应中断感到神奇,我们人可以响应外界的事件,是因为我们有多种“传感器“――眼、耳可以接受不同的信息,计算机是如何做到这点的呢?其实说穿了,一点都不希奇,MCS51工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可计算机本来就是这样,它根本没人聪明。 了解了上述中断的过程,就不难解中断响应的条件了。在下列三种情况之一时,CPU将封锁对中断的响应: 1、CPU正在处理
[单片机]
51单片机8*8点阵LED的显示原理及程序设计
在8X8点阵LED上显示柱形,让其先从左往右平滑移动三次,其次从右往左平滑移动三次,再次从上往下平滑移动三次,最后从下往上平滑移动三次,如此循环。 1. 程序设计内容 8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述: 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。 一根横柱:对应的行置0,而列则采用扫描的方法来实现。 2. 硬件电路 3.汇编源程
[单片机]
<font color='red'>51单片机</font>8*8点阵LED的显示原理及程序设计
51单片机MPX4115压力传感器+ADC0832仿真课设程序
单片机源程序如下: #include math.h #include absacc.h #include intrins.h #include reg51.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define BUSY 0x80 //常量定义 #define DATAPORT P0 sbit Alarm_led_red =P1^6; //超过压力表量程最大值红灯报警 sbit Alarm_led_green=P1^7; //低于压力表量程最小
[单片机]
Keil MDK下学习STM32注意事项
在MDK下学习使用STM32也快两个礼拜了,基本掌握了STM32在MDK环境下的开发流程和基本硬件程序的书写。其间,遇到了许多问题,其中不少问题花费了我相当多得时间才得以解决,现将这些问题和解决方法列出。其中也有一些是学习过程中我觉得需要记下的注意事项。 1、STM32固件库使用外围设备的主要思路 在STM32中,外围设备的配置思路比较固定。首先是使能相关的时钟,一方面是设备本身的时钟,另一方面如果设备通过IO口输出还需要使能IO口的时钟;最后如果对应的IO口是复用功能的IO口,则还必须使能AFIO的时钟。 其次是配置GPIO,GPIO的各种属性由硬件手册的AFIO一章详细规定,较为简单。 接着相关设备需要
[单片机]
Keil(MDK-ARM)系列教程(七)_菜单
Ⅰ、写在前面 本文带来关于Keil软件菜单的内容,系列教程中前面讲述的内容都可以通过菜单而找到,只是大部分内容都可以通过快捷按钮或快捷键找到,该文就讲述主菜单里每一个子菜单的内容。 Keil有些菜单在编辑模式和调试模式下可能有所不同,也就是说在不同模式下有些功能或许不能使用,下面内容会将每项菜单在不同模式下的区别提出来。 按照前面文章编辑方式,为了使文章内容精简,过于简单和不常用且过于复杂的内容只简述。 本文内容已经整理成PDF文件,提供给大家下载: http://pan.baidu.com/s/1nuJ0RDR Ⅱ、File文件菜单 File文件菜单在两种模式下略有不同。比较简单,只简述。 1.New
[单片机]
<font color='red'>Keil</font>(MDK-ARM)系列教程(七)_菜单
基于MCS51单片机的大屏幕LED显示屏高速控制方案
摘要:以MCS51系列单片机为例,介绍单片机对大屏幕LED显示屏的一种高速控制方案。单片机对LED显示屏的显示控制,一般是先从数据存储器读取数据,然后将数据写给LED点阵片。本方案的创新点是:用一条对外部数据存储器的读指令,同时完成对外部数据存储器读和对LED点阵片的写操作。本文详细介绍高速控制方案的电路设计,并简要提示软件编制的要点;最后介绍高速控制方案在大屏幕LED显示屏中的应用。 引言   LED显示屏的基本工作原理是动态扫描。显示控制的过程是先从数据存储器读得字模数据,再通过单片机的串行口或并行口将数据写给LED点阵片,然后再行扫描。   动态扫描方案和静态显示方案相比节省驱动元件,但要求刷新频率高于50 Hz,以避
[单片机]
基于MCS<font color='red'>51单片机</font>的大屏幕LED显示屏高速控制方案
基于51单片机之触控调光台灯实验
****************************** Copyright(C) CaKe ************************************ =================================== ==============**版权信息 : CaKen工作室 ============== ==============**文件名 : main.c ============== ==============**作者 : CaKen ============== =
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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