STC89C52RC单片机额外篇 | 03 - 认识C51编译器支持的数据类型

Keil C51对C语言的关键词扩展之十三: sfr sfr用来定义特殊功能寄存器。用法如下: sfr name = address; name 为寄存器名字 address 为寄存器的地址 示例: sfr P0 = 0x80; /* P0口,地址为0x80 */ sfr P1 = 0x90; /* P1口,地址为0x90 */ sfr P2 = 0xA0;       /* P2口,地址为0xa0 */ sfr P3 = 阅读详情

以前我们在学习C语言的时候,有C语言支持的数据类型,它们被称为标准C,现在对于51单片机,它与标准C的数据类型稍有不同,并且追加了一些关键字。

在标准C语言中基本的数据类型,例如char、int、short、long、float与double,它们存储数据的长度是有差异的,而在C51编译器中,int与short是一样的,float与double也是一样的,我们通过表格来看看它们具体的定义:

对于unsigned char、signed char、unsigned int、signed int、unsigned long、signed long这些数据类型,我们在C语言的学习中就已经用得较多,这里不再赘述。下面分别对指针型*、bit、sfr、sfr16、sbit这五个数据类型进行说明。

1 指针型*

指针型*可以说是C语言的一大特性,有人说不懂指针,C语言只是学会了一半。在博主看过很多8位单片机开发中,几乎很少看到指针的使用,原因可能是一方面8位单片机往往ROM资源有限,指针往往是操作内存的,另一方面是指针往往与结构体结合使用,定义结构体很大程度上是用于抽象数据类型,便于复用,但在8位单片机较少使用结构体。

指针型*本身是一个变量,在这个变量中存放的是指向另一个数据类型的地址。这个指针变量要占据一定的内存单元,对于不一样的处理器长度也不尽相同,在C51中,它的长度一般为1~3个字节。

后面实践中,博主会逐渐使用指针,方便大家理解。

2 bit 位变量

bit位变量是C51编译器的一种扩充数据类型,利用它可定义一个位变量,但不能定义为位指针,也不能位数组,例如bit* a;、bit a[5];这些是不允许的。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True与Flase。

3 sfr 特殊功能寄存器

sfr也是C51编译器的一种扩充数据类型,它占用一个内存单元,值域为0~255。利用它能访问51单片机内部的所有特殊功能寄存器。例如sfr P1 = 0x90;这一句定义地址0x90为P1端口在片内的寄存器,在后面的语句中可以用P1 = 0xff; (对P1端口的所有引脚输出高电平)之类的语句来操作特殊功能寄存器。

4 sfr16 16为特殊功能寄存器

sfr16也是C51编译器的一种扩充数据类型,它占用两个内存单元,值域为0~65535。sfr16与sfr一样用于操作特殊功能寄存器,不一样的是它操作占两个字节的寄存器,如定义器T0与T1。

5 sbit 可寻址位

sbit同样是C51编译器的一种扩充数据类型,利用它能访问芯片内部的RAM中的可寻址位或者特殊功能寄存器中的可寻址位。例如之前定义了sfr P1 = 0x90;(P1端口的寄存器是支持位寻址的),现在可以定义sbit P1_1 = P1^1;(定义P1_1为P1中的P1.1引脚)。同样的,我们也可以用地址去定义,例如P1.1的地址是0x91,那么我们可以定义sbit P1_1 = 0x91;,这种定义方式也是可以的。

6 其他扩展关键字

如表所示:

这里插个知识点:

程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,像以前的计算机程序存储在卡片上,code区也可以放在ROM里面,也可以放在RAM里面,也可以放在Flash里面(但是运行速度要慢很多,主要读Flash比读RAM要费时间),因此一般的做法是要将程序放到Flash里面,然后load到RAM里面运行的;data区就没有什么选择了,肯定要放在RAM里面,放到ROM里面改动不了。

读到这里就很好理解data关键字(实际上很少用到)与code关键字,这里着重介绍code关键字,因为它经常使用:

unsigned char code word[] = {
      0x04,0x10,0x34,0x08,0xC4,0x06,0x04,0x01,
      0xC4,0x82,0x3C,0x8C,0x20,0x40,0x10,0x30,
      0x0F,0x0C,0xE8,0x03,0x08,0x0C,0x08,0x10,
      0x28,0x60,0x18,0xC0,0x00,0x40,0x00,0x00,
};
int code val = 1201;

在单片机中一般都有两块存储区域,ROM和RAM,程序代码存储在ROM中,程序要用的变量存储在RAM中。而“code”的作用就是将其修饰过的变量存储在ROM中而非RAM。

