找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13573|回复: 1
收起左侧

关于51单片机启动文件STARTUP.A51的详细说明

[复制链接]
ID:284075 发表于 2018-8-18 19:30 | 显示全部楼层 |阅读模式
;STARTUP.A51:用户上电初始化程序
;------------------------------------------------------------------------------
;
; 用户定义需上电初始化的内存空间
;
; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间
;
; ;IDATA 存储器的空间的绝对起始地址总是0.
IDATALENEQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数
;
XDATASTARTEQU 0H ; XDATA存储器空间的绝对起始地址
XDATALENEQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数.
;
PDATASTARTEQU 0H ; PDATA存储器的空间的绝对起始地址
PDATALENEQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数.
;
; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.
; 听说至少要保证与C51编译器运行库有关的存储器的空间进行0初始化不知是否
;------------------------------------------------------------------------------
;
; 再入函数模拟初始化
;
; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化
;
; 使用SMALL存储器模式时再入函数的堆栈空间.
IBPSTACKEQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1.
IBPSTACKTOPEQU 0FFH+1 ; 将堆栈顶设置为最高地址+1.
;
; 使用LARGE存储器模式时再入函数的堆栈空间.
XBPSTACKEQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1.
XBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.
;
; 使用COMPACT存储器模式时再入函数的堆栈空间.
PBPSTACKEQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1.
PBPSTACKTOPEQU 0FFFFH+1; 将堆栈顶设置为最高地址+1.
;
;------------------------------------------------------------------------------
;
; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义
;
; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址
; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致
;
PPAGEENABLEEQU 0 ; 使用PDATA类型变量时将其设置成1.
PPAGEEQU 0 ; 定义页号.
;
;------------------------------------------------------------------------------
NAME?C_STARTUP ; 模块名为?C_STAUTUP
?C_C51STARTUPSEGMENT CODE ; 代码
?STACKSEGMENT IDATA ; 堆栈
RSEG?STACK ; 堆栈
DS 1
EXTRNCODE (?C_START) ; 程序开始地址
PUBLIC?C_STARTUP
CSEGAT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用
?C_STARTUP:LJMP STARTUP1
RSEG?C_C51STARTUP
STARTUP1:
;
; 初始化串口
MOVSCON,#40H
MOVTMOD,#20H
MOVTH1,#0fdH
SETBTR1
CLRTI
; 单片机上电IDATA内存清零如果不需要上电清零IDATA可以注销IF到IFEDN之间的话句
; 或者修改IDTALEN的长度为了具有掉电保护功能不知IDTALEN多长为好
IFIDATALEN <> 0
MOVR0,#IDATALEN - 1
CLR A
IDATALOOP:MOV @R0,A
DJNZR0,IDATALOOP
ENDIF
;
; 单片机上电XDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句
; 或者修改XDATALEN的长度
IFXDATALEN <> 0
MOVDPTR,#XDATASTART
MOVR7,#LOW (XDATALEN)
IF(LOW (XDATALEN)) <> 0
MOVR6,#(HIGH (XDATALEN)) +1
ELSE
MOVR6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP:MOVX @DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF
;
; 送PDATA存储器页面高位地址
IFPPAGEENABLE <> 0
MOVP2,#PPAGE
ENDIF
;
; 单片机上电PDATA内存清零如果不需要上电清零XDATA可以注销IF到IFEDN之间的话句
; 或者修改PDATALEN的长度
IFPDATALEN <> 0
MOVR0,#PDATASTART
MOVR7,#LOW (PDATALEN)
CLR A
PDATALOOP:MOVX @R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF
;
; 设置使用SMALL存储器模式时再入函数的堆栈空间.
IFIBPSTACK <> 0
EXTRNDATA (?C_IBP)
MOV?C_IBP,#LOW IBPSTACKTOP
ENDIF
;
; 设置使用LARGE存储器模式时再入函数的堆栈空间.
IFXBPSTACK <> 0
EXTRNDATA (?C_XBP)
MOV?C_XBP,#HIGH XBPSTACKTOP
MOV?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
;
; 设置使用COMPACT存储器模式时再入函数的堆栈空间.
IFPBPSTACK <> 0
EXTRNDATA (?C_PBP)
MOV?C_PBP,#LOW PBPSTACKTOP
ENDIF
;
; 设置堆栈的起始地址
MOVSP,#?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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:333467 发表于 2019-6-10 14:21 | 显示全部楼层
好贴
谢谢,分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表