MCS单片机课后作业解答.docx
《MCS单片机课后作业解答.docx》由会员分享,可在线阅读,更多相关《MCS单片机课后作业解答.docx(26页珍藏版)》请在冰豆网上搜索。
MCS单片机课后作业解答
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
JB,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(lsreturn0;
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=*;
第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
CLR
SJMP$
T0_INT:
MOVTL0,#0B0H
MOVTH0,#3CH
CPL
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
SETB
SJMP$
T0_INT:
MOVTL0,#0B0H
MOVTH0,#3CH
INCR2
CJNER2,#3,T0_INT1
CLR
RETI
T0_INT1:
CJNER2,#10,T0_INT2
SETB
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
SETB
SJMP$
T0_INT:
MOVTL0,#0B0H
MOVTH0,#3CH
INCR2
CJNER2,#10,T0_INT1
CLR
RETI
T0_INT1:
CJNER2,#20,T0_INT2
SETB
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次时=0,外部INT0中断时=1,启动定时器。
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT0_INT
ORG000BH
LJMPT0_INT
MAIN:
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
MOVR2,#0
SETBET0
SETBIE
SETBEX0
SETBIT0
SETB
CLR
SJMP$
T0_INT:
MOVTL0,#0B0H
MOVTH0,#3CH
INCR2
CJNER2,#10,T0_INT2
SETB
CLR
CLRTR0
T0_INT2:
RETI
INT0_INT:
SETBTR0
MOVR2,#0
CLR
SETB
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:
JBWAIT;等待/引脚变为低电平
SETBTR0;预启动T0
WAIT1:
JNB,WAIT1;等待/引脚变为高电平、启动计数
WAIT2:
JB,WAIT2;等待/引脚再变为低电平
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;/*等待/引脚变为低电平*/
TR0=1;/*启动定时器/计数器0*/
do{}while(!
;/*等待引脚变为高电平、启动计数*/
do{}while;/*等待引脚再变为低电平*/
TR0=0;/*停止计数*/
p=0x50;
*p=TL0;
p=p+1;
*p=TH0;
}
解:
有4种工作方式
方式0:
8位同步移位寄存器方式,波特率fosc/12
方式1:
10位异步收发方式,波特率可变
方式2:
11位异步收发方式,波特率fosc/32、fosc/64
方式3:
11位异步收发方式,波特率可变
解:
串口SBUF分接收SBUF和发送SBUF,占用同一地址。
解:
分析:
甲、乙两机都选