打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Keil C51学习过程
Keil C51学习过程
51实时系统
RTX-51 Tiny
抢先任务切换
RTX51 Full 提供了抢先的任务切换,RTX51 Tiny 不具备这个功能。为了对多任务的概念有一个完整的了解,在这里对抢先任务切换加以解释。
在上一个例子中,任务1收到一个信号后不会立即开始,只有当任务0 发生了时间到事件后,任务1才会启动。如果任务1被赋予了比任务0 高的优先级,通过抢先任务切换,如果任务1收到了信号,就会立即开始。优先级在任务定义中被指定(默认的优先级是0)
51规则看法
1.数据类型
C51 编译器支持下表列出的数据类型除了这些标量类型外还可以将变量组合到结构联合及
阵列中除了指明的类型可通过指针访问这些数据类型
数据类型                        位                字节            值的范围
bit                                  1                  1                 0~1
带符号char                     8                  1                 -128~+127
无符号char                     8                  1                 0~255
enum                            16                 2                 -32768~+32767
short                             16                 2                 -32768~+32767
short                             16                 2                 0~65535
int                                 16                 2                 -32768~+32767
int                                 16                 2                 0~65535
long                               32                4                  -2147483648~+2147483647
long                               32                4                 0~4294967295
float                               32                4                 +1.175494E-38~+3.402823E+38
sbit                               1                 1                 0~1
sfr                                 8                 1                 0~255
sfr16                             16                2                 0~65535
1). bit sbit sfrs 和sfr16 数据类型专门用于8051 硬件和C51 编译器并不是ANSI C 的一部分,不能通过指针进行访问bit sbit sfrs 和sfr16 数据类型用于访问8051 的特殊功能寄存器。例如:sfr P0 = 0x80 定义变量P0 并将其分配特殊功能寄存器地址0x80 在8051 上是P0 口的地址。
当结果表示不同的数据类型时C51 编译器自动转换数据类型例如位变量在整数分配中就被转换成一个整数除了数据类型的转换之外带符号变量的符号扩展也是自动完成的。
2.存储器类型
C51 编译器支持8051 及其派生器件结构并提供对8051 所有存储区的访问每个变量可以明确地分配到指定的存储空间对内部数据存储器的访问比对外部数据存储器的访问快许多因此应当将频繁使用的变量放在内部数据存储器而把较少用的变量放在外部数据存储器中变量的定义包括了存储器类型的指定可以指定变量存放的位置存储器类型描述
code 程序存储器64K 字节通过操作码 MOVC @A+DPTR 进行访问
data 直接寻址内部数据存储器对变量的最快访问128 字节
idata 间接寻址内部数据存储器访问整个内部地址空间256 字节
bdata 位寻址内部数据存储器允许位和字节混合寻址16 字节
xdata 外部数据存储器64K 字节通过 MOVX @DPTR 访问
pdata 页外部数据存储器256 字节通过 MOVX @Rn 访问
3.再入函数
再入函数可以同时由几个程序共用当执行再入函数时其它程序可以中断执行并开始执行同一个再入函数通常C51 函数不能递归调用或用于导致重入的方式受到该限制是因为函数自变量和局部变量都存放在固定的存储器位置再入函数属性允许说明那些可以重入的函数因此可以实现递归调用例如
int calc (char i, int b) reentrant
{
int x;
x=table [i]
return (x * b)
}
再入函数可以递归调用也可以同时被两个或更多程序调用它经常用于实时应用或中断代码和非中断代码必须共用一个函数的情况对于每个再入函数根据存储器的模型在内部或外部存储器模拟再入堆栈区。
4.代码优化
C51 编译器是一个主动优化编译器意思是说编译器采取一定的步骤确定产生的代码和输出的目标文件是高效的代码编译器分析所产生的代码并使之成为最高效的指令序列这确保了C 程序在最小程序空间内实现尽可能高效的运行C51 编译器提供6 种不同级别的优化高级优化包含低级优化下面列出了C51 编译器可执行的所有优化
常量合并一个表达式或地址计算式内的几个常量合并成一个常量
跳转优化跳转反演或扩展为最终目标地址使程序效率得以提高
无用代码消除将不可能执行的代码无用码从程序中删除
寄存器变量自动变量和函数自变量尽可能放在寄存器中没有为这些变量保留数据存储器空间
参数通过寄存器传递通过寄存器最多可传递3 个函数自变量
全局共用的子表达式消除将在一个函数中多次出现的子表达式和地址计算式尽可能只计算一次
5.8051 特殊优化
窥孔优化当存储器空间或时间可作为结果保存时用简化操作代替复杂操作
访问优化在操作中直接计算并包含常量和变量
数据覆盖数据和位段函数被认为是可覆盖的并通过BL51 连接器/定位器用其它数据和位段覆盖
Case/Switch 优化Case 和Switch 语句根据它们的数据序列和位置可以使用跳转表或跳转串进行优化
6.代码产生选项
OPTIMIZE SIZE 子程序代替共用的C 操作在降低程序运行速度的前提下减小了程序代码占用的空间
OPTIMIZE SPEED 共用的C 操作内嵌扩展增加程序代码的规模换取程序速度的提高
NOAREGS C51 编译器不再使用绝对寄存器访问程序代码独立于寄存器组
NOREGPARMS 参数传递总是在局部数据段内而不是在专门寄存器内进行使用pragma创建的程序代码和C51编译器PL/M-51 编译器和ASM-51 汇编器的较早版本兼容
7.全局寄存器优化
C51 编译器支持宽范围的寄存器优化。 编译器知道由外部函数使用的寄存器不由外部函数改变的寄存器用于寄存器变量这样所产生的代码占用更少的数据和代码空间并且执行得更快。
8.BL51 代码连接/定位器
BL51 代码连接/定位器将一个或多个目标模块组合成一个可执行的8051 程序。连接器还解析外部和其它共用的引用并将绝对地址分配给浮动的程序段。
BL51 代码连接/定位器处理由Keil C51 编译器和A51 汇编器以及Intel PL/M-51 编译器和ASM-51汇编器所创建的目标模块。BL51 自动选择所需要的合适的库和连接。
9.数据地址管理
BL51 连接器通过重叠不相关的函数变量管理8051 有限的内部存储器。对大多数8051 应用系统来说极大地降低了所需要的存储空间。
BL51 分析函数间的引用并实现存储器的重叠。可以使用OVERLAY 命令人为地控制函数引用使用。NOOVERLAY 可以完全禁止存储器重叠。当使用间接调用函数或调试时,使用这些命令禁止重叠是很有效的。
10.代码排序
BL51 支持创建大于64K 的应用程序由于8051 不直接支持超过64K 字节的代码地址空间,必须外部硬件交换代码区。该硬件必须由8051 软件进行控制。该处理称作代码空间切换。
BL51 可让用户管理一个公共区域和32 个存储区(每个区最多可达64K 字节)总共高达2M 字节的存储空间。支持外部硬件的软件包含一个短的汇编文件,用户可在专门的硬件平台上编辑。
BL51 使用户可在指定的区域放置特定的程序模块。谨慎地使用不同区域的分组函数可使用户创建出一个大而有效的应用程序。
11.公共区域
存储区切换程序中的公共区域是一个所有存储区随时可访问的区域。公共区域在物理上不可交换或移动。公共区域的代码复制在每个存储区或位于一个单独的EPROM 区(如果公共区域没有交换)。
公共区域包含可随时访问的程序段和常量。还可包含频繁使用的代码。默认情况下,下列为自动位于公共区域的代码段。
12.复位和中断向量
代码常量
C51 中断函数
存储区切换跳转表
一些C51 实时库函数
13.其它存储区的执行功能
代码存储区由额外的软件控制地址线进行选择。这些地址线是由8051I/O 口线或存储器映射锁存器进行模拟。BL51 在其它代码存储区中产生一个函数跳转表。当调用不同的存储区的函数时,程序对存储区进行切换,跳转到所需要的函数,并在调用完成后回到原来的存储区。
存储区切换处理大约需要50 个CPU 周期和额外的两个字节堆栈空间。通过同一存储区中互相关联的函数可提高系统的性能。多个存储区频繁调用的函数应当放置在公共区域。
C51中的关键字
关键字    用 途      说 明
auto ;存储种类说明 ;用以说明局部变量,缺省值为此
break ;程序语句 ;退出最内层循环
case ;程序语句 ;Switch语句中的选择项
char ;数据类型说明 ;单字节整型数或字符型数据
const ;存储类型说明 ;在程序执行过程中不可更改的常量值
continue ;程序语句 ;转向下一次循环
default ;程序语句 ;Switch语句中的失败选择项
do ;程序语句 ;构成do..while循环结构
double ;数据类型说明 ;双精度浮点数
else ;程序语句 ;构成if..else选择结构
enum ;数据类型说明 ;枚举
extern ;存储种类说明 ;在其他程序模块中说明了的全局变量
flost ;数据类型说明 ;单精度浮点数
for ;程序语句 ;构成for循环结构
goto ;程序语句 ;构成goto转移结构
if ;程序语句 ;构成if..else选择结构
int ;数据类型说明 ;基本整型数
long ;数据类型说明 ;长整型数
register ;存储种类说明 ;使用CPU内部寄存的变量
return ;程序语句 ;函数返回
short ;数据类型说明 ;短整型数
signed ;数据类型说明 ;有符号数,二进制数据的最高位为符号位
sizeof ;运算符 ;计算表达式或数据类型的字节数
static ;存储种类说明 ;静态变量
struct ;数据类型说明 ;结构类型数据
swicth ;程序语句 ;构成switch选择结构
typedef ;数据类型说明 ;重新进行数据类型定义
union ;数据类型说明 ;联合类型数据
unsigned ;数据类型说明 ;无符号数数据
void ;数据类型说明 ;无类型数据
volatile ;数据类型说明 ;该变量在程序执行中可被隐含地改变
while ;程序语句 ;构成while和do..while循环结构
附表1-1 ANSIC标准关键字
关键字 ;用 途 ;说 明
bit ;位标量声明 ;声明一个位标量或位类型的函数
sbit ;位标量声明 ;声明一个可位寻址变量
Sfr ;特殊功能寄存器声明 ;声明一个特殊功能寄存器
Sfr16 ;特殊功能寄存器声明 ;声明一个16位的特殊功能寄存器
data ;存储器类型说明 ;直接寻址的内部数据存储器
bdata ;存储器类型说明 ;可位寻址的内部数据存储器
idata ;存储器类型说明 ;间接寻址的内部数据存储器
pdata ;存储器类型说明 ;分页寻址的外部数据存储器
xdata ;存储器类型说明 ;外部数据存储器
code ;存储器类型说明 ;程序存储器
interrupt ;中断函数说明 ;定义一个中断函数
reentrant ;再入函数说明 ;定义一个再入函数
using ;寄存器组定义 ;定义芯片的工作寄存器
附表1-2 C51编译器的扩展关键字
附录二 AT89C51特殊功能寄存器列表(适用于同一架构的芯片)
符 号 ;地 址 ;注 释
*ACC ;E0H ;累加器
*B ;F0H ;乘法寄存器
*PSW ;D0H ;程序状态字
SP ;81H ;堆栈指针
DPL ;82H ;数据存储器指针低8位
DPH ;83H ;数据存储器指针高8位
*IE ;A8H ;中断允许控制器
*IP ;D8H ;中断优先控制器
*P0 ;80H ;端口0
*P1 ;90H ;端口1
*P2 ;A0H ;端口2
*P3 ;B0H ;端口3
PCON ;87H ;电源控制及波特率选择
*SCON ;98H ;串行口控制器
SBUF ;99H ;串行数据缓冲器
*TCON ;88H ;定时器控制
TMOD ;89H ;定时器方式选择
TL0 ;8AH ;定时器0低8位
TL1 ;8BH ;定时器1低8位
TH0 ;8CH ;定时器0低8位
TH1 ;8DH ;定时器1高8位
带*号的特殊功能寄存器都是可以位寻址的寄存
有关C51的再入函数 重入函数
有关C51的再入函数 重入函数
重入函数,又叫再入函数,是一种可以在函数体内不直接或间接调用其自身的一种函数。再入函数可被递归调用,无论何时,包括中断函数在内的任何函数都可以调入。再入函数在C51编译时使用的是模拟栈。
{
允许被嵌套调用的函数必须是可重入函数。函数的嵌套调用是指当一个函数正被调用尚未返回。又被本函数或其他函数再次调用,只有等到后次调用返回到了本次,本次被暂时搁置的程序才得以正确地恢复接续原来的正常运行,直到本次返回。一般的函数做不到这一点,因为它不是可重入的函数。重入函数必须具有分层保护参数和局部变量的专门重入堆栈机制,才可被嵌套调用。多任务系统的不同任务之间经常发生对一个函数的嵌套调用。对于单任务系统,本函数被直接或间接地自我递归调用也是函数的嵌套调用。’只有重入函数才允许嵌套调用。
重入函数不使用一般函数位于存储模式缺省空间的覆盖式堆栈,而是在此同一缺省空间内从顶端另行分配一个非覆盖的重入堆栈。它与覆盖式堆栈相向,但自上而下地堆放。重入堆栈将嵌套调用的每层参数及局部变量一直保留到控制由深层返回本层,而又终止于本层的返回。
}
函数说明: 函数名(形式参数表) reentrant
注意事项:
1、再入函数不能传递bit类型参数。
2、与PL/M51兼容的函数不能具有reentrant,这样也不能调用再入函数。
3、在编译时:再入函数建立的是模拟堆栈区,small模式下模拟堆栈区位于idata区,compact模式下模拟堆栈区位于pdata区,large模式下模拟堆栈区位于xdata区。
4、在同一程序中可以定义和使用不同存储器模式的再入函数,任意模式的再入函数不能调用不同存储器模式的再入函数,但可以调用普通函数。
5、实际参数可以传递给间接调用的再入函数。无再入属性的间接调用函数不能包含调用参数。
6、再入函数实质就是函数的参数传递用堆栈来传,非再入函数是使用RX寄存器来传的,在C51中是如此。
7、中断中想用这个来解决:中断中的函数和中断外的函数调用时寄存器不在同一个区的时候,函数参数不能正确传递的问题。但吾对此持不以为然的想法。
8、中断中使用不同的区,使用using x,是为了加快速度,避免RX入栈。再入函数后,这个加快速度的优势荡然无存,还不如中断不指定using,这样也没必要使用再入函数。使用using又不使用再入函数,才能体现加快速度的优。可以对函数做一些处理,但这是更高深的问题,一个不小心会犯错误,非高手不要使用。
9、在中断函数里一般不调用函数,只处理与硬件有关的处理或者标志位的处理,然后在中断外部定义相关的函数来检测该标志位并进行相关处理。
10、一个函数被嵌套调用时,重入栈的空间消耗很大,对于8051微控制器应有节制使用。
内部函数(很多人都不知道呢)
1、内部函数
有这样一些函数,用汇编语言编写,非常直接、简单而且目标码很短;而用C语言编写,却目标码很长。对于用汇编语言编写的这类库函数叫做内部函数。内部函数,在C51中,已经按C的规范用汇编语言写好。用户可以直接当作C语言函数调用它们。内部函数已经放在库中,供程序员使用。内部函数的原型说明放在intrins.h头文件中。
{
#ifndef __INTRINS_H__
#define __INTRINS_H__
extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#endif
}
2、扩充内部函数
伪本征函数—Keil C51头文件INTRINS.H的扩容工程
/*--------------------------------------------------------------------------
INTRINS.H
Intrinsic functions for C51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__
extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#endif
/*----------------------------------------------------------------------------------------
伪本征函数——Keil C51头文件INTRINS.H的扩容工程
----------------------------------------------------------------------------------------*/
#define _setc_()          CY   = 1
#define _clrc_()          CY   = 0
#define _setb_(RBIT)      RBIT = 1
#define _clrb_(RBIT)      RBIT = 0
#define _clra_()          ACC  = 0
#define _movcb_(RBIT)     CY   = RBIT
#define _movbc_(RBIT)     RBIT = CY
#define _movra_(RX)       RX   = ACC
#define _movar_(RX)       ACC  = RX
#define _movb0_(RBIT, RX) RBIT = RX & 0x01  //用于取RX的最低位
#define _movb7_(RBIT, RX) RBIT = RX & 0x80  //用于取RX的最高位
#define _rrca_()          CY   = ACC & 0x01 //产生RRC A指令
#define _rlca_()          CY   = ACC & 0x80 //产生RLC A指令
#define _rrcar_(RX)       CY   = RX  & 0x01
#define _rlcar_(RX)       CY   = RX  & 0x80
#define _xorr_(RX)        RX  ^= RX         //用于取奇偶位P,且RX=0
#define _andr_(RX)        RX  &= RX         //用于取奇偶位P,且RX=不变
#define _orr_(RX)         RX  |= RX         //用于取奇偶位P,且RX=不变
#define _notr_(RX)        RX   =~RX
/*------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
累加器带进位右移指令 RRC A
#define _rrca_()          CY  = ACC & 0x01
汇编代码       rrc a
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
累加器带进位左移指令 RLC A
#define _rlca_()          CY  = ACC & 0x80
汇编代码       rlc a
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
寄存器带进位右移指令 RRC REG
#define _rrcar_(RX)       CY  = RX  & 0x01
#define _movra_(RX)       RX  = ACC
/*--------------------------------------------------------------------------
例:
C51程序
unsigned char i;
i = 0x55;
_setc_();//CY=1
_rrcar_(i);//i=0x55,ACC=0xaa,CY=1
_movra_(i);//或用i = ACC;//i=0xaa,ACC=0xaa,CY=1
汇编代码
mov  r7,#055h
setb c
mov  a,r7
rrc  a
mov  r7,a
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
寄存器带进位右移指令 RRC REG
#define _rlcar_(RX)       CY  = RX  & 0x80
#define _movra_(RX)       RX  = ACC
例:
C51程序
unsigned char i;
i = 0x55;
_setc_();//CY=1
_rlcar_(i);//i=0x55,ACC=0xab,CY=0
_movra_(i);//或用i = ACC;//i=0xaa,ACC=0xaa,CY=0
汇编代码
mov  r7,#055h
setb c
mov  a,r7
rlc  a
mov  r7,a
--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------
伪本征函数"汇编级"应用
----------------------------------------------------------------------------
1.写串行数据
C51程序
void writedata(unsigned char val)
{
_movar_(val);//或用ACC = val;
for (val = 8; val > 0; val--)
{
_clrb_(TXD);//或用TXD = 0;
_rrca_();
_movbc_(RXD);//或用RXD = CY;
_setb_(TXD);//或用TXD = 1;
_nop_();
}
}
A51代码
writedata:
mov  a,r7
mov  r7,#8
writedata_loop:
clr  txd
rrc  a
mov  rxd,c
setb txd
nop
djnz r7,writedata_loop
ret
----------------------------------------------------------------------------
2.读串行数据
C51程序
unsigned char readdata(void)
{
unsigned char val;
for (val = 8; val > 0; val--)
{
_clrb_(TXD);//或用TXD = 0;
_nop_();
_movcb_(RXD);//或用CY = RXD;
_rrca_();
_setb_(TXD);//或用TXD = 1;
_nop_();
}
_movra_(val);//或用val = ACC;
return val;
}
A51代码
readdata:
mov  r7,#8
readdata_loop:
clr  txd
nop
mov  c,rxd
rrc  a
setb txd
nop
djnz r7,readdata_loop
mov  r7,a
ret
--------------------------------------------------------------------------*/
其他实用例子:
/*
详解:
函数名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
功 能:_crol_,_irol_,_lrol_以位形式将val 左移n 位,该函数与8051“RLA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
C-5 1 程序设计 37
y=0x00ff;
y=_irol_(y,4); y=0x0ff0
}
函数名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式将val 右移n 位,该函数与8051“RRA”指令
相关,上面几个函数不同于参数类型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4); ////y=0x0ff0
}
函数名: _nop_
原 型: void _nop_(void);
功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_
函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函数名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。
如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。
_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的
*/
C51的极限值
C51的极限值
标识符最长255个字符,一般取32个字符。大小写不敏感。     case语句的变量个数没有限制,仅受可用内存容量和函数的最大长度的限制。     函数嵌套调用最大深度为10。     功能块{--------}的最大嵌套深度为15。     宏最多嵌套深度为8。     函数级宏的参数最多32个。     语句行和宏定义行最多510个字符《宏扩展后是510个字符》。     头文件嵌套深度为20。     预处理器中的条件编译层最多为20。     关于Intel目标模块格式(OMF- 51)的极限值:
函数类型段总和最多255个;
全局符号(PUBLIC)最多256个;
外部符号(extern)最多25b个。
51类型等
ANSI C标准的关键字
关 键 字
用     途
说                         明
auto
存储种类说明
用以说明局部变量,缺省值为此
break
程序语句
退出最内层循环体
case
程序语句
Switch语句中的选择项
char
数据类型说明
单字节整形数或字符行数据
const
存储类型说明
在程序执行过程中不可修改的变量值
continue
程序语句
转向下一次循环
default
程序语句
Switch语句中的失败选择项
do
程序语句
构成do…while循环结构
double
数据类型说明
双精度浮点数
else
程序语句
构成if…else选择结构
enum
数据类型说明
枚举
extern
存储类型说明
在其它程序中说明了的全局变量
float
数据类型说明
单精度浮点数
for
程序语句
构成for循环结构
got
程序语句
构成goto转移结构
if
程序语句
构成if…else选择结构
int
数据类型说明
基本整形数
long
数据类型说明
长整形数
register
存储类型说明
使用CPU内部寄存器的变量
return
程序语句
函数返回
short
数据类型说明
短整形数
signed
数据类型说明
有符号数,二进制数据的最高位为符号位
sizeof
运算符
计算表达式或数据类型的字节数
static
存储类型说明
静态变量
struct
数据类型说明
结构类型数据
switch
程序语句
构成switch选择结构
typedef
数据类型说明
重新进行数据类型定义
union
数据类型说明
联合类型数据
unsigned
数据类型说明
无符号数据
viod
数据类型说明
无类型数据
volatile
数据类型说明
说明该变量在程序执行中可被隐含地改变
while
程序语句
构成while和do…while循环结构
C51编译器的扩展关键字
关 键 字
用     途
说                         明
bit
位标量声明
声明一个位标量或位类型的函数
sbit
位变量声明
声明一个可位寻址变量
sfr
特殊功能寄存器声明
声明一个特殊功能寄存器(8位)
sfr16
特殊功能寄存器声明
声明一个特殊功能寄存器(16位)
data
存储器类型说明
直接寻址的8051内部数据存储器
bdata
存储器类型说明
可位寻址的8051内部数据存储器
idata
存储器类型说明
间接寻址的8051内部数据存储器
pdata
存储器类型说明
“分页”寻址的8051外部数据存储器
xdata
存储器类型说明
8051外部数据存储器
code
存储器类型说明
8051程序存储器
interrupt
中断函数声明
定义一个中断函数
reentrant
再入函数声明
定义一个再入函数
using
寄存器组定义
定义8051的工作寄存器组
Franklin C51编译器能够识别的数据类型
数据类型
长     度
值                 域
unsigned char
单字节
0~255
signed char
单字节
-128~127
unsigned int
双字节
0~65536
signed int
双字节
-32768~32767
unsigned long
四字节
0~4294967295
signed long
四字节
-2147483648~2147483647
float
四字节
±1.175494E-38~±3.402823E+38
*
1~3字节
对象的地址
bit
0或1
sfr
单字节
0~255
sfr16
双字节
0~65536
sbit
0或1
常用转移字符表
转 移 字 符
含     义
ASCII码(16进制数)
\0
空字符(NULL)
00H
\n
换行符(LF)
0AH
\r
回车符(CR)
0DH
\t
水平制表符(HT)
09H
\b
退格符(BS)
08H
\f
换页符(FF)
0CH
\’
单引号
27H
\”
双引号
22H
\\
反斜杠
5CH
Franklin C51编译器所能识别的存储器类型
存储器类型
data
可直接访问内部数据存储器(128字节),访问速度最快。
bdata
可位寻址内部数据存储器(16字节),允许位与字节混合访问。
idata
间接访问内部数据存储器(256字节),允许访问全部内部地址。
pdata
“分页”访问外部数据存储器(256字节),用MOVX @Ri指令访问。
xdata
外部数据存储器(64K字节),用MOVX @DPTR指令访问。
code
程序存储器(64K字节),用MOVC @A+DPTR指令访问。
运算赋与表达式
运     算    符
说         明
运                   算                   符
赋值运算符
=
算术运算符
+
加或取正值运算符
-
减或取负值运算符
*
乘运算符
/
除运算符
%
取余运算符
增量和减量运算符
++
增量运算符
--
减量运算符
关系运算符
大于
小于
>=
大于等于
<=
小于等于
==
等于
!=
不等于
逻辑运算符
||
逻辑“或”
&&
逻辑“与”
!
逻辑“非”
位运算符
按位“取反”
<<
左移
>>
右移
按位“与”
^
按位“异或”
|
按位“或”
复合赋值运算符
+=
加法赋值
-=
减法赋值
*=
乘法赋值
/=
除法赋值
%=
取模赋值
<<=
左移位赋值
>>=
右移位赋值
&=
逻辑“与”赋值
|=
逻辑“或”赋值
^=
逻辑“异或”赋值
~=
逻辑“非”赋值
逗号运算符
条件运算符
?:
指针和地址运算赋
*
&
强制类型转换运算符<span
指针和地址运算赋
*
&
强制类型转换运算符
()
sizeof
sizeof
语   句
表达式语句
表达式;
复合语句
{
}
条件语句
if
else
开关语句
switch
case
循环语句
while
do…while语句
do
while
for语句
for
goto语句
goto
continue语句
continue
return语句
return
flags标志符及其意义
flags
意             义
*
输入被忽略
b,h
用作格式类型d,I,o,u和x的前缀,输入数据为char型
l
用作格式类型d,I,o,u和x的前缀,输入数据为long型
输出格式转换字符type的内容和定义
type字 符
数 据 类 型
输 入 格 式
d
int指针
带符号十进制数
u
int指针
无符号十进制数
o
int指针
无符号八进制数
x
int指针
无符号十六进制数
f,e,g
float指针
浮点数
c
char指针
字符
s
string指针
字符串
本页上的内容是Google 笔记本用户提供的,Google 对这些内容不负任何责任。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Keil C51库函数及学习附录
MSC-51单片机学习笔记之1
【单片机C语言基础入门】第三章:变量与数据类型
变量 keil存储器类型
51单片机综合学习系统之 DS18B20温度实验篇 《电子制作》2008年5月
NRF24L01无线模块收发程序(实测成功 多图)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服