8位单片机体系的直接软件构架(C51系列)
1.启动文件的编制
$NOMOD51;Ax51宏汇编器控制命令:禁止预定义的8051
;自定义上电后需要初始化的储存区域
;间接寻址区IDATA起始地址固定为0
IDATALENEQU8OH;指定需要初始化的IDATA区长度(以字节为单位)
XDATASTARTEQUOH;需要初始化的外部直接寻址区XDATA的起始地址
XDATALENEQUOH;指定需要初始化的XDATA区长度(以字节为单位)
PDATASTARTEQUOH;指定需要初始化的页寻址区PDATA起始地址
PDATALENEQUOH;指定需要初始化的PDATA区长度(以字节为单位)
;重入堆栈初始化,下面的EQU语句定义并初始化重入函数的堆栈指针
;SMALL模式下重入函数的堆栈空间
IBPSTACKEQUO ;SMALL模式下使用重入则设为1
EBPSTACKTOPEQUOFFH+1;设置堆栈顶为最高位置+1
;LARGE模式下重入函数的堆栈空间
XBPSTACKEQUO;LARGE模式下使用重入则设为1
XBPSTACKTOPEQUOFFFFH+1;设置堆栈顶为最高位置+1
;COMPACT模式下重入函数的堆栈空间
PBPSTACKEQUO;COMPACT模式下使用重入则设为1
PBPSTACKTOPEQUOFFFFH+1;设置堆栈顶为最高位置+1
;使用COMTACT模式是为64KB的XDATARAM定义页
PPAGEENABLEEQUO;使用PDATA也则设为1
PPAGEEQUO;定义页号
PPAGE_SFRDATAOAOH;SFR的最高地址字节
;标准SFR符号
ACCDATAOEOH
BDATAOFOH
SPDATA81H
DPLDATA82H
DPHDATA83H
;******************************************************************************
NAME?C_STARTUP
C_C51STARTUPSEGMENTCODE
STACKSEGMENTIDATA
RSEG?STACK
DS1
EXTRNCODE(?C_STAR;外部代码(这个标号将代表用户程序的起始地址)
PUBLIC?STARTUP;给外部使用的符号
CSEGATO;在code段0地址处放以下代码(绝对地址定位)
?C_STARTUP:
LJMPSTARTUP1
RSEG?C_C51STARTUP
STARTUP1:
IFIDATALEN<>;若长度大于1,则初始化IDATA
MOVRO,#IDATALEN-1
CLRA
IDATALOOP:
MOV@RO,A
DJNZRO,IDATALOOP
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@DPTA,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF
IFPPAGEENABLE<>0
MOVPPAGE_SFR,#PPAGE
ENDIF
IFPDATALEN<>0;若长度大于1,则初始化PDATA
MOVR0,#LOW(PDATASTART)
MOVR7,#LOW(PDATALEN)
CLRA
PDATALOOP:
MOVX@R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF
IFIBPSTACK<>0;SMALL模式下使用重入函数是要设置的堆栈
EXTRNDATA(?C_IBP)
MOV?C_IBP,#LOWIBPSTACKTOP
ENDIF
IFXBPSTACK<>0;COMPACT模式下使用重入函数是要设置的堆栈
EXTRNDATA(?C_XBP)
MOV?C_XBP,#HIGHXBPSTACKTOP
MOV?C_XBP+1,#HIGHXBPSTACKTOP
ENDIF
IFPBPSTACK<>0;LARGE模式下使用重入函数是要设置的堆栈
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_Init(void)/该函数初始化微控制器
{
USART_vInit();//初始化异步串行接口器件
T01__vInit();//初始化定时器T0和T1
INT__vInit();//初始化外部触发中断ET0、ET1
IP=0x15;//设置中断优先级:T2、T1、T0为低,串口、ET1、ET1为高
//用户可以加入的代码
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();//在串行接口设备驱动程序中的串行收发中断处理函数
//用户可以加入的代码
}