理解头文件reg52.h一.头文件引用的两种方式与区别#include reg52.h先在工程目录中查找reg52.h这个文件如果没有再去Kile软件安装目录中去查找我们后面学到代码模块化的时候我们自己定义的文件我们用这种方式引用原因是我们自己定义的文件肯定放在工程目录下#include reg52.h直接在kile 软件安装目录中查找库文件调用一般用二 .kile终端显示的重要信息1.如图所示Program Size: data13.0 xdata0 code227怎么理解2.CODE可以这样理解就是你编译后生成的 HEX 文件里的内容代码 常量这玩意很容易容易忽略烧写时会被写入单片机的 Flash是程序能运行的 “基础”断电不会丢失俗话CODE 是我们编译好烧写进单片机的数据。3.DATA是单片机运行代码时临时产生、随时可能修改的变量比如计数、状态标记断电就消失俗话DATA 是单片机跑我们的代码产生的临时数据。4.XDATA和DATA没多大区别就是怕DATA不够用外加的一部分临时存储空间。CODE片内 Flash/ROM只读存代码、常量断电不丢失DATA片内 RAM可读可写存临时变量、寄存器断电丢失XDATA片外扩展 RAM可读可写存大容量临时数据断电丢失5STC89C5161. Code 区程序存储区物理总容量64KB65536 字节芯片标称的 Flash 总大小用户可用容量61KB62464 字节扣除 3KB ISP 引导程序后的实际可用空间也是编译时code的上限2. Data 区片内高速 RAM物理总容量128 字节片内 SRAM 中速度最快的核心区域存放临时变量、寄存器用户可用容量≈120 字节扣除寄存器组8 字节等硬件占用后实际可分配给用户变量的空间3. Xdata 区片内扩展 RAM物理总容量4096 字节芯片内置的扩展 SRAM4KB用户可用容量3968 字节4096 - 128Data 区 3968 字节编译时xdata的上限4代码验证代码验证DATA 区128字节报错DATA区溢出了代码后续章节在解释代码验证DATA区120字节没报错编译终端区显示用了129多数51编译器对于超1~2字节能运行但有风险。三.理解头文件reg52.h这个REG52.H是 51 单片机开发的核心头文件本质是把单片机内部的硬件寄存器比如端口、定时器、中断相关映射成你能在代码里直接用的变量 / 位定义不用记复杂的内存地址如果需要记住那些地址头能记大了直接用P1、EA这些直观的名字就行。一、先搞懂文件里的核心关键字最基础也最重要文件里只有两个核心关键字sfr和sbit是 51 单片机 C 语言特有的普通 C 语言没有专门用来定义硬件寄存器关键字含义通俗讲用途例子sfr定义字节寄存器占 1 个字节 8 位映射单片机里按 “字节” 操作的硬件寄存器比如整个 P0 端口、定时器模式寄存器sfr P0 0x80;表示P0 端口对应的硬件地址是 0x80代码里写P00xFF;就相当于给 0x80 这个地址写数据sbit定义位寄存器占 1 个位映射字节寄存器里的某一位比如 P3 口的 RXD 引脚、中断总开关 EAsbit EA IE^7;表示EA 是 IE 寄存器的第 7 位代码里写EA1;就只操作 IE 寄存器的第 7 位不影响其他位补充地址和位的写法0x8016 进制地址51 单片机的寄存器都有固定的内存地址比如 P0 口固定在 0x80IE^7^是 “位偏移” 符号IE^7就是 IE 寄存器的第 7 位从 0 开始数7 是最高位。二、文件结构拆解按功能分组对应单片机硬件整个文件把 51 单片机的核心硬件寄存器分成了 6 大类每一类都是开发时要用到的1. 通用字节寄存器基础中的基础sfr P0 0x80; // P0端口8个引脚地址0x80 sfr P1 0x90; // P1端口地址0x90 sfr P2 0xA0; // P2端口地址0xA0 sfr P3 0xB0; // P3端口带特殊功能RXD/TXD/INT0等地址0xB0 sfr ACC 0xE0; // 累加器CPU核心寄存器运算时临时存数据 sfr SP 0x81; // 堆栈指针管理DATA区的堆栈和上面图片中的DATA区溢出相关用途控制I/O口电平高低或者读取I/O口电平比如控制 LED 亮灭直接写P10x00;P1 口全部置低不用管 0x90 这个地址。2. 定时器 / 计数器寄存器定时、计数功能sfr TCON 0x88; // 定时器控制寄存器启停定时器、判断溢出 sfr TMOD 0x89; // 定时器模式寄存器设置定时/计数、工作模式 sfr TL0 0x8A; // 定时器0低8位 sfr TH0 0x8C; // 定时器0高8位 // T2相关是8052扩展8051没有用于16位自动重装定时器用途做 1ms 定时、脉冲计数时配置这些寄存器。3. 中断相关寄存器中断开关、优先级sfr IE 0xA8; // 中断允许寄存器总开关EA、串口/定时器/外部中断开关 sfr IP 0xB8; // 中断优先级寄存器设置哪个中断优先响应 sbit EA IE^7; // 中断总开关EA1开总中断EA0关所有中断 sbit EX0 IE^0; // 外部中断0开关用途比如按键外部中断要先写EA1; EX01;打开中断。4. 串口通信寄存器UARTsfr SCON 0x98; // 串口控制寄存器设置串口模式、启停接收 sfr SBUF 0x99; // 串口数据缓冲区发数据写SBUF收数据读SBUF sbit REN SCON^4; // 串口接收使能REN1才能收数据 sbit TI SCON^1; // 发送完成标志发完1字节TI自动置1需手动清0用途单片机和电脑 / 传感器串口通信时用。5. 位操作寄存器精准控制某一位sbit RXD P3^0; // P3.0引脚串口接收 sbit TXD P3^1; // P3.1引脚串口发送 sbit INT0 P3^2; // P3.2引脚外部中断0用途比如只控制 P1 口第 0 位的 LED写P1_01;或T21;不用改整个 P1 口。6. 状态寄存器CPU 运行状态sfr PSW 0xD0; // 程序状态字记录运算结果、寄存器组选择 sbit CY PSW^7; // 进位标志加法有进位则CY1 sbit OV PSW^2; // 溢出标志运算溢出时置1用途做数学运算时判断结果是否溢出新手暂时用得少。四、总结这个头文件的实际作用为什么必须包含简化开发不用记寄存器的十六进制地址比如不用记 P00x80直接用P0、EA这些语义化的名字硬件映射把 “代码里的变量名” 和 “单片机的物理寄存器” 绑定你写P10xFF;编译器会自动转换成对 0x90 地址的写操作兼容性针对 8052 扩展了 T2 相关寄存器兼容 8051/8052不用自己定义。简单说这个文件是 51 单片机开发的 “硬件字典”你写代码控制硬件时所有和寄存器相关的操作都要靠它来简化。