您好,欢迎访问三七文档
$NOMOD51IDATALENEQU80HSPDATA81HNAME?C_STARTUP?STACKSEGMENTIDATA;定义一个IDATA段,段名?STACK?,符合C51编译器的命名规则?(SEGMENT?用于定义一个段)?RSEG?STACK;声明当前段是IDATA段,段中保留空间RSEG伪指令用于选择一个事先用SEGMENT伪指令声明的普通段DS1;DS是预留空间定义指令EXTRNCODE(?C_START);声明本模块引用的外部全局符号,用于和C相连接在.src文件中可以看到这个符号PUBLIC?C_STARTUP;声明可被其他模块使用的全局符号,由.src文件中可以看出这个符号的作用。CSEGAT0;结束当前的IDATA段,产生一个位于CODE中新段,起始地址是0000H。代码段的起始点?C_STARTUP:LJMPSTARTUP1;C编译器编译源程序后,芯片复位之后的复位代码第一个就是执行这条语句;如果上;面idatalen=80H,那么是对0~7FH清零;如果你的程序是改写成:IDATALEN?EQU?0100H??;就是对0~FFH清零。STARTUP1:IFIDATALEN0MOVR0,#IDATALEN-1CLRAIDATALOOP:MOV@R0,ADJNZR0,IDATALOOPENDIFMOVSP,#?STACK-1LJMP?C_STARTEND?(二)二、如何按你意愿加载这段程序?;一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时,你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。默认是自动加载这段startup.a51的。?;所以你要这样做:?;把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中?;比如改成:?;IDATALEN?EQU?00H??the?length?of?IDATA?memory?in?bytes.?;然后编译链接。这样你的程序中就不会包含对idata清零的内码了。?;为什么?上面提到的IF语句的作用呀!当定义IDATALEN=0时,清零代码被跳过!汇编开发不用启动代码。启动代码三大作用:初始化RAM初始化SP跳转到main函数
本文标题:51单片机启动代码
链接地址:https://www.777doc.com/doc-5892090 .html