在单片机的使用中,我们经常会在文件的开始部分进行头文件的定义,即使我们在编写十分简单的LED驱动程序时,往往也引用了头文件#include ,那么头文件的作用究竟是什么呢?
首先,我们在Keil的安装目录下找到C51->INC->REG52.h,打开后,我们可以看到,这个reg52.h的头文件中提取出来就是使用了两个特殊的数据类型定义,sfr和sbit,关于这两个特殊的数据类型,本章节不过多的赘述。而使用了sfr和sbit之后,就将单片机的内部的地址从0x80到0x99的各个地址使用了易于记忆的方式进行了定义。这样,我们在对单片机的内部硬件寄存器进行操作时,就可以不需要记忆内部寄存器的实际地址,而是只需要记忆这些寄存器的名称就可以。
那么,我们的理解是否正确呢?用一个简单的例子进行验证。使用一个控制单片机的管脚的程序,首先按照常规的编程方式进行程序的编写。
#include
sbit LED = P2^1;
void main(void)
{
LED = 0;
while(1)
{
LED = 1;
Delay1S(1);
LED = 0;
Delay1S(1);
}
}
使用keil自带的仿真,可以看到单片机的P2.1管脚在循环的进行高低电平的变换。那么,如果实现同样的功能,我们不使用头文件的话,可以进行怎么样的编程呢?
首先,我们定义一个LEDBUF,这个LEDBUF的指向为管脚P2的地址。
sfr LEDBUF = 0xA0;
sbit LED = LEDBUF^1;
那么,再次运行下,我们会看到同样的效果,所以对于使用的单片机自身提供了头文件后,我们为了方便,可以直接使用该头文件,当然,我们可以自行修改头文件,为了满足应用程序的需求,前提是注意修改的头文件的放置路径,不要和系统安装的头文件混淆即可。