一.常量与变量


1.常量


      又称为标量,在程序执行过程中不能改变,常量数据类型有整形(int)、浮点型(float)、字符型和字符串型。应用中一般使用“#define”定义在程序中经常用到的常量。


2.变量


是一种在程序执行过程中,数值不断变化的量。C51对变量的定义格式:【存储种类】数据类型【存储器类型】变量名


C51中的四中存储种类:auto(自动)、extern(外部)、static(静态)、register(寄存器)。默认为:auto。


根据变量的作用域的不同,变量还可以分为局部变量和全局变量两种。


局部变量。内部变量,只在定义它的函数模块内有效,必须定义在该函数模块的开头。


全局变量。外部变量,程序开始处或各个功能函数外面定义的变量,对于整个程序都有效。一般定义在程序的开始。


二.数据类型


【存储种类】数据类型【存储器类型】变量名


C51相对于c增加了bit、sfr、sfr16、sbit的特殊数据类型。


                 C51变量的数据类型


数据类型

长度/bit

长度/Byte

值域

unsigned char

8

1

0~255

Signed char/char

8

1

-128~+127

unsigned int

16

2

0~65535

Signed int

16

2

-32786~+32786

Unsigned long

32

4

0~4294967295

Signed long

32

4

-2147483678~+2147483677

float

32

4

-1.175494E-38~+3.402823E

_指针

 

13

 

bit

2

 

0或1


 


1.Char字符类型   


  长度是8位,1字节(1B),用于定义处理字符变量数据的变量或常量。无符号型(unsigned char)和符号字符类型(signed char),默认signed char。-128~+127。Unsigned char常用于处理ASCLL字符或处理小于255的整型数。


2.Int整形  


长度为16位,双字节(2B),用于存放一个双字节数据。分有符号int整型数signed int和无符号int整型数unsigned int。


   Unsigned int用字节中的最高位表示数据符号位。0正数,1负数。


3.Long长整型


长度为32位,4字节(4B)。


4.Float浮点型


十进制数中具有7位有效数据,符合IEEE754标准的单精度浮点型数据,占4B,24位精度。


5._指针型
本身就是一个变量,这个变量中存放指向另一个数据的地址。 指针变量要占据一定的内存单元,不同处理器长度不尽相同,C51 中长度一般为1~3个字节。


 


 



6.
Bit类型

存放逻辑变量,占用一个位地址,C51编译器把bit类型的变 量安排在单片机内RAM的位寻址区。


三.变量的存储器类型


存储器类型与存储空间的对应关系


存储类型

与存储空间的对应关系

DATA

直接寻址片内数据存储区,访问速度快(128B)

BDATA

可位寻址片内数据存储区,允许位与字节混合访问(16B)

IDATA

间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B)

PDATA

分页寻址片外数据存储区(256B)

XDATA

片外数据存储区(64KB)

CODE

代码存储区(64KB)


1.DATA区
    
使用存储类型data、bdata定义变量时,C51编译器会将它   们定位在片内数据存储区中(RAM)STC89C52存储长度为512B,   能快速存取各种数据,片内数据存储区是临时存放传递变量或使   用频率较高的变量的理想存储场所。Data区除了包含程序变量外,   还保护了堆栈和数据寄存器组。在SMALL存储模式下,未说明存   储器类型时,变量默认被定义在DATA区。


2.BDATA区
    
如果在DATA区的位寻址BDATA区定义变量,这个变量就可以   进行位寻址,并且申明位变量。这种可位寻址的变量对状态寄存   器十分有用,可以单独使用变量的每一位,而不一定要用位变量   名引用变量。但不允许在BDATA区定义float和double类型的变   量。


3.IDATA区
    
也可以存放使用频繁的变量,使用寄存器作为指针进行位寻址。   在寄存器中设置8位地址间寻址,与外部存储器相比,指令执行   周期和代码行长度都比较短。


4.PDATA和XDATA区
    
