單片機中用c編程時頭文件reg51.h及reg52.h解析
我們在用c語言編程是往往第一行就是reg51.h或者其他的自定義頭文件,我們怎么樣來理解呢?
1)“文件包含”處理。
程序的第一行是一個“文件包含”處理。
所謂“文件包含”是指一個文件將另外一個文件的內(nèi)容全部包含進來。程序中包含REG51.h
文件的目的是為了要使用P1 (還有其他更多的符號)這個符號,即通知C 編譯器,程序中所寫的P1
是指80C51 單片機的P1 端口而不是其它變量。這是如何做到的呢?
打開reg51.h 可以看到這樣的一些內(nèi)容:
(此文件一般在C:\KEIL\C51\INC下
,INC文件夾根目錄里有不少頭文件,并且里面還有很多以公司分類的文件夾,里面也都是相關產(chǎn)品的頭文件。如果我們要使用自己寫的頭文件,使用的時候只需把對應頭文件拷貝到INC文件夾里就可以了。)
#ifndef __REG51_H__
#define __REG51_H__
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;
sbit CY = 0xD7;
sbit AC = 0xD6;
sbit F0 = 0xD5;
sbit RS1 = 0xD4;
sbit RS0 = 0xD3;
sbit OV = 0xD2;
sbit P = 0xD0;
sbit TF1 = 0x8F;
sbit TR1 = 0x8E;
sbit TF0 = 0x8D;
sbit TR0 = 0x8C;
sbit IE1 = 0x8B;
sbit IT1 = 0x8A;
sbit IE0 = 0x89;
sbit IT0 = 0x88;
sbit EA = 0xAF;
sbit ES = 0xAC;
sbit ET1 = 0xAB;
sbit EX1 = 0xAA;
sbit ET0 = 0xA9;
sbit EX0 = 0xA8;
sbit PS = 0xBC;
sbit PT1 = 0xBB;
sbit PX1 = 0xBA;
sbit PT0 = 0xB9;
sbit PX0 = 0xB8;
sbit RD = 0xB7;
sbit WR = 0xB6;
sbit T1 = 0xB5;
sbit T0 = 0xB4;
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD = 0xB1;
sbit RXD = 0xB0;
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
熟悉80C51
內(nèi)部結構的讀者不難看出,這里都是一些符號的定義,即規(guī)定符號名與地址的對應關系。注意其中有
sfr P1 = 0x90;
這樣的一行,即定義P1 與地址0x90 對應,P1 口的地址就是0x90(0x90 是C
語言中十六進制數(shù)的寫法,相當于匯編語言中寫90H)。
從這里還可以看到一個頻繁出現(xiàn)的詞:sfr
sfr 并非標準C 語言的關鍵字,而是Keil 為能直接訪問80C51 中的SFR
而提供了一個新
的關鍵詞,其用法是:
sfrt
變量名=地址值。
2)符號P1_0 來表示P1.0 引腳。
在C 語言里,如果直接寫P1.0,C 編譯器并不能識別,而且P1.0
也不是一個合法的C語言變量名,所以得給它另起一個名字,這里起的名為P1_0,可是P1_0 是不是就是P1.0呢?你這么認為,C
編譯器可不這么認為,所以必須給它們建立聯(lián)系,這里使用了Keil C的關鍵字sbit 來定義,sbit 的用法有三種:
第一種方法:sbit
位變量名=地址值
第二種方法:sbit
位變量名=SFR 名稱^變量位地址值
第三種方法:sbit
位變量名=SFR 地址值^變量位地址值
如定義PSW 中的OV 可以用以下三種方法:
sbit OV=0xd2 (1)說明:0xd2 是OV 的位地址值
sbit OV=PSW^2 (2)說明:其中PSW 必須先用sfr 定義好
sbit OV=0xD0^2 (3)說明:0xD0 就是PSW 的地址值
因此這里用sfr P1_0=P1^0;就是定義用符號P1_0 來表示P1.0
引腳,如果你愿意也可以起P10 一類的名字,只要下面程序中也隨之更改就行了。
=======================================================================
下面再附上reg52.h的頭文件內(nèi)容:
#ifndef __REG52_H__
#define __REG52_H__
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;
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
sbit CY =
PSW^7;
sbit AC =
PSW^6;
sbit F0 =
PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV =
PSW^2;
sbit P =
PSW^0; //8052 only
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
sbit EA = IE^7;
sbit ET2 = IE^5; //8052
only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI =
SCON^1;
sbit RI =
SCON^0;
sbit T2EX = P1^1; // 8052 only
sbit T2 = P1^0; //
8052 only
sbit TF2 =
T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 =
T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;
#endif