最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

keil下C51启动代码详解

来源:动视网 责编:小OO 时间:2025-10-03 20:01:19
文档

keil下C51启动代码详解

keil下C51启动代码详解      这是我在书上看到的,于是把它整理过来。我还没有完全看明白,发上来,和大家一起分享讨论,欢迎大家发表意见!      由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:;---------------------------------------------------;startup.A51:用户上电初
推荐度:
导读keil下C51启动代码详解      这是我在书上看到的,于是把它整理过来。我还没有完全看明白,发上来,和大家一起分享讨论,欢迎大家发表意见!      由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:;---------------------------------------------------;startup.A51:用户上电初
keil下C51启动代码详解 

       这是我在书上看到的,于是把它整理过来。我还没有完全看明白,发上来,和大家一起分享讨论,欢迎大家发表意见!

       由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:

;---------------------------------------------------

;startup.A51: 用户上电初始化程序

;----------------------------------------------------

;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间

;IDATA存储器的空间的绝对起始地址总是零

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存储器模式时再入函数的堆栈空间

IBPSACK  EQU  0   ;使用SMALL存储器模式再入函数时将其设置成1

IBPSTACKTOP  EQU  0FFH+1    ;将堆栈顶设置为最高地址加1

;

;使用LARGE存储器模式时再入函数的堆栈空间

XBPSTACK  EQU  0     ;使用LARGE存储器模式再入函数时将其设置成1

XBPSTACKTOP  WQU  0FFFFH+1     ;将堆栈顶设置为最高地址加1

;

;使用COMPACT存储器模式时再入函数的堆栈空间

PBPSTACK  EQU  0     ; 使用COMPACT存储器模式再入函数时将其设置成1

PBPSTACKTOP  WQU  0FFFFH+1     ;将堆栈顶设置为最高地址加1

;;----------------------------------------------------

;使用COMPACT存储器模式时,KB X DATA存储器空间的分页定义

;

;以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址

;使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致

;

PPAGEENABLE  EQU  0     ;使用PDATA类型变量时将其设置成1

PPAGE  EQU  0      ;定义页号

;

;------------------------------------------------

NAME  ? C_STARTUP   ;模块名为 ? C_STARTUP

? C_51STARTUP  SEGMENT CODE     ;代码段

? STACK  SEGMENT IDATA      ;堆栈段

RSEG  ? STACK              ;堆栈

DS 1

EXTRN COE(? C_START)          ;程序开始地址

PUBLIC ? C_STARTUP

CSEG AT 0x8000                 ;定义用户程序的起始地址,用MON51仿真器时可能有用

? C_STARTUP: LFMP STARTUP1

RSEG  ? C_51STARTUP

STARTUP1:

;

;初始化串口

MOV SCOM, #40H

MOV TMOD, #20H

MOV TH1, #0FDH

SETB TR1

CLR T1

;单片机上电IDATA内存清零,如果不需要上电清零IDATA,可以注销IF到IFEDN之间的语句,或者修改IDTALEN的长度,为了让CPU具有掉电保护功能,需要确定IDTALEN的长度

IF IDATALEN <> 0

MOV R0, # IDATALEN-1

CLR A

IDATALOOP: MOV @R0,A

DJNZ R0,IDATALOOP

ENDIF

;

;单片机上电XDATA内存清零,如果不需要上电清零XDATA,可以注销IF到IFEDN之间的

;语句,或者修改XDTALEN的长度

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

END IF

;

;送PDATA存储器页面高位地址

IF PPAGEENABLE <> 0

MOV P2, #PPAGE

ENDIF

;

;单片机上电PDATA内存清零,如果不需要上电清零XDATA,可注销IF到IFEDN之

;间的语句或者修改PDATALEN的长度

IF PDATALEN <> 0

MOV R0, #PDATASTART

MOV R7, #LOW (PDATALEN)

CLR A

PDATALOOP: MOV @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

END IF 

;

;设置堆栈的起始地址

MOV SP, #? STACK-1           ;例如 MOV SP, #4FH

;

;如果程序超过K,则使用程序分组技术,启动下面的程序

;EXTRN CODE(? B_SWITCH0)

;CALL ? B_SWITCH0

;程序从第一组bank 0 块开始执行

;跳转到用户程序MAIN函数

LJMP ? C_START

END 

文档

keil下C51启动代码详解

keil下C51启动代码详解      这是我在书上看到的,于是把它整理过来。我还没有完全看明白,发上来,和大家一起分享讨论,欢迎大家发表意见!      由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下:;---------------------------------------------------;startup.A51:用户上电初
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top