头文件在C51的编程中是不可缺少的部分。本文将对keil C中常用头文件予以说明,并就如何编写头文件进行初步介绍。
一、C51常见本征函数库
一些常见的头文件都是keil C自带的,在安装目录下的C51文件夹的INC中可以找到keilC中所有的芯片所对应的头文件。51系列单片机在编程中常用的头文件有:AT89X51.H、INTRINS.H、ABSACC.H、MATH.H。
1、AT89X51.H——本征函数库
头文件AT89X51.H是编程中必需要用到的专用寄存器文件。它与INC中的头文件REG51.H所定义的内容是一样的。主要用来定义特殊功能寄存器的位地址、程序状态寄存器的位地址、定时器/计数器控制寄存器的位地址、中断使能控制器位地址、单片机P3引脚特殊功能位地址、中断优先权控制寄存器位地址、串行口控制寄存器位地址。
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 |
P0口锁存器的地址 |
sfr P1 = 0x90 |
P1口锁存器的地址 |
sfr P2 = 0xA0 |
P2口锁存器的地址 |
sfr P3 = 0xB0 |
P3口锁存器的地址 |
sfr PSW = 0xD0 |
程序状态字 |
sfr ACC = 0xE0 |
累加器 |
sfr B = 0xF0 |
B寄存器 |
sfr SP = 0x81 |
堆栈指针 |
sfr DPL = 0x82 |
数据指针低位 |
sfr DPH = 0x83 |
数据指针高位 |
sfr PCON = 0x87 |
电源控制寄存器 |
sfr TCON = 0x88 |
定时器/计数器控制寄存器 |
sfr TMOD = 0x89 |
定时器/计数器方式控制寄存器 |
sfr TL0 = 0x8A |
定时器/计数器0(低字节) |
sfr TL1 = 0x8B |
定时器/计数器1(低字节) |
sfr TH0 = 0x8C |
定时器/计数器0(高字节) |
sfr TH1 = 0x8D |
定时器/计数器1(高字节) |
sfr IE = 0xA8 |
中断允许控制寄存器 |
sfr IP = 0xB8 |
中断优先级控制寄存器 |
sfr SCON = 0x98 |
串行控制寄存器 |
sfr SBUF = 0x99 |
串行缓冲器 |
BIT Register |
程序状态寄存器的地址 |
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 |
T1计数溢出标志位 |
sbit TR1 = 0x8E |
T1计数运行控制位 |
sbit TF0 = 0x8D |
T0计数溢出标志位 |
sbit TR0 = 0x8C |
T0计数运行控制位 |
sbit IE1 = 0x8B |
中断1边沿标志 |
sbit IT1 = 0x8A |
中断1控制位 |
sbit IE0 = 0x89 |
中断0边沿标志位 |
sbit IT0 = 0x88 |
中断0控制位 |
IE |
中断使能控制器位地址 |
sbit EA = 0xAF |
总中断控标志位 |
sbit ES = 0xAC |
串行中断标志位 |
sbit ET1 = 0xAB |
T1计数中断标志位 |
sbit EX1 = 0xAA |
外部中断1标志位 |
sbit ET0 = 0xA9 |
T0计数中断标志位 |
sbit EX0 = 0xA8 |
外部中断0标志位 |
IP |
中断优先权控制寄存器位地址 |
sbit PS = 0xBC |
串行中断优先标志位 |
sbit PT1 = 0xBB |
计数器1中断优先标志位 |
sbit PX1 = 0xBA |
外部中断1优先标志位 |
sbit PT0 = 0xB9 |
计数器0中断优先标志位 |
sbit PX0 = 0xB8 |
外部中断0优先标志位 |
P3 |
单片机P3引脚特殊功能位地址 |
sbit RD = 0xB7 |
外部数据存储器的写入控制信号 |
sbit WR = 0xB6 |
外部数据存储器的读取控制信号 |
sbit T1 = 0xB5 |
定时器1外部中断 |
sbit T0 = 0xB4 |
定时器0外部中断 |
sbit INT1 = 0xB3 |
外部中断0 |
sbit INT0 = 0xB2 |
外部中断1 |
sbit TXD = 0xB1 |
串行输出口 |
sbit RXD = 0xB0 |
串行输入口 |
SCON |
串行口控制寄存器位地址 |
sbit SM0 = 0x9F |
串行口模式的选择位 |
sbit SM1 = 0x9E |
串行口模式的选择位 |
sbit SM2 = 0x9D |
允许模式2和3的多机通讯控制位 |
sbit REN = 0x9C |
允许串行接收位 |
sbit TB8 = 0x9B |
在模式2和3下传送第9数据位 |
sbit RB8 = 0x9A |
在模式2和3下存放第9数据位 |
sbit TI = 0x99 |
传送中断标志位 |
sbit RI = 0x98 |
接收中断标志位 |
#endif |
|
2、INTRINS.H——本征函数库
头文件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) |
空操作相当于NOP指令 |
xtern bit _testbit_ (bit) |
测试并清零位相当于JBC指令 |
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, unsignedchar) |
字符循环左移 |
extern unsigned int _irol_ (unsigned int, unsigned char) |
长整数循环左移 |
extern unsigned long _lrol_ (unsigned long, unsigned char) |
整数循环左移 |
Extern unsigned char _chkfloat_(float) |
测试并返回源点数状态 |
#endif |
|
3、ABSACC.H——本征函数库
头文件ABSACC.H用来确定各存储空间的绝对地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD。在C51中特有的内存型态:
code 以 MOVC @A+DPTR 读取的程序内存
data 可以直接存取的内部数据存储器
idata 以 Mov @Rn 存取的内部数据存储器
bdata 可以位寻址(Bit Addressable)的内部存储器
xdata 以 MOVX @DPTR 存取的外部数据存储器
pdata 以 MOVX @Rn 存取的外部数据存储器
Direct access to 8051, extended 8051 and Philips 80C51MX memory areas. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.
#ifndef __ABSACC_H__ |
|
#define __ABSACC_H__ |
|
#define CBYTE ((unsigned char volatile code *) 0) |
寻址code程序区 |
#define DBYTE ((unsigned char volatile data *) 0) |
寻址data数据区 |
#define PBYTE ((unsigned char volatile pdata *) 0) |
寻址外部pata数据区 |
#define XBYTE ((unsigned char volatile xdata *) 0) |
寻址外部xdata数据区 |
#define CWORD ((unsigned int volatile code *) 0) |
指向内部ROM的地址 |
#define DWORD ((unsigned int volatile data *) 0) |
指向内部RAM的地址 |
#define PWORD ((unsigned int volatile pdata *) 0) |
指向外部RAM的地址 |
#define XWORD ((unsigned int volatile xdata *) 0) |
指向外部RAM的地址 |
#ifdef __CX51__ |
如果CX51已被定义过则编译下面的的命令 |
#define FVAR(object, addr) (*((object volatile far *) (addr))) |
从addr处取出object 型数据 |
#define FARRAY(object, base) ((object volatile far *) (base)) |
|
#define FCVAR(object, addr) (*((object const far *) (addr))) |
|
#define FCARRAY(object, base) ((object const far *) (base)) |
|
#else |
如果CX51未被定义过则编译下面的的命令 |
#define FVAR(object,addr)(*((object volatile far *)((addr)+0x10000L))) |
|
#define FCVAR(object, addr)(*((object const far *)((addr)+0x810000L))) |
|
#define FARRAY(object, base)(object volatile far *)((base)+0x10000L)) |
|
#defineFCARRAY(object, base)((object const far *)((base)+0x810000 L)) |
|
endif |
|
#endif |
|
4、MATH.H——本征函数库
头文件MATH.H中是一些常见的函数库,主要是返回常见函数的函数值。
Prototypes for mathematic functions.Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved.
#ifndef __MATH_H__ |
|
#define __MATH_H__ |
|
#pragma SAVE |
|
#pragma REGPARMS |
|
extern char cabs (char val) |
返回复数val的的绝对值 |
extern int abs (int val) |
返回整型参数val的绝对值 |
extern long labs (long val) |
返回长整型参数val的绝对值 |
extern float fabs (float val) |
返回浮点型参数val的绝对值 |
extern float sqrt (float val) |
返回浮点型参数val的开方值 |
extern float exp (float val) |
返回浮点型参数val的 值 |
extern float log (float val) |
返回浮点型参数val的值 |
extern float log10 (float val) |
返回浮点型参数val的 值 |
extern float sin (float val) |
返回浮点型参数val的正弦值 |
extern float cos (float val) |
返回浮点型参数val的余弦值 |
extern float tan (float val) |
返回浮点型参数val的正切值 |
extern float asin (float val) |
返回浮点型参数val的反正弦值 |
extern float acos (float val) |
返回浮点型参数val的反余弦值 |
extern float atan (float val) |
返回浮点型参数val的反正切值 |
extern float sinh (float val) |
返回浮点型参数val的双曲正弦值 |
extern float cosh (float val) |
返回浮点型参数val的双曲余弦值 |
extern float tanh (float val) |
返回浮点型参数val的双曲正切值 |
extern float atan2 (float y, float x) |
返回浮点型参数val y/x的反正切值 |
extern float ceil (float val) |
返回不小于浮点型参数val的最小整数 |
extern float floor (float val) |
返回不大于浮点型参数val的最大整数 |
extern float modf (float val, float *n) |
把浮点型参数val分解为整数部分和小 数部分,把整数部分存到n指向的单元 |
extern float fmod (float x, float y) |
返回浮点型参数x/y的余数 |
extern float pow (float x, float y) |
返回浮点型参数 值 |
#pragma RESTORE |
|
#endif |
|
调用头文件须注意参数的类型。如果主程序中所选参数的类型与头文件中的不一样,则在编译时就不会通过。
二、头文件的编制方法
单片机C语言编程时往往会根据编程的需要编写头文件,这些头文件一般都是用来设定电路中芯片的接口定义及工作模式。从上述几个标准的头文件可知,在编写头文件时须遵循一定的格式,头文件的开始与结束部分的标准书写格式如下所示:
#ifndef __头文件名_H__
#define __头文件名_H__
┊
#endif
编写头文件时可以调用KeilC51自带的头文件。
自行编写的头文件中被调用的头文件在主程序中须放在该头文件的前面,这样程序在编译时才能识别自行编写的头文件中所调用的头文件。
编写的头文件函数中不能出现main主函数,对于某个具体程序的头文件的编写须根据程序需求结合硬件和原理图来进行。
上一篇:三种常用的CRC16校验算法的C51程序的优化
下一篇:KeilC51中的库函数printf
推荐阅读最新更新时间:2024-03-16 15:19