MCS51单片机课后作业解答资料讲解Word文档下载推荐.docx
《MCS51单片机课后作业解答资料讲解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《MCS51单片机课后作业解答资料讲解Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
时钟周期——振荡脉冲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:
X<
DECA
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
RRCA
MOVR3,A
MOVA,R4;
/2
DJNZR2,CAL_AVE2
MOVResult,R3
RET
data1equ40h
Data2equ50h
Resultequ40h
Mult10_DATA:
MOVR0,#DATA1
MOVR1,#DATA2
MOVR2,#10H
Mult10_DATA1:
MOVA,@R0
ADDCA,@R0;
*2
MOV@R0,A
MOV@R1,A
INCR0
INCR1
DJNZR2,Mult10_DATA1
Mult10_DATA2:
*2*2
DJNZR2,Mult10_DATA2
MOVR0,#DATA1
Mult10_DATA3:
*2*2*2
DJNZR2,Mult10_DATA3
MOVR0,#DATA1
Mult10_DATA4:
MOVA,@R0;
ADDCA,@R1;
+*2
DJNZR2,Mult10_DATA4
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
DATA_ASCEQU2000H
DATA_BCDEQU3000H
NUMEQU10
ASC_TO_BCD:
MOVDPTR,#DATA_ASC
MOVP2,DPH
MOVR0,DPL
MOVDPTR,#DATA_BCD
ASC_TO_BCD1:
MOVXA,@R0
ANLA,#0FH
SWAPA
MOVB,A
INCR0
MOVXA,@R0
ANLA,#0FH
ORLA,B
MOVX@DPTR,A
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]>
='
(s[i]<
9'
tmp[i]=s[i]-48;
elseif((s[i]>
a'
f'
tmp[i]=s[i]-'
+10;
A'
F'
else
tmp[i]=0;
result=result+tmp[i]*count;
count=count*16;
}
returnresult;
}
#include<
stdio.h>
string.h>
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<
lt)
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:
=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
T0_INT:
CPLP2.0
RETI
2.采用c51语言
定时为50ms,采用方式1,X=216-50000*(12/12)
#include<
reg51.h>
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
P2_0=!
P2_0;
定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断3次时清0,满10次重新置1。
MOVR2,#0
SETBP1.0
INCR2
CJNER2,#3,T0_INT1
CLRP1.0
T0_INT1:
CJNER2,#10,T0_INT2
T0_INT2:
定时为100ms,采用方式1,X=216-100000*(6/12)
sbitP1_0=P1^0;
ucharNUM=0;
P1_0=1;
NUM++;
If(NUM==3)P1_0=0;
Elseif(NUM==10)
NUM=0;
P1_0=1;
定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断10次时清0,满20次重新置1。
SETBP1.7
CJNER2,#10,T0_INT1
CLRP1.7
CJNER2,#20,T0_INT2
sbitP1_7=P1^7;
P1_7=1;
If(NUM==10)P1_7=0;
Elseif(NUM==20)
P1_7=1;
定时为100ms,采用方式1,X=216-100000*(6/12)=3CB0H,当中断10次时p1.0=0,外部INT0中断时p1.0=1,启动定时器。
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT0_INT
SETBEX0
SETBIT0
CLRP1.1
SETBP1.0
CLRTR0
T0_INT2:
INT0_INT:
SETBP1.1
sbitP1_1=P1^1;
P1_1=0;
EX0=1;
IT0=1;
If(NUM==10)
P1_0=1;
P1_1=0;
TR0=0;
VoidINT_0(void)interrupt0
P1_0=0;
P1_1=1;
NUM=0;
外部脉冲由管脚输入,可设T0工作于定时器方式1,计数初值为0,当输入高电平时对T0计数,当高电平结束时,计数值乘上机器周期数就是脉冲宽度。
工作方式控制字TMOD=00001001B=09H,计数初值TH1=00、TL0=00H。
汇编语言程序:
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
END
C语言程序:
unsignedchardata*p;
voidmain(void)
TMOD=0x09;
/*T0工作在定时器方式1,GATE=1*/
TH0=0;
TL0=0;
do{}while(P3.2);
/*等待/P3.2引脚变为低电平*/
TR0=1;
/*启动定时器/计