)
前言在初学Keil C51时一定会引用过C51的头文件例如#includeREG51.H// 或者 #include REG52.H// 或者 #include REGX51.H// 或者 #include REGX52.H// 或者小写版本 reg51.h ...voidmain(){while(1){}}一般来说会遇见4种头文件REG51.H和REGX51.HREG52.H和REGX52.H顺便一提在Windows下文件名是不区分大小写的也就是说REG51.H和reg51.h相同本文依据个人习惯下文用大写本文将解释这4个头文件的关系并讲解一些头文件技巧头文件区别REG51.H和REGX51.HREG52.H和REGX52.H这四个头文件中最基础的是REG51.H它是C51单片机的基础配置内部定义了寄存器位置REGX51.H是REG51.H的升级版内部除了基本的寄存器位置外还有引脚定义以及许多额外辅助配置宏类似的REG52.H是C52单片机的基础配置内部定义了寄存器位置REGX52.H是REG52.H的升级版内部除了基本的寄存器位置外还有引脚定义以及许多额外辅助配置宏看到这里有些读者可能会有疑问为什么开发C51单片机会出现C52头文件因为虽然一般说C51单片机编程但通常真正使用的芯片是STC公司生产的STC89C52RC单片机C52单片机兼容C51而且性能更强。如今购买C51得到的一般都是C52单片机只不过口头习惯继续叫C51因为C52兼容C51所以在开发C52时用REG51.H/REGX51.H(C51的头文件)也是完全可以的只是少了一些C52新增的功能在实际开发中通常都直接使用REGX52.H头文件内容我们以REG52.H和REGX52.H为例看一下头文件内容(REG51.H和REGX51.H类似)首先是REG52.H本质上就是用sfr和sbit定义了各个基本寄存器的位置例如P0组引脚固定在0x80的位置头文件已经帮我们写好了就不需要我们自己手动记忆书写了// REG52.Hsfr P00x80;sfr P10x90;sfr P20xA0;sfr P30xB0;sfr PSW0xD0;...sbit CYPSW^7;sbit ACPSW^6;sbit F0PSW^5;sbit RS1PSW^4;sbit RS0PSW^3;sbit OVPSW^2;...而REGX52.H则是在REGX51.H的基础上多了通用引脚的定义与辅助宏通用引脚就是已经帮忙写了P1_0P2_0等定义这样就不用手动一个一个定义引脚了直接用REGX51.H或REGX52.H就可以直接用定义好的通用引脚了而辅助宏则是便于记忆与配置单片机功能详情见下文// REGX52.H//以下这些是REG52.H就有的sfr P00x80;sfr P10x90;sfr P20xA0;...sbit CYPSW^7;sbit ACPSW^6;sbit F0PSW^5;...//REGX52.H新增的通用引脚定义sbit P1_00x90;sbit P1_10x91;sbit P1_20x92;...//REGX52.H新增的辅助宏#defineT0_M0_0x01#defineT0_M1_0x02#defineT0_CT_0x04#defineT0_GATE_0x08#defineT1_M0_0x10#defineT1_M1_0x20...REGX 辅助宏REGX52.H和REGX51.H中有3组辅助宏可以方便我们配置单片机功能分别是PCON辅助宏用于辅助配置PCON寄存器设置电源功率#defineIDL_0x01#defineSTOP_0x02#definePD_0x02/* Alternate definition */#defineGF0_0x04#defineGF1_0x08#defineSMOD_0x80TMOD辅助宏用于辅助配置TMOD寄存器设置定时器/计数器功能#defineT0_M0_0x01#defineT0_M1_0x02#defineT0_CT_0x04#defineT0_GATE_0x08#defineT1_M0_0x10#defineT1_M1_0x20#defineT1_CT_0x40#defineT1_GATE_0x80#defineT1_MASK_0xF0#defineT0_MASK_0x0F中断标志辅助宏便于记忆中断标志#defineIE0_VECTOR0/* 0x03 External Interrupt 0 */#defineTF0_VECTOR1/* 0x0B Timer 0 */#defineIE1_VECTOR2/* 0x13 External Interrupt 1 */#defineTF1_VECTOR3/* 0x1B Timer 1 */#defineSIO_VECTOR4/* 0x23 Serial port */#defineTF2_VECTOR5/* 0x2B Timer 2 */#defineEX2_VECTOR5/* 0x2B External Interrupt 2 */辅助宏使用示例中断标志辅助宏一般的检测外部按钮按下的INT1中断这么写voidINT1_button(void)interrupt2{LED!LED;}需要手动记忆INT1中断对应2而这时就可以用中断标志辅助宏voidINT1_button(void)interrupt IE1_VECTOR{LED!LED;}这样就可以方便记忆一些IEx对应INT中断TFx对应定时器中断或者单纯忘了中断对应的序号到这里查看一下也是可以的TMOD辅助宏以下是设定Timer0模式116位定时器TMOD0xF0;// 清除 Timer0 的控制位TMOD|0x01;// Timer0模式116位定时器而使用辅助宏后可以增加可读性TMOD~T0_MASK_;// 清除 Timer0 的控制位TMOD|T0_M0_;// Timer0模式116位定时器