我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢?
1)“文件包含”处理。
程序的第一行是一个“文件包含”处理。
所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。程序中包含REG51.h
文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。这是如何做到的呢?
打开reg51.h 可以看到这样的一些内容:
(此文件一般在C:KEILC51INC下 ,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。)
#ifndef __REG51_H__
#define __REG51_H__
sfr P0
sfr P1
sfr P2
sfr P3
sfr PSW
sfr ACC
sfr B
sfr SP
sfr DPL
sfr DPH
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0
sfr TL1
sfr TH0
sfr TH1
sfr IE
sfr IP
sfr SCON = 0x98;
sfr SBUF = 0x99;
sbit CY
sbit AC
sbit F0
sbit RS1
sbit RS0
sbit OV
sbit P
sbit TF1
sbit TR1
sbit TF0
sbit TR0
sbit IE1
sbit IT1
sbit IE0
sbit IT0
sbit EA
sbit ES
sbit ET1
sbit EX1
sbit ET0
sbit EX0
sbit PS
sbit PT1
sbit PX1
sbit PT0
sbit PX0
sbit RD
sbit WR
sbit T1
sbit T0
sbit INT1 = 0xB3;
sbit INT0 = 0xB2;
sbit TXD
sbit RXD
sbit SM0
sbit SM1
sbit SM2
sbit REN
sbit TB8
sbit RB8
sbit TI
sbit RI
#endif
熟悉80C51 内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地
址的对应关系。注意其中有
sfr P1 = 0x90;
这样的一行,即定义P1 与地址0x90 对应,P1 口的地址就是0x90
(0x90 是C 语言中十六进制数的写法,相当于汇编语言中写90H)。
从这里还可以看到一个频繁出现的词: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 编译器可不这么认为,所以必须给它们建立联系,这里使用了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 一类的名字,只要下面程序中也随之更改就行了。
[page]
下面再附上reg52.h的头文件内容:
#ifndef __REG52_H__
#define __REG52_H__
sfr P0
sfr P1
sfr P2
sfr P3
sfr PSW
sfr ACC
sfr B
sfr SP
sfr DPL
sfr DPH
sfr PCON
sfr TCON
sfr TMOD
sfr TL0
sfr TL1
sfr TH0
sfr TH1
sfr IE
sfr IP
sfr SCON
sfr SBUF
sfr T2CON
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2
sfr TH2
sbit CY
sbit AC
sbit F0
sbit RS1
sbit RS0
sbit OV
sbit P
sbit TF1
sbit TR1
sbit TF0
sbit TR0
sbit IE1
sbit IT1
sbit IE0
sbit IT0
sbit EA
sbit ET2
sbit ES
sbit ET1
sbit EX1
sbit ET0
sbit EX0
sbit PT2
sbit PS
sbit PT1
sbit PX1
sbit PT0
sbit PX0
sbit RD
sbit WR
sbit T1
sbit T0
sbit INT1
sbit INT0
sbit TXD
sbit RXD
sbit SM0
sbit SM1
sbit SM2
sbit REN
sbit TB8
sbit RB8
sbit TI
sbit RI
sbit T2EX
sbit T2
sbit TF2
sbit EXF2
sbit RCLK
sbit TCLK
sbit EXEN2
sbit TR2
sbit C_T2
sbit CP_RL2 = T2CON^0;
#endif
推荐阅读最新更新时间:2024-03-16 14:42