单片机第34章习题答案.docx
《单片机第34章习题答案.docx》由会员分享,可在线阅读,更多相关《单片机第34章习题答案.docx(12页珍藏版)》请在冰豆网上搜索。
单片机第34章习题答案
第3、4章习题
一、选择题
1.51单片机中,PC是一个16位的计数器指针,它的值永远指向下一条要执行的指令地址。
它决定程序执行的顺序和方向,寻址范围可达64KB。
A、此叙述大部分错误 B、此叙述完全正确 C、此叙述大部分正确 D、 很难判断
2.判断下列说法正确的是
A、89c51共有21个特殊功能寄存器,它们中一部分的位是可以进行位寻址的。
B、内部RAM的位寻址区,只能供位寻址使用,而不能供字节寻址使用。
C、程序指针PC也可以为用户编程时直接使用,可存入16位的数据。
D、以上说法都不正确。
3.C51中,chardatavar1;为。
(A)在内部RAM定义一个带符号的一字节变量;
(B)在可位寻址的片内RAM定义了一个位变量;
(C)在内部RAM(含52子系列的高128字节)定义浮点变量;
(D)在片外RAM低256字节内定义了一个整型变量;
(E)在内部RAM定义一个带符号的一字节的数组。
4.C51中,bitbdataflags;为。
(A)在内部RAM定义一个带符号的一字节变量;
(B)在可位寻址的片内RAM定义了一个位变量;
(C)在内部RAM(含52子系列的高128字节)定义浮点变量;
(D)在片外RAM低256字节内定义了一个整型变量;
(E)在内部RAM定义一个带符号的一字节的数组。
5.C51中,floatidatax;为。
(A)在内部RAM定义一个带符号的一字节变量;
(B)在可位寻址的片内RAM定义了一个位变量;
(C)在内部RAM(含52子系列的高128字节)定义了一个浮点变量;
(D)在片外RAM低256字节内定义了一个整型变量;
(E)在内部RAM定义一个带符号的一字节的数组。
6.C51中,unsignedintpdatavar2;为。
(A)在内部RAM定义一个带符号的一字节变量;
(B)在可位寻址的片内RAM定义了一个位变量;
(C)在内部RAM(含52子系列的高128字节)定义了一个无符号浮点变量;
(D)在片外RAM0-255地址内定义了一个16位的无符号整型变量;
(E)在内部RAM定义一个带符号的一字节的数组。
7.C51中,unsignedcharvector[3];为。
(A)在内部RAM定义一个带符号的一字节变量;
(B)在可位寻址的片内RAM定义了一个位变量;
(C)在内部RAM(含52子系列的高128字节)定义了3个浮点变量;
(D)在片外RAM低256字节内定义了一个有符号的整型变量;
(E)在内部RAM定义一个无符号的每个元素为一字节的有三元素的数组。
8.若定义了charx;charX;则x与X完全是两个的变量。
(A)不同(B)相同(C)外部(D)无符号
9.定义了charthird[]={“HELLO”};则third是一个元素的字符型数组。
(A)4(B)5(C)6(D)7
10.定义了charsecond[5]={‘H’,’E’,’L’,’L’,’O’};则second是一个元素的字符型数组。
(A)4(B)5(C)6(D)7
11.以下能正确定义一维数组的选项是()。
A、inta[5]={0,1,2,3,4,5};B、chara[]={0,1,2,3,4,5};
C、chara={'A','B','C'};D、inta[5]="0123";
12.C51中,以下叙述中错误的是()
A、数组一般会存放在外部RAM中;
B、指针中,数组名代表的是数组所占存储区的首地址;
C、程序运行时,数组元素的下标超出所定义的下标范围时,单片机应用系统将给出“下标越界”的出错信息;
D、可以通过赋初值的方式C51编译器确定数组元素的个数。
13.下列计算机语言中,CPU能直接识别的是()。
A、自然语言B、高级语言C、汇编语言D、机器语言
二、判断正误╳√
1、c51中若一个函数的返回类型为void,则表示其没有返回值。
(√)
2、51单片机定时器与计数器的工作原理均是对输入脉冲进行计数。
(√)
3、51单片机中已有的SFR中凡是能被8整除的地址,都具有位寻址能力。
(√)
4、MCS-51单片机的外部数据存储器用来存放程序和常数的。
(╳ )
5、MCS-51单片机的程序存储器是用来存放程序和常数的。
(√ )
6、51单片机中所有串口中断标志都要由硬件清0。
(╳)
7、特殊功能寄存器的名字,在C51程序中,需全部大写。
(√)
8、sbitLED1=p3^3;这条c51语句是正确的。
(╳ )
9、#include 与#include “reg51.h”基本功能是等价的。
(√)
10、sbit不可以用于定义内部RAM的可位寻址区,只能用在可位寻址的SFR上。
(√)
11、在对某一函数进行多次调用时,系统会对相应的局域变量重新分配存储单元。
(╳)
12、在C语言的复合语句中,只能包含可执行语句。
(╳)
13、自动变量属于局部变量。
(╳)
14、c51中定义为char的变量一定是英文字母如a、b、c、d等。
(╳)
15、所有定义在主函数之前的函数无需进行声明。
(√)
16、汇编语言中ORG表示它后面程序的起始地址。
(√)
17、MCS-51的相对转移指令最大负跳距是127B。
(╳)
18、若TMOD中的GATE=1,则需要两个信号控制定时器的的启停。
(√)
19、MCS-51应用系统可以没有复位电路。
(╳)
20、全局变量的有效范围是定义变量的位置开始到本文件结束。
(√)
21、ADC0832采用的是IIC总线方式。
(╳)
22、DAC0832是一种AD转换芯片。
(╳)
23、P1作为通用IO口使用时必须加上拉电阻。
(√)
24、若一个函数的返回类型为unsignedchar,则表示其没有返回值。
(╳)
25、51单片机中定时器与计数器其基本的工作原理相同,只是计数脉冲的来源不同。
(√)
26、ADC0809是8位逐次逼近式模/数转换器。
(√)
27、MCS-51的程序存储器是用来存放程序的。
(√)
28、MCS-51的特殊功能寄存器分布在60H~80H地址范围内。
(╳)
29、51单片机片外RAM与并口外部设备统一编址时,使用不同的输入/输出指令。
(╳)
30、使用89c51且EA=1时,仍可外扩程序存储器。
(╳)
三、填空题
1.数据指针DPTR在用汇编语言编程时可以看作是一个 16位的寄存器。
2.完成的堆栈操作的原则是先进后出。
3.在基址加变址寻址方式中,以累加器A作变址寄存器,以DPTR或PC作基址寄存器。
4.在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作数的地址。
5.在MCS-51中,PC和DPTR都用于提供地址,但PC只是为了访问程序存储器提供地址,而DPTR可为访问 数据和程序 存储器提供地址。
6.10%3;结果为:
1。
7.x=5;执行if(x==3){x=4;}后,x=5。
8.a=0x4b,执行a=a<<2后,a=0x2c;CY=0。
9.若a=0x4b;b=0xc8;则a||b的值为:
1。
10.若a=0x4b;b=0xc8;则a|b的值为:
0xcb。
11.若a=10,则!
a的值为0。
12.若a=10,b=20,则a&&b的值为1。
13.若a=10,b=20,则a||b的值为1。
14.若a=0,b=20,则a&&b的值为0。
15.a+=b;等价于a=a+b;
16.x*=a+b;等价于x=x*(a+b);
17.a&=b;等价于a=a&b;
18.若charx;则x=(char)0xb030;后,x的值为0x30。
19.设X=0x5AH,Y=0x36,则X|Y运算结果为_0x7e_;X与Y的“异或”运算为_0x6c___。
20.若定义了一个指针变量unsignedcharxdata*datayc;它表示:
指针变量yc被分配在片内RAM,指针指向一个无符号字符,该无符号字符存放于数据存储区。
四、阅读、编写简单程序
1.设(A)=0FH,(R0)=30H,内部RAM(30H)=0AH,(31H)=0BH,(32H)=0CH请写出在执行各条列指令后,所示单元的内容:
MOVA,@R0;(A)=0AH;
MOV@R0,32H;(30H)=0CH;
MOV32H,A;(32H)=0AH;
MOVR0,#31H;(R0)=31H;
MOVA,@R0;(A)=0BH;
答案:
2.用数据传输指令来完成下列要求的数据传送:
(1)外部RAM1000H单元的内容送内部RAM20H;
MOVR0,#1000H
MOVXA,@R0
MOV20H,A
(2)程序存储器ROM2000H单元的内容送到R1;
MOVDPTR,#2000H
MOVA,#0H
MOVA,@A+DPTR
MOVR1,A
(3)程序存储器2000H单元的内容送内部RAM20H;
MOVDPTR,#2000H
CLRA
MOVCA,@A+DPTR
MOV20H,A
(4)程序存储器2000H单元的内容送外部RAM30H;
MOVDPTR,#2000H
MOVDPTR,#30
MOVX@DPTR,A
(5)外部RAM2000H单元的内容送外部RAM1000H。
MOVDPTR,#2000H
CLRA
MOVCA,@A+DPTR
MOVDPTR,#1000H
MOVX@DPTR,A
答案:
3.请定义一个含year(unsignedint)、month(unsignedchar)、day(unsignedchar)的数据结构,并定义该结构的一个结果变量data1。
structdata
{
unsignedcharmonth;
unsignedcharday;
unsignedintyear;
}idatadata1;
4.若定义了一个结构变量data1如下:
请按2010年11月20日给data1赋值。
data1.year=2010;
data1.month=11;
data1.day=20;
5.如定义char*px;charx=11,y;并运行了px=&x;
请注释执行下列语句后的结果:
y=*px+5//把x的内容加5并赋给y,则y=16。
Y=++*px//px的内容加1后赋给y,则y=12。
//y=++*px;因px是x的地址,px的内容就是x;相当于y=++(*px);
//相当y=*px;px++;这时,y=11,但指针px随后+1。
6.判断下列关系表达式或逻辑表达式的运算结果(1或0)。
(1)10==9+1;答案:
1
(2)0&&0;答案:
0
(3)10&&8;答案:
1
(4)6||O;答案:
1
(5)!
(3+2);答案:
0
(6)设x=10,y=9,x>=88&&y<=x;答案:
0
7.设x=4,y=8,说明进行下列运算后,x,y和z的值分别是多少(用16进制表达)?
(1)z=(x++)*(--y);答案:
x=0x05,y=0x07,z=0x1c
(2)z=(++x)-(y--);答案:
x=0x05,y=0x07,z=0xfd
(3)z=(++x)*(--y);答案:
x=0x05,y=0x07,z=0x23
(4)z=(x++)+(y--);答案:
x=0x05,y=0x07,z=0x0c
8.写出下列表达式运算后a的值,设运算前a=10;n=9;a、n已定义为8位整型变量。
(1)a+=a;a=20
(2)a*=2+3;a=50(3)a%=(n%=2);a=0;
解:
五、问答题
1.在单片机中使用高级语言c51与汇编语言相比有何优点?
答:
C51与汇编语言相比,有如下优点:
(1)对单片机的指令系统不必深入了解(但对51单片机的存贮器空间结构需深入了解);
(2)寄存器分配、不同存贮器的寻址等细节可由编译器管理;
(3)程序有规范的结构,可分解成各种子函数,有利于程序的结构化;
(4)库文件中包含许多标准子程序,具有较强的数据处理能力;
(5)具有方便的模块化编程技术,使程序很容易移植。
因此,单片机编程人员从使用汇编语言到C语言是大势所趋、必然的发展规律。
2.目前最常用的C51编译器是什么?
它的主要作用?
答:
单片机的C语言采用C51编译器,目前最常用的是KeilC51。
C语言源程序经过C51编译器编译、L51(或BL51)连接/定位后生成.BIN和.HEX的目标程序。
3.C51中有哪些数据存储类型,简述它们在单片机系统存储空间的位置。
答:
4.C51定义了哪些存储器模式,对每种模式略作说明。
答:
5.变量的数据类型与存储区域有何关系?
变量存储区域与哪些因素有关?
答:
6.2C51中,对于int类型数组,能直接用数组名对数组进行整体输入或输出吗?
答:
所谓整体输入输出就是可以一次过全部输入或输出数组的全部元素。
C51中能够用数组名对数组进行整体输入或输出的就只有字符串数组,int类型数组不是字符串数组,只能对数组元素输入或输出,不能直接用数组名对数组进行整体输入或输出。
7.C51中,什么是局部变量和全局变量?
有何特点
答:
从变量的作用范围来区分,变量可以被分为局部变量和全局变量。
局部变量在函数内部定义,又称为内部变量。
函数的形式参数属于局部变量。
局部变量只能在被定义它的函数中使用,不能被其他函数使用。
局变量被定义时若没有初始化,其值是不确定的;各个函数内部的局部变量可以同名而互不影响。
全局变量在函数外面定义,又称为外部变量。
每个函数都可以使用全局变量,也就是说,全局变量对所有函数都是可见的,而局部变量只对定义它的函数才是可见的。
全局变量被定义时若没有初始化,其值为0。
在一个函数内部,当一个局部变量与一个全局变量同名时,全局变量不起作用,局部变量起作用。
8.如何在C51中调用汇编程序?
答:
C51调用汇编子程序,实际上就是用C51关于函数故命名、函数参数和返回值传递等的规则来编写汇编子程序。
9.c51中,什么是“文件包含”,包含命令中的文件名可以用“”或<>括起来,它们有何区别?
答:
文件包含是C51预处理程序的一个重要功能。
文件包含命令行的一般形式为:
#include“文件名”
文件包含命令的功能是把制定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。
在程序设计中,文件包含是很有用的。
一个大的程序可以分为多个模块,由多个程序员分别编程。
有些公用的符号常量或宏定义等可以单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。
这样,可避免在每个文件开头都去书写那些公用量,从而减少出错和书写时间。
包含命令中的文件名可以用“”或<>括起来。
使用<>表示在Keil的包含文件目录中去找,“”表示首先在源文件所在的目录中找,未找到再到包含目录中去找。
文件包含可以嵌套,即在一个被包含的文件中又可以包含另一个文件。
10.“头文件”有何作用?
如何定义头文件?
答:
通常,一个C51工程由多个模块组成,如I2C.c、ADC.c、LED_disp.c等,为使用方便,可以为每个模块定义一个头文件,文件的主要作用是对同名的驱动函数中的自定义函数作出声明,另外也可以包含对程序中所使用的引脚进行的定义等。
比如,设计了一个驱动程序4LED.c,主要功能是控制4位LED显示的模块。
为了方便在其它程序设计中调用其中的“Disp_4LED”函数和毫秒延时函数“delayms”,于是就根据4LED.c定义了一个4LED.h的头文件(注意:
头文件的名要于驱动程序的文件名一致,但文件名后缀除外),其格式如下:
#ifndef_4LED_H_//防止重复引用该文档,如果没有定义过_4LED_H_,则编译下面语句#define_4LED_H_//定义_4LED_H_,仿止重定义#include//LED数码管位选线连接定义sbitLED1=P2^0;sbitLED2=P2^1;sbitLED3=P2^2;sbitLED4=P2^3;
voiddelayms(uintx);//毫秒延时函数,x为延时ms数
voidDisp_4LED(uchar*ledbuf);//显示4位LED函数;ledbuf为显示缓冲区;#endif
定义完后,要引用该模块时,只要在加入#include“4LED.h”
就可以在程序中调用Disp_4LED(uchar*ledbuf)和delayms(uintz)的自定义函数了。
11.下面函数中的变量temp是否在main函数的所有部分都有效?
#defineN5
voidmain()
{inti;
inta[N]={1,2,3,4,5};
for(i=0;i{inttemp;
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
i=a[4];
}
答:
temp只在for循环语句中有效。
12.下面的程序中,哪些变量在f1函数中有效,哪些变量在main中有效?
intx;
floatf1(inta)
{intb,c;
…….
}
inty;
main()
{intm,n;
…….
}
答:
x、a、b、c在f1中有效;x、y、m、n在main中有效。
13.下面两个数组的定义中,数组b、c各有多少个元素。
charb[]={`H`,`E`,`L`,`L`,`O`};
charc[]={“HELLO”};
答:
b含有5个元素;c含有6个元素,最后一个是“/0”
14.定义了inta[10]={0,1,2,3,4};请写出a数组中每个元素的值。
答:
a[0]-a[4]为0,1,2,3,4;a[5]-a[9]为0。
15.下面的关于数组a的定义是否正确?
为什么?
(1)unsignedchari;
a[i];
(2)inta(10);
答:
(1)不正确,因i未给出值,编译器无法给a预留空间。
(2)不正确,数组的定义要用方括弧。
16.当定义了charc=1;chara;后
运行a=c++;后a=?
答:
a=l,c=2
运行a=++c;后a=?
答:
a=2,c=2
17.按要求定义如下变量:
(1)在内部RAM定义一个带符号的一字节变量var1;
答:
chardatavar1;
(2)在可位寻址的片内RAM定义了一个位变量flags;
答:
bitbdataflags;
(3)在内部RAM(含52子系列的高128字节)定义浮点变量xy、z;
答:
floatidatax,y,z;
(4)在片外RAM低256字节内定义了一个无符号整型变量var2;
答:
unsignedintpdatavar2;
(5)在内部RAM定义一个带符号的一字节3x4数组vector;
答:
unsignedcharvector[3][4];
18.教材中voiddelayms(unsignedintx)是常用的自定义延时毫秒函数,注释中说明“当晶振为11.0592MHz时,x为ms数”,这是如何计算出来的?
答:
这是根据将此函数编译成汇编语言后,根据每条汇编语句的执行时间累加计算出来的。
19.为什么while
(1){。
。
。
;}中的循环部分将无穷的执行下去?
答:
while
(1)是条件循环,即如果条件为“真”就执行{}中的语句,“真”的概念是非零。
这里,条件是“1”,即非零,永远为“真”,所以,主程序中while
(1)中的循环部分将无穷的执行下去
六、编程题
1.设计一个有返回值的、带参数的、求两个数(8位正整数)中最大值的函数。
解:
unsignedcharMax_Value(unsignedcharx,unsignedchary)
{
if(x>=y)returnx;
elsereturny;
}
2.设计一个无返回值的、带参数的、延时毫秒的函数(晶振11.0592)。
解:
voiddelayms(unsignedintx)
{
unsignedintj;
while(x--)
{
for(j=0;j<113;j++)
{;}
}
}
3.用for语句编写一个求1-10整数累计和的一段循环程序。
解:
unsignedchari,sum=0;
for(i=0;i<=10;i++)
{
sum=sum+i;
}
4.用while语句编写一个求1-10整数累计和的一段循环程序。
解:
unsignedcharsum=0,i=0;
do
{
i++;
sum=sum+i;
}while(i<=10)