单片机头文件reg52.h中文注释详解

/*--------------------------------------------------------------------------
REG52.H

Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/


#ifndef __REG52_H__
#define __REG52_H__


/*  特殊字节(8位)寄存器 */
sfr	P0	=	0x80;	// P0口特殊寄存器寻址位
sfr	P1	=	0x90;	// P1口特殊寄存器寻址位
sfr	P2	=	0xA0;	// P2口特殊寄存器寻址位
sfr	P3	=	0xB0;	// P3口特殊寄存器寻址位
sfr	PSW	=	0xD0;	//程序状态字寄存器
sfr	ACC	=	0xE0;	//累加器
sfr	B	=	0xF0;	//B 特殊寄存器
sfr	SP	=	0x81;	//堆栈指针寄存器
sfr	DPL	=	0x82;	//数字指针(低位)
sfr	DPH	=	0x83;	//数字指针(高位)
sfr	PCON	=	0x87;	//电源控制寄存器
sfr	TCON	=	0x88;	//定时器/计数器 0 和 1 控制
sfr	TMOD	=	0x89;	//定时器/计数器 0 和 1 模式
sfr	TL0	=	0x8A;	//定时器/计数器 0 低8位寄存器 
sfr	TL1	=	0x8B;	//定时器/计数器 1低8位寄存器  
sfr	TH0	=	0x8C;	//定时器/计数器 0高8位寄存器  
sfr	TH1	=	0x8D;	//定时器/计数器 1高8位寄存器
sfr	IE	=	0xA8;	//中断允许寄存器
sfr	IP	=	0xB8;	//中断优先寄存器(低)
sfr	SCON	=	0x98;	//串口控制寄存器
sfr	SBUF	=	0x99;	//串口数据缓冲器

/*  8052扩展寄存器 */
sfr	T2CON	=	0xC8;	//定时器/计数器2 控制
sfr	RCAP2L	=	0xCA;	//定时器/计数器2 重载/捕捉低位
sfr	RCAP2H	=	0xCB;	//定时器/计数器2 重载/捕捉高位
sfr	TL2	=	0xCC;	//定时器/计数器2 低位
sfr	TH2	=	0xCD;	//定时器/计数器2 高位



/*  位寄存器  */


/*  PSW (程序状态字寄存器) */
sbit	CY	=	PSW^7;	//进位、借位标志。进位、借位CY=1;否则CY=0
sbit	AC	=	PSW^6;	//辅助进位、借位标志。当D3向D4有借位或进位时,AC=1;否则AC=0
sbit	F0	=	PSW^5;	//用户标志位
sbit	RS1	=	PSW^4;	//寄存器组选择控制位1
sbit	RS0	=	PSW^3;	//寄存器组选择控制位0
sbit	OV	=	PSW^2;	//溢出标志。有溢出OV=1,否则OV=0
sbit	F1	=	PSW^1;	//保留位,无定义
sbit	P	=	PSW^0;	//8052 only 奇偶校验标志位,由硬件置位或清0;
				//存在ACC中的运算结果有奇数个1时P=1,否则P=0


/*  TCON (定时器/计数器 0 和 1 控制) */
sbit	TF1	=	TCON^7;	//定时器1溢出标志位。当字时器1计满溢出时, 
				//由硬件使TF1置“1”,并且申请中断。
				//进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清 “0”
sbit	TR1	=	TCON^6;	//定时器1运行控制位。由软件清“0”关闭定时器1。
				//当GATE=1,且INT1为高电平时,TR1置“1”启动定时器1;
				//当GATE=0,TR1置“1” 启动定时器1
sbit	TF0	=	TCON^5;	//定时器0溢出标志。其功能及操作情况同TF1。
sbit	TR0	=	TCON^4;	//定时器0运行控制位。其功能及操作情况同TR1。
sbit	IE1	=	TCON^3;	//外部中断1请求标志。
sbit	IT1	=	TCON^2;	//外部中断1触发方式选择位。
sbit	IE0	=	TCON^1;	//外部中断0请求标志。
sbit	IT0	=	TCON^0;	//外部中断0触发方式选择位。


