MCS51单片机课后作业解答资料讲解.docx

上传人:b****5 文档编号:6952970 上传时间:2023-01-13 格式:DOCX 页数:26 大小:463.64KB
下载 相关 举报
MCS51单片机课后作业解答资料讲解.docx_第1页
第1页 / 共26页
MCS51单片机课后作业解答资料讲解.docx_第2页
第2页 / 共26页
MCS51单片机课后作业解答资料讲解.docx_第3页
第3页 / 共26页
MCS51单片机课后作业解答资料讲解.docx_第4页
第4页 / 共26页
MCS51单片机课后作业解答资料讲解.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

MCS51单片机课后作业解答资料讲解.docx

《MCS51单片机课后作业解答资料讲解.docx》由会员分享,可在线阅读,更多相关《MCS51单片机课后作业解答资料讲解.docx(26页珍藏版)》请在冰豆网上搜索。

MCS51单片机课后作业解答资料讲解.docx

MCS51单片机课后作业解答资料讲解

 

MCS51单片机课后作业解答

MCS51单片机作业解答

第二章MCS-51单片机的结构和原理

(1)MCS-51单片机芯片包含哪些主要功能部件?

答:

CPU、4KBROM、128BRAM、4个8位I/O口、2个定时计数器、串行I/O口、中断系统、时钟电路、位处理器、总线结构。

(2)MCS-51单片机的/EA端有何用途?

答:

当/EA=0只访问片外程序区;当/EA=1时,先访问片内程序区,当PC超过片内程序容量时,自动转向外部程序区。

(3)MCS-51单片机有哪些信号需要芯片引脚以第二功能的方式提供?

答:

RXD、TXD、/INT0、/INT1、T0、T1、/WR、/RD

(4)MCS-51单片机的4个I/O口在使用上各有什么功能和特点?

答:

P1口通用输入输出;P0口数据总线、地址总线低8位、通用输入输出

P2口地址总线高8位、通用输入输出

P3第2功能信号、通用输入输出。

(5)单片机的存储器分哪几个空间?

试述各空间的作用。

答:

程序存储器:

内部ROM、外部ROM

数据存储器:

内部基本RAM、专用寄存器区、外部RAM

(6)简述片内RAM中包含哪些可位寻址单元?

答:

20H~2FH共16个可寻址单元

(7)什么叫堆栈?

堆栈指针SP的作用是什么?

在程序设计中为何要对SP重新赋值?

答:

只允许数据单端输入输出的一段存储空间。

SP的作用是用来存放堆栈栈顶的地址。

因为SP的初值是07H,后继的是寄存器区和位寻址区,为了便于编程工作,要修改SP.

(8)程序状态字寄存器PSW的作用是什么?

简述各位的作用。

答:

PSW用来存放程序执行状态的信息,

CY—加减运算的进位、借位

AC—辅助进位标志,加减运算的低4位进位、借位

(9)位地址65H与字节地址65H如何区别?

位地址65H具体在片内RAM中什么位置?

答:

位地址65H中是一位0/1的数据,字节地址65H是8位0/1的数据。

位地址65H在片内RAM中2CH单元第5位。

(10)什么是振荡周期、时钟周期、机器周期和指令周期?

如何计算机器周期的确切时间?

答:

振荡周期——为单片机提供信号的振荡源的周期

时钟周期——振荡脉冲2分频的信号

机器周期——完成一个基本操作需要的时间,是振荡周期/12=1T

指令周期——执行1条指令需要的时间1~4T

(11)单片机工作时在运行出错或进入死循环时,如何处理?

答:

复位处理,在单片机的RESET加持续1段时间的高电平

(12)使单片机复位的方法有几种?

复位后单片机的初始状态如何?

分上电复位和手动复位。

复位后PC=0000HALE=0/PSEN=1

(13)开机复位后,单片机使用的是哪组工作寄存器?

它们的地址是什么?

如何改变当前工作寄存器组?

答:

单片机使用的是第0组工作寄存器R0-R7,对应的地址为00H-07H,采用置位复位RS1、RS0,可以改变单片机使用的工作寄存器。

 

第3章MCS-51单片机的汇编语言指令系统

单片机的指令格式为:

操作码+操作数

[标号:

]操作码助记符[目的操作数][,源操作数][;注释]

答:

MCS-51单片机有7种寻址方式:

立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址、位寻址。

立即寻址——操作数在指令中直接给出。

直接寻址——操作数存放的地址在指令中给出。

可寻址RAM128B和特殊功能寄存器

寄存器寻址——操作数在寄存器中。

可寻址4组寄存器共32个字节即00H—1FH

