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();//在串行接口设备驱动程序中的串行收发中断处理函数
//用户可以加入的代码
}
相关推荐
STC8H系列单片机启光开发板全套源代码,又初级及进阶,STC8H是STC最新单片机,目前相应开发板还不多,启光开发板例程是很不错的。
单片机原理与应用及C51程序设计(第3版).rar
单片机原理与应用及C51程序设计课后习题答案,清华大学出版社,谢维成,杨加国主编。
单片机原理与应用及C51程序设计课件电子教案
51单片机 51单片机 51单片机 51单片机 C51程序代码和原理图
实战型C51单片机程序例程软件源码20例合集: 10、LED流水+定时器.zip 11、LCD1602滚动显示.zip 12、LCD1602显示红外值.zip 13、LCD1602显示矩阵按键键值.zip 14、LCD显示温度+串口接收温度.zip 15、按键控制蜂鸣器....
C51型单片机仿真器调试软件C51型单片机仿真器调试软件
单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件
C8051Fxxx系列单片机是完全集成的混合信号系统级芯片, 具有与 8051兼容的微控制器 内核,与 MCS-51 指令集完全兼容。除了具有标准 8052 的数字外设部件之外,片内还集成了 数据采集和控制系统中常用的模拟部件和...
郭天祥程序 51单片机郭天祥TX-1C51单片机开发板\
单片机原理与应用及C51程序设计 第二版 谢维成 课本教程
c51单片机编程工具,号称经典。c51单片机编程工具,号称经典。
单片机C51学习 单片机C51-流水灯2 软件延时
单片机 嵌入式 C51 单片机习题集单片机 嵌入式 C51
单片机C51常用子程序 C51子程序 单片机C51常用子程序 C51子程序
单片机原理与应用及C51程序设计(第三版)(1、2、3、4、7章课后习题答案).pdf
单片机原理与应用及C51程序设计__杨加国主编_基本完整版答案,1~六章。
单片机原理与应用及C51程序设计-唐颖 单片机原理与应用及C51程序设计-唐颖
单片机原理及接口技术 C51编程
51单片机是应用比较广的单片机类型,而且也是单片机入门级芯片,作为一款基于单片机的编程软件,Keil C51与C语言编程风格近似,得到广泛应用。