#include
类似于头文件 AT89X51.h。
这两个头文件基本是一样的,只是在使用时对位的定义不一样,
at89x51.h 文件中对 P1.1的操作是写成 P1_1;
reg51.h 文件中的操作则写成 P1^1。
打开 reg51.h 可以看到这样的一些内容:
此文件一般在 C:KEILC51INC 下 ,INC 文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。
如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到 INC 文件夹里就可以了。
sfr 并非标准C语言的关键字,而是 Keil 为能直接访问 80C51 中的 SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。
符号 P1_0 来表示 P1.0 引脚。
在C语言里,如果直接写 P1.0,C编译器并不能识别,而且 P1.0 也不是一个合法的语言变量名,所以得给它另起一个名字,这里起的名为 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 一类的名字,只要下面程序中也随之更改就行了。
1)“文件包含”处理概念
所谓“文件包含”是指在一个文件内将另外一个文件的内容全部包含进来。因为被包含的文件中的一些定义和命令使用的频率很高,几乎每个程序中都可能要用到,为了提高编程效率,减少编程人员的重得劳动,将这些定义和命令单独组成一个文件,如 reg51.h 然后用#include
2)寄存器地址及位地址声明的原因
reg51.h 里面主要是一些特殊功能寄存器的地址声明,对可以位寻址的,还包括一些位地址的声明,如果如 sfr P1=0x80; sfr IE=0xA8; sbit EA=0xAF 等。
sfr P1 = 0x90 这句话表示:P1 口所对应的特殊功能寄存器,P1在内存中的地址为0x90。
sbit EA=0xAF 这句话表示:EA 这一位的地址为 0xAF。
程序状态寄存器 Program Status WORD=PSW (程序状态信息)
3)内存、SFR、位、地址等的通俗解释
前面讲到了寄存器地址和位地址(前提能位寻址)声明的目的是为告诉 C 编译器相应寄存器及其位在内存中的地址,这样我们对寄存器及一些位赋的变量和数值才能正确保存, 然后才能供 CPU 正确的调用,完成相应的功能。上段文字出现了寄存器(SFR)、位、地址、内存等,单片机学习过程中还会出现ROM、RAM 等名词,可能大家觉得不是很好理解,这里可以通俗的解释一下。
我们把内存比作宾馆,ROM、RAM、SFR 相当于宾馆里具体的有三种不同功能楼层(具体这个宾馆多少层即多少 ROM、RAM、SFR,视各个宾馆或者每种单片机而不同),每层 8个房间相当于8位,每个房间要么住男人要么住女人相当于每位要么放入数字1要么放入数字0,keil 编译器就相当于宾馆的工作人员,旅客去住旅馆相当写程序的过程,住宾馆的人必须事先要给工作人员说你是哪一层哪一个房间(即声明寄存器地址和位地址,)宾馆工作人员才能把你带到你的房间里去(这里假设这个宾馆可以由旅客自己决定住哪个房间)。
即:只有对寄存器及相关位进行声明地址后,我们才能对其进行赋相关的值,keil 软件才能编译通过。