《单片机startup.a51文件标号和清零程序的内容详细解答.doc》由会员分享,可在线阅读,更多相关《单片机startup.a51文件标号和清零程序的内容详细解答.doc(7页珍藏版)》请在三一文库上搜索。
1、单片机startup.a51文件标号和清零程序的内容详细解答1.标号IDATALEN EQU 80H ; the length of IDATA memory in bytes.这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到IDATALEN的地方其实就是可以看成是80H这个数,你用80H去代替IDATALEN是完全对的。之所以取IDATALEN这么个名字,只是为了好记,表明和idata
2、有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0FFH。如果你想改成FFH,完全可以。2。清零IF IDATALEN 0MOV R0,#IDATALEN - 1CLR AIDATALOOP: MOV R0,ADJNZ R0,IDATALOOP关于这一段,很明显是在清零,如果上面idatalen=80H,那么是对07FH清零;如果你的程序是改写成:IDATALEN EQU 0100H ;就是对0FFH清零。还要注意的是那条IF语句,下面再谈。二、如何按你意愿加载这段程序一般考虑到这个往往是你的设计中
3、要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。默认是自动加载这段startup.a51的。所以你要这样做:把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。比如改成:IDATALEN EQU 00H ; the length of IDATA memory in bytes.然后编译链接。这样你的程序中就不会包含对idata清零的内码了。为
4、什么?上面提到的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 EQ
5、U 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
6、.; 使用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存储
7、器空间的分页定义; 以下用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 1EXTRNEXTRN CODE (?C_START) ; 程序开始地址PUBLIC ?C_
8、STARTUPCSEG AT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用?C_STARTUP: LJMP STARTUP1RSEG ?C_C51STARTUPSTARTUP1:; 初始化串口MOV SCON,#40HMOV TMOD,#20HMOV TH1,#0fdHSETB TR1CLR TI; 单片机上电IDATA内存清零 如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句; 或者修改IDTALEN的长度 为了具有掉电保护功能 不知IDTALEN多长为好IF IDATALEN 0MOV R0,#IDATALEN - 1CLR AIDATALOOP:
9、 MOV R0,ADJNZ R0,IDATALOOPENDIF; 单片机上电XDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句; 或者修改XDATALEN的长度IF XDATALEN 0MOV DPTR,#XDATASTARTMOV R7,#LOW (XDATALEN)IF (LOW (XDATALEN) 0MOV R6,#(HIGH (XDATALEN) +1ELSEMOV R6,#HIGH (XDATALEN)ENDIFCLR AXDATALOOP: MOVX DPTR,AINC DPTRDJNZ R7,XDATALOOPDJNZ R6,XDATALOOP
10、ENDIF; 送PDATA存储器页面高位地址IF PAGEENABLE 0MOV P2,#PPAGEENDIF; 单片机上电PDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句; 或者修改PDATALEN的长度IF PDATALEN 0MOV R0,#PDATASTARTMOV R7,#LOW (PDATALEN)CLR APDATALOOP: MOVX R0,AINC R0DJNZ R7,PDATALOOPENDIF; 设置使用SMALL存储器模式时再入函数的堆栈空间.IF IBPSTACK 0EXTRN DATA (?C_IBP)MOV ?C_IBP,#LO
11、W IBPSTACKTOPENDIF; 设置使用LARGE存储器模式时再入函数的堆栈空间.IF XBPSTACK 0EXTRN DATA (?C_XBP)MOV ?C_XBP,#HIGH XBPSTACKTOPMOV ?C_XBP+1,#LOW XBPSTACKTOPENDIF; 设置使用COMPACT存储器模式时再入函数的堆栈空间.IF PBPSTACK 0EXTRN DATA (C_PBP)MOV ?C_PBP,#LOW PBPSTACKTOPENDIF; 设置堆栈的起始地址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_STARTEND;lINSHENGFENG
链接地址:https://www.31doc.com/p-3398127.html