一、填空1.KeiLC51软件中,工程文件的扩展名是___UV2_______,编译连接后生成可烧写的文件扩展名是___HEX_________。2.C51支持的指针有一般指针和存储器指针。3.C51中,没有专门的循环语句,我们可以用函数____crol_____完成一个字节的循环左移,用___irol____完成二个字节的循环左移。4.C51的基本数据类型有位型、字符型、整型、长整型、浮点型、双精度浮点型。5.C51的存储类型有data、bdata、idata、pdata、xdata、code。6.C51的存储模式有SMALL、COMPACT和LARGE。7.C51程序与其他语言程序一样,程序结构也分为顺序结构、选择结构、循环结构三种。8.C51中int型变量的长度为4位,其值域为0~65535。9.C51中关键字sfr的作用定义8位特殊功能寄存器,sbit的作用定义可位寻址对象,用于位寻址,从位寻址字节中定义位变量。10.函数定义由函数首部和函数体两部分组成。11.C51中“!”运算符的作用是逻辑运算结果值取反。12.若函数无返回值,用void关键字指定。13.若局部变量未初始化,其初值为0。二、单项选择题:1.89S51的内部程序存储器与数据存储器容量各为多少?(C)(A)64KB、128B(B)4KB、64KB(C)4KB、128B(D)8KB、256B2.在8x51芯片里,哪个引脚用于控制使用内部程序存储器还是外部程序存储器?(B)P17(A)XTAL1(B)/EA(C)/PSEN(D)ALE3.下列哪个不是KeilC的预处理命令?(C)(A)#include(B)#define(C)#exit(D)#if4.下列哪个不是KeilC的数据类型?(B)(A)void(B)string(C)char(D)float5.在KeilC的程序里,若要指定P0口的bit3,如何编写?(C)(A)P0.3(B)Port0.3(C)P0^3(D)Port^36.在8x51里,若要扩展外部存储器时,数据总线连接哪个输入/输出端口?(A)(A)P0(B)P1(C)P2(D)P37.在KeilC里,判读开关状态时,使用if_elseif语句与使用switch语句有何差异?(B)(A)if-elseif语句较快(B)if-elseif语句有优先级(C)switch语句可判读较多开关状态(D)switch语句有优先级8.在KeilC里,中断子程序与函数有何不同?(A)(A)中断子程序不必声明(B)函数不必声明(C)中断子程序必须有形式参数(D)中断子程序一定会有返回值9.利用下列(A)关键字可以改变工作寄存器组A、interruptB、sfrC、whileD、using10.C51中一般指针变量占用(C)字节存储。A、一个B、两个C、三个D、四个211.使用宏来访问绝对地址时,一般需包含的库文件是(B)A、reg51.hB、absacc.hC、intrins.hD、startup.h12.执行#definePA8255XBYTE[0x3FFC];PA8255=0x7e;后存储单元0x3FFC的值是(A)A、Ox7eB、8255HC、未定D、7e三、判断题:(每小题1分,共10分。正确的在括号内打“√”,错误的打“×”。判对得分,不判、判错均不得分。)1.若一个函数的返回类型为void,则表示其没有返回值。(√)2.特殊功能寄存器的名字,在C51程序中,全部大写。(√)3.“sfr”后面的地址可以用带有运算的表达式来表示。(×)4.#includereg51.h与#include“reg51.h”是等价的。(√)5.sbit不可以用于定义内部RAM的可位寻址区,只能用在可位寻址的SFR上。(×)6.一个函数利用return不可能同时返回多个值。(√)四、问答题1.哪些变量类型是51单片机直接支持的?答:C51编译器支持的数据类型有:位型(bit)、无符号字符型(unsignedchar)、有符号字符型(signedchar)、无符号整型(unsignedint)、有符号整型(signedint)、无符号长整型(unsignedlong)、有符号长整型(signedlong)、浮点型(float)和指针型等。2.简述C51的数据存储类型答:我们都知道,8051单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。8051单片机内部的数据存储区是可读写的,8051派生系列最多可有256字节的内部数据存储区,其中低128字节可直接寻址,高128字节(从0x80到0xFF)只能间接寻址,从20H开始的16字节可位寻址。内部数据区可分为3个不同的存储类型:data、idata和bdata。外部数据区也是可读写的,访问外部数据区比访问内部数据区慢,因为外部数据区是通过数据指针加载地址来间接访问的。C51提供两种不同的存储类型xdata和pdata访问外部数据。程序存储区是只能读不能写。程序存储区可能在8051单片机内部或者在外部或者内外都有,这由8051单片机的硬件决定。C51提供了code存储类型来访问程序存储区。每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部存储器中,而把较少使用的变量3放在外部存储器中。各存储区的简单描述如表2-2所示。表2-2C51存储类型与8051存储空间的对应关系存储区描述DATA片内RAM的低128字节,可在一个周期内直接寻址BDATA片内RAM的位寻址区,16字节IDATA片内RAM的256字节,必须采用间接寻址XDATA外部数据存储区,使用DPTR间接寻址PDATA外部存储区的256个字节,通过P0口的地址对其寻址。使用MOVX@Ri,需要两个指令周期CODE程序存储区,使用DPTR寻址。以上介绍的是C51的数据存储类型,C51存储类型及其大小和值域如表2-3所示。表2-3C51存储类型及其大小和值域存储类型长度/bit长度/byte值域data810~255idata810~255pdata810~255code1620~65535xdata1620~655353.简述C51对51单片机特殊功能寄存器的定义方法答:MCS-51通过其特殊功能寄存器(SFR)实现对其内部主要资源的控制。MCS-51单片机有21个SFR,有的单片机还有更多的SFR,它们分布在片内RAM的高128字节中,其地址能够被8整除的SFR一般可以进行位寻址。关于MCS-51单片机的特殊功能寄存器参看附录A。对SFR只能用直接寻址方式访问。C51允许通过使用关键字sfr、sbit或直接引用编译器提供的头文件来实现对SFR的访问。4.简述C51对51单片机片内I/O口和外部扩展的I/O口的定义方法答:C51对51单片机片内I/O口的定义方法是将片内I/O口看成SFR。C51对51单片机片外I/O的访问有两种比较常用的访问方法:4(1)绝对宏C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#includeabsacc.h”即可使用其中声明的宏来访问绝对地址,包括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中的中断函数和一般的函数有什么不同?答:C51编译器允许用C51创建中断服务函数,中断函数是由中断系统自动调用的。中断函数的定义格式为:函数类型函数名interruptnusingn其中:interrupt和using为关键字;interrupt后面的n为中断源的编号,即中断号;using后面的n所选择的寄存器组,取值范围为0~3。定义中断函数时,using是一个选项,可以省略不用。如果不用using选项,则由编译器选择一个寄存器组作为绝对寄存器组。8051的中断过程通过使用interrupt关键字和中断号(0~31)来实现,中断号告诉编译器中断函数的入口地址.6.C51采用什么形式对绝对地址进行访问?答:绝对地址的访问包括片内RAM、片外RAM及I/O的访问。C51提供了两种比较常用5的访问绝对地址的方法。(1)绝对宏C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。在程序中,用“#includeabsacc.h”即可使用其中声明的宏来访问绝对地址,包括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区寻址;如:#includeabsacc.h#definePORTAXBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/#defineNRAMDBYTE[0x40]/*将NRAM定义为片内RAM,地址为40H,长度为8位*/(2)_at_关键字可以使用关键字_at_对指定的存储器空间的绝对地址进行访问,一般格式如下:[存储器类型]数据类型说明符变量名_at_地址常数;其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变量的存储器区域;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用_at_定义的变量必须为全局变量。7.按照给定的数据类型和存储类型,写出下列变量的说明形式(1)在data区定义字符变量val1(2)在idata区定义整型变量val2(3)在xdata区定义无符号字符型数组val3[4]。(4)在xdata区定义一个指向char类型的指针px。(5)定义可位寻址变量flag。(6)定义特殊功能寄存器变量P3。6答:(1)在data区定义字符变量val1chardatavall;(2)在idata区定义整型变量val2intidataval2;(3)在xdata区定义无符号字符型数组val3[4]。unsignedxdataval3[4];(4)在xdata区定义一个指向char类型的指针px。charxdata*px;(5)定义可位寻址变量flag。bitflag;(6)定义特殊功能寄存器变量P3。SfrP3=0xB0;五、程序设计题设在存储区,有10个数据:99,15,30,13,27,28,7,0,33,67。编写程序,将其按照从大到小的次序排列。并按次序在数码管上显示。为了简化硬件电路,选用译码、显示一体化显示模块。仿真电路如图3-8所示。78.在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?答:(1)确定T/C的工作方式——编程TMOD寄存器;(2)计算T/C中的计数初值,并装载到TH