1 51单片机-C51语法
系列文章目录
文章目录
- 系列文章目录
- 前言
- 1 存储类型差异
- 2 位操作扩展
- 3 中断服务函数
- 4 存储器模式
- 5 指针差异
- 6 数据类型限制
- 7 特殊功能寄存器 (SFR)
- 8 预处理差异
- 9 库函数差异
- 总结
前言
C51 是专为 8051 单片机设计的 C 语言扩展,与标准 C 语法有一些区别,本节对于这些区别展开介绍。
1 存储类型差异
标准 C 通常只关注内存访问,而 C51 必须明确指定变量存储位置:
// C51 特有存储类型关键字
data // 直接访问内部数据存储器(128B)
bdata // 可位寻址内部数据存储器
idata // 间接访问内部数据存储器(256B)
pdata // 分页访问外部数据存储器(256B)
xdata // 外部数据存储器(64KB)
code // 程序存储器(64KB)// 示例:将变量放在不同存储区
unsigned char data var1; // 内部RAM
unsigned int xdata var2; // 外部RAM
const unsigned char code table[] = {0,1,2}; // 程序存储器(ROM)
2 位操作扩展
C51 支持直接位寻址和位变量:
// 位变量定义
bit flag; // 声明位变量
sbit LED = P1^0; // 定义P1.0为LED控制位
sfr P1 = 0x90; // 声明特殊功能寄存器P1// 位操作
flag = 1; // 置位标志
if(LED == 0) {...} // 检测引脚状态
3 中断服务函数
C51 使用 interrupt 关键字定义中断处理函数:
// 定时器0中断服务函数
void timer0_isr() interrupt 1 {// 中断处理代码TH0 = 0xFC; // 重新加载初值TL0 = 0x66;
}
4 存储器模式
C51 编译时需指定默认存储模式:
// 三种存储器模式
#pragma small // 所有变量默认位于data区(内部RAM)
#pragma compact // 所有变量默认位于pdata区(分页外部RAM)
#pragma large // 所有变量默认位于xdata区(外部RAM)
5 指针差异
C51 指针需明确指向的存储区:
// 不同类型指针
char *data ptr1; // 指向内部数据的指针
char xdata *ptr2; // 指向外部数据的指针
char code *const ptr3; // 指向程序存储器的常量指针
6 数据类型限制
C51 通常没有 long long、float(需软件库支持)等复杂类型,更依赖 int、char 等基础类型。
7 特殊功能寄存器 (SFR)
C51 通过 sfr 和 sfr16 声明单片机特有的寄存器:
sfr P0 = 0x80; // 声明P0口寄存器(地址0x80)
sfr16 TMR0 = 0x8A; // 声明16位定时器0寄存器(TH0:TL0)
8 预处理差异
C51 编译器通常支持 Keil 特有的预处理指令:
#pragma NOAREGS // 禁止使用寄存器组
#pragma OPTIMIZE(8) // 设置优化级别
9 库函数差异
C51 提供专用库函数(如 reg51.h),标准 C 库部分功能缺失(如文件操作):
#include <reg51.h> // C51专用头文件,定义SFR
#include <intrins.h> // 包含_nop_()等内部函数
总结
C51 是标准 C 的嵌入式定制版本,通过扩展语法直接支持 8051 硬件特性(如位操作、中断、特殊寄存器),但牺牲了部分标准 C 的通用性。开发时需特别注意存储器分配和硬件资源的直接操作。