寄存器间接寻址——操作数的地址放在寄存器R0、R1、dptr中

@R0、R1可寻址256B@DPTR可寻址64KB

变址寻址——操作数的地址由变址寄存器A和基址寄存器DPTR、PC相加得到。

可寻址64KB的程序区

相对寻址——实现程序的相对转移,地址范围-128~+127

位寻址——按位寻址,操作数的地址为位地址。

可寻址RAM区128bit特殊功能区的128bit

答:

对片内RAM可以用直接寻址和寄存器寻址方式。

对片外RAM可以用寄存器寻址方式-

答:

在对片外RAM单元的寻址中用Ri间接寻址只能寻址当前页的256B,用dptr间接寻址可以直接寻址64KB的内存

答:

(1)立即寻址

(2)直接寻址(3)寄存器间接寻址(4)寄存器寻址(5)MOVCA@A+DPTR

变址寻址(6)相对寻址(7)CLRA立即寻址,CLRC位寻址

答:

这2条指令的操作结果相当,但是前1条指令速度快,指令短

答:

如A=12H(PC)=0FFEH+20H+3=1021H如A=10H(PC)=0FFEH+3=1001H

第4章MCS-51单片机汇编语言程序设计

解:

xequ5AH

YEQU5BH

ORG0100H

START:

CJNEA,#10,START1

START1:

JCSTART_M;X<10

CJNEA,#15,START2

START2:

JNCSTART_B;X>=15

MOVB,A;10<=X<15

MULAB

ADDA,#8

SJMPSTART_END

START_M:

MOVB,A;X<10

MULAB

DECA

SJMPSTART_END

START_B:

MOVA,#41

START_END:

MOVY,A

SJMP$

解:

dataequ50h

Numequ08h

Resultequ54h

CAL_AVE:

MOVR0,#DATA

MOVR2,#Num

MOVR3,#0

MOVR4,#0

CLRC

CAL_AVE1:

MOVA,R4

ADDCA,@R0

MOVR4,A

MOVA,R3

ADDCA,#0

MOVR3,A

DJNZR2,CAL_AVE1

MOVR2,#3

CAL_AVE2:

CLRC

MOVA,R3

RRCA

MOVR3,A

MOVA,R4;/2

RRCA

MOVR4,A

DJNZR2,CAL_AVE2

MOVResult,R3

RET

解:

data1equ40h

Data2equ50h

Resultequ40h

Mult10_DATA:

MOVR0,#DATA1

MOVR1,#DATA2

MOVR2,#10H

CLRC

Mult10_DATA1:

MOVA,@R0

ADDCA,@R0;*2

MOV@R0,A

MOV@R1,A

INCR0

INCR1

DJNZR2,Mult10_DATA1

MOVR0,#DATA1

MOVR2,#10H

CLRC

Mult10_DATA2:

MOVA,@R0

ADDCA,@R0;*2*2

MOV@R0,A

INCR0

DJNZR2,Mult10_DATA2

MOVR0,#DATA1

MOVR2,#10H

CLRC

Mult10_DATA3:

MOVA,@R0

ADDCA,@R0;*2*2*2

MOV@R0,A

INCR0

DJNZR2,Mult10_DATA3

MOVR0,#DATA1

MOVR1,#DATA2

MOVR2,#10H

CLRC

Mult10_DATA4:

MOVA,@R0;*2*2*2

ADDCA,@R1;+*2

MOV@R0,A

INCR0

INCR1

DJNZR2,Mult10_DATA4

RET

解:

dataequ2000H

NUMEQU100

EVENEQU30H;偶数

ODDEQU31H;奇数

CAL_EVEN_ODD:

MOVDPTR,#DATA

MOVR2,#NUM

CAL_EVEN_ODD2:

MOVXA,@DPTR

JBACC.0,CAL_ODD;

INCEVEN

SJMPCAL_EVEN_ODD1

CAL_ODD:

INCODD

CAL_EVEN_ODD1:

INCDPTR

DJNZR2,CAL_EVEN_ODD2

RET

解:

DATA_ASCEQU2000H

DATA_BCDEQU3000H

NUMEQU10

ASC_TO_BCD:

MOVDPTR,#DATA_ASC

MOVP2,DPH

MOVR0,DPL

MOVDPTR,#DATA_BCD

MOVR2,#NUM

ASC_TO_BCD1:

MOVXA,@R0

ANLA,#0FH

SWAPA

MOVB,A

INCR0

MOVXA,@R0

ANLA,#0FH

ORLA,B

MOVX@DPTR,A

INCR0

INCDPTR

