C51编程中头文件的使用
扫描二维码
随时随地手机看文章
头文件在C51的编程中是不可缺少的部分。本文将对keilC中常用头文件予以说明,并就如何编写头文件进行初步介绍。
一、C51常见本征函数库
一些常见的头文件都是keilC自带的,在安装目录下的C51文件夹的INC中可以找到keilC中所有的芯片所对应的头文件。51系列单片机在编程中常用的头文件有:AT89X51.H、INTRINS.H、ABSACC.H、MATH.H。
1、AT89X51.H——本征函数库
头文件AT89X51.H是编程中必需要用到的专用寄存器文件。它与INC中的头文件REG51.H所定义的内容是一样的。主要用来定义特殊功能寄存器的位地址、程序状态寄存器的位地址、定时器/计数器控制寄存器的位地址、中断使能控制器位地址、单片机P3引脚特殊功能位地址、中断优先权控制寄存器位地址、串行口控制寄存器位地址。
Headerfileforgeneric80C51and80C31microcontroller.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.
#ifndef__REG51_H_
#define__REG51_H_
BYTERegister
特殊功能寄存器的位地址
sfrP0=0x80
P0口锁存器的地址
sfrP1=0x90
P1口锁存器的地址
sfrP2=0xA0
P2口锁存器的地址
sfrP3=0xB0
P3口锁存器的地址
sfrPSW=0xD0
程序状态字
sfrACC=0xE0
累加器
sfrB=0xF0
B寄存器
sfrSP=0x81
堆栈指针
sfrDPL=0x82
数据指针低位
sfrDPH=0x83
数据指针高位
sfrPCON=0x87
电源控制寄存器
sfrTCON=0x88
定时器/计数器控制寄存器
sfrTMOD=0x89
定时器/计数器方式控制寄存器
sfrTL0=0x8A
定时器/计数器0(低字节)
sfrTL1=0x8B
定时器/计数器1(低字节)
sfrTH0=0x8C
定时器/计数器0(高字节)
sfrTH1=0x8D
定时器/计数器1(高字节)
sfrIE=0xA8
中断允许控制寄存器
sfrIP=0xB8
中断优先级控制寄存器
sfrSCON=0x98
串行控制寄存器
sfrSBUF=0x99
串行缓冲器
BITRegister
程序状态寄存器的地址
sbitCY=0xD7
进位标志
sbitAC=0xD6
辅助进位标志
sbitF0=0xD5
标志位(可自行定义)
sbitRS1=0xD4
寄存器选择控制位
sbitRS0=0xD3
寄存器选择控制位
sbitOV=0xD2
溢出标志位
sbitP=0xD0
奇偶标志位
TCON
定时器/计数器控制寄存器的地址
sbitTF1=0x8F
T1计数溢出标志位
sbitTR1=0x8E
T1计数运行控制位
sbitTF0=0x8D
T0计数溢出标志位
sbitTR0=0x8C
T0计数运行控制位
sbitIE1=0x8B
中断1边沿标志
sbitIT1=0x8A
中断1控制位
sbitIE0=0x89
中断0边沿标志位
sbitIT0=0x88
中断0控制位
IE
中断使能控制器位地址
sbitEA=0xAF
总中断控标志位
sbitES=0xAC
串行中断标志位
sbitET1=0xAB
T1计数中断标志位
sbitEX1=0xAA
外部中断1标志位
sbitET0=0xA9
T0计数中断标志位
sbitEX0=0xA8
外部中断0标志位
IP
中断优先权控制寄存器位地址
sbitPS=0xBC
串行中断优先标志位
sbitPT1=0xBB
计数器1中断优先标志位
sbitPX1=0xBA
外部中断1优先标志位
sbitPT0=0xB9
计数器0中断优先标志位
sbitPX0=0xB8
外部中断0优先标志位
P3
单片机P3引脚特殊功能位地址
sbitRD=0xB7
外部数据存储器的写入控制信号
sbitWR=0xB6
外部数据存储器的读取控制信号
sbitT1=0xB5
定时器1外部中断
sbitT0=0xB4
定时器0外部中断
sbitINT1=0xB3
外部中断0
sbitINT0=0xB2
外部中断1
sbitTXD=0xB1
串行输出口
sbitRXD=0xB0
串行输入口
SCON
串行口控制寄存器位地址
sbitSM0=0x9F
串行口模式的选择位
sbitSM1=0x9E
串行口模式的选择位
sbitSM2=0x9D
允许模式2和3的多机通讯控制位
sbitREN=0x9C
允许串行接收位
sbitTB8=0x9B
在模式2和3下传送第9数据位
sbitRB8=0x9A
在模式2和3下存放第9数据位
sbitTI=0x99
传送中断标志位
sbitRI=0x98
接收中断标志位
#endif
2、INTRINS.H——本征函数库
头文件INTRINS.H主要用来定义空操作、判断并清零和字符及数字的循环移动。
IntrinsicfunctionsforC51.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved
#ifndef__INTRINS_H__
#define__INTRINS_H__
externvoid_nop_(void)
空操作相当于NOP指令
xternbit_testbit_(bit)
测试并清零位相当于JBC指令
externunsignedchar_cror_(unsignedchar,unsignedchar)
字符循环右移
externunsignedint_iror_(unsignedint,unsignedchar)
整数循环右移
externunsignedlong_lror_(unsignedlong,unsignedchar
长整数循环右移
externunsignedchar_crol_(unsignedchar,unsignedchar)
字符循环左移
externunsignedint_irol_(unsignedint,unsignedchar)
长整数循环左移
externunsignedlong_lrol_(unsignedlong,unsignedchar)
整数循环左移
Externunsignedchar_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可以位寻址(BitAddressable)的内部存储器
xdata以MOVX@DPTR存取的外部数据存储器
pdata以MOVX@Rn存取的外部数据存储器
Directaccessto8051,extended8051andPhilips80C51MXmemoryareas.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.
#ifndef__ABSACC_H__
#define__ABSACC_H__
#defineCBYTE((unsignedcharvolatilecode*)0)
寻址code程序区
#defineDBYTE((unsignedcharvolatiledata*)0)
寻址data数据区
#definePBYTE((unsignedcharvolatilepdata*)0)
寻址外部pata数据区
#defineXBYTE((unsignedcharvolatilexdata*)0)
寻址外部xdata数据区
#defineCWORD((unsignedintvolatilecode*)0)
指向内部ROM的地址
#defineDWORD((unsignedintvolatiledata*)0)
指向内部RAM的地址
#definePWORD((unsignedintvolatilepdata*)0)
指向外部RAM的地址
#defineXWORD((unsignedintvolatilexdata*)0)
指向外部RAM的地址
#ifdef__CX51__
如果CX51已被定义过则编译下面的的命令
#defineFVAR(object,addr)(*((objectvolatilefar*)(addr)))
从addr处取出object型数据
#defineFARRAY(object,base)((objectvolatilefar*)(base))
#defineFCVAR(object,addr)(*((objectconstfar*)(addr)))
#defineFCARRAY(object,base)((objectconstfar*)(base))
#else
如果CX51未被定义过则编译下面的的命令
#defineFVAR(object,addr)(*((objectvolatilefar*)((addr)+0x10000L)))
#defineFCVAR(object,addr)(*((objectconstfar*)((addr)+0x810000L)))
#defineFARRAY(object,base)(objectvolatilefar*)((base)+0x10000L))
#defineFCARRAY(object,base)((objectconstfar*)((base)+0x810000L))
endif
#endif
4、MATH.H——本征函数库
头文件MATH.H中是一些常见的函数库,主要是返回常见函数的函数值。
Prototypesformathematicfunctions.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.
#ifndef__MATH_H__
#define__MATH_H__
#pragmaSAVE
#pragmaREGPARMS
externcharcabs(charval)
返回复数val的的绝对值
externintabs(intval)
返回整型参数val的绝对值
externlonglabs(longval)
返回长整型参数val的绝对值
externfloatfabs(floatval)
返回浮点型参数val的绝对值
externfloatsqrt(floatval)
返回浮点型参数val的开方值
externfloatexp(floatval)
返回浮点型参数val的值
externfloatlog(floatval)
返回浮点型参数val的值
externfloatlog10(floatval)
返回浮点型参数val的值
externfloatsin(floatval)
返回浮点型参数val的正弦值
externfloatcos(floatval)
返回浮点型参数val的余弦值
externfloattan(floatval)
返回浮点型参数val的正切值
externfloatasin(floatval)
返回浮点型参数val的反正弦值
externfloatacos(floatval)
返回浮点型参数val的反余弦值
externfloatatan(floatval)
返回浮点型参数val的反正切值
externfloatsinh(floatval)
返回浮点型参数val的双曲正弦值
externfloatcosh(floatval)
返回浮点型参数val的双曲余弦值
externfloattanh(floatval)
返回浮点型参数val的双曲正切值
externfloatatan2(floaty,floatx)
返回浮点型参数valy/x的反正切值
externfloatceil(floatval)
返回不小于浮点型参数val的最小整数
externfloatfloor(floatval)
返回不大于浮点型参数val的最大整数
externfloatmodf(floatval,float*n)
把浮点型参数val分解为整数部分和小
数部分,把整数部分存到n指向的单元
externfloatfmod(floatx,floaty)
返回浮点型参数x/y的余数
externfloatpow(floatx,floaty)
返回浮点型参数值
#pragmaRESTORE
#endif
调用头文件须注意参数的类型。如果主程序中所选参数的类型与头文件中的不一样,则在编译时就不会通过。
二、头文件的编制方法
单片机C语言编程时往往会根据编程的需要编写头文件,这些头文件一般都是用来设定电路中芯片的接口定义及工作模式。从上述几个标准的头文件可知,在编写头文件时须遵循一定的格式,头文件的开始与结束部分的标准书写格式如下所示:
#ifndef__头文件名_H__
#define__头文件名_H__
┊
#endif
编写头文件时可以调用KeilC51自带的头文件。
自行编写的头文件中被调用的头文件在主程序中须放在该头文件的前面,这样程序在编译时才能识别自行编写的头文件中所调用的头文件。
编写的头文件函数中不能出现main主函数,对于某个具体程序的头文件的编写须根据程序需求结合硬件和原理图来进行。