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

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模式是为64KBXDATARAM定义页

PPAGEENABLEEQUO;使用PDATA也则设为1

PPAGEEQUO;定义页

PPAGE_SFRDATAOAOH;SFR的最高地址字节

;标准SFR

ACCDATAOEOH

BDATAOFOH

SPDATA81H

DPLDATA82H

DPHDATA83H

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

NAMESTARTUP

C_C51STARTUPSEGMENTCODE

STACKSEGMENTIDATA

RSEGACK

DS1

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

PUBLICARTUP;给外部使用的符

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

pan style=””>C_STARTUP

LJMPSTARTUP1

RSEGC51STARTUP

STARTUP1:

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

MOVRO,#IDATALEN-1

CLRA

IDATALOOP:

MOV@RO,A

DJNZRO,IDATALOOP

ENDIF

IFXDATALEN0;若长度大于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

IFPPAGEENABLE0

MOVPPAGE_SFR,#PPAGE

ENDIF

IFPDATALEN0;若长度大于1,则初始化PDATA

MOVR0,#LOW(PDATASTART)

MOVR7,#LOW(PDATALEN)

CLRA

PDATALOOP:

MOVX@R0,A

INCR0

DJNZR7,PDATALOOP

ENDIF

IFIBPSTACK0;SMALL模式下使用重入函数是要设置的堆栈

EXTRNDATA(IBP)

MOVIBP,#LOWIBPSTACKTOP

ENDIF

IFXBPSTACK0;COMPACT模式下使用重入函数是要设置的堆栈

EXTRNDATA(XBP)

MOVXBP,#HIGHXBPSTACKTOP

MOVXBP+1,#HIGHXBPSTACKTOP

ENDIF

IFPBPSTACK0;LARGE模式下使用重入函数是要设置的堆栈

EXTRNDATA(PBP)

MOVPBP,#LOWPBPSTACKTOP

ENDIF

MOVSP,#ACK–1

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

CALLSWITCHO;程序从第一个块(bank0)开始执行

LJMPSTART;从这里跳到C程序入口

END

2.主程序的文件构架:

#include“main.h”

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

{

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();//在串行接口设备驱动程序中的串行收发中断处理函数

//用户可以加入的代码

}

相关资源:直齿圆柱齿轮计算软件_VB编程一对标准直齿圆柱齿轮传动-专业指导…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年7月5日
下一篇 2015年7月6日

相关推荐