/* IE (中断允许寄存器) */
sbit	EA	=	IE^7;	//允许/禁止总中断
sbit	ET2	=	IE^5;	//8052 only 允许/禁止定时器2(T2)中断
sbit	ES	=	IE^4;	//允许/禁止串口中断
sbit	ET1	=	IE^3;	//允许/禁止T1溢出中断
sbit	EX1	=	IE^2;	//允许/禁止外部中断1(INT1)
sbit	ET0	=	IE^1;	//允许/禁止T0溢出中断
sbit	EX0	=	IE^0;	//允许/禁止外部中断0(INT0)


/* IP (中断优先寄存器低) */
sbit	PT2	=	IP^5;	//定时/计数器T2优先级设定位。
sbit	PS	=	IP^4;	//串行口优先级设定位;
sbit	PT1	=	IP^3;	//定时/计数器T1优先级设定位;
sbit	PX1	=	IP^2;	//外部中断0优先级设定位;
sbit	PT0	=	IP^1;	//定时/计数器T0优先级设定位;
sbit	PX0	=	IP^0;	//外部中断0优先级设定位;

/* P3 (第二功能) */
sbit	RD	=	P3^7;	//外部数据存储器读脉冲
sbit	WR	=	P3^6;	//外部数据存储器写脉冲
sbit	T1	=	P3^5;	//定时器/计数器1外部输入
sbit	T0	=	P3^4;	//定时器/计数器0外部输入
sbit	INT1	=	P3^3;	//外部中断0。
sbit	INT0	=	P3^2;	//外部中断1。
sbit	TXD	=	P3^1;	//串行数据输出口
sbit	RXD	=	P3^0;	//串行数据输入口


/* SCON(控制寄存器,它是一个可寻址的专用寄存器,用于串行数据的通信控制) */	
sbit	SM0	=	SCON^7;	//串行口工作方式控制位0。
sbit	SM1	=	SCON^6;	//串行口工作方式控制位1。
sbit	SM2	=	SCON^5;	//多机通信控制位。 
sbit	REN	=	SCON^4;	//允许接收位。用于控制数据接收的允许和禁止,
				// ren=1时,允许接收,ren=0时,禁止接收。
sbit	TB8	=	SCON^3;	//发送接收数据位8。
sbit	RB8	=	SCON^2;	//接收数据位8。
sbit	TI	=	SCON^1;	//发送中断标志位。
sbit	RI	=	SCON^0;	//接收中断标志位。 


/*  P1(第二功能) */
sbit	T2EX	=	P1^1;	// 8052 only	定时/计数器2捕捉/重装入触发
sbit	T2	=	P1^0;	// 8052 only	定时/计数器2外部输入


/*  T2CON  (定时器/计数器2 控制) */
sbit	TF2	=	T2CON^7;	//定时器2 溢出标记
sbit	EXF2	=	T2CON^6;	//定时器2 外部标记
sbit	RCLK	=	T2CON^5;	//0=串口时钟应用定时器1 溢出,  1=定时器 2
sbit	TCLK	=	T2CON^4;	//0=串口时钟应用定时器1 溢出,  1=定时器 2
sbit	EXEN2	=	T2CON^3;	//定时器 2 外部允许
sbit	TR2	=	T2CON^2;	//0=停止定时器, 1=开始定时器
sbit	C_T2	=	T2CON^1;	//0=定时器, 1=计数器
sbit	CP_RL2	=	T2CON^0;	//0=重载, 1=捕捉选择。


#endif

