8位单片机体系的直接软件构架(C51系列)

发布者:AngelicJourney最新更新时间:2024-11-08 来源: cnblogs关键字:C51系列 手机看文章 扫描二维码
随时随地手机看文章

1.启动文件的编制

$ NOMOD51                      ;Ax51宏汇编器控制命令:禁止预定义的8051

;自定义上电后需要初始化的储存区域

;间接寻址区IDATA起始地址固定为0

IDATALEN       EQU  8OH       ;指定需要初始化的IDATA区长度(以字节为单位)

XDATASTART    EQU   OH       ;需要初始化的外部直接寻址区XDATA的起始地址

XDATALEN      EQU   OH       ;指定需要初始化的XDATA区长度(以字节为单位)

PDATASTART    EQU   OH       ;指定需要初始化的页寻址区PDATA起始地址

PDATALEN      EQU  OH        ;指定需要初始化的PDATA区长度(以字节为单位)

;重入堆栈初始化,下面的EQU语句定义并初始化重入函数的堆栈指针

;SMALL模式下重入函数的堆栈空间

IBPSTACK        EQU    O         ;SMALL模式下使用重入则设为1

EBPSTACKTOP    EQU    OFFH+1   ;设置堆栈顶为最高位置+1

;LARGE模式下重入函数的堆栈空间

XBPSTACK        EQU    O         ;LARGE模式下使用重入则设为1

XBPSTACKTOP    EQU    OFFFFH+1   ;设置堆栈顶为最高位置+1

;COMPACT模式下重入函数的堆栈空间

PBPSTACK        EQU    O         ;COMPACT模式下使用重入则设为1

PBPSTACKTOP    EQU    OFFFFH+1   ;设置堆栈顶为最高位置+1

;使用COMTACT模式是为64KB的XDATA  RAM定义页

PPAGEENABLE    EQU   O           ;使用PDATA也则设为1

PPAGE            EQU   O           ;定义页号

PPAGE_SFR        DATAOAOH        ;SFR的最高地址字节

;标准SFR符号

ACC              DATA    OEOH

B                 DATA    OFOH

SP                 DATA   81H

DPL                DATA   82H

DPH               DATA    83H

;******************************************************************************

         NAME     ?  C_STARTUP

C_C51STARTUP      SEGMENT      CODE

STACK              SEGMENT      IDATA

         RSEG   ?  STACK

         DS      1

         EXTRN  CODE ( ? C_STAR ;外部代码(这个标号将代表用户程序的起始地址)

         PUBLIC  ?  STARTUP     ;给外部使用的符号

         CSEG     AT      O      ;在code段0地址处放以下代码(绝对地址定位)

?C_STARTUP:

             LJMP    STARTUP1

             RSEG    ? C_C51STARTUP

STARTUP1:

IF  IDATALEN  <>                   ;若长度大于1,则初始化IDATA

              MOV    RO,# IDATALEN-1

              CLR     A

IDATALOOP:

             MOV  @RO,A

             DJNZ    RO,IDATALOOP

ENDIF

IF XDATALEN  <>   0                ;若长度大于1,则初始化XDATA

               MOV   DPTR,#  XDATASTART

               MOV   R7; # LOW (XDATALEN)

IF (LOW(XDATALEN))   <>  0         ;预置初始化的外循环次数为R6

               MOV    R6;# (HIGH (XDATALEN ) )+1

ELSE           MOV   R6;# HIGH (XDATALEN ) 

ENDIF

                CLR  A

XDATALOOP:

             MOVX   @DPTA,A

             INC     DPTR

             DJNZ   R7,XDATALOOP

             DJNZ   R6,XDATALOOP

ENDIF

IF PPAGEENABLE  <>   0

             MOV       PPAGE_SFR,  # PPAGE

ENDIF

IF PDATALEN   <>   0                  ;若长度大于1,则初始化PDATA

              MOV    R0,  #  LOW (PDATASTART)

              MOV     R7, #  LOW (PDATALEN)

              CLR      A

PDATALOOP:

              MOVX      @R0,A

              INC          R0

              DJNZ         R7,PDATALOOP

ENDIF

IF IBPSTACK  <>  0              ;SMALL模式下使用重入函数是要设置的堆栈

EXTRN  DATA  ( ?  C_IBP)

               MOV     ? C_IBP ,# LOW IBPSTACKTOP

ENDIF

IF XBPSTACK  <> 0               ;COMPACT模式下使用重入函数是要设置的堆栈

EXTRN  DATA  ( ? C_XBP)

               MOV     ? C_XBP,# HIGH XBPSTACKTOP

               MOV      ? C_XBP + 1,# HIGH XBPSTACKTOP

ENDIF

IF PBPSTACK  <>  0              ;LARGE 模式下使用重入函数是要设置的堆栈

EXTRN  DATA  ( ? C_PBP)

              MOV        ? C_PBP, # LOW  PBPSTACKTOP

ENDIF

               MOV        SP,# ?  STACK – 1

;如果使用了Mode 4 程序分组技术 ( BANKING )请启用下面的程序代码

;         CALL     ? B_SWITCHO       ;程序从第一个块 (bank0)开始执行

           LJMP      ? C_START          ;从这里跳到C程序入口

           END

2.主程序的文件构架:

# include “main.h”                

void Project_Init(void)     /该函数初始化微控制器

{   

USART_vInit();      //初始化异步串行接口器件

T01__vInit();        //初始化定时器T0和T1

INT__vInit();       //初始化外部触发中断ET0、ET1

[1] [2]
关键字:C51系列 引用地址:8位单片机体系的直接软件构架(C51系列)

上一篇:MCS-51单片机定时器/计数器常见习题解答
下一篇:最后一页

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved