background image

sbit TB8 = 0x9B;
sbit RB8 = 0x9A;
sbit TI = 0x99;
sbit RI = 0x98;
#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 一类的名字,只要下面程序中也随之更改就行了。
下面再附上 reg52.h 的头文件内容:
/*---------------------------------------------------------------
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------*/
#ifndef __REG52_H__
#define __REG52_H__
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;