单片机技术及c5程序设计第2版答案唐颖阮越.docx
《单片机技术及c5程序设计第2版答案唐颖阮越.docx》由会员分享,可在线阅读,更多相关《单片机技术及c5程序设计第2版答案唐颖阮越.docx(45页珍藏版)》请在冰豆网上搜索。
单片机技术及c5程序设计第2版答案唐颖阮越
《单片机技术及C51程序设计》(第2版)习题解
(注:
问答题略)
习题1部分习题解
1-1给出下列有符号数的原码、反码和补码(设计算机字长为8位)。
+37-86-105+112-79
解:
+37:
原码=00100101B;反码=00100101B;补码=00100101B
-86:
原码=11010110B;反码=10101001B;补码=10101010B
-105:
原码=11101001B;反码=10010110B;补码=10010111B
+112:
原码=01110000B;反码=01110000B;补码=01110000B
-79:
原码=11001111B;反码=10110000B;补码=10110001B
1-28位补码表示的定点整数的范围是多少?
解:
-128~+127
1-3已知X、Y是两个有符号数的定点整数,它们的补码为:
[X]补=00010011B,[y]补=11111001B,求[X+Y]补等于多少?
解:
[X+Y]补=[X]补+[y]补=00001100B
1-4请选择正确答案填在括号中:
将-33以补码形式存入8位寄存器中,寄存器中的内容为( A )
A.DFHB.A1HC.5FHD.DEH
1-5请选择正确答案填在括号中:
如果X为负数,由[X]补求[-X]补是将(D)
A.[X]补各值保持不变
B.[X]补符号位变反,其他各位不变
C.[X]补除了符号位外,各位变反,末位加1
D.[X]补连同符号位一起各位变反,末位加1
1-6请选择正确答案填在括号中:
设有二进制数X=-1101110,若采用8位二进制数表示,则[X]补的结果是(D)。
A.11101101B.10010011C.00010011D.10010010
1-78051与8751的区别是( C )
A.内部数据存储数目的不同B.内部数据存储器的类型不同
C.内部程序存储器的类型不同D.内部寄存器的数目不同
1-8单片机与普通计算机的不同之处在于其将(CPU)(存储器)和(I/O接口)三部分集成于一块芯片上(的单片微机)
1-9MCS-51单片机内部提供了哪些资源?
略
1-10单片机有哪些应用特点?
主要应用在哪些领域?
略
1-11MCS-51单片机如何进行分类?
各类有哪些主要特性?
略
习题2部分习题解
2-1填空题
1.MCS-51单片机中P3端口的第5位(P3.5)的位地址是(B5H)。
2.堆栈指针SP的字节地址是(81H),MCS-51单片机复位后,堆栈指针SP的值为(07H)。
3.MCS-51系列单片机的一个机器周期包含(6)个时钟周期。
4.MCS-51单片机复位后,PC的内容是(0000H),CPU使用的当前工作寄存器是第(0)组,此时R0~R7对应的地址范围是(00H)~(07H)。
5.设(PSW)=88,则Cy=( 1 ),P=( 0 )。
选择的是第
(1)组通用寄存器,该组寄存器在片内RAM中的地址为(08H~0FH)。
6.单片机的特殊功能寄存器只能采用(直接)寻址方式。
7.如果8051单片机采用6MHz的晶振,那么该系统一个机器周期为( 2 )微秒(µs),一个状态周期(或称时钟周期)为(2/6)微秒(µs)。
8.8051单片机采用12MHz的晶振频率,设无外扩存储器,单片机运行时ALE引脚输出的正脉冲的频率是( 2 )MHz。
2-2选择题
1.若RS0=0,RS1=0,则当前使用的工作寄存器组为(A )。
A.第0组B.第1组C.第2组D.第3组
2.若Fosc=12MHz,则8051的机器周期为(B)。
A.0.5μsB.1μsC.2μsD.4μs
3.堆栈遵循的原则是(B )。
A.先进先出,后进先出B.先进后出,后进先出
C.先进先出,后进后出D.先进后出,后进后出
4.8051有( B )个可编程的16位定时/计数器。
A.1B.2C.3D.4
5.MCS-5l单片机中不是准双向I/O接口的是( A )。
A.P0B.P1C.P2D.P3
6.在MCS-51系统中扩展一片2732(EPROM存储芯片,容量4K×8)需要(C )根地址线。
A.10B.11C.12D.13
7.8051单片机有( C )个中断源。
A.3B.4C.5D.6
8.片内RAM的20H~2FH为位寻址区,所包含的位地址是(B )。
A.00H~20HB.00H~7FHC.20H~2FHD.00H~FFH
10.8051单片机复位后的P0~P3的值为(D)。
A.00HB.0FHC.F0HD.FFH
2-3简答题(略)
1.简述在MCS-51系列单片机中哪些地址单元具有位地址?
2.MCS-51系列单片机的P0~P3口有何使用特点?
各自的第二功能是哪些?
3.决定程序执行顺序的寄存器是哪个?
它是多少位的寄存器?
是不是特殊功能寄存器?
4.MCS-51系列单片机的PSW寄存器各位标志的意义是什么?
若PSW=91H,请问其包含的信息是什么?
5.MCS-51系列单片机由哪几个功能部件组成?
6.MCS-51系列单片机的存储器结构有何特点?
存储器的空间如何划分?
各地址空间的寻址范围是多少?
7.MCS-51系列单片机的控制总线主要信号有哪些?
各信号的作用如何?
8.MCS-51系列单片机有哪几种低功耗工作模式?
简述这几种低功耗工作模式特点及退出该低功耗模式的方法。
9.MCS-51系列单片机在存储器组织上分为四个物理上相互独立的空间,单片机是如何实现对这四个空间进行访问的?
习题4部分习题解
4-1C语言有哪些特点?
略
4-2有哪些数据类型是MCS-51单片机直接支持的?
略
4-3C51特有的数据结构类型有哪些?
略
4-4C51中存储类型有几种,它们分别表示的存储器区域是什么?
略
4-5C51中,bit位与sbit位有什么区别?
略
4-6在C51中,通过绝对地址来访问存储器的有几种?
略
4-7在C51中,中断函数与一般函数有什么不同?
略
4-8按给定存储器类型和数据类型,写出下列变量的说明形式。
(1)在data区定义字符变量va11。
解:
chardataval1;
(2)在idata区定义整型变量va12。
解:
intidataval2;
(3)在xdata区定义无符号字符数组va13[4]。
解:
externcharxdatava13[4];
(4)在xdata区定义一个指向类型的指针px。
解:
uintxdata*px;
(5)定义可寻址位变量flag。
解:
bitbdataflag;
(6)定义特殊功能寄存器变量p3。
解:
sfrP3=0xB0;
(7)定义特殊功能寄存器变量SCON。
解:
sfrSCON=0xB8;
(8)定义16位的特殊功能寄存器T0。
解:
sfr16T0=0x8C8A;
4-9写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。
(1)a+b>c&&b==c
解:
a+b>c&&b==c不成立,结果为假(0)
(2)a‖b+c&&b-c
解:
a‖b+c&&b-c表达式为非零,逻辑结果为1
(3)!
(a>b)&&!
c‖1
解:
!
(a>b)&&!
c‖1表达式为非零,逻辑结果为1
(4)!
(a+b)+c-1&&b+c/2
解:
!
(a+b)+c-1&&b+c/2表达式为非零,逻辑结果为1
4-10在C51语言中,设变量a,b都为unsignedchar类型,a=78(十进制),b=209(十进制),用十六进制表示以下表达式的计算结果:
a&b=ox40;a^b=0xdf;b>>2=0x34;~a=0xb1;(a>b)?
a:
b=0xd1。
4-11C51程序是基于MCS-51系列单片机的C程序,在C51程序中,int型数据所能表示的数值范围是多少?
。
解:
-32768~+32767
4-13用分支结构编程实现,当输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。
解:
…
switch(grade)
case'1':
printf("A\n");break;
case'2':
printf("B\n");break;
case'3':
printf("C\n");break;
case'4':
printf("D\n");break;
case'5':
printf("END\n");break;
default:
printf("error"\n)
}
4-14输入三个无符号字符数据,要求按由大到小的顺序输出。
解:
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inta,b,c,t;//定义整型变量a,b,c,t
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("inputa,b,c:
\n");//输出提示信息
scanf("%d,%d,%d",&a,&b,&c);//输入a,b和c的值,无符号数据。
printf("\n");//输出换行
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%d,%d,%d",c,b,a);
while
(1);//结束
}
4-15用三种循环结构编写程序实现输出1到10的平方之和。
解:
1、通过while语句实现计算并输出1到10的平方之和。
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inti,s=0;//定义整型变量i和s
i=1;
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0Xf3;
TR1=1;
while(i<=10)//累加1~10的平方之和在s中
{
s=s+i*i;
i++;
}
printf("%d\n",s);
while
(1);
}
2、通过do...while语句实现计算并输出1到10的平方之和。
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inti,s=0;//定义整型变量i和s
i=1;
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0Xf3;
TR1=1;
do
{
s=s+i*i;//累加1~10的平方之和在s中
i++;
}while(i<=10);
printf("%d\n",s);
while
(1);
}
3、用for语句实现计算,并输出1到10的平方之和。
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inti,s=0;//定义整型变量i和s
i=1;
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0Xf3;
TR1=1;
for(i=1;i<=10;i++)
s=s+i*i;//累加1~10的平方之和在s中
printf("d\n",s);
while
(1);
}
4-16对一个5个元素的无符号字符数组按由小到大顺序排序。
解:
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inti,j,min,temp,a[5];//定义整型变量x和y
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("input:
\n");//输出提示信息
for(i=0;i<5;i++)
{printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for(i=0;i<5-1;i++)//排序
{min=i;
for(j=i;j<5;j++)
if(a[min]>a[j])
min=j;
temp=a[j];
a[j]=a[min];
a[min]=temp;
}
for(i=0;i<5;i++)//输出
printf("%5d",a[i]);
}
4-17用指针实现,输入3个无符号字符数据,按由大到小的顺序输出。
解:
#include//包含特殊功能寄存器库
#include//包含I/O函数库
voidmain(void)//主函数
{
inta,b,c,t;//定义整型变量a,b,c,t
int*p,*p1,*p2,*p3;//定义指针变量
SCON=0x52;//串口初始化
TMOD=0x20;
TH1=0XF3;
TR1=1;
printf("inputa,b,c:
\n");//输出提示信息
scanf("%d,%d,%d",&a,&b,&c);//输入a,b和c的值,无符号数据。
printf("\n");//输出换行
p1=&a;p2=&b;p3=&c;
if(a>b)
{p=p1;p1=p2;p2=p;}
if(a>c)
{p=p1;p1=p3;p3=p;}
if(b>c)
{p=p2;p2=p3;p3=p;}
printf("%d,%d,%d",*p3,*p2,*p1);
while
(1);//结束
}
4-18有3个学生,每个学生包括学号、姓名、成绩,要求找出成绩最高的学生的姓名和成绩。
解:
#include//包含特殊功能寄存器库
#include//包含I/O函数库
Structstudent
{charnum[6];
charname[8];
intscore[4];
}stu[3];
voidmain(void)//主函数
{
inti,tem,max,maxi;
printf("input3studentinformation:
\n");//提示输入信息
for(i=0;i<3;i++)
{
printf("name:
");//提示输入姓名
scanf("%s,stu[i].name);
printf("studentid:
");//提示输入学号
scanf("%s,stu[i].num);
printf("score:
");//提示输入分数
scanf("%d,stu[i].score);
}
max=0;maxi=0;
for(i=0;i<3;i++)
{tem=0;
tem=stu[i].score;
if(tem>max)
{max=tem;
maxi=i;
}
printf("student%s,maxscore:
%d.",stu[maxi].name.num,max);//打印
}
习题5部分习题解
5-15单片机用内部定时方法产生频率为10kHz方波,设单片机晶振频率fosc为12MHz,请编程实现。
解:
频率10kHz的方波,其周期为:
T=1/10k=100us,定时时间为50us。
设选用定时器0,方式2,10kHz方波从P1.0口输出。
C51参考程序:
#include//包含特殊功能寄存器库
sbitP1_0=P1^0;
voidmain()
{
TMOD=0x02;//使用定时器T0的模式2
TH0=256-50;//定时器T0的高8位赋初值
TL0=256-50;//定时器T0的低8位赋初值
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0
while
(1);
}
voidtime0_int(void)interrupt1//中断服务程序
{
P1_0=!
P1_0;//取反
}
5-16使用定时器0以定时方法在P1.0输出周期为400μs,占空比为20%的矩形脉冲,设单片机晶振频率fosc为12MHz,编程实现。
解:
其周期为400μs,占空比为20%的矩形脉冲,即定时时间分别为输出高电平80μs,输出低电平320μs(是输出高电平的4倍)。
根据题意,选用定时器0,方式1,从P1.0口输出。
C51参考程序:
#include//包含特殊功能寄存器库
sbitP1_0=P1^0;
sbitf;
sbiti;
voidmain()
{
TMOD=0x02;//使用定时器T0的模式1
TH0=256-80;//定时器T0的高8位赋初值
TL0=256-80;//定时器T0的低8位赋初值
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0
f=1;
while
(1);
}
voidtime0_int(void)interrupt1//中断服务程序
{
if(f==1)
(
P1_0=0;
F=0;
)
else
(i++;
if(i==4)
(
P1_0=1;
f-1;
)
)
}
5-23参照图5-2电路图,编程实现灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。
设fosc=6MHz。
解:
fosc=6MHz,每个机器周期=2us。
C51参考程序:
#include
unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedchari,j;
voidmain(void)
{TMOD=0x01;
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
EA=1;ET0=1;
i=0;j=0;
TR0=1;
while
(1);
}
voidtime0_int(void)interrupt1
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
j++;
if(j==5)
{j=0;
if(i!
=7)
{
P1=table[i];
i++;
}
else
{P1=table[i];
i=0;
}
}
5-24利用单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,请画出电路图且编程实现。
解:
电路图如下所示:
C51参考程序:
#include//包含特殊功能寄存器库
#include//包含函数_nop_()定义的头文件
sbitP1_7=P1^7;
unsignedcharcodetable[]={0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,
0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};
voidmain()
{
unsignedcharj,i;
SCON=0x00;
j=0;
for(;;)
{
P1_7=0;
_nop_();//延时一个机器周期
_nop_();//延时一个机器周期,保证清0完成
P1_7=1;
SBUF=table[j];
j++;
while(!
TI){;}
TI=0;
SBUF=table[j];
j++;
while(!
TI){;}
TI=0;
for(i=0;i<=3000;i++){;}//延时
if(j==16)j=0;
}
}
习题7部分习题解
7-5修改本章例7-8的程序,用数组表的方式编程实现在图7-18所示电路上动态显示“1234”。
解:
C51参考程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcode[4]={0xfe,0xfd,0xfb,0xf7};//位选码表
uchartel[4]={0x06,0x5b,0x4f,0x66};//共阴极1,2,3,4字段吗
voiddelay(void)//延时函数,延时一段时间
{
uchari,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++);
}
voidmain(void)
{uchark,d;
while
(1)//无限循环
{
for(k=0;k<4;k++)
{
P2=code[k];//送出位选码
P0=tel[k];
delay();//延时
}
}
}
7-6参照图7-18动态显示接口电路,试编写一段程序,在6个数码管上从右到左依次显示一个“3”字,直至出现6个“3”字为止。
解:
设数码管增至6个,为共阴极。
C51参考程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcode[6]={0xfe,0x