由于绝大部分的C语言知识已在C语言学习笔记专栏 点我跳转讲过,本文补充一些没有提到过的(C51标准)
1.C51扩充数据类型
sfr:特殊功能寄存器(special function register)
sbit:是特殊功能寄存器(sfr)中的一个位的地址,用于直接定义和访问单个引脚的状态
sfr16:16位特殊功能寄存器(special function register 16bit)
注:图中的*(对象的地址)长度为1~3字节,与x86和x64环境都不一样,x86为32位,占8个字节;x64为64位,占16个字节;
其实这些声明都已经写入了51单片机的头文件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
每一个寄存器在内存中都有一个唯一的地址 ,而操作这些寄存器实际上在操作寄存器所对应的地址的数据
如:
1.sfr P0 = 0x80;指P0端口(本质上是寄存器)在地址0x80处,类型为sfr,这样声明后,在c文件时就可以直接使用P0这个名称来对0x80地址处的数据进行读或写操作
2.sbit TI = SCON^1;指TI定义为SCON的位1处,但在51单片机中^不是按位异或
SCON的存储空间为1 byte,从左向右依次为位0~位7
2.typedef
typedef c51固有的数据类型说明符 别名;,具体可见45.5【C语言】typedef
3.C51的变量存储种类
1.自动(auto)
在16.【C语言】初识常见关键字 上文提过,
2.外部(extern)
在5.【C语言】初识变量的作用域和生命周期和17.【C语言】初识常见关键字 下都讲过
在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函
数体内要用extern说明(相当于全局变量),外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直
到程序结束才释放
3.静态(static)
在17.【C语言】初识常见关键字 下文讲过,这里简单提下
使用static修饰的变量称为静态变量
它又分为内部静态变量和外部静态变量
在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变
外部静态变量上在函数外部定义的静态变量.它在程序中一直存在,但在定义的范围之外是不可见的.如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效
4.寄存器(register)
C51 编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户无需专门声明
4.C51的存储器类型
用于指明变量所处的单片机的存储器区域情况