1 51单片机-C51语法

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • [1 存储类型差异](#1 存储类型差异)
  • [2 位操作扩展](#2 位操作扩展)
  • [3 中断服务函数](#3 中断服务函数)
  • [4 存储器模式](#4 存储器模式)
  • [5 指针差异](#5 指针差异)
  • [6 数据类型限制](#6 数据类型限制)
  • [7 特殊功能寄存器 (SFR)](#7 特殊功能寄存器 (SFR))
  • [8 预处理差异](#8 预处理差异)
  • [9 库函数差异](#9 库函数差异)
  • 总结

前言

C51 是专为 8051 单片机设计的 C 语言扩展,与标准 C 语法有一些区别,本节对于这些区别展开介绍。


1 存储类型差异

标准 C 通常只关注内存访问,而 C51 必须明确指定变量存储位置:

c 复制代码
// 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 支持直接位寻址和位变量:

c 复制代码
// 位变量定义
bit flag;           // 声明位变量
sbit LED = P1^0;    // 定义P1.0为LED控制位
sfr P1 = 0x90;      // 声明特殊功能寄存器P1

// 位操作
flag = 1;           // 置位标志
if(LED == 0) {...}  // 检测引脚状态

3 中断服务函数

C51 使用 interrupt 关键字定义中断处理函数:

c 复制代码
// 定时器0中断服务函数
void timer0_isr() interrupt 1 {
    // 中断处理代码
    TH0 = 0xFC;     // 重新加载初值
    TL0 = 0x66;
}

4 存储器模式

C51 编译时需指定默认存储模式:

c 复制代码
// 三种存储器模式
#pragma small       // 所有变量默认位于data区(内部RAM)
#pragma compact     // 所有变量默认位于pdata区(分页外部RAM)
#pragma large       // 所有变量默认位于xdata区(外部RAM)

5 指针差异

C51 指针需明确指向的存储区:

c 复制代码
// 不同类型指针
char *data ptr1;        // 指向内部数据的指针
char xdata *ptr2;       // 指向外部数据的指针
char code *const ptr3;  // 指向程序存储器的常量指针

6 数据类型限制

C51 通常没有 long long、float(需软件库支持)等复杂类型,更依赖 int、char 等基础类型。


7 特殊功能寄存器 (SFR)

C51 通过 sfr 和 sfr16 声明单片机特有的寄存器:

c 复制代码
sfr P0 = 0x80;      // 声明P0口寄存器(地址0x80)
sfr16 TMR0 = 0x8A;  // 声明16位定时器0寄存器(TH0:TL0)

8 预处理差异

C51 编译器通常支持 Keil 特有的预处理指令:

c 复制代码
#pragma NOAREGS     // 禁止使用寄存器组
#pragma OPTIMIZE(8) // 设置优化级别

9 库函数差异

C51 提供专用库函数(如 reg51.h),标准 C 库部分功能缺失(如文件操作):

c 复制代码
#include <reg51.h>  // C51专用头文件,定义SFR
#include <intrins.h> // 包含_nop_()等内部函数

总结

C51 是标准 C 的嵌入式定制版本,通过扩展语法直接支持 8051 硬件特性(如位操作、中断、特殊寄存器),但牺牲了部分标准 C 的通用性。开发时需特别注意存储器分配和硬件资源的直接操作。

相关推荐
炸膛坦客8 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
华清远见IT开放实验室13 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅15 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao15 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch15 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my16 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯17 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学18 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
CedarQR18 小时前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
萌动的小火苗19 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件