单片机的片外RAM区,声明变量和其他区语法相同。


5.CODE区
     
单片机的程序代码区,代码区的数据是不可以改变的。可存放   数据表,跳转向量和状态表。
四.存储模式
   在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACL、和LARGE存储模式(Memory Models)指令决定。存储模式是编译器的编译选项,用于决定变量的默认存储类型、参数传递区和无声明存储类型说明变量的存储类型。各种不同模式对于哦哦哦那个不同的实际硬件系统,也将有不同的编译结果。


1.小模式(SMALL Model)
    
所有未声明存储器类型变量,都默认驻留在内部数据区,即这   种方式和用DATA进行显示说明一样。变量访问速度快,当所有数   据对象(包括堆栈)都必须放在内部数据存储区中,空间有限。
   2.紧凑模式(Compact Model)
    
所有未声明存储器的变量类型,默认驻留在外部数据存储区的   一个页上。即PDATA进行存储器类型的说明一样的。该模式利用   R0和R1寄存器进行间接寻址(@R0和@R1)。该模式存取速度笔小   模式慢但比大模式快。


   3.大模式(Large Model)
    
所有未声明存储器的变量类型,默认驻留在外部数据存储区,   即和利用XDATA进行显示说明一样。
例:


在不同存储器类型下等价下面的变量说明:


Unsigned chardata var1; //Small模式,被定位在DATA区,片内RAM


Unsigned charpdata var1;//Compact模式片外按页面间接寻址RAM


Unsigned charxdata var1;//Large模式,片外间接寻址RAM
为了提高运行速度,建议在编写源程序时,把存储模式设定为Small,必要时在程序中XDATA、PDATA和IDATA等类型变量进行专门声明。
   sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数可包括bit类型的参数也可作为返回值。sbit可以访问MCS-51单片机内20H~2FH范围内的位对象。
五.C51语言的数组、指针与结构


1.数组  是一个由同类型的变量组成的集合,它保存在连续的存储区域中,第一个元素保存在最低地址中,最末一个保存在最高地址中。
   定义方式:数据类型【存储器类型】数组名【常量1】···【常量n】
   2.指针  指针是指某个变量所占用存储空间的首地址。用来存放指针变量的类型。
   类型说明符 _指针变量名
   char _s; char _str[4]; int _numptr;
   这样声明的指针要占用3B。对于MCS-C51存储结构的特殊性,也可以指定存储器类型的指针,声明时定义指针指向的存储器类型,也称为给予存储器类型的指针。


例如:char data _str;char xdata _numtab;


unsigned  char code _powtab;
   3.结构   结构变量是将相互关联、多个不同类型的变量结合在一起形成一个组合变量。定义格式:
   struct 结构名{


结构成员说明;


}
六.对绝对地址进行访问
  1.使用指针   _:取指令;&:取地址
   具体运算:变量=_指针变量   指针变量=&目标变量
   取内容运算时将指针变量所指向的目标地址的值赋给左边的变量,取地址运算是将目标变量的地址赋给左边的变量。变量中只能存放地址(也就是指针型数据),一般情况下不要将非指针类型数据赋给一个指针变量。


MCS-51单片机工作在总线方式下,P0/P2口作为地址/数据总线使用。对外部扩展的数据存储器RAM的读写,可采用指针的方法,实现在C51程序中对任意指定的存储器地址进行操作。
   2.使用C51扩展关键字_at_对确定地址进行访问
   使用_at_对指定的存储器空间的地址进行定位,例如对外部接口的地址进行读写。
   【存储器类型】 数据类型 标识符 _at_常数
   数据类型通常为uchar的1字节类型;常数规定变量的绝对地址,由译码电路产生;使用_at_定义的变量必须为全局变量。
   3.使用C51运行库中预定义宏
  
函数原型:


#defineCBYTE((unsigned char volatile code_)0)


#defineDBYTE((unsigned char volatile idata_)0)


