頭文件在C51的編程中是不可缺少的部分。本文將對(duì)keilC中常用頭文件予以說(shuō)明,并就如何編寫頭文件進(jìn)行初步介紹。
一、C51常見本征函數(shù)庫(kù)
一些常見的頭文件都是keilC自帶的,在安裝目錄下的C51文件夾的INC中可以找到keilC中所有的芯片所對(duì)應(yīng)的頭文件。51系列單片機(jī)在編程中常用的頭文件有:AT89X51.H、INTRINS.H、ABSACC.H、MATH.H。
1、AT89X51.H——本征函數(shù)庫(kù)
頭文件AT89X51.H是編程中必需要用到的專用寄存器文件。它與INC中的頭文件REG51.H所定義的內(nèi)容是一樣的。主要用來(lái)定義特殊功能寄存器的位地址、程序狀態(tài)寄存器的位地址、定時(shí)器/計(jì)數(shù)器控制寄存器的位地址、中斷使能控制器位地址、單片機(jī)P3引腳特殊功能位地址、中斷優(yōu)先權(quán)控制寄存器位地址、串行口控制寄存器位地址。
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
程序狀態(tài)字
sfrACC=0xE0
累加器
sfrB=0xF0
B寄存器
sfrSP=0x81
堆棧指針
sfrDPL=0x82
數(shù)據(jù)指針低位
sfrDPH=0x83
數(shù)據(jù)指針高位
sfrPCON=0x87
電源控制寄存器
sfrTCON=0x88
定時(shí)器/計(jì)數(shù)器控制寄存器
sfrTMOD=0x89
定時(shí)器/計(jì)數(shù)器方式控制寄存器
sfrTL0=0x8A
定時(shí)器/計(jì)數(shù)器0(低字節(jié))
sfrTL1=0x8B
定時(shí)器/計(jì)數(shù)器1(低字節(jié))
sfrTH0=0x8C
定時(shí)器/計(jì)數(shù)器0(高字節(jié))
sfrTH1=0x8D
定時(shí)器/計(jì)數(shù)器1(高字節(jié))
sfrIE=0xA8
中斷允許控制寄存器
sfrIP=0xB8
中斷優(yōu)先級(jí)控制寄存器
sfrSCON=0x98
串行控制寄存器
sfrSBUF=0x99
串行緩沖器
BITRegister
程序狀態(tài)寄存器的地址
sbitCY=0xD7
進(jìn)位標(biāo)志
sbitAC=0xD6
輔助進(jìn)位標(biāo)志
sbitF0=0xD5
標(biāo)志位(可自行定義)
sbitRS1=0xD4
寄存器選擇控制位
sbitRS0=0xD3
寄存器選擇控制位
sbitOV=0xD2
溢出標(biāo)志位
sbitP=0xD0
奇偶標(biāo)志位
TCON
定時(shí)器/計(jì)數(shù)器控制寄存器的地址
sbitTF1=0x8F
T1計(jì)數(shù)溢出標(biāo)志位
sbitTR1=0x8E
T1計(jì)數(shù)運(yùn)行控制位
sbitTF0=0x8D
T0計(jì)數(shù)溢出標(biāo)志位
sbitTR0=0x8C
T0計(jì)數(shù)運(yùn)行控制位
sbitIE1=0x8B
中斷1邊沿標(biāo)志
sbitIT1=0x8A
中斷1控制位
sbitIE0=0x89
中斷0邊沿標(biāo)志位
sbitIT0=0x88
中斷0控制位
IE
中斷使能控制器位地址
sbitEA=0xAF
總中斷控標(biāo)志位
sbitES=0xAC
串行中斷標(biāo)志位
sbitET1=0xAB
T1計(jì)數(shù)中斷標(biāo)志位
sbitEX1=0xAA
外部中斷1標(biāo)志位
sbitET0=0xA9
T0計(jì)數(shù)中斷標(biāo)志位
sbitEX0=0xA8
外部中斷0標(biāo)志位
IP
中斷優(yōu)先權(quán)控制寄存器位地址
sbitPS=0xBC
串行中斷優(yōu)先標(biāo)志位
sbitPT1=0xBB
計(jì)數(shù)器1中斷優(yōu)先標(biāo)志位
sbitPX1=0xBA
外部中斷1優(yōu)先標(biāo)志位
sbitPT0=0xB9
計(jì)數(shù)器0中斷優(yōu)先標(biāo)志位
sbitPX0=0xB8
外部中斷0優(yōu)先標(biāo)志位
P3
單片機(jī)P3引腳特殊功能位地址
sbitRD=0xB7
外部數(shù)據(jù)存儲(chǔ)器的寫入控制信號(hào)
sbitWR=0xB6
外部數(shù)據(jù)存儲(chǔ)器的讀取控制信號(hào)
sbitT1=0xB5
定時(shí)器1外部中斷
sbitT0=0xB4
定時(shí)器0外部中斷
sbitINT1=0xB3
外部中斷0
sbitINT0=0xB2
外部中斷1
sbitTXD=0xB1
串行輸出口
sbitRXD=0xB0
串行輸入口
SCON
串行口控制寄存器位地址
sbitSM0=0x9F
串行口模式的選擇位
sbitSM1=0x9E
串行口模式的選擇位
sbitSM2=0x9D
允許模式2和3的多機(jī)通訊控制位
sbitREN=0x9C
允許串行接收位
sbitTB8=0x9B
在模式2和3下傳送第9數(shù)據(jù)位
sbitRB8=0x9A
在模式2和3下存放第9數(shù)據(jù)位
sbitTI=0x99
傳送中斷標(biāo)志位
sbitRI=0x98
接收中斷標(biāo)志位
#endif
2、INTRINS.H——本征函數(shù)庫(kù)
頭文件INTRINS.H主要用來(lái)定義空操作、判斷并清零和字符及數(shù)字的循環(huán)移動(dòng)。
IntrinsicfunctionsforC51.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved
#ifndef__INTRINS_H__
#define__INTRINS_H__
externvoid_nop_(void)
空操作相當(dāng)于NOP指令
xternbit_testbit_(bit)
測(cè)試并清零位相當(dāng)于JBC指令
externunsignedchar_cror_(unsignedchar,unsignedchar)
字符循環(huán)右移
externunsignedint_iror_(unsignedint,unsignedchar)
整數(shù)循環(huán)右移
externunsignedlong_lror_(unsignedlong,unsignedchar
長(zhǎng)整數(shù)循環(huán)右移
externunsignedchar_crol_(unsignedchar,unsignedchar)
字符循環(huán)左移
externunsignedint_irol_(unsignedint,unsignedchar)
長(zhǎng)整數(shù)循環(huán)左移
externunsignedlong_lrol_(unsignedlong,unsignedchar)
整數(shù)循環(huán)左移
Externunsignedchar_chkfloat_(float)
測(cè)試并返回源點(diǎn)數(shù)狀態(tài)
#endif
3、ABSACC.H——本征函數(shù)庫(kù)
頭文件ABSACC.H用來(lái)確定各存儲(chǔ)空間的絕對(duì)地址。包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD。在C51中特有的內(nèi)存型態(tài):
code以MOVC@A+DPTR讀取的程序內(nèi)存
data可以直接存取的內(nèi)部數(shù)據(jù)存儲(chǔ)器
idata以Mov@Rn存取的內(nèi)部數(shù)據(jù)存儲(chǔ)器
bdata可以位尋址(BitAddressable)的內(nèi)部存儲(chǔ)器
xdata以MOVX@DPTR存取的外部數(shù)據(jù)存儲(chǔ)器
pdata以MOVX@Rn存取的外部數(shù)據(jù)存儲(chǔ)器
Directaccessto8051,extended8051andPhilips80C51MXmemoryareas.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.
#ifndef__ABSACC_H__
#define__ABSACC_H__
#defineCBYTE((unsignedcharvolatilecode*)0)
尋址code程序區(qū)
#defineDBYTE((unsignedcharvolatiledata*)0)
尋址data數(shù)據(jù)區(qū)
#definePBYTE((unsignedcharvolatilepdata*)0)
尋址外部pata數(shù)據(jù)區(qū)
#defineXBYTE((unsignedcharvolatilexdata*)0)
尋址外部xdata數(shù)據(jù)區(qū)
#defineCWORD((unsignedintvolatilecode*)0)
指向內(nèi)部ROM的地址
#defineDWORD((unsignedintvolatiledata*)0)
指向內(nèi)部RAM的地址
#definePWORD((unsignedintvolatilepdata*)0)
指向外部RAM的地址
#defineXWORD((unsignedintvolatilexdata*)0)
指向外部RAM的地址
#ifdef__CX51__
如果CX51已被定義過(guò)則編譯下面的的命令
#defineFVAR(object,addr)(*((objectvolatilefar*)(addr)))
從addr處取出object型數(shù)據(jù)
#defineFARRAY(object,base)((objectvolatilefar*)(base))
#defineFCVAR(object,addr)(*((objectconstfar*)(addr)))
#defineFCARRAY(object,base)((objectconstfar*)(base))
#else
如果CX51未被定義過(guò)則編譯下面的的命令
#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——本征函數(shù)庫(kù)
頭文件MATH.H中是一些常見的函數(shù)庫(kù),主要是返回常見函數(shù)的函數(shù)值。
Prototypesformathematicfunctions.Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.
#ifndef__MATH_H__
#define__MATH_H__
#pragmaSAVE
#pragmaREGPARMS
externcharcabs(charval)
返回復(fù)數(shù)val的的絕對(duì)值
externintabs(intval)
返回整型參數(shù)val的絕對(duì)值
externlonglabs(longval)
返回長(zhǎng)整型參數(shù)val的絕對(duì)值
externfloatfabs(floatval)
返回浮點(diǎn)型參數(shù)val的絕對(duì)值
externfloatsqrt(floatval)
返回浮點(diǎn)型參數(shù)val的開方值
externfloatexp(floatval)
返回浮點(diǎn)型參數(shù)val的值
externfloatlog(floatval)
返回浮點(diǎn)型參數(shù)val的值
externfloatlog10(floatval)
返回浮點(diǎn)型參數(shù)val的值
externfloatsin(floatval)
返回浮點(diǎn)型參數(shù)val的正弦值
externfloatcos(floatval)
返回浮點(diǎn)型參數(shù)val的余弦值
externfloattan(floatval)
返回浮點(diǎn)型參數(shù)val的正切值
externfloatasin(floatval)
返回浮點(diǎn)型參數(shù)val的反正弦值
externfloatacos(floatval)
返回浮點(diǎn)型參數(shù)val的反余弦值
externfloatatan(floatval)
返回浮點(diǎn)型參數(shù)val的反正切值
externfloatsinh(floatval)
返回浮點(diǎn)型參數(shù)val的雙曲正弦值
externfloatcosh(floatval)
返回浮點(diǎn)型參數(shù)val的雙曲余弦值
externfloattanh(floatval)
返回浮點(diǎn)型參數(shù)val的雙曲正切值
externfloatatan2(floaty,floatx)
返回浮點(diǎn)型參數(shù)valy/x的反正切值
externfloatceil(floatval)
返回不小于浮點(diǎn)型參數(shù)val的最小整數(shù)
externfloatfloor(floatval)
返回不大于浮點(diǎn)型參數(shù)val的最大整數(shù)
externfloatmodf(floatval,float*n)
把浮點(diǎn)型參數(shù)val分解為整數(shù)部分和小
數(shù)部分,把整數(shù)部分存到n指向的單元
externfloatfmod(floatx,floaty)
返回浮點(diǎn)型參數(shù)x/y的余數(shù)
externfloatpow(floatx,floaty)
返回浮點(diǎn)型參數(shù)值
#pragmaRESTORE
#endif
調(diào)用頭文件須注意參數(shù)的類型。如果主程序中所選參數(shù)的類型與頭文件中的不一樣,則在編譯時(shí)就不會(huì)通過(guò)。
二、頭文件的編制方法
單片機(jī)C語(yǔ)言編程時(shí)往往會(huì)根據(jù)編程的需要編寫頭文件,這些頭文件一般都是用來(lái)設(shè)定電路中芯片的接口定義及工作模式。從上述幾個(gè)標(biāo)準(zhǔn)的頭文件可知,在編寫頭文件時(shí)須遵循一定的格式,頭文件的開始與結(jié)束部分的標(biāo)準(zhǔn)書寫格式如下所示:
#ifndef__頭文件名_H__
#define__頭文件名_H__
┊
#endif
編寫頭文件時(shí)可以調(diào)用KeilC51自帶的頭文件。
自行編寫的頭文件中被調(diào)用的頭文件在主程序中須放在該頭文件的前面,這樣程序在編譯時(shí)才能識(shí)別自行編寫的頭文件中所調(diào)用的頭文件。
編寫的頭文件函數(shù)中不能出現(xiàn)main主函數(shù),對(duì)于某個(gè)具體程序的頭文件的編寫須根據(jù)程序需求結(jié)合硬件和原理圖來(lái)進(jìn)行。