C51单片机头文件和启动文件

STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数

<reg51.h>  //特殊寄存器的字节地址和位地址,sfr定义字节变量、sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器。

<intrins.h> //定义了一些外部函数,在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便.

/*--------------------------------------------------------------------------
REG51.H

Header file for generic 80C51 and 80C31 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __REG51_H__
#define __REG51_H__

/* BYTE Register */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;


/* BIT Register */
/* PSW */
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;

/* TCON */
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;

/* IE */
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;

/* IP */
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;

/* P3 */
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;

/* SCON */
sbit SM0 = 0x9F;
sbit SM1 = 0x9E;
sbit SM2 = 0x9D;
sbit REN = 0x9C;
sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;

#endif

 

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);

#endif

 

关于sfr、sbit://如同int、char...

sfr 似乎不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。

例:sfr P1 = 0x90;

这样的一行即定义P1 与地址0x90 对应,P1 口的地址就是0x90.

SFR的定义在头文件reg51.h或reg52.h中。

 

在C51里,利用sbit可访问RAM中可寻址位或SFR中可寻址位。

如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,比如P1_0,可是P1_0 是不是就是P1.0呢?C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit 来定义,sbit 的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR 名称^变量位地址值

第三种方法:sbit 位变量名=SFR 地址值^变量位地址值

例如,定义P1 中的P1.1脚可以用以下三种方法:

sbit P1_1=0x92 (1)说明:0x92是P1.1 的位地址值

sbit P1_1=P1^1 (2)说明:其中P1必须先用sfr 定义好

sbit P1_1=0x90^2 (3)说明:0x90 就是P1的地址值

因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引

 

sfr 是定义8 位(范围0~255)的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器, 如8052 的T2 定时器,可以定义为: 
sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH 

在KEIL中,汇编是从ORG 000H开始启动,那么它在C51中是如何启动MAIN()函数的呢?实际上是C51中有一个启启动程序STARTUP.A51,它总是和C程序一起编译和链接的.
启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行, 其功能包括
z 定义内部RAM大小、外部RAM大小、可重入堆栈位置
z 清除内部、外部或者以此页为单元的外部存储器
z 按存储模式初使化重入堆栈及堆栈指针
z 初始化8051硬件堆栈指针
z 向main( )函数交权
 
开发人员 可修改以下数据从而对系统初始化
常数名 意义
IDATALEN                  待清内部RAM长度
XDATA START           指定待清外部RAM起始地址
XDATALEN                 待清外部RAM长度
IBPSTACK                  是否小模式重入堆栈指针需初始化标志,1为需要。缺省为0
IBPSTACKTOP           指定小模式重入堆栈顶部地址
XBPSTACK                是否大模式重入堆栈指针需初始化标志,缺省为0
XBPSTACKTOP         指定大模式重入堆栈顶部地址
PBPSTACK                是否Compact重入堆栈指针,需初始化标志,缺省为0
PBPSTACKTOP         指定Compact模式重入堆栈顶部地址
PPAGEENABLE         P2初始化允许开关
PPAGE                      指定P2值
PDATASTART          待清外部RAM页首址
经常可能需要修改的地方:(红色)
XDATASTART EQU 0H ;                     the absolute start-address of XDATA memory
XDATALEN EQU 0H ;                          the length of XDATA memory in bytes.
 
XBPSTACK EQU 0 ;                            set to 1 if large reentrant is used.
XBPSTACKTOP EQU 0FFFFH+1;      set top of stack to highest location+1.
 
PPAGEENABLE EQU 0 ;                     set to 1 if pdata object are used.
PPAGE EQU 0 ;                                  define PPAGE number.

 

当在kiel  C中新建项目时,会问:
Copy standard 8051 Starup Code to Project Forder and add file to Project?
翻译为:复制8051启动代码到项目并和添加文件到项目?

其实无论您选是还是否,您的代码中都将包含该文件。
该文件的作用是 初始化 内外部 RAM使其清零,另外还初始化SP等。
如果上述提示框您选否,对哪些RAM清零将采用默认的方式。
如果您想改变RAM清零区域(假如希望复位时某些RAM不被清零时会很有用。),您可以选是,这样该文件的一个副本将添加到您的项目,您可以根据需要改写此文件。

其他SP,SAMLL/COMPACT、LARGE模式的重入函数的堆栈和指针的初始化等和RAM的道理是一样的。

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