原创 Keil C51初始化代码 Startup.a51的中文说明

2009-9-14 15:42 4280 12 14 分类: MCU/ 嵌入式

Keil C51初始化代码 Startup.a51的中文说明












Keil C51初始化代码 Startup.a51的中文说明



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

;  STARTUP.A51:   用户上电初始化程序

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

;

;   用户定义需上电初始化的内存空间

;

;   使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间

;

;;       ; IDATA 存储器的空间的绝对起始地址总是0.;

IDATALEN   EQU   80H    ; 需用0进行初始化的IDATA存储器空间的字节数

;

XDATASTART   EQU    0H    ; XDATA存储器空间的绝对起始地址

XDATALEN   EQU    0H    ; 需用0进行初始化的XDATA存储器的空间字节数.

;

PDATASTART   EQU    0H    ; PDATA存储器的空间的绝对起始地址

PDATALEN   EQU    0H    ; 需用0进行初始化的PDATA存储器的空间字节数.

;

;   注意:    IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.

;            听 说 至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 不知是否

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

;

;   再入函数模拟初始化

;

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

;

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

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

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

;

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

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

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

;

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

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

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

;

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

;

;   使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义

;

;   以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址

;   使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致


;

PPAGEENABLE   EQU    0    ; 使用PDATA类型变量时将其设置成1.

PPAGE      EQU    0    ; 定义页号.

;

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

       NAME    ?C_STARTUP; 模块名为 ?C_STAUTUP

?C_C51STARTUP    SEGMENT    CODE       ; 代码

?STACK       SEGMENT    IDATA      ; 堆栈

       RSEG    ?STACK       ; 堆栈

      DS    1

       EXTRNEXTRN CODE   ((?C_START))    ; 程序开始地址

       PUBLIC    ?C_STARTUP

       CSEG    AT    0x8000   ;  定义用户程序的起始地址,用MON51仿真器时可能有用

?C_STARTUP:    LJMP    STARTUP1

       RSEG    ?C_C51STARTUP

STARTUP1::

;

; 初始化串口

       MOV      SCON,#40H

       MOV    TMOD,#20H

       MOV    TH1,#0fdH

      SETB    TR1

      CLR    TI  

;   单片机上电IDATA内存清零 如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句

;   或者修改IDTALEN的长度 为了具有掉电保护功能 不知IDTALEN多长为好


IF IDATALEN <> 0

       MOV    R0,#IDATALEN - 1

       CLR    A

IDATALOOP:    MOV    @R0,A

       DJNZ    R0,IDATALOOP

ENDIF

;

;   单片机上电XDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句

;   或者修改XDATALEN的长度


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

;

;   送PDATA存储器页面高位地址

IF PAGEENABLE <> 0

       MOV    P2,#PPAGE

ENDIF

;

;   单片机上电PDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句

;   或者修改PDATALEN的长度


IF PDATALEN <> 0

       MOV    R0,#PDATASTART

       MOV    R7,#LOW   (PDATALEN)

       CLR    A

PDATALOOP:    MOVX    @R0,A

       INC    R0

       DJNZ    R7,PDATALOOP

ENDIF

;

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

IF IBPSTACK <> 0

EXTRN DATA   (?C_IBP)

       MOV    ?C_IBP,#LOW IBPSTACKTOP

ENDIF

;

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

IF XBPSTACK <> 0

EXTRN DATA   (?C_XBP)

       MOV    ?C_XBP,#HIGH XBPSTACKTOP

       MOV    ?C_XBP+1,#LOW XBPSTACKTOP

ENDIF

;

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

IF PBPSTACK <> 0

EXTRN DATA   (C_PBP)

       MOV    ?C_PBP,#LOW PBPSTACKTOP

ENDIF

;

;   设置堆栈的起始地址

       MOV    SP,#?STACK-1    ; 例如 MOV   SP,#4FH;



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

; 如果你的程序使用了Mode 4 程序分组技术 请启动下面的程序,不会吧你的程序超过64K 利害


; EXTRN CODE (?B_SWITCH0)

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

;;                  程序从第一组bank 0 块开始执行

; 跳转到用户程序MAIN函数


       LJMP    ?C_START

      END

       ;lINSHENGFENG
PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户194501 2009-9-14 20:52

应该会不一样吧,创建一个工程都会自动生成Startup.a51的

用户188034 2009-9-14 19:05

初始化硬件接口不一定通用吧
相关推荐阅读
用户194501 2009-09-17 13:50
利用protues仿真51的中断和定时器实验
步骤:1、利用protues软件,画出电路图,如下图2、利用wave软件,编译你的汇编程序,生成hex文件;**********************************************...
用户194501 2009-09-14 20:43
51单片机汇编伪指令
最近在学KEIL在进行编译时,生成的SRC文件,里面的许多命令都不大知道,于是自己找资料查了查。现总结如下,希望对大家有点帮助。为了大家查找方便,命令按字母排序:1、ALTNAME功能: 这一伪指令用...
用户194501 2009-09-12 20:53
DS18B20测温系统
经过几天的研究,终于将DS18B20测试温度系统做出来了,下面讲一下DS18B20要点(有些是自己做实验过程中的体会)1、芯片管脚:2、DS18B20内部结构DS18B20内部结构主要由四部分组 成:...
用户194501 2009-09-12 20:10
石英晶体振荡器原理
1、压电效应压电效应简单来说是机械能与电能的互相转换。顺压电效应:物质在沿一定方向上受到外力的作用变形时,内部会产生极化现象,同时在其表面上会产生电荷;当外力去掉后,又重新回到不带电的状态。逆压电效应...
用户194501 2009-09-11 00:50
8段数码管显示深入分析
在开始之前,先推荐一个十分有用的工具:LED代码段生成器,可自己随意修改,下面是图下面进入正题:      光源闪烁就是光源发出的光随时间呈快速、重复的变化,使得光源跳动和不稳定。当然人的肉眼并不能很...
EE直播间
更多
我要评论
2
12
关闭 站长推荐上一条 /3 下一条