80C51常用头文件:reg51.h、math.h、ctype.h、stdio.h、stdlib.h、absacc.h、intrins.h。
DBYTE、DWORD(以字节型、字型访问内部RAM)
PBYTE、PWORD(以字节型、字型访问外部RAM的一页空间(256字节))
XBYTE、XWORD(以字节型、字型访问外部RAM)
如:XWORD[0x1000] = 0x1234; //给片外RAM的2000H单元赋值12H,2001H单元赋值34H(高字节存储在低地址)
定义XBYTE为:指向xdata地址空间unsigned char数据类型的指针,指针值为0。
这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
至于volatile的作用就是让编译器不至于优化掉它的操作:
volatile修饰的变量,对于读操作来说,其值是不可预知的;对于写操作来说,即使是写入两个同样的值,影响也是不一样的。所以编译器不会对访问该变量的操作优化。如果不加volatile关键词,有些编译器会将一些它认为无意义的或者无效的操作给优化掉,但实际上这并不是你要的结果。例如一些特殊的寄存器,一些IO等。
I=0;
I=0; //如果I未声明成volatile的,则可能被优化掉
if(I==1) //如果I未声明成volatile的,则可能被优化掉
{
}
//8051特有的内存型态:
code 以 MOVC @A+DPTR 读取的程序内存
data 可以直接存取的内部数据存储器
idata 以 Mov @Rn 存取的内部数据存储器
bdata 可以位寻址(Bit Addressable)的内部存储器
xdata 以 MOVX @DPTR 存取的外部数据存储器
pdata 以 MOVX @Rn 存取的外部数据存储器
如_cror_、_crol_、_iror_、_irol_分别表示字符型整数右循环、字符型整数左循环和整形数字的右循环、左循环。
例:_cror_(a,2);//对变量a循环右移2位。
此处的循环移位和按位操作的左移(<<)和右移(>>)实现的功能是不同的。
(1)reg51.h
定义51系列单片机特殊功能寄存器和特殊位。
(2)absacc.h
访问绝对地址头文件。当用绝对地址访问内部RAM(data)、外部RAM的一页(pdata)、整个外部RAM(xdata)和ROM(code)时,需要包含此文件。
主要有:
CBYTE、CWORD(以字节型、字型访问ROM)DBYTE、DWORD(以字节型、字型访问内部RAM)
PBYTE、PWORD(以字节型、字型访问外部RAM的一页空间(256字节))
XBYTE、XWORD(以字节型、字型访问外部RAM)
如:XWORD[0x1000] = 0x1234; //给片外RAM的2000H单元赋值12H,2001H单元赋值34H(高字节存储在低地址)
对#define XBYTE ((unsigned char volatile xdata *) 0)的分析:
xdata是large存储类型,volatile是通过硬件来改变指针指向的内容。定义XBYTE为:指向xdata地址空间unsigned char数据类型的指针,指针值为0。
这样,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
至于volatile的作用就是让编译器不至于优化掉它的操作:
volatile修饰的变量,对于读操作来说,其值是不可预知的;对于写操作来说,即使是写入两个同样的值,影响也是不一样的。所以编译器不会对访问该变量的操作优化。如果不加volatile关键词,有些编译器会将一些它认为无意义的或者无效的操作给优化掉,但实际上这并不是你要的结果。例如一些特殊的寄存器,一些IO等。
I=0;
I=0; //如果I未声明成volatile的,则可能被优化掉
if(I==1) //如果I未声明成volatile的,则可能被优化掉
{
}
//8051特有的内存型态:
code 以 MOVC @A+DPTR 读取的程序内存
data 可以直接存取的内部数据存储器
idata 以 Mov @Rn 存取的内部数据存储器
bdata 可以位寻址(Bit Addressable)的内部存储器
xdata 以 MOVX @DPTR 存取的外部数据存储器
pdata 以 MOVX @Rn 存取的外部数据存储器
(3)math.h
数学运算函数,如求绝对值、平方根、指数、正弦等。
(4)ctype.h
包含两类函数:字符测试函数和字符大小转换函数。如判断一个整形变量是数字、字母、换行符、控制符等。
(5)stdio.h
标准输入输出函数头文件,用于从标准设备读取字符、数字,或者向标准输出设备输出字符、字符串等。
(6)stdlib.h
标准库头文件。说明了用于数值转换、内存分配以及具有其他相似任务的函数,如求绝对值、字符转换为整形、长整形等。
(7)intrins.h
字符型、整形和长整形数字的左、右循环移位。如_cror_、_crol_、_iror_、_irol_分别表示字符型整数右循环、字符型整数左循环和整形数字的右循环、左循环。
例:_cror_(a,2);//对变量a循环右移2位。
此处的循环移位和按位操作的左移(<<)和右移(>>)实现的功能是不同的。