单片机C语言知识点全攻略(二)

单片机C语言知识点全攻略(二)  
 
       电子发烧友网讯:继《单片机学习知识点全攻略》得到广大读者好评,根据有网友提出美中不足的是所用单片机编程语言为汇编,基于此,电子发烧友网再接再厉再次为读者诚挚奉上非常详尽的《单片机C语言知识点全攻略》系列单片机C语言学习教程,本教程共分为四部分,主要知识点如下所示。

参阅相关系列文章,

单片机C语言知识点全攻略(一)

第二部分知识点:

  点击浏览下一页第五课 C51变量

  点击浏览下一页第六课 C51运算符和表达式

  点击浏览下一页第七课 运算符和表达式(关系运算符)

  点击浏览下一页第八课 运算符和表达式(位运算符)

  点击浏览下一页第九课 C51运算符和表达式(指针和地址运算符)

  第五课、C51变量

  上课所提到变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:

  [存储种类] 数据类型 [存储器类型] 变量名表

  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(staTIc)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和使用方法,将在第七课《变量的存储》中进一步进行学习。

  而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在单片机c语言硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89c51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 AT89c51特殊功能寄存器列表

 单片机C语言知识点全攻略(二)

 

  如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。

  数据存储模式

  存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:

  1. 1. Small模式

  所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。

  2. 2. Compact模式

  所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。

  3. 3. large模式

  所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。

  提示:存储模式在单片机c语言编译器选项中选择。

  之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。

  sfr和sfr16能直接对51单片机的特殊寄存器进行定义,定义方法如下:

  sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;

  sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;

  我们能这样定义AT89c51的P1口

  sfr P1 = 0x90; //定义P1 I/O口,其地址90H

  sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口能用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,能定义为:

  sfr16 T2 = 0xCC; //这里定义8052定时器2,地址为T2L=CCH,T2H=CDH

  用sfr16定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器0和1的定义。

  sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1口中的第2个引脚P1.1。我们能照以下的方法去定义:

  (1)sbit 位变量名=位地址

  sbit P1_1 = Ox91;

  这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。

  (2)Sbit 位变量名=特殊功能寄存器名^位位置

  sft P1 = 0x90;

  sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置

  当可寻址位位于特殊功能寄存器中时可采用这种方法

  (3)sbit 位变量名=字节地址^位位置

  sbit P1_1 = 0x90 ^ 1;

  这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。

  在单片机c语言存储器类型中供给有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,能将要求可位录址的数据定义为bdata,如:

  unsigned char bdata ib; //在可位录址区定义ucsigned char类型的变量ib

  int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象

  sbit ib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位

  sbit ab12=ab[1]^12;

  操作符“^”后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。

  下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为RunLED2。程序如下:

  sfr P1 = 0x90; //这里没有使用预定义文件,

  sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器

  sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用

  sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚

  void main(void)

  {

  unsigned int a;

  unsigned char b;

  do{

  for (a=0;a《50000;a++)

  P1_0 = 0; //点亮P1_0

  for (a=0;a《50000;a++)

  P1_7 = 0; //点亮P1_7

  for (b=0;b《255;b++)

  {

  for (a=0;a《10000;a++)

  P1 = b; //用b的值来做跑马灯的花样

  }

  P1 = 255; //熄灭P1上的LED

  for (b=0;b《255;b++)

  {

  for (a=0;a《10000;a++) //P1_1闪烁

  P1_1 = 0;

  for (a=0;a《10000;a++)

  P1_1 = 1;

  }

  }while(1);

  }

  • 单片机C语言知识点全攻略(二)已关闭评论
    A+
发布日期:2019年07月14日  所属分类:参考设计