8位單片機體系的直接軟件構架(C51系列)
8位單片機體系的直接軟件構架(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模式下重入函數的堆??臻g
IBPSTACK EQU O ;SMALL模式下使用重入則設為1
EBPSTACKTOP EQU OFFH+1 ;設置堆棧頂為最高位置+1
;LARGE模式下重入函數的堆??臻g
XBPSTACK EQU O ;LARGE模式下使用重入則設為1
XBPSTACKTOP EQU OFFFFH+1 ;設置堆棧頂為最高位置+1
;COMPACT模式下重入函數的堆??臻g
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
IP = 0x15; //設置中斷優先級:T2、T1、T0為低,串口、ET1、ET1為高
//用戶可以加入的代碼
EA = 1; //開放全局中斷
}
//用戶可以加入的自定義函數
void main ( void) //主程序函數,由Keil PK51內定函數C_START調用
{
//用戶可以加入的自定義變量
Project_Init(); //初始化項目核心微控制器
//用戶可以加入的全局初始變量賦值
while(1) //無限循環體,完成后臺事務處理
{
//用戶可以加入的代碼
}
}
3.中斷處理文件的構架
中斷處理文件interrupt.c 的框架格式如下:
#include”interrupt.h
//外部中斷0服務處理程序
void INT_viIsrEx0(void)interrupt EXOINT
{
//用戶可以加入的代碼
}
//定時器T1服務處理程序
void T1_viIsrT1(void) interrupt T1 INT
{
//用戶可以加入的代碼
}
// 串行收發中斷服務處理程序
void USART_ viIsr (void)interrupt USARTINT
{
USART_Interrupt(); //在串行接口設備驅動程序中的串行收發中斷處理函數
//用戶可以加入的代碼
}
浙公網安備 33010602011771號