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

发布者:巳午未最新更新时间:2022-05-10 来源: eefocus关键字:STC89C52RC  单片机  C51编译器  数据类型 手机看文章 扫描二维码
随时随地手机看文章

以前我们在学习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  单片机  C51编译器  数据类型 引用地址:STC89C52RC单片机额外篇 | 03 - 认识C51编译器支持的数据类型

上一篇:STC89C52RC单片机额外篇 | 04 - 认识头文件<intrins.h>与_nop_函数
下一篇:STC89C52RC单片机额外篇 | 02 - 认识串行通信、波特率以及数据包

推荐阅读最新更新时间:2024-11-13 10:25

基于51单片机最小系统点亮一个灯的程序
51单片机最小系统 今天我们开始进行51单片机编程学习,首先我们要了解一下单片机工作需要的基本条件。前面的内容中我们知道了51单片机的引脚有电源引脚,时钟引脚,控制引脚,以及通用输入输出端口。那要怎样才能让单片机工作呢? 如果将单片机与人类比,那它的电源就像人的心脏;时钟信号就像人的脉搏;控制引脚就如人的五官;通用端口就如人的四肢;芯片内部的控制逻辑就如我们的神经系统。这么说的话我们就很容易确定单片机的最小系统了吧。首先我们需要给单片机供电,再给他提供时钟,然后配置它的控制电路,最后给它的引脚接上一些外部电路,据此我们就可以绘制出下图这个最小系统电路了。 例程实图 以上最小系统电路图中使用的是89C51单片机,因为它的功能
[单片机]
基于51<font color='red'>单片机</font>最小系统点亮一个灯的程序
基于AVR 单片机的中频电源测试系统设计
1 引言 电参数的测量和监控是电力系统的重要组成部分,本文从测试系统的工程学实际出发,完成了对中频电源系统的电压、电流、频率、功率因数、有功功率等参数的测量和实时监控,较好的实现了中频电源测试系统的功能和工程要求。AVR 单片机相对传统的 51 系列单片机,具有更高的集成度和更强的功能,与 C 语言有很好的兼容性,RISC 指令架构使其运行速度可达 1MIPS/MHZ。随着其越来越广泛的应用,必将取代 51 系列成为单片机的主流。其主要功能包括看门狗、FLASH 程序存储器、E2PROM、A/D 转换器、定时器、计数器、USART 接口等多种功能,这使得本测试系统的硬件实现变得简单,可靠。 2 硬件结构设计与实现 本文所提及的中
[单片机]
基于AVR <font color='red'>单片机</font>的中频电源测试系统设计
单片机控制的电池管理实现了成功的互联网
微控制器将在观光噪比(IoT)取向设计大多数因特网主控制元件和这些MCU将有可能被电池供电。电源效率将是实现可接受的电池寿命至关重要因此MCU将需要管理的电池使用更精确地比以往任何时候。许多MCU具有特殊的功能,帮助管理电池电量和使用这些功能优化可能使输赢在市场之间的差异。 本文将很快回顾一些实现高效电池的MCU产品设计,并说明所需的关键功能,例如使用的设备,这些功能如何提高工作效率和电池寿命。软件工具,帮助估计电池寿命将用于展示如何在您详细的设计实施估计寿命。这极大地有助于设备选择并且是一个关键的技术用于创建电源效率的设计。 管理电源域 电池的MCU实现时想我们最初可能,前提是有一个单一的MCU电源域,流失的电池,我们的目标是管
[单片机]
<font color='red'>单片机</font>控制的电池管理实现了成功的互联网
C8051单片机实现多目标超声波测距的设计
超声波测距传感器以其测量精度高、响应快和价格低廉而广泛应用在工业现场测距、移动机器人导航和定位等场合。超声波测距传感器常用的方式是1 个发射头对应1 个接收头,也有多个发射头对应1 个接收头。 它们共同之处是:每个接收头只测量一个位置,这个位置就是除盲区内因发射的超声波旁瓣引起的接收信号超声波包络峰值外,第1个接收信号超声波包络峰值对应的距离。 在机器人自主导航避障时,机器人只关心最近障碍物的距离,是能够完成自主避障的。 但是在机器人定位时,尤其在动态环境下,1 个接收头同时测量多个距离,能够更多地描述环境信息,这对机器人用超声波定位具有重要意义。 1 超声波 1. 1 超声波测距原理 超声波测距原理比较简单,一般是采用时差法
[单片机]
C8051<font color='red'>单片机</font>实现多目标超声波测距的设计
单片机中实现8个LED的流水灯效果
左移函数_crol_(x,y)和数组实现 #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar temp;/*变量类型和赋的值最好一致,P1口为8位寄存器,选用uchar*/ void delay(uint); void main() { temp=0XFE; P1=temp; while(1) { temp=_crol_(temp,1); //循环左移 delay(300); P1=temp; } } void delay(uint z) { uint x
[单片机]
PIC16C72单片机在太阳能热水器水位水温控制器中的设计
  为满足落水式太阳能热水器自动控制的要求,设计了一个基于PIC16C72单片机的水温水位控制器。以NTC热敏电阻作为测温传感器,用PIC16C72内置的多路8位A/D转换器把NTC热敏电阻上的压降转换为数字量实现测温。通过非对称多谐振荡器电路把水位传感器的等效电阻转换为振荡信号的频率,然后用PIC16C72内置的计数器测量频率的高低,实现对水位的测量。介绍了控制器的工作原理、完整的硬件电路和功能。该设计省去了温度测量信号调理电路、专用A/D转换和输出译码驱动芯片,具有硬件系统组成简单、可靠性好的特点。   太阳能热水器因具有节能环保、使用费用低廉等优点正快速进入千家万户,与太阳能热水器配套的水温水位控制器十分方便用户的使用,产
[单片机]
PIC16C72<font color='red'>单片机</font>在太阳能热水器水位水温控制器中的设计
基于51单片机的智能家居控制系统
***************************** * @File Name: SYS.C * @Author : JZHG * @Time : 2012-12-04 * @Version : V1.0 ******************************/ #include SYS.h /************************************ * 定义变量类型 *************************************/ char USART_RxBuf ={0}; // 定义串口接收数据缓冲区 u8 USART_
[单片机]
基于51<font color='red'>单片机</font>的智能家居控制系统
RTOS为Energy MCU实现“无时钟节拍”节能模式
Energy Micro宣布Keil RTX实时操作系统(RTOS)已成为其Simplicity Studio提供的软件之一。Keil RTX 是针对ARM Cortex-M 处理器进行了优化的RTOS,可提供灵活的任务调度及进行高速的任务处理。Energy Micro对Keil RTX加以扩展,使MCU在任务处理之间处于超低功耗的深度睡眠模式。 Energy Micro对ARM Keil RTX进行了扩展,实现了“无时钟节拍”模式,该模式下EFM32 MCU只需在必要的时候醒来-即在预定的时间或发生中断时。相比其它使用基于SysTick,即系统定时器,需要不断运行的高速时钟的方案,“无时钟节拍”模式下电流消耗小了几个数量级。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved