单片机应用技术思考与练习参考答案.docx

上传人:b****6 文档编号:8777490 上传时间:2023-02-01 格式:DOCX 页数:40 大小:472.68KB
下载 相关 举报
单片机应用技术思考与练习参考答案.docx_第1页
第1页 / 共40页
单片机应用技术思考与练习参考答案.docx_第2页
第2页 / 共40页
单片机应用技术思考与练习参考答案.docx_第3页
第3页 / 共40页
单片机应用技术思考与练习参考答案.docx_第4页
第4页 / 共40页
单片机应用技术思考与练习参考答案.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

单片机应用技术思考与练习参考答案.docx

《单片机应用技术思考与练习参考答案.docx》由会员分享,可在线阅读,更多相关《单片机应用技术思考与练习参考答案.docx(40页珍藏版)》请在冰豆网上搜索。

单片机应用技术思考与练习参考答案.docx

单片机应用技术思考与练习参考答案

思考与练习参考答案

项目1:

1.什么是单片机,一块完整的单片机芯片有哪些组成部件?

答:

单片机是单芯片微型计算机SCM(Single-ChipMicrocomputer)的简称,它是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口、中断系统、定时器/计时器等部件(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块芯片上构成的一个小而完善的微型计算机系统。

2.请把下列十进制数转换为二进制数和十六进制数:

①245②47.62③0.356

答:

①245D=11110101B=F5H

②47.62=101111.10011110B=2F.9EH

③0.356=0.01011011B=0.5BH

3.请把下列二进制数转换为十进制数和十六进制数:

①110100111B②01001100B③1011.1100B

答:

①110100111B=1×28+1×27+1×25+1×22+1×21+1×20=423D

110100111B=1A7H

②01001100B=1×26+1×23+1×22=76D

01001100B=4CH

③1011.1100B=1×23+1×21+1×20+1×2-1+1×2-2=11.75D

1011.1100B=B.CH

4.写出下列十进制数在8位二进制数(含符号位)机中的原码、反码和补码:

①+76②-118③-55

答:

①+76的原码为01001100B,反码为01001100B,补码为01001100B

②-118的原码为11110110B,反码为10001001B,补码为10001010B

③-55的原码为10110111B,反码为11001000B,补码为11001001B

5.写出下列各数的BCD码:

①56②119③2014

答:

①56=(01010110)BCD

②119=(000100011001)BCD

③2014=(0010000000010100)BCD

6.MCS-51单片机内部包含哪些主要功能部件,各有什么主要功能?

答:

MCS-51单片机内部主要包含如下功能部件:

1)中央处理器CPU:

中央处理器是整个单片机的核心部件,由运算器和控制器组成,主要完成运算和控制功能。

2)内部程序存储器和内部数据存储器:

程序存储器用于存放已编写好的程序及数据表格,数据存储器用于存放输入、输出数据、中间运算结果。

3)并行I/O口:

4组8位的可编程并行I/O(Input/Output)接口(P0、P1、P2、P3),可以实现数据的并行输入、输出。

4个并行口既可作为I/O端口使用,又可作为外部扩展电路时的数据总线、地址总线及控制总线。

4)串行接口:

一个全双工的可编程串行通信接口,以实现单片机与其它设备之间的串行数据传送。

5)定时器/计数器:

2个16位的定时器/计数器,可实现定时或计数功能。

可以通过对系统时钟计数实现定时,也可用于对外部事件的脉冲进行计数。

6)中断系统:

具备较完善的中断功能,通过硬件改变CPU程序运行的方向,满足一般控制应用的需要。

它共有5个中断源:

2个外部中断源,3个内部中断源,即两个定时/计数器中断和一个串行口中断。

7)时钟电路:

内部有时钟电路,为单片机产生时钟脉冲时序,但需要外接晶振和微调电容。

8)系统总线:

按其传递信息的类型可分为数据总线、地址总线和控制总线,分别用来传输数据、地址和控制信号。

7.AT89S51单片机的P0、P1、P2、P3口各有什么用途,使用时应注意什么?

答:

P0口(0.0~P0.7/AD0~AD7):

一组8位漏极开路型双向I/O口,也是地址/数据总线复用口。

作输入/输出口用时,必须外接上拉电阻,它可驱动8个TTL门电路。

当访问片外存储器时,用作地址/数据分时复用口线。

P1口(P1.0~P1.7):

一组内部带上拉电阻的8位准双向I/O口,可驱动4个TTL门电路。

P2口(P2.0~P2.7/A8~A15):

一组内部带上拉电阻的8位准双向I/O口,可驱动4个TTL门电路。

当访问片外存储器时,用作高8位地址总线。

P3口(P3.0~P3.7):

一组内部带上拉电阻的8位准双向I/O口。

P3口的每一引脚同时还具有专门的第二功能

8.AT89S51单片机的存储器从物理结构上可划分为哪几个存储空间?

答:

AT89S51单片机的存储器在物理结构上有4个存储空间:

片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。

但在逻辑上,即从用户的使用角度,89S51有3个存储器地址空间:

片内、外统一编址的程序存储器地址空间、片内数据存储器地址空间和片外数据存储器地址空间。

9.AT89S51单片机采用何种方式区分片内、外程序存储器和片内、外数据存储器?

答:

AT89S51单片机在访问3个不同的逻辑空间时,应采用不同形式的指令,以产生不同的存储空间的选通信号。

AT89S51单片机内部有4KB的程序存储器,地址为0000H~0FFFH。

片外16位地址线最多可扩展空间达64KB,地址为0000H~FFFFH,两者是统一编址的。

则地址范围为0000H~0FFFH是在片内存储器还是片外存储器,取决于单片机外围引脚EA的状态。

如果EA接高电平(即EA=1),89S51的程序计数器PC在0000H~0FFFH范围内(即前4KB地址)时是执行片内ROM的程序,当寻址范围在1000H~FFFFH时,则读取片外ROM的指令数据;如果EA接低电平(即EA=0),则不管地址大小,一律读取外部程序存储器指令。

使用片内和片外数据存储器时采用不同的指令加以区别。

在访问片内数据存储器时,可使用MOV指令;要访问片外数据存储器可使用MOVX指令。

10.开机复位后,CPU使用的是哪组工作寄存器,它们的地址是什么,CPU如何改变当前工作寄存器组?

答:

开机复位后,CPU自动选中第0组工作寄存器,它们的地址是00H~07H。

如要改变当前工作寄存器组必须重新设置程序状态字PSW中RS1、RS0两位的状态。

11.程序状态字寄存器PSW的作用是什么,常用状态标志位有哪些?

答:

程序状态字寄存器PSW是一个可编程的8位特殊功能寄存器,用于存储指令执行后的相关状态信息。

其中有些位的状态是根据程序执行结果,由硬件自动设置的,而有些位的状态则可通过指令设置。

常用状态标志位有:

CY进位标志位、AC辅助进位标志位(半进位标志位)、F0用户标志位、RS1、RS0工作寄存器组选择位、OV溢出标志位、

P奇偶校验位。

12.什么是堆栈,有何作用?

在程序设计时,有时为什么要对堆栈指针SP重新赋值?

答:

堆栈是存储区中一个主要用来暂存数据和地址的特殊区域,操作时按“先进后出”的原则存放数据,其生成方向由低地址到高地址,通常在中断或调用子程序时用于保护现场和断点地址。

堆栈指针SP是一个8位特殊功能寄存器,用以指示堆栈顶部在片内RAM中的位置。

系统复位后,SP的初始值为07H。

由于08H~1FH单元为工作寄存器区1~3,20H~2FH单元为位寻址区,所以在程序设计时一般将SP的初值改变至片内RAM的高地址区(30H以上)。

13.当晶振频率为12MHZ时,AT89S51单片机的状态周期、机器周期、指令周期各是多少微秒,ALE引脚输出频率是多少?

答:

石英晶体振荡器的频率为fOSC=12MHz,则

状态周期=2×时钟周期=0.167μs

机器周期=12时钟周期=1μs

指令周期=(1~4)机器周期=1μs~4μs

ALE引脚输出频率为1/6时钟频率,即:

1/6×12MHZ=2MHZ

14.单片机的复位电路有哪几种,复位后单片机的初始状态如何?

答:

要实现复位操作,只需在89S51单片机的RST引脚上施加24个振荡周期以上的高电平信号就可以了。

单片机的复位电路有两种形式:

上电复位和按钮复位。

当单片机进行复位操作后,各寄存器的内容被初始化。

复位后除SP、P0~P3及SBUF外,其余各寄存器值均为0。

PC=0000H代表单片机从地址为0处开始执行程序。

端口P0~P3为FFH表明所有端口锁存器均被置“1”,可进行输入/输出数据的操作。

SP为07H,SBUF状态不定。

15.AT89S51单片机有几种低耗方式,如何实现?

答:

AT89S51单片机有两种低功耗方式:

待机(或称空闲)方式和掉电(或称停机)保护方式,这两种方式可通过电源控制寄存器PCON中有关位IDL(D0位)和PD(D1位)来控制。

如果使用一条指令使寄存器PCON的IDL位为1,则AT89S51即进入待机方式,IDL置“0”,单片机即退出待机状态。

寄存器PCON的PD位控制单片机进入掉电保护方式。

当单片机在检测到电源故障时,除进行信息保护外,还应把PCON的PD位置1,使之进入掉电保护方式,此时内部RAM单元的内容被保存,单片机一切工作都停止硬件复位或外部中断INT0、INT1可终止掉电保护方式。

16.Proteus中电路连线的方式有几种?

答:

Proteus中电路连线的方式有两种。

最常用的连线方式是:

系统默认的自动捕捉功能打开,只要将光标放在需要连线的元器件引脚附近,就会自动捕捉到引脚,单击第一个对象的连接点,拖动鼠标到另一个对象的连接点处单击即可自动生成连线。

在拖动过程中需要拐弯时单击鼠标左键即可。

也可采用网络标号进行连线:

在第一个连接点处放置一个输入终端INPUT,在另一个连接点处放置一个输出终端OUTPUT,利用对象的编辑属性方法对两个终端进行标号(也可以用普通导线加网络标号),两个终端的标号(Label)必须一致。

17.Proteus中删除一个元件可以采用几种方式?

答:

Proteus中删除一个元件的方式有好三种:

鼠标左键单击选中元件,按键盘上的delete键可以删除;右键单击元件,在对话框中选择“DeleteObject”也可以删除元件;右键双击元件也可进行删除。

18.如何用Proteus进行软件和硬件的仿真调试?

答:

在Proteus中绘出电路,用汇编语言编写程序,在WAVE6000中编译得到HEX文件,或者用C51编写程序,在KEIL中编译得到HEX文件,然后在Proteus中双击单片机,在弹出的对话框中的ProgramFile选项里关联到该HEX文件,最后在运行即可进行软件和硬件的仿真调试。

19.使用Keil和Proteus进行联合调试时,还需要安装什么驱动?

需要在两个软件中分别怎样设置?

答:

使用Keil和Proteus进行联合调试时,还需要安装vdmagdi.exe,这个文件是KEIL与Proteus联调的驱动程序,运行后,软件所需的设置全帮你设置好。

需要在两个软件中分别进行如下设置:

打开Keil,新建工程,编写源程序,并把这个程序文件加入工程中。

如图1所示。

图1KeiluVision界面

右键单击Project窗口的Target1,在弹出的对话框中单击“OptionsforTarget‘Target1’…,弹出选项设置对话框,如图2所示。

图2选项设置对话框

打开Output选项卡,勾选

选项卡,在

中可选择输出HEX文件的路径及文件名。

然后打开Debug选项卡,如图3所示。

在使用仿真器这个地方选

图3Debug选项卡

择ProteusVSMSimulator,

4、打开ISIS,打开任务2中建好的电路图,点击Debug菜单,如图4所示。

图4Debug菜单

勾选UseRemoteDebugMonitor选项。

至此,完成了联合调试所需的全部参数设定,ISIS中无需让MCU关联HEX文件。

接下来就可以实现联合调试了。

20.用C51编程将单片机内部RAM30H单元的数据和40H单元的数据相乘,结果存入外部RAM1000H单元。

答:

C51编程如下:

voidmain(void)

{chardata*p1,*p2;

charxdata*p3;

p1=0x30;

p2=0x40;

p3=0x1000;

*p3=(*p1)*(*p2);

}

21.用C51编程将外部RAM20~25H单元的内容传送到内部RAM20H~25H单元。

答:

C51编程如下:

voidmain(void)

{charxdata*p1;

chardata*p2;

p1=0x20;

p2=0x20;

while(p1<=0x25)

{

*p2=*p1;

p1++;

p2++;

}

}

22.用Proteus设计一个8位led流水的硬件电路,画出其原理图,并用汇编或c51编写源程序,然后在proteus中进行软硬件仿真调试。

答:

 硬件电路见下图。

P1口接8个发光二极管D1-D8构成流水灯结构,C3、R1、R2构成上电复位电路,C1、C2和X1构成晶振电路

8位LED流水灯硬件电路

先向P1口送一个01H的初值,只让P1.0管脚上所接的LED亮,其它LED灭,延时一段时间后,将送出的数据左移,再从P1口送出,这样周而复始,就可实现亮点流动。

C51源程序如下:

#include

voiddelay02s(void)

{

unsignedchari,j,k;/*定义无符号字符型

变量i,j,k,局部变量说明*/

for(i=20;i>0;i--)

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

voidmain(void)/*主函数*/

{unsignedcharm=0;

P1=0x01;

while

(1)

{

delay02s();/*调用函数delay02s()*/

P1=P1<<1;

m++;

if(m==0x08){P1=0x01;m=0;}

}

}

仿真调试

1)在Proteus中按照图1-16搭接好电路;

2)在KeilC51软件中编辑上述C51源程序,并进行编译,得到目标(HEX格式)文件;

3)与Proteus原理图进行联合仿真调试,同时通过Proteus原理图观察程序运行结果。

23.用Proteus设计一个8位8段led动态显示的硬件电路,画出其原理图,并用汇编或c51编写源程序,然后在keil中进行联合调试。

解:

硬件电路如下:

参考程序为:

#include

typedefunsignedcharu8;

u8codeNumbercode[]={0xA4,0xC0,0xF9,0x99,0xC0,0x99,0xC0,0x82};

/*延时tms*/

voidDelay()

{

u8i,j;

for(i=0;i>0;i--)

for(j=125;j>0;j--);

}

voidmain()

{

while

(1)

{

u8i=0;

P3=0x01;

for(i=0;i<8;i++)

{

P2=Numbercode[i];

Delay();

P2=0xFF;

P3<<=1;

}

}

}

 

项目2:

1、编写程序,把外部RAM2000H-20FFH的区域内的数据逐个搬到从1000H单元开始的区域。

解:

voidmain(void)

{int;

charxdata*x;

charxdata*y;

x=0x2000;

y=0x1000;

for(i=0;i<=255;i++){

*y=*x;

x++;

y++;}

}

2、设两个16位数分别在片内RAM30H和40H开始的两个单元中,高字节在低地址单中,低字节在高地址单元中,编程求两个数之和并存入40H开始的单元中。

解:

CLRC;CY←0

MOVR0,#41H;将立即数送给累加器R0

MOVA,31H;将内部RAM中31H单元的内容送给A

ADDA,@R0;计算低字节之和

MOV@R0,A;低字节和存入41H单元

MOVA,30H;将内部RAM中30H单元的内容送给A

DECR0;指向内部RAM中40H单元

ADDCA,@R0;计算高字节之和

MOV@R0,A;高字节和存入40H单元

END

3、将20H单元中的无符号二进制数转换为3位BCD码。

转换结果的百位存到21H单元,十位存到22H单元,个位存到23H单元。

解:

ORG0100H

MOVB,#100;除数100送B

DIVAB;A中内容除以100,得到百位数

MOV21H,A;百位数存30H单元

MOVA,#10;除数10送A

XCHA,B;余数送A,除数10送B

DIVAB;A中内容除以10,得到十位数和个位数

MOV22H,A

MOV23H,B

END

4、设变量X以补码的形式放在片内RAM30H单元,函数Y与X有如下关系:

X,X>0

Y=20H,X=0

X+5,X<0

试编制程序,根据X的大小求出Y的值并放回原单元。

解:

c51程序:

voidmain(void)

{

charx,*y;

y=0x30;

x=*y;

if(x>0)*y=x;

if(x<0)*y=x+5;

if(x=0)*y=0x20;

}

汇编程序:

ORG0000H

AJMPSTART

ORG0100H

START:

MOVA,30H

JZLP2

JNBAcc.7,LP1

ADDA,#05H

MOV30H,A

SJMPLL

LP1:

MOV30H,A

SJMPLL

LP2:

MOV30H,#20H

LL:

SJMP$

END

5、编程将内部RAM30H到4FH共32个连续单元清0。

解:

ORG0000H

AJMPSTART

ORG0100H

START:

MOVR0,#20H;循环计数器赋初值

MOVR1,#30H;地址指针赋初值

LOOP:

MOV@R1,#00H;清0RAM单元

INCR1;修改地址指针

DJNZR0,LOOP;循环控制

SJMP$;循环结束

END

6、编程求出内部RAM30H单元中的数据中“0”的个数,并将结果存入31H单元。

7、设单片机的晶振频率

=6MHz,试编写延时10ms的延时程序。

解:

ORG0100H

DELAY:

MOVR1,#50

DL1:

MOVR7,#49

DL:

DJNZR7,$

DJNZR1,DL1

RET

8、从内部RAM30H单元开始存放一组无符号数,其数据个数存放在21H单元中。

试编写程序,求出这组无符号数中的最小数,并将其存入20H单元中。

解:

ORG0100H

BLOCKDATA30H

LENDATA21H

FMIN:

MOVDPTR,#BLOCK;数据块首址送DPTR

DECLEN;长度减1

MOVXA,@DPTR;取数至A

LOOP:

CLRC;C清零

MOVB,A;暂存于B

INCDPTR;修改指针

MOVXA,@DPTR;取数至A

SUBBA,B;比较两数

JNCLOOP1;若B小则跳转

ADDA,B;若A小则恢复A

SJMPLOOP2

LOOP1:

MOVA,B;将较小数存入A

LOOP2:

DJNZLEN,LOOP;未完,重复比较

MOV20H,A;存最小数

END

9、编程查找内部RAM20H到40H单元中出现0FFH的次数,并将结果存入41H单元中。

解:

ORG0100H

MOVR0,#20H

MOVR1,#21H

MOVR7,#00H

LOOP:

MOVA,@R0

CJNEA,#0FFH,NEXT

INCR7

NEXT:

INCR0

DJNZR1,LOOP

MOV41H,R7

END

10、设有100个有符号数,连续存放在以2000H为首地址的外部RAM中。

试编程统计其中正数、负数、零的个数,并将结果分别放到片内RAM20H、21H、22H三个单元中。

解:

参考第4题。

11、在20H和21H两个单元中各有一个8位数,试编程求出两数的平方和。

要求用子程序方法实现求平方,结果存放在22H和23H两个单元。

解:

参考两个数都是0~9的程序

ORG0100H

MAIN:

MOVSP,#50H;设堆栈指针

MOVA,21H;取a值

ACALLSQR;求a2

MOV20H,A;a2值暂存于20H

MOVA,22H;取b值

ACALLSQR;求b2

ADDA,20H;求a2+b2

MOV20H,A;结果存于20H单元

SJMP$

ORG0150H

SQR:

MOVDPTR,#TAB;修正A值

MOVCA,@A+DPTR;查平方表

RET

TAB:

DB0,1,4,9,16,25;平方表

DB36,49,64,81

END

12、89S51单片机内部有几个定时器/计数器?

和定时器相关的特殊功能寄存器有哪些?

答:

有两个16位的定时器/计数器,和定时器相关的特殊功能寄存器有TMOD和TCON。

13、89S51单片机的定时器/计数器有哪几种工作方式?

各有什么特点?

答:

参见下表

14、定时器/计数器用做定时方式时,其定时时间与哪些因素有关?

作计数时,对外界计数频率有何限制?

答:

定时器/计数器用作定时方式时,定时时间与初值和机器周期有关;作计数时,最高的外部计数脉冲的频率不能超过振荡频率的1/24,并且要求外部计数脉冲的高电平和低电平的持续时间不能小于一个机器周期。

15、在89S51单片机中,已知时钟频率为12MHZ,请编程使P1.0和P1.1分别输出周期为2ms和500us的方波。

解:

用定时器1方式1定时,设初值为x,则(216-x)*1us=250,x=65286=FF06H

汇编源程序如下:

ORG0000H

AJMPSTART

ORG0100H

START:

MOV50H,#04H;定时1ms循环次数

MOVTMOD,#10H;设定时器1为方式1

MOVTH1,#0FFH;赋初值

MOVTL1,#06H

SETBTR1;启动T1

L2:

JBCTF1,L1;查询计数溢出

SJMPL2

L1:

MOVTH1,#3CH

MOVTL1,#0B0H

CPLP1.1;到250us将P1.1取反

DJN

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

当前位置:首页 > 高等教育 > 农学

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

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