山科大《单片机的C语言程序设计与运用第2版》期末复习题和答案1文档格式.docx
《山科大《单片机的C语言程序设计与运用第2版》期末复习题和答案1文档格式.docx》由会员分享,可在线阅读,更多相关《山科大《单片机的C语言程序设计与运用第2版》期末复习题和答案1文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
(A)void(B)string(C)char(D)float
5.在8x51的输入/输出端口里,哪个输入/输出端口执行在输出功能时没有内部上拉电阻(A)
(A)P0(B)P1(C)P2(D)P3
6.在KeilC的程序里,若要指定P0口的bit3,如何编写?
(A)P0.3(B)Port0.3(C)P0^3(D)Port^3
7.在8x51里,若要扩展外部存储器时,数据总线连接哪个输入/输出端口?
(A)
8.点亮一般的LED所耗的电流约为多少?
(D)
(A)1~5uA(B)10~20uA(C)1~5mA(D)10~20mA
9.在8x51的程序里,若要将个输入/输出端口设置成输入功能,应如何处理?
(A)先输出高电平到该输入/输出端口(B)先输出低电平到该输入/输出端口
(C)先读取该输入/输出端口的状态(D)先保存该输入/输出端口的状态
10.根据实验统计,当操作开关时,其不稳定关态大约持续多久?
(A)1~5ms(B)10~20ms(C)100~150ms(D)150~250us
11.在KeilC里,判读开关状态时,使用if_elseif语句与使用switch语句有何差异?
(A)if-elseif语句较快(B)if-elseif语句有优先级(C)switch语句可判读较多开关状态(D)switch语句有优先级
12.对于低电平动作(低电平触发)的开关而言,下列哪个不是在输入口上连接一个上拉电阻VCC的目的?
(A)提供足够的驱动电流(B)防止确定状态(C)保持输入高电平
(D)防止噪声干扰
13.中断功能具有什么好处?
(A)让程序更复杂(B)让程序执行速度更快(C)让程序更有效率(D)
以上皆非
14.8x51的IP缓存器的功能为何?
(A)设置中断优先级(B)启用中断功能(C)设置中断触发信号(D)定义CPU的网址
15.在KeilC里,中断子程序与函数有何不同?
(A)中断子程序不必声明(B)函数不必声明(C)中断子程序必须有形式参数(D)中断子程序一定会有返回值
16.若要同时启用INT0及INT1中断功能,则应如何设置?
(A)TCON=0x81(B)IE=0x85(C)IP=0x83(D)IE=0x03
17.若要提高INT1的优先级,则应如何设置?
(A)IP=0x01(B)IE=0x01(C)IP=0x04(D)IE=0x04
18.在8x51的Timer里,若使用Mode0,其最大计数值为多少个机器周期?
(A)65636(B)8192(C)1024(D)256
19.12MHz的8x51系统里,哪一种方式一次可定时5ms?
(A)Mode0及Mode1(B)Mode1及Mode2(C)Mode2及Mode3(D)Mode3及Mode1
20.8x51的定时器,在下列哪种方式下具有自动加载功能?
(A)Mode0(B)Mode1(C)Mode2(D)Mode3
21.若将Timer0设置为外部启动,则可由哪个引脚启动?
(A)P3.2(B)P3.3(C)P3.4(D)P3.5
22.下列哪个IC具有将串行数据转换成并行数据的功能?
(A)74138(B)74164(C)74165(D)74168
23.在同一时刻,只能接收或发送信号者称为什么?
(A)半双工(B)全双工(C)半单工(D)单工
24‘在8x51的串行口里,在哪一种方式下,可利用Timer1产生波特率?
(A)Mode0(B)Mode1(C)Mode2(D)Mode3
25.在8x51里,若通过串行端口传出数据,则只要将数据放入哪个寄存器,CPU就会自动将它会传出?
(A)SMOD(B)SBUF(C)PCON(D)RBUF
26.在8x51里,若CPU完成串行端口数据的接收将会如何?
(A)将TI标志变为0(B)将RI标志为0(C)将TI标志变为了1(D)将RI标志变为1
27.若要设置8x51串行端口方式,可在哪个寄存器中设置?
(A)SMOD(B)SCON(C)PCON(D)TCON
28.在共阳极8*8LED点阵里,其阳极如何连接?
(A)各行阳极连接到行引脚(B)各列阳极连接到列引脚(C)各行阳极连接到列引脚(D)各列阳极连接到行引脚
29.在共阳极8*8点阵里,其阴极如何连接?
(A)各行阴极连接到行引脚(B)各列阴极连接到列引脚(C)各行阴极连接到列引脚(D)各列阴极连接到行引脚
30.通常8*8LED点阵的驱动方式是什么?
(A)直接驱动(B)扫描驱动(C)双向驱动(D)以上皆非
31.若要对LCM下指令,则应如保设置?
(A)RS=0,R/~W=0(B)RS=1,R/~W=0(C)RS=1,R/~W=1
(D)RS=0,R/~W=1
32.若要在LCM中显示些字符,则需把所要显示的字符放入何处?
(A)CGRAM(B)DDRAM(C)IRAM(D)GDRAM
33.若要将数据写入LCM,则应如何设置?
(A)RS=0,R/~W=0(B)RS=1,R/~W=0(C)RS=1,R/~W=1(D)RS=0,R/~w=1
341.利用下列(
D
)关键字可以改变工作寄存器组
A、interrupt B、sfr
C、while
D、using
35.C51中一般指针变量占用(
C
)字节存储。
A、一个
B、两个
C、三个
D、四个
36.使用宏来访问绝对地址时,一般需包含的库文件是( B )
A、reg51.h
B、absacc.h
C、intrins.h
D、startup.h
37.执行#definePA8255
XBYTE[0x3FFC];
PA8255=0x7e;
后存储单元0x3FFC的值是(A
)
A、Ox7e
B、8255H
C、未定
D、7e
38.设有inta[]={10,11,12},*p=&
a[0];
则执行完*p++;
*p+=1;
后a[0],a[1],a[2]的值依次是(C)
A、10,11,12B、11,12,12C、10,12,12D、11,11,12
A、1B、2C、3D、4
三、判断题:
(每小题1分,共10分。
正确的在括号内打“√”,错误的打“×
”。
判对得分,不判、判错均不得分。
1.若一个函数的返回类型为void,则表示其没有返回值。
(√
)
2.特殊功能寄存器的名字,在C51程序中,全部大写。
(√ )
3.“sfr”后面的地址可以用带有运算的表达式来表示。
(
×
4.#include
<
reg51.h>
与#include
“reg51.h”是等价的。
5.sbit不可以用于定义内部RAM的可位寻址区,只能用在可位寻址的SFR上。
(×
)
6.Continue和break都可用来实现循环体的中止。
7.所有定义在主函数之前的函数无需进行声明。
8.inti,*p=&
i;
是正确的C说明。
9.7&
3+12的值是15。
10.一个函数利用return不可能同时返回多个值。
四、问答题
1.简述C51语言和汇编语言的比较
使用C51语言进行嵌入式系统的开发,有着汇编语言所不可比拟的优势:
①编程调试灵活方便;
②生成的代码编译效率高;
③模块化开发;
④可移植性好;
⑤便于项目的维护;
2.简述单片机的C语言和标准C的比较
答:
单片机的C语言和标准C的比较主要有以下几点不同:
①C51中定义的库函数和标准的C语言定义的库函数不同;
②C51中的数据类型和标准C的数据类型也有一定的区别;
③C51变量的存储模式与标准C中变量的存储模式不一样;
④C51与标准C的输入/输出处理不一样;
⑤C51与标准C语言在函数使用方面有一定的区别。
3.简述单片机的C语言的特点
单片机的C语言的特点主要体现在以下几个方面:
①无需了解机器硬件及其指令系统,只需初步了解MCS-51的存储器结构;
②C51能方便的管理内部寄存器的分配、不同存储器的寻址和数据类型等细节问题,但对硬件控制有限;
而汇编语言可以完全控制硬件资源;
③C51在小应用程序中,产生的代码量大,执行速度慢;
但在较大的程序中代码效率高;
④C51程序由若干函数组成,具有良好的模块化结构,便于改进和扩充;
C51程序具有良好的可读性和可维护性;
而汇编语言在大应用程序开发中,开发难度增加,可读性差;
C51有丰富的库函数,可大大减少用户的编程量,显著缩短编程与调试时间,大大提高软件开发效率;
⑦使用汇编语言编制的程序,当机型改变时,无法直接移植使用,而C语言程序是面向用户的程序设计语言,能在不同机型的机器上运行,可移植性好。
4.简述使用KeilC51开发工具开发软件的流程
使用KeilSoftware工具时,用户的项目开发流程和其它软件开发项目的流程极其相似,主要包括以下几个步骤:
① 创建一个项目,从器件库中选择目标器件并配置工具软件的设置;
② 用C语言或汇编语言创建源程序;
③ 用项目管理器生成用户的应用;
④ 修改源程序中的错误;
⑤ 调试链接后的应用。
一个完整的8051工具集的框图可以很好地表述此开发流程,如图1-1所示。
1.哪些变量类型是51单片机直接支持的?
C51编译器支持的数据类型有:
位型(bit)、无符号字符型(unsignedchar)、有符号字符型(signedchar)、无符号整型(unsignedint)、有符号整型(signedint)、无符号长整型(unsignedlong)、有符号长整型(signedlong)、浮点型(float)和指针型等。
C51编译器支持的数据类型、长度和值域如表2-1所示。
表2-1C51的数据类型
数据类型
长度/bit
长度/byte
值域
bit
1
0,1
unsignedchar
8
0~255
signedchar
-128~127
unsignedint
16
2
0~65535
signedint
-32768~32767
unsignedlong
32
4
0~4294967295
signedlong
-2147483648~2147483647
float
±
1.176E-38~±
3.40E+38(6位数字)
double
64
3.40E+38(10位数字)
一般指针
24
3
存储空间0~65535
2.简述C51的数据存储类型
我们都知道,8051单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。
8051单片机内部的数据存储区是可读写的,8051派生系列最多可有256字节的内部数据存储区,其中低128字节可直接寻址,高128字节(从0x80到0xFF)只能间接寻址,从20H开始的16字节可位寻址。
内部数据区可分为3个不同的存储类型:
data、idata和bdata。
外部数据区也是可读写的,访问外部数据区比访问内部数据区慢,因为外部数据区是通过数据指针加载地址来间接访问的。
C51提供两种不同的存储类型xdata和pdata访问外部数据。
程序存储区是只能读不能写。
程序存储区可能在8051单片机内部或者在外部或者内外都有,这由8051单片机的硬件决定。
C51提供了code存储类型来访问程序存储区。
每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部存储器中,而把较少使用的变量放在外部存储器中。
各存储区的简单描述如表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存储类型及其大小和值域
存储类型
data
idata
pdata
code
xdata
3.简述C51对51单片机特殊功能寄存器的定义方法
MCS-51通过其特殊功能寄存器(SFR)实现对其内部主要资源的控制。
MCS-51单片机有21个SFR,有的单片机还有更多的SFR,它们分布在片内RAM的高128字节中,其地址能够被8整除的SFR一般可以进行位寻址。
关于MCS-51单片机的特殊功能寄存器参看附录A。
对SFR只能用直接寻址方式访问。
C51允许通过使用关键字sfr、sbit或直接引用编译器提供的头文件来实现对SFR的访问。
(1)使用关键字定义sfr
为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法。
这种定义方法与标准的C语言不兼容,只适用于对8051系列单片机进行C编程。
这种定义的方法是引入关键字“sfr”,语法如下:
sfr特殊功能寄存器名字=特殊功能寄存器地址;
如:
sfrSCON=0x98;
/*串口控制寄存器地址98H*/
sfrTMOD=0X89;
/*定时器/计数器方式控制寄存器地址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的数。
第二种方法:
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<
absacc.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对51单片机位变量的定义方法
除了通常的C数据类型外,C51编译器支持bit数据类型。
采用关键字“bit”进行定义。
bitdirection_bit;
/*将direction_bit定义为位变量*/
bitlock_pointer;
/*将lock_pointer定义为位变量*/
bitdisplay_invers;
/*将display_invers定义为位变量*/
6.C51和TurboC的数据类型和存储类型有哪些异同点?
C51增加了位变量,取消了布尔变量。
7.C51的data、bdata、idata有什么区别?
data、bdata、idata是表明数据的存储类型,
data是指片内RAM的低128字节,可在一个周期内直接寻址;
bdata是指片内RAM的位寻址区,16字节;
idata是指片内RAM的256字节,必须采用间接寻址。
8.C51中的中断函数和一般的函数有什么不同?
C51编译器允许用C51创建中断服务函数,中断函数是由中断系统自动调用的。
中断函数的定义格式为:
函数类型函数名interruptnusingn
其中:
interrupt和using为关键字;
interrupt后面的n为中断源的编号,即中断号;
using后面的n所选择的寄存器组,取值范围为0~3。
定义中断函数时,using是一个选项,可以省略不用。
如果不用using选项,则由编译器选择一个寄存器组作为绝对寄存器组。
8051的中断过程通过使用interrupt关键字和中断号(0~31)来实现,中断号告诉编译器中断函数的入口地址。
9.C51采用什么形式对绝对地址进行访问?
绝对地址的访问包括片内RAM、片外RAM及I/O的访问。
C51提供了两种比较常用的访问绝对地址的方法。
#include<
#definePORTAXBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/
#defineNRAMDBYTE[0x40]/*将NRAM定义为片内RAM,地址为40H,长度为8位*/
其中,存储器类型为C51能识别的数据类型,如省略则按存储器模式规定的默认存储器类型确定变