0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机startup.a51文件标号和清零程序的内容详细解答

j4AI_wujianying 来源:未知 作者:易水寒 2018-06-18 17:50 次阅读

1.标号

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

这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到IDATALEN的地方其实就是可以看成是80H这个数,你用80H去代替IDATALEN是完全对的。

之所以取IDATALEN这么个名字,只是为了好记,表明和idata有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0~FFH。如果你想改成FFH,完全可以。

2。清零

IF IDATALEN <> 0

MOV R0,#IDATALEN - 1

CLR A

IDATALOOP: MOV @R0,A

DJNZ R0,IDATALOOP

关于这一段,很明显是在清零,如果上面idatalen=80H,那么是对0~7FH清零;如果

你的程序是改写成:

IDATALEN EQU 0100H ;

就是对0~FFH清零。

还要注意的是那条IF语句,下面再谈。

二、如何按你意愿加载这段程序

一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。

默认是自动加载这段startup.a51的。

所以你要这样做:

把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。

比如改成:

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

然后编译链接。这样你的程序中就不会包含对idata清零的内码了。

为什么?上面提到的IF语句的作用呀!当定义IDATALEN=0时,清零代码被跳过!

////////////////////////////////////////////

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620855
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79544
  • STARTUP
    +关注

    关注

    0

    文章

    5

    浏览量

    6019

原文标题:单片机startup.a51文件内容的详解

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STARTUP.A51文件对于单片机的作用

    单片机
    jf_97106930
    发布于 :2022年08月27日 08:02:40

    关于Startup.A51

    本帖最后由 eehome 于 2013-1-5 09:53 编辑 keil中 加与不加Startup.A51的区别,本人一直都没加过,也没发现啥问题,但搜到说很重要,谁能说说怎么个重要法。O(∩_∩)O谢谢。(不要Copy网上的看过了)
    发表于 01-02 17:34

    51单片机中keil下STARTUP.A51文件注释

    51单片机中keil下STARTUP.A51文件注释。
    发表于 10-29 13:18

    张工分享学习C51单片机的一些误区和注意事项

    0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。 有人喜欢改startup.a51,为了满足自己一些想当然的爱好
    发表于 11-05 10:28

    解决:C8051系列单片机,代码量较大时工作不正常问题

    XDATALOOP这儿就容易产生复位,心想,是不是这个循环上单片机耗费的时间太长了,没有及时关闭看门狗,从而导致单片机复位了。于是,我在单片机Startup.A51
    发表于 07-20 10:40

    startup.a51执行时间

    单片机型号STC12C5A60S2时钟:11.0592MHz单片机复位后首先执行startup.a51请问它的执行时间是多少呢??
    发表于 04-27 15:23

    C51单片机的编程经验三则

    的第一语句执行前要先执行一段‘起始代码’。正是这段代码执行了内存清零的工作。 C编译程序提供了这段起始代码的源程序,名为CSTARTUP A51,打开这个
    发表于 01-09 09:02

    STARTUP.A51文件的理解

    ;一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时 ;你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。 ;默认是自动加载这
    发表于 07-19 04:51

    AVR单片机的的清零和置位是如何来实现的?

    AVR单片机的的清零和置位是如何来实现的?AVR单片机51单片机清零和置位有什么不同?
    发表于 07-08 07:08

    对pic单片机清零等指令加以讲解

    大家更好掌握pic单片机编程。一、清零指令1.寄存器清零指令实例:CLRW;寄存器W被清零说明:该条指令很简单,其中W为PIC单片机的工作寄
    发表于 11-24 06:32

    80C51单片机startup.a51程序模块的作用

    startup.a51的主要工作是把包含idata、xdata、pdata在内的内存区块清除为0,并且初始化递归指针。接着startup.a51被执行的仍然是一个隐藏在KEIL-C51标准链接库中称为init.a
    发表于 12-13 15:46 7961次阅读

    使用51单片机实现秒表的代码和资料免费下载

    本例子为用汇编在普中单片机上实现一个简单的秒表功能,加一个清零按键。新建keil工程,新建.asm文件并加入工程,不添加startup.a51文件
    发表于 09-11 17:24 1次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机</b>实现秒表的代码和资料免费下载

    51单片机程序的头文件reg51.h详解

    本文档的主要内容详细介绍的是51单片机程序的头文件reg51
    发表于 06-27 17:42 3次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>程序</b>的头<b class='flag-5'>文件</b>reg<b class='flag-5'>51</b>.h详解

    51单片机的引导加载程序详细资料和工程文件免费下载

    本文档的主要内容详细介绍的是51单片机的引导加载程序详细资料和工程
    发表于 05-29 17:36 6次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的引导加载<b class='flag-5'>程序</b>的<b class='flag-5'>详细</b>资料和工程<b class='flag-5'>文件</b>免费下载

    51单片机实现LED的程序和工程文件免费下载

    本文档的主要内容详细介绍的是使用51单片机实现LED的程序和工程文件免费下载。
    发表于 09-30 08:00 7次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>实现LED的<b class='flag-5'>程序</b>和工程<b class='flag-5'>文件</b>免费下载