Skip to main content

单片机--C51

C51&&ANIS C

区别:

1)变量(一般变量)的定义问题

如字符型、整型、浮点型、各种数组、各种结构体等。

因单片机有4个存储空间、7个存储区,在定义时,必须要指明变量存放的存储器空间、具体的区域。

2)特殊功能寄存器的使用问题

这是ANSI C中所没有的。在C51中增加了两种“特殊功能寄存器数据类型”,使用之前,像一般变量一样,需要先定义再使用。

3)位变量的定义问题

这也是ANSI C中所没有的,在C51增加了两种“位数据类型”。见4.5节。

4)指针的定义问题

指针的定义和变量一样,与ANSI C的差异是由复杂的存储器引发,主要是指针指向的是哪个存储器空间、哪个存储区域。见4.6节。

5)函数、中断服务函数的定义问题

在C51的函数定义中,增加了多个函数属性以解决单片机的要求。如中断函数、函数重入、 切换工作寄存器组等。见4.8节。

6.混合编程问题

一般PC机程序很少混合编程,但在单片机中常混合编程。见4.9节。

7.库函数的差异问题

由于PC机与单片机的差异,相对于ANSI C的库函数来说,C51的库函数减少了一部分(如显示、键盘、磁盘,文件系统等),增加了一部分(如循环移位、绝对地址访问等),修改了一部分(如I/O函数等)。

扩充关键字

col1col2col3col4
atbdatabitcode
dataidatainterruptpdata
reentrantsbitsfr
sfr16usingvolatilexdata

C51数据类型、长度和数值范围

注:1)bit、sbit到char类型转换

2)bit、sbit类型与char类型可直接作逻辑运算

C51 数据的储存

MCS-51单片机只有bit和unsigned char两种数据类型支持机器指令,而其它类型的数据都需要转换成bit或unsigned char型进行存储。

为了减少单片机的存储空间和提高运行速度,要尽可能地使用unsigned char型数据。

位变量的存储:

  • bit和sbit型位变量,直接存于RAM的位寻址空间,包括低128位和特殊功能寄存器位。

字符变量(char):

无论是unsigned char数据还是signed char数据,均为1个字节,能够被直接存储在RAM中,可以存储在0~0x7f区域,也可以存储在0x80~0xff区域,与变量的定义有关。

  • unsigned char数:可直接被MSC-51接受
  • signed char数据:用补码表示。需要额外的操作来测试、处理符号位,使用的是两种库函数,代码量大,运算速度降低。

整型变量(int)长整型变量(long):

长整型变量(long)为4个字节 不管是unsigned int数据还是signed int数据,均为2个字节,其存储方法是高位字节保存在低地址(在前面),低位字节保存在高地址(在后面) 。

浮点型:

占用4个字节

C51变量的存储类型

一、动态存储

动态(存储)变量:用auto定义的为动态变量,也叫自动变量。

作用范围:在定义它的函数内或复合语句内部

当定义它的函数或复合语句执行时,C51才为变量分配存储空间,结束时所占用的存储空间释放。

定义变量时,auto可以省略,或者说如果省略了存储类型项,则认为是动态变量。动态变量一般分配使用寄存器或堆栈。

二、静态存储

静态(存储)变量:用static定义的为静态变量。分为内部静态和外部静态变量。

内部静态变量:在函数体内定义的为内部静态变量。 在函数内可以任意使用和修改,函数运行结束后会一直存在,但在函数外不可见,即在函数体外得到保护。

外部静态变量:在函数体外部定义的为外部静态变量。在定义的文件内可以任意使用和修改,外部静态变量会一直存在,但在文件外不可见,即在文件外得到保护。

三、外部存储

外部(存储)变量:用extern声明的变量为外部变量,是在其它文件定义过的全局变量。 用extern声明后,便可以在所声明的文件中使用。

需要注意的是:在定义变量时,即便是全局变量,也不能使用extern修饰。

四、寄存器存储

寄存器(存储)变量:用register定义的变量为寄存器变量。

寄存器变量存放在CPU的寄存器中,这种变量处理速度快,但数目少。

C51中的寄存器变量:C51的编译器在编译时,能够自动识别程序中使用频率高的变量,并将其安排为寄存器变量,用户不用专门声明。

C51存储区属性与存储空间的对应关系

C51变量的存储模式

存储模式:如果在定义变量时缺省了存储区属性,则编译器会自动选择默认的存储区域,也就是存储模式。

变量的存储模式决定于程序(或函数)的编译模式。

编译模式分为三种:小模式(small)、紧凑模式(compact)和大模式(large)。编译模式由编译控制命令决定。

存储模式(编译模式)决定了变量的默认存储区域和参数的传递方法。

small模式

在small模式下,变量的默认存储区域是“data”、“idata”,即未指出存储区域的变量保存到片内数据存储器中,并且堆栈也安排在该区域中。

small模式的特点:存储容量小,但速度快。

在small模式下参数的传递:通过寄存器、堆栈或片内数据存储区完成的。

compact模式

  • 在compact模式下,变量的默认存储区域是“pdata”,即未指出存储区域的变量保存到片外数据存储器的一页中,最大变量数为256字节,并且堆栈也安排在该区域中。

  • compact模式的特点:是存储容量较small模式大,速度较small模式稍慢,但比large模式要快。

  • 在compact模式下参数的传递:通过片外数据区的一个固定页完成的。

large模式

  • 在large模式下,变量的默认存储区域是“xdata”,即未指出存储区域的变量保存到片外数据存储器,最大变量数可达64KB,并且堆栈也安排在该区域中。

  • large模式的特点:存储容量大,速度慢。

  • large模式下参数的传递方式:参数的传递也是通过片外数据存储器完成的。

tips:

C51支持混合模式:即可以对函数设置编译模式,所以在large模式下,可以对某些函数设置为compact模式或small模式,从而提高运行速度。

默认编译模式:如果文件或函数未指明编译模式,则编译器按small模式处理。

编译模式控制命令: “#pragma small(或compact、large)”应放在文件的开始。

设备变量的概念

C语言的输入/输出,都是通过定义在I/O口的变量(字符型、位型)实现的。通过这些变量,将设备的数据、状态传递给单片机,单片机对数据、状态信息进行分析,再对设备做出相应控制。

这样的变量与设备相关联,为设备型变量,与一般数据型变量有很大的区别,一般数据型变量访问的是存储器,不会对外部设备产生影响

在设备型变量中,以三总线方式连接的设备型变量最复杂,初学者对其定义及操作过程往往感到不好理解而出错。为了加强对这类变量的理解,我们将其称为“设备变量”。因此,“设备变量”的定义为“以三总线方式连接的设备对应的变量为设备变量”。