在单片机中,RAM空间都比较小,是比较宝贵的。“code”的意义就是将一些初始化后值一直保持不变的变量(如固定的常数、表格、常量数组、只读常量等)放置于ROM区,从而节省了RAM空间。

注意:用“code”修饰的变量是不能在程序运行时改变的!

剩下的提一下interrupt与using关键字,interrupt是用于声明中断服务程序的关键字,using与interrupt结合使用,指定使用中断服务程序的寄存器组,这涉及到函数的压栈与出栈问题,只有深入了解了这块才能用好using关键字,一般情况不建议使用using,让编译器给我们的中断服务程序分配寄存器组即可!

7 总结

对于sfr与sbit定义的一些寄存器,其实在我们开始写程序时包含的头文件就定义了一套,例如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__

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;

/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;


/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX  = P1^1; // 8052 only
sbit T2    = P1^0; // 8052 only
             
/*  T2CON  */
sbit TF2    = T2CON^7;
sbit EXF2   = T2CON^6;
sbit RCLK   = T2CON^5;
sbit TCLK   = T2CON^4;
sbit EXEN2  = T2CON^3;
sbit TR2    = T2CON^2;
sbit C_T2   = T2CON^1;
sbit CP_RL2 = T2CON^0;

#endif

STC89C52RC的寄存器 例如,可以使用Overflow Flag(溢出标志位)来检测有符号16位数的溢出,使用Sign Flag(符号标志位)来判断16位数的正负,使用Zero Flag(零标志位)来判断16位结果是否为0等等。在程序中,可以通过相应的指令(如MOV、SETB、CLR等)来操作定时器寄存器中的标志位和寄存器,实现定时器的启动、停止、重载等操作。在8051系列单片机中,一般有两个独立的定时器:定时器0和定时器1,每个定时器都包括一个16位计数器和一些相关的寄存器,用于控制定时器的工作模式和计数器的计数值。 阅读详情

相关推荐

Keil C51编译器在XC800系列MCU中的SFR访问问题解析

在嵌入式系统开发中,特殊功能寄存器(SFR)的访问是底层硬件控制的核心技术。通过MOV指令直接操作SFR时,编译器生成的机器码可能存在硬件兼容性问题,这在Infineon XC800系列微控制器与Keil C51编译器的组合中尤为突出。该问题涉及指令集架构的特定编码模式,当操作某些敏感地址范围的SFR时,可能导致不可预期的硬件行为。通过静态分析工具如mddfind可以检测问题指令,而采用临时变量过渡或调整编译器优化设置等工程实践方法能有效规避风险。这类问题在工业控制、汽车电子等对可靠性要求严苛的领域需要特别

weixin_30299709的博客 331

C51编程中sfr,sbit的用法以及位地址和字节单元地址的区别

C51编程中sfr,sbit的用法以及位地址和字节单元地址的区别

breadcheesebread的博客 7725

STC89C52RC单片机额外篇 03 - 认识C51编译器支持的数据类型_stc89c52rc的sfr(1)

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_84009317的博客 1236

c语言编程单片机中的sbit,单片机sfr和sbit的用法

