1.C51标识符:
C语言的标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。
标识符由字符串、数字和下划线等等组成。
第一个字符必须是字母或下划线。错误的标识符,编译时会有错误提示。
由于C51中有些库函数的标识符是以下划线开头的,所以一般不要用下划线开头命名标识符。
2.关键字:
有些我们已经在C语言中熟悉过:
auto
break
case
char
const
continue
default
do
double
else
enum
exterm
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile(声明该变量在程序执行中可被隐含的改变)
whille
C51编译器扩充了关键字:
(关键字) | (用途) | (说明) |
---|---|---|
_at_ | (地址定位) | (为变量进行绝对地址定位) |
_priority_ | (多任务优先声明) | (规定 RTX51 或 RTX51 Tiny 的任务优先级) |
_task_ | (任务声明) | (定义实时多任务函数) |
alien | (函数特性声明) | (用于声明与PL/M51兼容的函数) |
bdata | (存储器类型声明) | (可位寻址的MCS-51内部数据存储器) |
bit | (位变量声明) | (声明一个位变量或位类型函数) |
code | (存储器类型声明) | (MCS-51的程序存储空间) |
compact | (存储器模式) | 按compact模式分配变量的存储空间 |
data | (存储器类型声明) | (直接寻址MCS-51的内部数据寄存器) |
idata | (存储器类型声明) | (间接寻址MCS-51的内部数据寄存器) |
interrupt | (中断函数声明) | (定义一个中断函数声明) |
large | (存储器模式) | (按large模式分配变量的存储空间) |
pdata | (存储器类型声明) | (分页寻址的MCS-5外部数据空间) |
sbit | (位变量声明) | (声明一个位变量) |
sfr | (特殊功能寄存器声明) | (声明一个8位特殊功能寄存器) |
sfr16 | (特殊功能寄存器声明) | (声明一个16位特殊功能寄存器) |
small | (存储器模式) | (按small模式分配变量) |
using | (存储器组定义) | (定义MCS-5的工作寄存器) |
xdata | (存储器类型声明) | (定义MCS-5外部数据空间) |
– | – | – |
3.常量和变量
常量 又称标量,它的值在程序执行过程中不能被改变,常量的数据类型有整型、浮点型、字符型、字符串型等。
实际使用中用 #define定义在程序中经常用到的常量,或者可能需要根据不同的情况进行更改的常量,列如:译码地址,而不在程序中直接使用常量值。
一方面有助于提高程序的可读性;另一方面便于程序的修改和维护。
常见的—如:
一下定义只是养成一种习惯,便于阅读,修改,维护
#define PI 3.141592 //以后的编码中用PI代替浮点数常量3.141592,便于阅读
#define SYSCLK 12,000,000 //这里不需要写逗号,只是为了好看,SYSCLK代替12MHZ
#define TRUE 1 //逻辑运算中TRUE代替1
#define STAR '*' //STAR表示字符 “ * ”
#define uint unsigned int //简写无符号型
变量 是一种在程序中,其数值不断变化的量。
C51规定,变量必须先定义,后使用。
4.数据类型:
正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1。
1. char
char 类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字 符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。 unsigned char 类型用字节中所有的位来表示数值,所能表达的数值范围是 0~255。
signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数, 负数用补码表示。所能表示的数值范围是-128~+127。unsigned char 常用于处理 ASCII 字符或用于处理≤ 255 的整型数。
2. int
int 整型长度为两个字节,用于存放一个双字节数据。分有符号 int 整型数 signed int 和无符号整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范 围是-32768~+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。 unsigned int 表示的数值范围是 0~65535。
先停一下来写个小程序看看 unsigned char 和 unsigned int 用于延时的不一样效果,说 明它们的长度是不一样的,学习它们的使用方法。依旧用上一篇的最小化系统做实验,不过要加多 一个电阻和 LED。实验中用 D1 的点亮表明正在用 unsigned int 数值延时,用D2 点亮表明正在用 unsigned char 数值延时。
#include <AT89X51.h> //预处理命令
void main(void) {
unsigned int a; //定义变量 a 为 unsigned int 类型
unsigned char b; //定义变量 b 为 unsigned char 类型
do{ //do while 组成循环
for (a=0; a<65535; a++)
P1_0 = 0; //65535 次设 P1.0 口为低电平,点亮 LED P1_0 = 1; //设 P1.0 口为高电平,熄灭 LED
for (a=0; a<30000; a++); //空循环
for (b=0; b<255; b++)
P1_1 = 0; //255 次设 P1.1 口为低电平,点亮 LED P1_1 = 1; //设 P1.1 口为高电平,熄灭 LED
for (a=0; a<30000; a++); //空循环
}while(1);
}
同样编译烧写,上电运行您就能看到结果了。很明显 D1 点亮的时间长于 D2 点亮的时间。
这里必须要讲的是,当定义一个变量为特定的数据类型时,在程序使用该变量不应使它的值 超过数据类型的值域。如本例中的变量 b 不能赋超出 0~255 的值,如 for (b=0; b<255; b++) 改为 for (b=0; b<256; b++),编译是能通过的,但运行时就会有问题出现,就是说 b 的 值永远都是小于 256 的,所以无法跳出循环执行下一句 P1_1 = 1,从而造成死循环。同理 a 的值不应超出 0~65535。
3. long
long 长整型长度为四个字节,用于存放一个四字节数据。分有符号 long 长整型 signed long 和无符号长整型 unsigned long,默认值为 signed long 类型。signed int 表示 的数值范围是-2147483648~+2147483647,字节中最高位表示数据的符号,“0”表示正 数,“1”表示负数。unsigned long 表示的数值范围是 0~4294967295。
4. float
float 浮点型在十进制中具有 7 位有效数字,是符合 IEEE-754 标准的单精度浮点型数 据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。
5.*
指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量 要占据一定的内存单元,对不一样的处理器长度也不尽相同,在 c51 中它的长度一般为 1~
3 个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。
6. bit
bit 位标量是 c51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义 位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True 和 False。
7. sfr
sfr 也是一种扩充数据类型,点用一个内存单元,值域为 0~255。利用它能访问 51 单片机内部的所有特殊功能寄存器。如用 sfr P1 = 0x90 这一句定 P1 为 P1 端口在片内 的寄存器,在后面的语句中用以用 P1 = 255(对 P1 端口的所有引脚置高电平)之类的 语句来操作特殊功能寄存器。
8.sfr16
sfr16 占用两个内存单元,值域为 0~65535。sfr16 和 sfr 一样用于操作特殊功能寄存 器,所不一样的是它用于操作占两个字节的寄存器,如定时器 T0 和 T1。
9. sbit
sbit 同样是 单片机c语言 中的一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址
位或特殊功能寄存器中的可寻址位。如先前定义了
sfr P1 = 0x90; //因 P1 端口的寄存器是可位寻址的,所以能定义
sbit P1_1 = P1^1; //P1_1 为 P1 中的 P1.1 引脚
//同样我们能用 P1.1 的地址去写,如 sbit P1_1 = 0x91; 这样在以后的程序语句中就能用 P1_1 来对 P1.1 引脚进行读写操作了。通常这些能 直接使用系统供给的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引 用能省去一点时间,我自己是一直用的。当然您也能自己写自己的定义文件,用您 认为好记的名字。