文章目录
- 前言
- [1. 存储类型关键字](#1. 存储类型关键字)
- [2. 其他常用关键字](#2. 其他常用关键字)
- [3. 关键点总结](#3. 关键点总结)
前言
本文简单介绍了Kiel51单片机中的各种关键字的作用和用途。
1. 存储类型关键字
1.1code
作用
作用:将变量或数据存储在**程序存储器(ROM)**中,不可修改,只能读取。
地址范围
地址范围:0x0000~0xFFFF(取决于单片机型号)。
用途
用途:常量、字符串、查表数据。
示例
c
const unsigned char lookup_table[] code = {0x01, 0x02, 0x03};
1.2data
作用
作用:直接寻址 的内部RAM(速度快,容量小)。
地址范围
地址范围:0x00~0x7F(128字节)。
用途
用途:高频访问的全局变量或静态变量。
示例
c
char fast_var data = 0;
1.3idata
作用
作用:间接寻址的内部RAM(速度稍慢于data)。
地址范围
地址范围:0x00~0xFF(256字节)。
用途
用途:需要较大内部RAM空间的变量。
示例
c
int buffer[32] idata;
1.4xdata
作用
作用:外部扩展RAM(16位地址访问,速度较慢)。
地址范围
地址范围:0x0000~0xFFFF(64KB)。
用途
用途:大型数组或缓冲区。
示例
c
float sensor_data[1000] xdata;
1.5pdata
作用
作用:分页访问外部RAM(通过P2端口分页,8位地址)。
地址范围
地址范围:每页256字节(由P2决定页地址)。
用途
用途:中等规模数据,需较快访问速度。
示例
c
unsigned char page_buffer[256] pdata;
1.6volatile
作用
作用:告知编译器变量可能被意外修改 (如中断、硬件寄存器),禁止优化。
用途
用途:多线程、中断服务程序、硬件寄存器。
示例
c
volatile unsigned int timer_count;
2. 其他常用关键字
2.1bit
作用
作用:定义1位二进制变量(仅占用1位存储空间)。
示例
c
bit flag = 0;
2.2sbit
作用
作用:定义特殊功能寄存器(SFR)的某一位。
示例
c
sbit LED = P1^0; // 定义P1.0引脚为LED控制位
2.3sfr / sfr16
作用
作用:定义8位或16位的特殊功能寄存器。
示例
c
sfr P0 = 0x80; // 定义P0端口
sfr16 TMR0 = 0x8C; // 定义16位定时器0
2.4reentrant
作用
作用:声明函数为可重入函数(支持递归或并行调用)。
示例
c
int factorial(int n) reentrant {
return (n <= 1) ? 1 : n * factorial(n-1);
}
2.5interrupt
作用
作用:定义中断服务函数,后跟中断号(0~31)。
示例
c
void Timer0_ISR() interrupt 1 {
// 定时器0中断处理
}
2.6using
作用
作用:指定中断服务函数使用的寄存器组(0~3)。
示例
c
void UART_ISR() interrupt 4 using 2 {
// 使用寄存器组2
}
2.7存储模式关键字
small
small:默认变量存储在data区(128字节)。
compat
compact:默认变量存储在pdata区(256字节/页)。
large
large:默认变量存储在xdata区(64KB)。
3. 关键点总结
关键字 存储区域 地址范围 速度 典型用途
code ROM 0x0000~0xFFFF 慢 常量、查表数据
data 内部RAM 0x00~0x7F 最快 高频访问变量
idata 内部RAM 0x00~0xFF 快 中等规模变量
xdata 外部RAM 0x0000~0xFFFF 慢 大型数组、缓冲区
pdata 外部RAM 分页访问 中等 分页数据存储
volatile - - - 防止编译器优化
通过合理使用这些关键字,可以优化程序性能和内存占用,适应8051的资源限制。