描述单片机sfr和sbit详解sfr用于将一个单片机的特殊功能寄存器(special function register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。STC该系列单片机的特殊功能寄存器布局如下:看过图1这么多特...

weixin_42298969的博客 5643

macOS系统实现51单片机编程

51单片机

张学友 1万+

51单片机多线程神器:Tiny-51操作系统_rtx51 tiny api

什么是RTX51RTX51是keil公司开发的一款实时操作系统,由汇编编写,其有两个版本:1.Tiny2.Full其中Tiny版本采用分时调度的方式,占用资源小,可以运行在STC89C52RC这种只有256个字节的单片机上,而Full版本是抢占式调度,支持任务间通信和内存管理等功能,功能强但占用资源多,适合RAM更大的单片机上,不适合STC89C52RC单片机,所以这里我们只做Tiny版本的分享。运行流程。

2401_89213290的博客 1852

你知道什么是STC89C52RC吗?

STC89C52RC是一种基于8051架构的单片机芯片,由中国的STC公司生产。它包含52KB的闪存程序存储器,1KB的RAM数据存储器,以及一系列的外设接口,例如串口、定时器、计数器等等,可广泛应用于工业自动化、仪器仪表、智能家居、电子产品等领域。STC89C52RC具有低功耗、高性能和高可靠性等优点,成本相对较低,因此在中国的嵌入式系统开发领域得到了广泛应用。你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

w5jaLw的博客 5552

Keil5安装教程51单片机(STC89C52):新手入门必看指南

手把手教你完成Keil5安装教程51单片机环境搭建,专为初学者优化,涵盖STC89C52配置要点,解决常见安装问题,让单片机开发从入门到运行第一个程序畅通无阻。

weixin_36289813的博客 1288

51单片机多线程神器:Tiny-51操作系统

给STC89C52RC单片机移植RTX-Tiny操作系统,简单到爆,B格拉满了,好吧?

嵌入式学习记录站点 1万+

基于VSCode与PlatformIO的51单片机PWM调光实战(STC89C52RC)

本文详细介绍了如何使用VSCode与PlatformIO开源工具链,在STC89C52RC单片机上实现PWM调光,并制作出模拟警车红蓝灯交替闪烁的拖尾灯效。内容涵盖开发环境搭建、PWM原理、代码实战及程序烧录调试,为嵌入式开发者提供了一套免费、高效且现代化的51单片机开发方案。

weixin_29243279的博客 279

基于VSCode+PlatformIO+SDCC的51单片机PWM调光实战(STC89C52RC)

本文详细介绍了如何使用VSCode+PlatformIO+SDCC开发环境进行51单片机PWM调光实战(STC89C52RC)。从环境搭建、工程配置到PWM实现原理与代码解析,逐步指导开发者完成警车灯效开发,并分享烧录调试技巧与SDCC语法差异。这套免费、跨平台的方案特别适合初学者快速入门51单片机开发。

weixin_42540248的博客 430

【STC单片机】图形化程序自动生成, STC89C52RC系列各功能模块, AiCube-ISP-V6.95Z

【STC单片机】--如何用 AiCube程序自动生成STC89C52RC系列各功能模块程序?come on, AI学妹来教你!11, STC89C52RC@AiCube-点击那个播放的按键-是产生KEIL-C51项目。只能8位自动重载的定时器1。》的相应原理部分后,来。Keil C51 项目。来配置,自动生成程序。

Xinxin_UP的博客 1925

Keil安装时如何添加C51支持图解说明

详细介绍Keil安装过程中如何手动添加C51编译器支持,解决因版本缺失导致的项目无法编译问题,帮助开发者顺利完成keil安装配置,提升开发效率。

weixin_42502040的博客 875

STC89C52RC单片机实验板使用手册与实战指南

STC89C52RC或许不再是最先进的MCU,但它依然是最好的入门老师。它教会我们:如何在资源极度受限的情况下进行工程取舍如何理解底层硬件的工作原理如何写出高效、稳定的嵌入式代码这些能力,远比学会某个具体框架更重要。当你有一天转向STM32甚至RISC-V平台时,会发现很多思想是一脉相承的。而这一切的起点,也许就是你现在点亮的那一盏LED灯 💡🚀本文还有配套的精品资源,点击获取。

weixin_35649491的博客 1083

Keil5安装后51单片机项目创建:从零实现操作指南

手把手教你完成keil5安装教程,快速搭建51单片机开发环境,从新建项目到配置选项,每一步都清晰易懂,助力嵌入式初学者顺利入门实战开发。

weixin_35879493的博客 1348

STC89C52RC单片机PWM控制项目

单片机,顾名思义,是一种将中央处理单元(CPU)、存储器、输入/输出端口和其他功能集成到单一芯片上的微控制器。STC89C52RC作为一款8位微控制器,属于STC公司生产的8051系列单片机,其主要特点包括低功耗、高性能以及丰富的指令集。在市场中,STC89C52RC单片机因其性价比高,被广泛应用于工业控制、家用电器、仪器仪表等领域。脉冲宽度调制(PWM)是一种通过改变脉冲宽度来调节输出功率的技术。在STC89C52RC单片机中,PWM信号广泛应用于电机控制、电源管理、LED亮度调节等领域。

weixin_42577243的博客 1096

STC89C52RC 单片机高效开发模板与规范实践

本文详细介绍了为STC89C52RC单片机构建高效开发模板与编码规范的最佳实践。通过创建标准化的项目结构、核心文件骨架及常用工具库,并结合清晰的命名、注释与代码结构规范,旨在提升C51单片机项目的开发效率、可维护性与代码质量,帮助开发者将精力集中于核心逻辑。

tree的博客 478

数据分析实战:如何用皮尔逊相关系数避免伪相关陷阱(附Python代码)

本文通过实战案例与Python代码,深入解析了皮尔逊相关系数在数据分析中的应用与常见陷阱。文章重点揭示了如何识别与避免由混杂变量导致的伪相关,并介绍了通过可视化、敏感性分析、分层分析与偏相关分析等方法来检验相关性的可靠性,帮助分析师建立严谨的相关性思维。

weixin_29051245的博客 410
上一篇: 模拟电路实验 02 - | 阻容耦合放大电路
下一篇: 模拟电路实验 03 - | 负反馈放大电路
嵌入式逍遥
嵌入式逍遥 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄9年 7万+粉丝 237原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

嵌入式逍遥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值