<think>好的,我现在需要解决用户关于51单片机头文件格式规范的问题。首先,我要回想一下用户提供的引用内容,看看有没有相关的信息。引用1提到C51单片机的编码规范和可读性的重要性,引用3则详细说明了C51编程规范,包括头文件的内容。引用4提到了使用正确头文件的重要性,避免因型号不匹配导致的错误。 用户的问题是关于头文件的规定格式,我需要整理出标准的头文件结构。通常,头文件包括防止重复包含的宏、寄存器定义、函数声明等部分。根据引用3中的内容,头文件应该遵循命名规则,比如以.h结尾,使用#ifndef防止重复包含,以及使用条件编译。 接下来,我需要确保结构清晰,分点说明每个部分的作用。例如,文件头注释、防止重复包含的预处理指令、寄存器地址定义、函数声明等。同时,要提醒用户注意型号匹配,如引用4中提到的,避免使用错误的头文件导致问题。 另外,可能用户还需要了解如何引用头文件,所以需要给出示例代码,并解释每个部分的意义。还要注意代码排版,符合LaTeX格式要求,使用$...$和$$...$$正确标注数学表达式,虽然这个问题可能不涉及太多数学内容,但如果有变量名或寄存器地址,需要用行内格式。 最后,根据用户的要求生成相关问题,可能涉及头文件的作用、条件编译的意义、命名规范等,确保问题相关且有帮助。 检查是否有遗漏的部分,比如引用中的内容是否都被合理引用,例如引用3提到规范包括排版、注释、命名等,这些需要在回答中体现。同时,确保语言用中文,结构清晰,分点明确,代码示例正确,符合用户的需求。</think>根据C51单片机编程规范[^3],头文件格式需遵循以下核心规范: $$ \begin{array}{|c|l|} \hline \text{组成元素} & \text{规范说明} \\ \hline \text{文件头注释} & \text{必须包含版权声明、文件说明、版本信息} \\ \text{防止重复包含} & \text{使用#ifndef/#define/#endif预处理指令} \\ \text{寄存器定义} & \text{采用sfr/sbit关键字声明特殊功能寄存器} \\ \text{函数声明} & \text{对外接口函数需添加extern声明} \\ \text{命名规则} & \text{使用全大写+下划线命名法,扩展名为.h} \\ \hline \end{array} $$ ### 一、标准头文件模板示例 ```c /****************************************************************** * 文件名 :STC89C52_REG.h * 作 者 :[开发者名称] * 版 本 :V1.0.0 * 说 明 :STC89C52系列寄存器定义头文件 * 日 期 :2023-07-20 * 备 注 :适用于Keil C51开发环境 ******************************************************************/ #ifndef __STC89C52_REG_H__ #define __STC89C52_REG_H__ /*-------特殊功能寄存器定义-------*/ sfr P0 = 0x80; // 端口0 sfr SP = 0x81; // 堆栈指针 sbit P0_0 = P0^0; // 端口0第0位 /*-------函数声明区-------*/ extern void DelayMS(unsigned int ms); // 毫秒级延时 extern unsigned char ReadKey(); // 按键扫描函数 #endif ``` ### 二、关键规范详解 1. **防重复包含机制** 通过`#ifndef __HEADERNAME_H__`条件编译指令,确保头文件内容仅被包含一次。命名规则建议采用`__MCU型号_REG_H__`格式。 2. **寄存器定义规范** - 使用`sfr`定义8位寄存器地址:`sfr IE = 0xA8;` - 使用`sbit`定义位地址:`sbit EA = IE^7;` - 地址值必须与数据手册严格对应[^4] 3. **函数声明要求** 对外接口函数必须添加`extern`声明,内部使用函数建议添加`static`限制作用域: ```c extern void UART_Init(); // 外部可调用 static void TimerConfig(); // 仅限本文件使用 ``` 4. **版本控制规范** 在文件头注释中必须包含: - 版本号(建议采用语义化版本控制) - 最后修改日期 - 适用芯片型号 - 开发环境说明 ### 三、注意事项 1. 不同型号单片机必须使用对应头文件,如STC89C58RD+不能使用STC89C52头文件[^4] 2. 寄存器地址注释应标明数据手册页码:`/* 详见手册P.128 */` 3. 避免在头文件中定义变量,防止链接错误 4. 建议采用分层结构: ```c #include "MCU_Core.h" // 核心寄存器 #include "Periph_GPIO.h" // 外设驱动 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南木Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值