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

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

1.启动文件的编制

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

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

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

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

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

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

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

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

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

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

IBPSTACKEQUO SMALL模式下使用重入则设为1

EBPSTACKTOPEQUOFFH+1;设置堆栈顶为最高位置+1

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

XBPSTACKEQUOLARGE模式下使用重入则设为1

XBPSTACKTOPEQUOFFFFH+1;设置堆栈顶为最高位置+1

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

PBPSTACKEQUOCOMPACT模式下使用重入则设为1

PBPSTACKTOPEQUOFFFFH+1;设置堆栈顶为最高位置+1

;使用COMTACT模式是为64KBXDATARAM定义页

PPAGEENABLEEQUO;使用PDATA也则设为1

PPAGEEQUO;定义页号

PPAGE_SFRDATAOAOHSFR的最高地址字节

;标准SFR符号

ACCDATAOEOH

BDATAOFOH

SPDATA81H

DPLDATA82H

DPHDATA83H

******************************************************************************

NAME?C_STARTUP

C_C51STARTUPSEGMENTCODE

STACKSEGMENTIDATA

RSEG?STACK

DS1

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

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

CSEGATO;在code0地址处放以下代码(绝对地址定位)

C_STARTUP

LJMPSTARTUP1

RSEG?C_C51STARTUP

STARTUP1

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

MOVRO#IDATALEN-1

CLRA

IDATALOOP

MOV@ROA

DJNZROIDATALOOP

ENDIF

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

MOVDPTR#XDATASTART

MOVR7#LOW(XDATALEN)

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

MOVR6#(HIGH(XDATALEN))+1

ELSEMOVR6#HIGH(XDATALEN)

ENDIF

CLRA

XDATALOOP

MOVX@DPTAA

INCDPTR

DJNZR7XDATALOOP

DJNZR6XDATALOOP

ENDIF

IFPPAGEENABLE<>0

MOVPPAGE_SFR#PPAGE

ENDIF

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

MOVR0#LOW(PDATASTART)

MOVR7#LOW(PDATALEN)

CLRA

PDATALOOP

MOVX@R0A

INCR0

DJNZR7PDATALOOP

ENDIF

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

EXTRNDATA(?C_IBP)

MOV?C_IBP#LOWIBPSTACKTOP

ENDIF

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

EXTRNDATA(?C_XBP)

MOV?C_XBP#HIGHXBPSTACKTOP

MOV?C_XBP+1#HIGHXBPSTACKTOP

ENDIF

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

EXTRNDATA(?C_PBP)

MOV?C_PBP#LOWPBPSTACKTOP

ENDIF

MOVSP#?STACK–1

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

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

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

END

2.主程序的文件构架:

#include“main.h”

voidProject_Initvoid/该函数初始化微控制器

{

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

T01__vInit();//初始化定时器T0T1

INT__vInit();//初始化外部触发中断ET0ET1

IP=0x15//设置中断优先级:T2T1T0为低,串口、ET1ET1为高

//用户可以加入的代码

EA=1//开放全局中断

}

//用户可以加入的自定义函数

voidmain(void)//主程序函数,由KeilPK51内定函数C_START调用

{

//用户可以加入的自定义变量

Project_Init()//初始化项目核心微控制器

//用户可以加入的全局初始变量赋值

while(1)//无限循环体,完成后台事务处理

{

//用户可以加入的代码

}

}

3.中断处理文件的构架

中断处理文件interrupt.c的框架格式如下:

#include”interrupt.h

//外部中断0服务处理程序

voidINT_viIsrEx0(void)interruptEXOINT

{

//用户可以加入的代码

}

//定时器T1服务处理程序

voidT1_viIsrT1(void)interruptT1INT

{

//用户可以加入的代码

}

//串行收发中断服务处理程序

voidUSART_viIsr(void)interruptUSARTINT

{

USART_Interrupt();//在串行接口设备驱动程序中的串行收发中断处理函数

//用户可以加入的代码

}

<!--EndFragment-->

你可能感兴趣的:(单片机)