DJNZR2,ASC_TO_BCD1

RET

第5章单片机C51程序设计

解:

unsignedinthtoi(unsignedchars[],unsignedintsize)

{

unsignedinttmp[10];

unsignedinti=0;

unsignedintcount=1,result=0;

unsignedintflag=0;

if((s[i]=='0')&&(s[i+1]=='x')||(s[i+1]=='X'))

flag=2;

for(i=size-1;i>=flag;i--){

if((s[i]>='0')&&(s[i]<='9'))

tmp[i]=s[i]-48;

elseif((s[i]>='a')&&(s[i]<='f'))

tmp[i]=s[i]-'a'+10;

elseif((s[i]>='A')&&(s[i]<='F'))

tmp[i]=s[i]-'A'+10;

else

tmp[i]=0;

result=result+tmp[i]*count;

count=count*16;

}

returnresult;

}

解:

#include

#include

typedefunsignedcharbool;

boolstrend(unsignedchars[],unsignedchart[]);

intmain()

{

unsignedchars1[]="abcdefg";

unsignedchars2[]="ef";

boolflag=strend(s1,s2);

printf("theresultis%d\n",flag);

return0;

}

boolstrend(unsignedchars[],unsignedchart[])

{

intls=strlen(s);

intlt=strlen(t);

if(lt==0)

return1;

if(ls

return0;

return!

strcmp(&s[ls-lt],t);

}

解:

晶振频率12MHZ,25ms中断1次,5次中断为125ms移位1次。

#defineuintunsignedint

#defineucharunsignedchar

uchartemp,num;

voidmain()

{

TMOD=0x10;

TH1=(65536-25000)/256;

TL1=(65536-25000)%256;

EA=1;

ET1=1;

TR1=1;

P1=0xff;

temp=0xfe;

while

(1)

{

P1=temp;

}

}

voidtime1()interrupt3

{

TH1=(65536-25000)/256;

TL1=(65536-25000)%256;

num++;

if(num==5)

{

num=0;

temp=(temp<<1|temp>>7);

}

}

答:

不是,5/9=0;则c=0.

改为C=5.0/9.0*(F-32.0);

第6章单片机内部资源

解:

因为10KHZ的周期为100us,定时器中断时间可为50us,因此有4中方式。

方式0:

x=213-50*(12/12)=8192-50=1FCEH

=1111111001110BTH0=FEHTL0=0EH

方式1:

x=216-50*(12/12)=65536-50=FFCEH

=1111111111001110BTH0=FEHTL0=CEH

方式2:

x=28-50*(12/12)=256-50=CEH

=11001110BTH0=CEHTL0=CEH

方式3:

x=28-50*(12/12)=256-50=CEH

=11001110BTL0=CEH

解:

1.采用汇编语言

定时为50ms,采用方式1,X=216-50000*(12/12)=3CB0H

ORG000BH

LJMPT0_INT

MAIN:

MOVTMOD,#01H

MOVTH0,#3CH

MOVTL0,#0B0H

SETBET0

SETBIE

SETBTR0

CLRP2.0

SJMP$

T0_INT:

MOVTL0,#0B0H

MOVTH0,#3CH

CPLP2.0

RETI

2.采用c51语言

定时为50ms,采用方式1,X=216-50000*(12/12)

#include

sbitP2_0=P2^0;

voidmain(void)

{

TMOD=0x01;

P2_0=0;

TH0=(65536–500000)/256;

TL0=(65536–500000)%256;

EA=1;

ET0=1;

TR0=1;

Do{}while

(1);

}

Voidtimer0(void)interrupt1

{

TL0=(65536–500000)%256;

TH0=(65536–500000)/256;

P2_0=!

P2_0;

}

解:

1.采用汇编语言

定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断3次时清0,满10次重新置1。

ORG000BH

LJMPT0_INT

MAIN:

MOVTMOD,#01H

MOVTH0,#3CH

MOVTL0,#0B0H

MOVR2,#0

SETBET0

SETBIE

SETBTR0

SETBP1.0

SJMP$

T0_INT:

MOVTL0,#0B0H

MOVTH0,#3CH

INCR2

CJNER2,#3,T0_INT1

CLRP1.0

RETI

T0_INT1:

CJNER2,#10,T0_INT2

SETBP1.0

MOVR2,#0

T0_INT2:

RETI

 

2.采用c51语言

定时为100ms,采用方式1,X=216-100000*(6/12)

#include

sbitP1_0=P1^0;

ucharNUM=0;

voidmain(void)

{

TMOD=0x01;

P1_0=1;

TH0=(65536–500000)/256;

TL0=(65536–500000)%256;

EA=1;

ET0=1;

TR0=1;

Do{}while

(1);

}

Voidtimer0(void)interrupt1

{

TL0=(65536–500000)%256;

TH0=(65536–500000)/256;

NUM++;

If(NUM==3)P1_0=0;

Elseif(NUM==10)

{

NUM=0;

P1_0=1;

}

}

解:

1.采用汇编语言

定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断10次时清0,满20次重新置1。

ORG000BH

LJMPT0_INT

MAIN:

MOVTMOD,#01H

MOVTH0,#3CH

MOVTL0,#0B0H

MOVR2,#0

SETBET0

SETBIE

SETBTR0

SETBP1.7

SJMP$

T0_INT:

MOVTL0,#0B0H

MOVTH0,#3CH

INCR2

CJNER2,#10,T0_INT1

CLRP1.7

RETI

T0_INT1:

CJNER2,#20,T0_INT2

SETBP1.7

MOVR2,#0

T0_INT2:

RETI

 

2.采用c51语言

定时为100ms,采用方式1,X=216-100000*(6/12)

#include

sbitP1_7=P1^7;

ucharNUM=0;

voidmain(void)

{

TMOD=0x01;

P1_7=1;

TH0=(65536–500000)/256;

TL0=(65536–500000)%256;

EA=1;

ET0=1;

TR0=1;

Do{}while

(1);

}

Voidtimer0(void)interrupt1

{

TL0=(65536–500000)%256;

TH0=(65536–500000)/256;

NUM++;

If(NUM==10)P1_7=0;

Elseif(NUM==20)

{

NUM=0;

P1_7=1;

}

}

解:

1.采用汇编语言

定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断10次时p1.0=0,外部INT0中断时p1.0=1,启动定时器。

ORG0000H

LJMPMAIN

ORG0003H

LJMPINT0_INT

ORG000BH

LJMPT0_INT

MAIN:

MOVTMOD,#01H

MOVTH0,#3CH

MOVTL0,#0B0H

MOVR2,#0

SETBET0

SETBIE

SETBEX0

SETBIT0

SETBP1.0

CLRP1.1

SJMP$

T0_INT:

MOVTL0,#0B0H

MOVTH0,#3CH

INCR2

CJNER2,#10,T0_INT2

SETBP1.0

CLRP1.1

CLRTR0

T0_INT2:

RETI

INT0_INT:

SETBTR0

MOVR2,#0

CLRP1.0

SETBP1.1

RETI

 

2.采用c51语言

定时为100ms,采用方式1,X=216-100000*(6/12)

#include

sbitP1_0=P1^0;

sbitP1_1=P1^1;

ucharNUM=0;

voidmain(void)

{

TMOD=0x01;

P1_0=1;

P1_1=0;

TH0=(65536–500000)/256;

TL0=(65536–500000)%256;

EA=1;

ET0=1;

EX0=1;

IT0=1;

Do{}while

(1);

}

Voidtimer0(void)interrupt1

{

TL0=(65536–500000)%256;

TH0=(65536–500000)/256;

NUM++;

If(NUM==10)

{

P1_0=1;

P1_1=0;

TR0=0;

}

}

VoidINT_0(void)interrupt0

{

P1_0=0;

P1_1=1;

TR0=1;

NUM=0;

}

}

