单片机技术及c5程序设计第2版答案唐颖阮越.docx

上传人:b****4 文档编号:27312513 上传时间:2023-06-29 格式:DOCX 页数:45 大小:108.14KB
下载 相关 举报
单片机技术及c5程序设计第2版答案唐颖阮越.docx_第1页
第1页 / 共45页
单片机技术及c5程序设计第2版答案唐颖阮越.docx_第2页
第2页 / 共45页
单片机技术及c5程序设计第2版答案唐颖阮越.docx_第3页
第3页 / 共45页
单片机技术及c5程序设计第2版答案唐颖阮越.docx_第4页
第4页 / 共45页
单片机技术及c5程序设计第2版答案唐颖阮越.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

单片机技术及c5程序设计第2版答案唐颖阮越.docx

《单片机技术及c5程序设计第2版答案唐颖阮越.docx》由会员分享,可在线阅读,更多相关《单片机技术及c5程序设计第2版答案唐颖阮越.docx(45页珍藏版)》请在冰豆网上搜索。

单片机技术及c5程序设计第2版答案唐颖阮越.docx

单片机技术及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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1