原创 Keil C51学习过程(转帖)

2009-2-2 22:17 5005 5 5 分类: MCU/ 嵌入式

 

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
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的极限值



  1.     标识符最长255个字符,一般取32个字符。大小写不敏感。
  2.     case语句的变量个数没有限制,仅受可用内存容量和函数的最大长度的限制
  3.     函数嵌套调用最大深度为10。
  4.     功能块{--------}的最大嵌套深度为15。
  5.     宏最多嵌套深度为8。
  6.     函数级宏的参数最多32个。
  7.     语句行和宏定义行最多510个字符《宏扩展后是510个字符》。
  8.     头文件嵌套深度为20。
  9.     预处理器中的条件编译层最多为20。
  10.     关于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


程序语句


构成whiledo…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


单字节


0255


signed char


单字节


-128127


unsigned int


双字节


065536


signed int


双字节


-3276832767


unsigned long


四字节


04294967295


signed long


四字节


-21474836482147483647


float


四字节


±1.175494E-38±3.402823E+38


*


1~3字节


对象的地址


bit



01


sfr


单字节


0255


sfr16


双字节


065536


sbit



01


 


常用转移字符表



转 移 字 符


    


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,ux的前缀,输入数据为char


l


用作格式类型d,I,o,ux的前缀,输入数据为long


 


输出格式转换字符type的内容和定义



type字 符


数 据 类 型


输 入 格 式


d


int指针


带符号十进制数


u


int指针


无符号十进制数


o


int指针


无符号八进制数


x


int指针


无符号十六进制数


f,e,g


float指针


浮点数


c


char指针


字符


s


string指针


字符串


 

 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条