#definePBYTE((unsigned char volatile pdata_)0)


#defineXBYTE((unsigned char volatile xdata_)0)
函数原型放在absacc.h文件中。


七.C51的运算符和表达式
  1.赋值运算符 
“=” 变量=表达式;
   2.算术运算符   C51中的算术运算符中只有取正值和取负值元素运算符是单目运算符,其他的都为双目运算算符
   +:加或取正值运算符  -:减或取负值运算符  _:乘法运算符
   /:除法运算符  %:模(取余)运算符
   3.自增自减预算  “++”、“—”
   4.关系运算符


 >:大于;<:小于;>=:大于等于;<=:小于等于;!=:不等于
5.逻辑运算符
  
逻辑与:条件1&&条件2;  逻辑或:条件1||条件2;
   逻辑非:!条件式
6.位运算符   变量1  位运算符  变量2
   &:按位与。|:按位或。^:按位异或。~:按位取反。


<<:左移。 >>:右移。
   位运算符的优先级从低到高:“~”、“<<”、“>>”、“&”、“^”、“|”。


7.复合运算符  
      +=:加法运算符  >>=:右移位负值  -=:减法赋值


   &=:逻辑与赋值  *=:乘法赋值  |=:逻辑或赋值
      /=:除法赋值  ^=:异或赋值  %=:取模赋值 


~=:逻辑非赋值  <<=:左移位赋值
   一般形式: 变量  复合赋值运算符  表达式


八.C51语言的程序结构
  1.顺序结构
  
    是指程序由低地址向高地址顺序执行指令代码的过程,是最简   单的程序结构。从地址0000H开始执行。
   2.选择结构
    
if语句和switch语句构成。
      ①if语句   if(表达式) 语句1 else 语句2


switch语句   处理多路分支的情况
   case分支常量的表达式的值必须是整型、字符型,不能使用条件运算符
   break语句用于跳出switch结构
3.循环结构
  
for、while、do···while 3种语句构成循环结构。


九.C51语言的函数
     实现程序的模块化,同c语言。
   十.中断服务函数
     void函数名() interrupt n
               
中断号和中断源的对应关系


中断号

中断源

中断号

中断源

0

外部中断0

3

定时、计数器1

1

定时/计数器0

4

串行口

2

外部中断1

5

定时、计数器2


中断函数运行过程中完成的任务:
   (1)中断产生时,中断函数被系统所使用。
   (2)中断函数运行完成退出时,堆栈保存的数据将被恢复。
   (3)中断函数退出时,其对应的汇编代码使用RETI指令退出。
   中断函数应遵循以下规则:
   (1)不能进行参数传递。
   (2)没有返回值


(3)不能再子函数中直接调用


(4)如中断调用了其他函数,必须保证函数和中断函数使用了相同的寄存器。


(5)对中断函数不需要声明。


十一.C51库函数与头文件
     1.C51的库函数
     2.本征库函数
        <intrinis.h>
文件下的


_cror_()、_crol_():将char型变量循环左移或右移
   _iror_()、_irol_():将int型变量循环左移或右移
   _lrol_()、_lrol_():将long型变量循环左移或右移
   _nop_():空指令12M晶振下为1us常用于IIC通信
   _testbit_:测试该为变量并跳转同时清除
   _chkfloat_:测试并返回浮点数的状态。


3.几类重要的库函数
    
(1).专用寄存器include文件。
      (2).绝对地址include文件absacc.h
      (3).动态内存分配函数malloc(stdilb.h)。
      (4).缓冲区处理数,string.h,包括复制、比较、移动函   数···
      (5).输入输出流函数


4.C51的预处理
    
(1)预处理命令以“#”开头,后面不加分号;
      (2)预处理命令在编译前执行,编译是对预处理的结果进行的,如词法、语法分析等。
      (3)多数预处理命令习惯放在头文件的开头。


5.使用C51时的注意事项
  
   (1).采用短变量;(2)避免浮点运算。