zoukankan      html  css  js  c++  java
  • 单片机成长之路(51基础篇)

    STARTUP.A51原始文件:

      1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。
      2 ;------------------------------------------------------------------------------
      3 ;  This file is part of the C51 Compiler package
      4 ;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
      5 ;  Version 8.01
      6 ;
      7 ;  *** <<< Use Configuration Wizard in Context Menu >>> ***
      8 ;------------------------------------------------------------------------------
      9 ;  STARTUP.A51:  This code is executed after processor reset.
     10 ;
     11 ;  To translate this file use A51 with the following invocation:
     12 ;
     13 ;     A51 STARTUP.A51
     14 ;
     15 ;  To link the modified STARTUP.OBJ file to your application use the following
     16 ;  Lx51 invocation:
     17 ;
     18 ;     Lx51 your object file list, STARTUP.OBJ  controls
     19 ;
     20 ;------------------------------------------------------------------------------
     21 ;
     22 ;  User-defined <h> Power-On Initialization of Memory
     23 ;
     24 ;  With the following EQU statements the initialization of memory
     25 ;  at processor reset can be defined:
     26 ;
     27 ; <o> IDATALEN: IDATA memory size <0x0-0x100>
     28 ;     <i> Note: The absolute start-address of IDATA memory is always 0
     29 ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
     30 IDATALEN        EQU     80H
     31 ;
     32 ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
     33 ;     <i> The absolute start address of XDATA memory
     34 XDATASTART      EQU     0     
     35 ;
     36 ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
     37 ;     <i> The length of XDATA memory in bytes.
     38 XDATALEN        EQU     0      
     39 ;
     40 ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
     41 ;     <i> The absolute start address of PDATA memory
     42 PDATASTART      EQU     0H
     43 ;
     44 ; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
     45 ;     <i> The length of PDATA memory in bytes.
     46 PDATALEN        EQU     0H
     47 ;
     48 ;</h>
     49 ;------------------------------------------------------------------------------
     50 ;
     51 ;<h> Reentrant Stack Initialization
     52 ;
     53 ;  The following EQU statements define the stack pointer for reentrant
     54 ;  functions and initialized it:
     55 ;
     56 ; <h> Stack Space for reentrant functions in the SMALL model.
     57 ;  <q> IBPSTACK: Enable SMALL model reentrant stack
     58 ;     <i> Stack space for reentrant functions in the SMALL model.
     59 IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
     60 ;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
     61 ;     <i> Set the top of the stack to the highest location.
     62 IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
     63 ; </h>
     64 ;
     65 ; <h> Stack Space for reentrant functions in the LARGE model.      
     66 ;  <q> XBPSTACK: Enable LARGE model reentrant stack
     67 ;     <i> Stack space for reentrant functions in the LARGE model.
     68 XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
     69 ;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
     70 ;     <i> Set the top of the stack to the highest location.
     71 XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
     72 ; </h>
     73 ;
     74 ; <h> Stack Space for reentrant functions in the COMPACT model.    
     75 ;  <q> PBPSTACK: Enable COMPACT model reentrant stack
     76 ;     <i> Stack space for reentrant functions in the COMPACT model.
     77 PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
     78 ;
     79 ;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
     80 ;     <i> Set the top of the stack to the highest location.
     81 PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
     82 ; </h>
     83 ;</h>
     84 ;------------------------------------------------------------------------------
     85 ;
     86 ;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
     87 ;  <e>Compact Model Page Definition
     88 ;
     89 ;  <i>Define the XDATA page used for PDATA variables. 
     90 ;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
     91 ;
     92 ; Enable pdata memory page initalization
     93 PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
     94 ;
     95 ; <o> PPAGE number <0x0-0xFF> 
     96 ; <i> uppermost 256-byte address of the page used for PDATA variables.
     97 PPAGE           EQU     0
     98 ;
     99 ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
    100 ; <i> most 8051 variants use P2 as uppermost address byte
    101 PPAGE_SFR       DATA    0A0H
    102 ;
    103 ; </e>
    104 ;------------------------------------------------------------------------------
    105 
    106 ; Standard SFR Symbols 
    107 ACC     DATA    0E0H
    108 B       DATA    0F0H
    109 SP      DATA    81H
    110 DPL     DATA    82H
    111 DPH     DATA    83H
    112 
    113                 NAME    ?C_STARTUP
    114 
    115 
    116 ?C_C51STARTUP   SEGMENT   CODE
    117 ?STACK          SEGMENT   IDATA
    118 
    119                 RSEG    ?STACK
    120                 DS      1
    121 
    122                 EXTRN CODE (?C_START)
    123                 PUBLIC  ?C_STARTUP
    124 
    125                 CSEG    AT      0
    126                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1
    127 
    128                 RSEG    ?C_C51STARTUP
    129 
    130 STARTUP1:
    131 
    132 IF IDATALEN <> 0
    133                 MOV     R0,#IDATALEN - 1
    134                 CLR     A
    135 IDATALOOP:      MOV     @R0,A
    136                 DJNZ    R0,IDATALOOP
    137 ENDIF
    138 
    139 IF XDATALEN <> 0
    140                 MOV     DPTR,#XDATASTART
    141                 MOV     R7,#LOW (XDATALEN)
    142   IF (LOW (XDATALEN)) <> 0
    143                 MOV     R6,#(HIGH (XDATALEN)) +1
    144   ELSE
    145                 MOV     R6,#HIGH (XDATALEN)
    146   ENDIF
    147                 CLR     A
    148 XDATALOOP:      MOVX    @DPTR,A
    149                 INC     DPTR
    150                 DJNZ    R7,XDATALOOP
    151                 DJNZ    R6,XDATALOOP
    152 ENDIF
    153 
    154 IF PPAGEENABLE <> 0
    155                 MOV     PPAGE_SFR,#PPAGE
    156 ENDIF
    157 
    158 IF PDATALEN <> 0
    159                 MOV     R0,#LOW (PDATASTART)
    160                 MOV     R7,#LOW (PDATALEN)
    161                 CLR     A
    162 PDATALOOP:      MOVX    @R0,A
    163                 INC     R0
    164                 DJNZ    R7,PDATALOOP
    165 ENDIF
    166 
    167 IF IBPSTACK <> 0
    168 EXTRN DATA (?C_IBP)
    169 
    170                 MOV     ?C_IBP,#LOW IBPSTACKTOP
    171 ENDIF
    172 
    173 IF XBPSTACK <> 0
    174 EXTRN DATA (?C_XBP)
    175 
    176                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
    177                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
    178 ENDIF
    179 
    180 IF PBPSTACK <> 0
    181 EXTRN DATA (?C_PBP)
    182                 MOV     ?C_PBP,#LOW PBPSTACKTOP
    183 ENDIF
    184 
    185                 MOV     SP,#?STACK-1
    186 
    187 ; This code is required if you use L51_BANK.A51 with Banking Mode 4
    188 ;<h> Code Banking
    189 ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
    190 #if 0   
    191 ;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
    192 EXTRN CODE (?B_SWITCH0)
    193                 CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
    194 #endif
    195 ;</h>
    196                 LJMP    ?C_START
    197 
    198                 END

     翻译后的STARTUP.A51:

      1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。
      2 ;------------------------------------------------------------------------------
      3 ;  该文件是C51编译器包的一部分
      4 ;  版权所有(c)1988-2005 Keil Elektronik GmbH 和 Keil Software, Inc.
      5 ;  版本 8.01
      6 ;
      7 ;  *** <<< 在上下文菜单中使用配置向导 >>> ***
      8 ;------------------------------------------------------------------------------
      9 ;  STARTUP.A51:此代码在处理器复位后执行。
     10 ;
     11 ;  要编译此文件,请调用A51使用以下配置:
     12 ;
     13 ;     A51 STARTUP.A51
     14 ;
     15 ;  要将修改后的STARTUP.OBJ文件链接到您的应用程序,请使用以下命令
     16 ;  Lx51 invocation:
     17 ;
     18 ;     Lx51您的目标文件列表,STARTUP.OBJ控件
     19 ;
     20 ;------------------------------------------------------------------------------
     21 ;
     22 ;  用户定义的头文件(.h) 内存的上电初始化
     23 ;
     24 ;  用以下EQU语句初始化内存
     25 ;  在处理器重置时可以定义:
     26 ;
     27 ; <o> IDATALEN: IDATA内存大小<0x0-0x100>
     28 ;     <i> 注意: IDATA存储器的绝对起始地址始终为0
     29 ;     <i>       IDATA空间在物理上与DATA和BIT区域重叠。
     30 IDATALEN        EQU     80H
     31 ;
     32 ; <o> XDATASTART: XDATA存储器起始地址<0x0-0xFFFF>
     33 ;     <i> XDATA 存储器的绝对起始地址(不一定为0)
     34 XDATASTART      EQU     0 ;XDATA 起始位置    
     35 ;
     36 ; <o> XDATALEN: XDATA 内存大小 <0x0-0xFFFF> 
     37 ;     <i> XDATA 内存的长度,以字节为单位。
     38 XDATALEN        EQU     0 ; XDATA 结束位置(不设置XDATA)   
     39 ;
     40 ; <o> PDATASTART: PDATA 存储器起始地址<0x0-0xFFFF>
     41 ;     <i> PDATA 存储器的绝对起始地址
     42 PDATASTART      EQU     0H    ;PDATA 设置起始地址
     43 ;
     44 ; <o> PDATALEN: PDATA 内存大小 <0x0-0xFF> 
     45 ;     <i> PDATA 内存的长度,以字节为单位。
     46 PDATALEN        EQU     0H     ;设置PDATA结束为止(不设置 PDATA) 
     47 ;
     48 ;</h>
     49 ;------------------------------------------------------------------------------
     50 ;
     51 ;<h> 可重入堆栈初始化
     52 ;
     53 ;  以下EQU语句定义了可重入函数的堆栈指针并对其进行了初始化:
     54 ;  
     55 ;
     56 ; <h> 用于SMALL模型中的可重入函数的堆栈空间。
     57 ;  <q> IBPSTACK: 启用SMALL模型可重入堆栈
     58 ;     <i> 在SMALL模型中为可重入函数堆栈空间。
     59 IBPSTACK        EQU     0       ; 如果使用小重载,则设置为1。
     60 ;  <o> IBPSTACKTOP: SMALL模型堆栈的结束地址 <0x0-0xFF>
     61 ;     <i> 将堆栈顶部设置为最高位置.
     62 IBPSTACKTOP     EQU     0xFF +1     ; 默认 0FFH+1  
     63 ; </h>
     64 ;
     65 ; <h> 堆栈空间用于LARGE模型中的可重入函数.      
     66 ;  <q> XBPSTACK: 启用LARGE模型可重入堆栈
     67 ;     <i> Stack 在LARGE模型中为可重入函数堆栈空间.
     68 XBPSTACK        EQU     0       ; 如果使用大的重入,则设置为1。
     69 ;  <o> XBPSTACKTOP: LARGE模型堆栈的结束地址 <0x0-0xFFFF>
     70 ;     <i> 将堆栈顶部设置为最高位置.
     71 XBPSTACKTOP     EQU     0xFFFF +1   ; 默认 0FFFFH+1 
     72 ; </h>
     73 ;
     74 ; <h> 用于COMPACT模型中的重入函数的堆栈空间.    
     75 ;  <q> PBPSTACK: 启用COMPACT模型可重入堆栈
     76 ;     <i> COMPACT模型中可重入函数的空间.
     77 PBPSTACK        EQU     0       ; 如果使用紧凑重入,则设置为1.
     78 ;
     79 ;   <o> PBPSTACKTOP: COMPACT模型堆栈的结束地址 <0x0-0xFFFF>
     80 ;     <i> 将堆栈顶部设置为最高位置.
     81 PBPSTACKTOP     EQU     0xFF +1     ; 默认 0FFH+1  
     82 ; </h>
     83 ;</h>
     84 ;------------------------------------------------------------------------------
     85 ;
     86 ;  使用64 KB xteata RAM的紧凑型号的内存页面
     87 ;  <e>紧凑型模型页面定义
     88 ;
     89 ;  <i>定义用于PDATA变量的XDATA页面. 
     90 ;  <i>PAGE必须符合链接器调用中设置的PAGE.
     91 ;
     92 ; 启用数据存储页面初始化
     93 PPAGEENABLE     EQU     0       ; 如果使用pdata对象,则设置为1.
     94 ;
     95 ; <o> 页码 <0x0-0xFF> 
     96 ; <i> 用于PDATA变量的页面的最高256字节地址.
     97 PPAGE           EQU     0
     98 ;
     99 ; <o> 提供最高地址字节的SFR地址 <0x0-0xFF> 
    100 ; <i> 大多数8051变体使用P2作为最高地址字节
    101 PPAGE_SFR       DATA    0A0H
    102 ;
    103 ; </e>
    104 ;------------------------------------------------------------------------------
    105 
    106 ; 标准SFR(特殊功能寄存器)符号(寄存器定义声称别名)(sfr特殊功能寄存器 sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。)
    107 ACC     DATA    0E0H;累加器
    108 B       DATA    0F0H;通用寄存器
    109 SP      DATA    81H;堆栈指针
    110 DPL     DATA    82H;数据指针低8位
    111 DPH     DATA    83H;数据指针高8位
    112 
    113                 NAME    ?C_STARTUP;定义一个模块名: ?C_STARTUP
    114 
    115 
    116 ?C_C51STARTUP   SEGMENT   CODE;声明(ROM)代码段
    117 ?STACK          SEGMENT   IDATA;声明(RAM)堆栈
    118 
    119                 RSEG    ?STACK;RSEG选择一个先前声明的可重定位段
    120                 DS      1;位堆栈预留一个低阶的储存空间
    121 
    122                 EXTRN CODE (?C_START);当前文件的代码储存区
    123                 PUBLIC  ?C_STARTUP;声明可以用于其他目标模块的全局符号?C_STARTUP,用于和 C 链接在.src文件中可以看到这个符号
    124 
    125                 CSEG    AT      0;选择代码存储区的一个绝对段,汇编从上面命令中的地址0开始执行这个段。
    126                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1
    127 
    128                 RSEG    ?C_C51STARTUP;选择代码段?C_C51STARTUP
    129 
    130 STARTUP1:        ;代码块STARTUP1
    131 
    132 IF IDATALEN <> 0;如果IDATALEN不为零,则将长度减1送R0
    133                 MOV     R0,#IDATALEN - 1    ;将长度-1送R0
    134                 CLR     A                ;清零累加器
    135 IDATALOOP:      MOV     @R0,A            ;初始化IDATA
    136                 DJNZ    R0,IDATALOOP    ;(DJNZ)R0减1后不为0则转移(跳转)IDATALOOP
    137 ENDIF
    138 
    139 IF XDATALEN <> 0;如果有外部数据储存区 XDATALEN为外部空间的长度
    140                 MOV     DPTR,#XDATASTART;起始地址送DPTR
    141                 MOV     R7,#LOW (XDATALEN);长度的低8位送到R7
    142   IF (LOW (XDATALEN)) <> 0    ;长度的低8位不为零继续
    143                 MOV     R6,#(HIGH (XDATALEN)) +1;高8位+1送R6,下面清0用
    144   ELSE                        ;长度的低8位为零继续
    145                 MOV     R6,#HIGH (XDATALEN);高8位直接送R6,下面清0用
    146   ENDIF
    147                 CLR     A    ;清零累加器
    148 XDATALOOP:      MOVX    @DPTR,A;XDATA环节 送A(清零累加器)的数据到单片机外部(ROM)(DPTR是16位地址位)
    149                 INC     DPTR;数据指针加 1
    150                 DJNZ    R7,XDATALOOP;R7减1后不为0则转移XDATALOOP
    151                 DJNZ    R6,XDATALOOP;R6减1后不为0则转移XDATALOOP
    152 ENDIF
    153 
    154 IF PPAGEENABLE <> 0;外部ram页面地址使能,(pdata     --->   分页寻址片外ram (MOVX @R0)) 
    155                 MOV     PPAGE_SFR,#PPAGE;上面一条成立,PPAGE_SFR设置为大多数8051变体使用P2作为最高地址字节,如果不成立,说明没有使用
    156 ENDIF
    157 
    158 IF PDATALEN <> 0;判断外部PDATA的长度是否为0(有没有配置外部RAM),如果不为零(使用了外部RAM),则进行下面的操作。
    159                 MOV     R0,#LOW (PDATASTART);获取外部的RAM(PDATA)起始地址的低8位
    160                 MOV     R7,#LOW (PDATALEN);获取外部的RAM(PDATA)长度的低8位
    161                 CLR     A;清零累加器
    162 PDATALOOP:      MOVX    @R0,A;PDATA环节,送A(清零累加器)的数据到单片机外部(RAM)(@R0是8位地址位)
    163                 INC     R0;数据指针加 1
    164                 DJNZ    R7,PDATALOOP;R7减1后不为0则转移PDATALOOP
    165 ENDIF
    166 
    167 IF IBPSTACK <> 0;可重载的模拟栈设置:http://www.21ic.com/jichuzhishi/mcu/questions/2018-05-02/759519.html
    168 EXTRN DATA (?C_IBP);使用其他目标模块中定义的?C_IBP(模拟栈指针)(.M51文件中)
    169 
    170                 MOV     ?C_IBP,#LOW IBPSTACKTOP;模拟栈指针指向栈顶
    171 ENDIF
    172 
    173 IF XBPSTACK <> 0 ;Large模式下使能模拟栈
    174 EXTRN DATA (?C_XBP)
    175                  ;栈指针指向栈顶
    176                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
    177                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
    178 ENDIF
    179 
    180 IF PBPSTACK <> 0 ;COMPACT模式下的模拟栈
    181 EXTRN DATA (?C_PBP)
    182                 MOV     ?C_PBP,#LOW PBPSTACKTOP;指向栈顶
    183 ENDIF
    184 
    185                 MOV     SP,#?STACK-1;硬件栈SP赋值
    186 
    187 ; 如果您将L51_BANK.A51与Banking Mode 4一起使用,则需要此代码
    188 ;<h> 代码银行
    189 ; <q> 为L51_BANK.A51模式4选择Bank 0
    190 #if 0   
    191 ;     <i> 在银行模式4下使用L51_BANK.A51时,将银行机制初始化为代码库0.
    192 EXTRN CODE (?B_SWITCH0)
    193                 CALL    ?B_SWITCH0      ; 代码银行0的初始银行机制
    194 #endif
    195 ;</h>
    196                 LJMP    ?C_START ;执行main函数
    197 
    198                 END
  • 相关阅读:
    Visual Studio 2008 完全卸载
    设置 Visual Studio 文件版权信息
    安装 Visual Studio 插件 Visual Assist
    下载 / 安装 Visual Studio
    Python help 函数
    Python next 函数
    Python oct 函数
    Python min 函数
    Python reload 函数
    numpy中matrix的特殊属性
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/10323706.html
Copyright © 2011-2022 走看看