最全单片机参考答案(姜志海) 下载本文

第2章 C51语言程序设计基础

1.哪些变量类型是51单片机直接支持的?

答:C51编译器支持的数据类型有:位型(bit)、无符号字符型(unsigned char)、有符号字符型(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点型(float)和指针型等。

C51编译器支持的数据类型、长度和值域如表2-1所示。

表2-1 C51的数据类型

数据类型 bit unsigned char signed char unsigned int signed int unsigned long signed long float double 一般指针 长度/bit 1 8 8 16 16 32 32 32 64 24 长度/byte 1 1 2 2 4 4 4 8 3 值域 0,1 0~255 -128~127 0~65 535 -32 768~32 767 0~4 294 967 295 -2 147 483 648~2 147483 647 ±1.176E-38~±3.40E+38(6位数字) ±1.176E-38~±3.40E+38(10位数字) 存储空间 0~65 535

2.简述C51的数据存储类型

答:我们都知道,8051单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。8051单片机内部的数据存储区是可读写的,8051派生系列最多可有256字节的内部数据存储区,其中低128字节可直接寻址,高128字节(从0x80到0xFF)只能间接寻址,从20H开始的16字节可位寻址。内部数据区可分为3个不同的存储类型:data、idata和bdata。

外部数据区也是可读写的,访问外部数据区比访问内部数据区慢,因为外部数据区是通过数据

5

指针加载地址来间接访问的。C51提供两种不同的存储类型xdata和pdata访问外部数据。

程序存储区是只能读不能写。程序存储区可能在8051单片机内部或者在外部或者内外都有,这由8051单片机的硬件决定。C51提供了code存储类型来访问程序存储区。

每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部存储器中,而把较少使用的变量放在外部存储器中。各存储区的简单描述如表2-2所示。

表2-2 C51存储类型与8051存储空间的对应关系

存储区 DATA BDATA IDATA XDATA 描述 片内RAM的低128字节,可在一个周期内直接寻址 片内RAM的位寻址区,16字节 片内RAM的256字节,必须采用间接寻址 外部数据存储区,使用DPTR间接寻址 外部存储区的256个字节,通过P0口的地址对其寻址。使用MOVX @Ri,需要PDATA 两个指令周期 CODE 程序存储区,使用DPTR寻址。

以上介绍的是C51的数据存储类型,C51存储类型及其大小和值域如表2-3所示。

表2-3 C51存储类型及其大小和值域

存储类型 data idata pdata code xdata

长度/bit 8 8 8 16 16 长度/byte 1 1 1 2 2 值域 0~255 0~255 0~255 0~65 535 0~65 535 3.简述C51对51单片机特殊功能寄存器的定义方法

答:MCS-51通过其特殊功能寄存器(SFR)实现对其内部主要资源的控制。MCS-51单片机有

6

21个SFR,有的单片机还有更多的SFR,它们分布在片内RAM的高128字节中,其地址能够被8整除的SFR一般可以进行位寻址。关于MCS-51单片机的特殊功能寄存器参看附录A。对SFR只能用直接寻址方式访问。C51允许通过使用关键字sfr、sbit或直接引用编译器提供的头文件来实现对SFR的访问。

(1)使用关键字定义sfr

为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法。这种定义方法与标准的C语言不兼容,只适用于对8051系列单片机进行C编程。这种定义的方法是引入关键字“sfr”,语法如下:

sfr 特殊功能寄存器名字 = 特殊功能寄存器地址; 如:

sfr SCON=0x98; sfr TMOD=0X89;

/*串口控制寄存器地址98H*/

/*定时器/计数器方式控制寄存器地址89H*/

(2)通过头文件访问SFR

8051系列单片机的寄存器数量与类型是极不相同的,因此对单片机特殊功能寄存器的访问可以通过对头文件的访问来进行。

为了用户处理方便,C51编译器把MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中。当用户要使用时,只需要在使用之前用一条预处理命令“#include ”把这个头文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名称了。用户可以通过文本编辑器对头文件进行增减。 (3)SFR中位定义

在8051单片机的应用问题中,经常需要单独访问SFR中的位,C51的扩充功能使之成为可能,使用关键字“sbit”可以访问位寻址对象。特殊位(sbit)的定义,像SFR一样不与标准C兼容。

与SFR定义一样,用关键字“sbit”定义某些特殊位,并接受任何符号名,“=”号后将绝对地址赋给变量名。这种地址分配有三种方法:

第一种方法:

sbit 位名=特殊功能寄存器名^位置;

当特殊功能寄存器的地址为字节(8位)时,可使用这种方法。特殊功能寄存器名必须是已定义的SFR的名字。“^”后的“位置”语句定义了基地址上的特殊位的位置。该位置必须是0~7的数。如:

7

第二种方法:

sbit 位名=字节地址^位置;

这种方法是以一个整常数为基地址,该值必须在0x80~0xFF之间,并能被8整除,确定位置的方法同上。

第三种方法: sbit 位名=位地址;

这种方法将位的绝对地址赋给变量,地址必须在0x80~0xFF之间。

4.简述C51对51单片机片内I/O口和外部扩展的I/O口的定义方法

答:

C51对51单片机片内I/O口的定义方法是将片内I/O口看成SFR。 C51对51单片机片外I/O的访问有两种比较常用的访问方法: (1)绝对宏

C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#include”即可使用其中声明的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD,具体使用方法参考absacc.h头文件。其中:

CBYTE以字节形式对code区寻址;CWORD以字形式对code区寻址; DBYTE以字节形式对data区寻址;DWORD以字形式对data区寻址; XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址; PBYTE以字节形式对pdata区寻址;PWORD以字形式对pdata区寻址; (2)_at_关键字

可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下: [存储器类型] 数据类型说明符 变量名 _at_地址常数;

其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。

5.简述C51对51单片机位变量的定义方法

8