C51的数据类型(基本数据类型和组合数据类型)
char(unsigned char/signed char, 1个字节)
int(unsigned int/signed int, 2个字节)
long(unsigned long/signed long, 4个字节)
float(4个字节,1符号位+8阶位+23尾数)
*指针型(不同处理器的长度不同,在C51中一般为1-3个字节)
特殊功能寄存器型(C51扩充的数据类型,用于访问MCS-51的特殊功能寄存器,分为sfr和sfr16)
位类型(用于访问MCS-51单片机中可寻址的位单元,bit和sbit,占用一个二进制位)


C51的运算量
常量(整型常量、浮点型常量、字符常量、字符串型常量)
变量(一段内存空间)
存储种类,有自动(auto)、外部(extern)、静态(static)、寄存器(register)
auto,使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部。当定义它的函数体或复合语句被执行时,才分配内存空间,一般分配在堆栈中。定义变量时,如果省略存储种类,则该变量默认为自动变量。

extern,使用extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。

static,分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量是在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的,如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。

register,存放在CPU内部的寄存器,处理速度快,但少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。


存储器类型
data 直接寻址的片内RAM低128位,寻址速度最快。
bdata 片内RAM的可位寻址区(0x20-0x2f),允许字节和位混合访问。
idata  间接寻址的片内RAM,允许访问全部片内RAM
pdata 片外低256字节
xdata 片外全部64KB RAM
code 程序存储器ROM 64KB RAM
特殊功能寄存器变量
定义 sfr PSW=0xd0
由于KeilC51在头文件“reg51.h”中将所有特殊功能寄存器进行了定义,因此特殊功能寄存器不用定义即可直接使用。


位变量
bit 用于定义一般的可位处理变量
bit 位变量名;
sbit 位类型用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址。
sbit 位变量名=位地址;
存储模式
Small模式,编译时,函数参数和变量被默认在片内RAM中,存储器类型为data。程序代码不超过2KB。
Compact模式,紧凑型编译方式。编译时,函数参数和变量被默认在片外RAM的低256字节,存储类型为pdata。
Large模式,大编译模式,编译时,函数参数和变量被默认在片外RAM的64KB字节空间,存储器类型为xdata。 
MCS-51定时器/计数器接口
1)MCS-51系列,51子系统有2个16位的可编程定时器/计数器:定时器/计数器T0和T1;52系列有3个;
2)每个定时器/计数器既可以对系统时钟计数实现定时,也可以对外部信号计数实现计数功能,通过编程设定来实现。
3)T0有4种工作方式,T1/T2有3种工作方式;
4)每一个定时器/计数器定时或计数时间产生溢出,使相应的溢出位置位,溢出可通过查询或中断方式处理。
方式寄存器TMOD用来设定T1和T0的工作方式;控制寄存器TCON用来控制定时器/计数器的启动、停止和溢出。
当定时器/计数器是用来定时时,加法器对内部机器周期Tcy计数;
当定时器/计数器是用来计数时,T0计数脉冲从P3.4输入,T1计数脉冲从P3.5输入;每来一个脉冲计数器加1,当计数器加满再加1时,就会产生溢出,此时计数器清0,同时使TCON的溢出标志位置1,T0的溢出标志位为TF0,T1的溢出标志位为TF1;此标志用于软件查询,可向CPU申请中断。


方式寄存器TMOD
GATE C/T M1 M0 GATE C/T M1 M0
C/T:定时或计数方式选择,C/T=0时,定时器/计数器工作在定时方式;C/T=1时,工作为计数方式;
GATE:门控位,GATE=1,定时器/计数器T0的启动除受TR0控制外,还受外部中断请求信号INTO(P3.2)的控制,只有INT0为高电平并且TR0=1时,才启动;T1同理;
控制寄存器TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF0/TF1:溢出标志位,当T0/T1计满溢出时,由硬件使TF0/TF1=1,可以使用此信号向CPU申请中断,需要清TF0/TF1;
TR0/TR1:启动标志位,TR0/TR1=1时启动,可由软件置位或清零;


    工作方式
    方式0,13位,最大计数值8192,N为计数值,X为初值,X=8192-N; TH0=X/256,TL0=X%256;
    方式1, 16位,最大计数值65536,其他同上。
    方式2,8位,使用TL0/TL1进行计数,TH0/TH1用于保存初值;当计数溢出时,TF0/TF1置位,TH0/TH1的值会自动装入TL0/TL1;
    方式3,只有T0才有,TH0、TL0为两个独立的8位计数器,TL0使用T0的控制资源:GATE、C/T、TR0、TF0;而TH0固定只能作定时     器使用,对机器周期进行计数,这时它占用定时器/计数器T1的TR1位、TF1位和T1的中断资源。此时T1由方式位控制,方式3停     止,方式0-2允许工作,但计数溢出时并不置TF1为1,即不能产生中断请求。一般是把T1用作串行口的波特率发生器。

11-04 12:15