解:

外部脉冲由管脚输入,可设T0工作于定时器方式1,计数初值为0,当输入高电平时对T0计数,当高电平结束时,计数值乘上机器周期数就是脉冲宽度。

工作方式控制字TMOD=00001001B=09H,计数初值TH1=00、TL0=00H。

汇编语言程序:

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVTMOD,#09H;T0定时,方式1,GATE=1

MOVTH0,#00H;置TH0计数初值

MOVTL0,#00H;置TL0计数初值

WAIT:

JBP3.2WAIT;等待/P3.2引脚变为低电平

SETBTR0;预启动T0

WAIT1:

JNBP3.2,WAIT1;等待/P3.2引脚变为高电平、启动计数

WAIT2:

JBP3.2,WAIT2;等待/P3.2引脚再变为低电平

CLRTR0;停止计数

MOV51H,TH1;读取计数值,存入指定的单元

MOV50H,TL1

SJMP$

END

C语言程序:

#include

unsignedchardata*p;

voidmain(void)

{

TMOD=0x09;/*T0工作在定时器方式1,GATE=1*/

TH0=0;

TL0=0;

do{}while(P3.2);/*等待/P3.2引脚变为低电平*/

TR0=1;/*启动定时器/计

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

当前位置:首页 > 工作范文

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

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