单片机原理及应用作业参考答案
1.2 单片机的结构特点表现在哪些主要方面?
答:(1)在存储器结构上,严格将程序存储器和数据存储器在空间上分开,并使用不同的寻址方式,使用两个不同的地址指针;
(2)在内部有一个全双工的串行接口;
(3)有一个独立进行操作的位处理器。
1.4 通用单片机的供应状态主要取决于什么?供应状态有哪几种?用户选用单片机的供应状态的原则是什么?
答:通用单片机的供应状态主要取决于片内ROM的配置状态。
(1)片内ROM的配置状态
掩膜ROM,适合于低成本。大批量产品的场合
(2)片内EPROM配置状态
可通过高压脉冲写入应用程序到EPROM,适合于开发样机,小批量生产。
(3)片内无ROM配置状态
必须外扩EPROM,价格低,使用灵活,适合于需要外接能在现场进行修改和更新程序存储器的应用场合。
2.3 单片机的EA端有何功用?8031的EA端应如何处理,为什么? 答:EA端是访问外部程序存储器的控制信号:当EA无效时,访问内部ROM,当EA为有效时,访问外部ROM。由于8031没有内部ROM,所以EA端必须接低电平。
2.4 MCS-51引脚中有多少I/O线?它们与单片机对外的地址总线、数据总线和控制总线有什么关系?地址总线和数据总线各是几位?
答:MCS-51引脚中有32根I/O线,一般由P0口提供单片机对外的数据总线,同时作为分时复用的地址总线的低8位,由P2口作为地址总线的高8位,控制总线由第二功能的状态下的P3口以及RST、EA、ALE和PSEN提供。
2.5 8051单片机的内部数据存储器可以分为哪几个不同的区域?各有什么特点?
答:数据存储器主要分为两个区域:00H~7FH是真正的RAM区,80H~FFH专门用作特殊功能寄存器的区域。其中00H~7FH可分为三个区域:00H~1FH为四组工作寄存器;20H~2FH为128位位寻址区,30H~7FH为一般RAM区。
2.6 单片机对外有几条专用控制线?其功能是怎样的?
答:单片机对外的专用控制线有4条,分别是:
(1)PSEN: 外部取指操作,在访问外部ROM时,PSEN信号自动产生;
(2)ALE/PROG:ALE为地址锁存允许信号,在访问外部ROM或RAM时,用来锁存P0口的低8位地址。第二功能PROG是对8751的EPROM编程时,编程脉冲输入。
1
(3)EA/VPP:EA是访问外部程序存储器的控制信号,EA无效时,访问内部ROM,EA有效时,访问外部ROM,第二功能VPP为对8751EPROM的21V编程电源输入。
(4)RST/VPD:RST是复位信号输入端,第二功能VPD是备用电源输入端。
2.8 有哪几种方法使单片机复位?复位后各寄存器、RAM中的状态如何?
答:单片机的复位方式有两种,上电自动复位和按钮复位。复位后各寄存器状态为:
PC 0000H ACC 00H PSW 00H SP 07H DPTR 0000H
P0~P3FFH IP XX000000B IE 0X000000B TMOD 00H
TCON 00H TL0 00H TH0 00H TL1 00H TH1 00H
SCON 00H SBUF XXH PCON 0XXX0000B
2.9 在8051扩展系统中,片外程序存储器和片外数据存储器使用相同的地址编址,是否会在数据总线上出现争总线的现象?为什么?
答:不会发生争总线的现象,因为从外部ROM取指令需要用ALE和PSEN信号控制读取操作,由P2和P0提供地址;而片外数据存储器的读写除了地址之外还要RD、WR控制,所以不会争总线。
2.10 如果8051端口P0~P3作为通用I/O口使用,则在输入引脚数据时应注意什么?
答:8051的P1、P2和作为一般输入I/O口的P以及第一功能的P3口均为准双向口,在输入数据时应先向端口写1,然后方可作为高阻输入。以使其场效应管T2截止,才不会影响输入电平。
3.2 若要完成以下的数据传送,应如何用MCS-51的指令实现?
(1)R1的内容传送到R0 (5)ROM2000H单元的内容传送到R0
MOV A,R1 MOV DPTR,#2000H
MOV R0,A CLR A
MOVC A,@A+DPTR (2)外部RAM20H单元的内容传送到R0
MOV R0,#20H MOV R0,A
MOVX A,@R0 (6)ROM2000H单元的内容传送到内部RAM20H单元 MOV R0,A MOV DPTR,#2000H
CLR A (3)外部RAM20H单元的内容传送到内
MOVC A,@A+DPTR 部RAM20H单元
MOV R0,#20H MOV 20H,A
MOVX A,@R0 (7)ROM2000H单元的内容传送到外部RAM20H单元 MOV 20H,A MOV DPTR,#2000H
CLR A (4)外部RAM1000H单元内容传送到内
MOVC A,@A+DPTR 部RAM20H单元
MOV DPTR,#1000H MOV R0,#20H
MOVX A,@DPTR MOVX @R0,A
MOV 20H,A
3.3 间接转移指令JMP @A+DPTR有何优点?为什么它能代替众多的判跳指令?试举例说明。
答:该间接转移指令的转移地址由A的内容和数据指针DPTR的内容之和决定,且两者都是无符号数,由DPTR决定多分支转移程序的首地址,由A的不同值实现多分支转移。因为可以根据A的内容进行分支转移,所以可以替代众多判跳指令。
如:根据A的内容调用相应的程序,如A为0调用OP0,A为1调用OP1,这里A的值小于128。 MOV DPTR,#OPTAB
2
RL
JMP A @A+DPTR
…
OPTAB: ACALL OP0
ACALL OP1
ACALL OP2
…
3.4 设内部RAM的30H单元的内容为40H,即(30H)=40H,还知(40H)=10H,(10H)=00H,端口P1=0CAH。问执行以下指令后,各有关存储器单元、寄存器以及端口的内容(即R0、R1、A、B、P1以及40H、30H、10H单元的内容)。
MOV R0,#30H ;(R0)=30H
MOV A,@R0 ;(A)=(30H)=40H
MOV R1,A ;(R1)=40H
MOV B,@R1 ;(B)=(40H)=10H
MOV @R1,P1 ;(40H)=0CAH
MOV P2,P1 ;(P2)=0CAH
MOV 10H,#20H ;(10H)=20H
MOV 30H,10H ;(30H)=20H
3.5 已知8751单片机的P1口为输出,经驱动电路接有8只发光二极管。当输出位是1时,发光二极管点亮;输出位是0时发光二极管熄灭。试分析下述程序的执行过程及发光二极管的发光情况。 LP: MOV P1,#81H ;1000 0001B LCALL DELAY
LCALL DELAY MOV P1,#24H ;0010 0100B MOV P1,#42H ;0100 0010B LCALL DELAY
LCALL DELAY MOV P1,#42H ;0100 0010B MOV P1,#24H ;0010 0100B LCALL DELAY
LCALL DELAY SJMP LP
MOV P1,#18H ;0001 1000B
答:程序执行MOV P1,#DATA后,根据DATA的每位的值点亮相应的LED,调用延时程序使点亮的LED保持一段时间。LED发光的情况为:每次同时点亮两个LED并从两边向中间移动,然后再向两边移动,并一直循环。
3.6 在上题中,若系统的晶体振荡器频率为6MHz,求子程序DELAY的延时时间。
DELAY: MOV R2,#0FAH ;①2μS
L1: MOV R3,#0FAH ;②2μS
L2: DJNZ R3,L2 ;③4μS
DJNZ R2,L1 ;④4μS
RET ;⑤4μS
0FAH=250D
其中③执行250次,执行时间为250×4μS
其中②③④循环250次,该循环执行时间为(2+250×4+4)×250μS
加上①和⑤的执行时间,DELAY的延时时间为2+(2+250×4+4)×250+4=251.506ms
延时程序的设计:
首先设计内循环:
MOV R3,#data1 ;2μs
NOP ;2μs
DJNZ R3,$ ;4μs×data1
延时时间t1=2+2+4×data1=4×(data1+1)=1000μs=1ms,则data1=249
3
若需要大于1ms时间,则先增加一层循环
MOV R2,#data2 ;2μs
L1: MOV R3,#data1 ;2μs
NOP ;2μs
DJNZ R3,$ ;4μs×data1
DJNZ R2,L2 ;(4μs+t1)×data2
延时时间为:2+(4μs+t1)×data2=2+[4μs+4×(data1+1)]×data2=
=2+4×(data1+2)×data2=250ms,这里将data1修正为248,
得
2+4×(248+2)×data2=2+1000×data2=250ms则data2=250
3.7 根据图3-3线路,试设计灯亮移位程序,使8只发光二极管每次亮一个,循环右移或左移,一个一个地亮,循环不止。
MOV A,#80H
DIS: MOV P1,A
ACALL DELAY
RR A
AJMP DIS
3.8 设逻辑运算表达式为:
YA(BC)D(EF) 其中变量A,B,C分别为P1.0、P1.4、定时器1溢出标志TF1,D,E,F分别为22H.0、22H.3、外中断方式标志IE1;输出变量为P1.5。试编写实现上述逻辑功能的程序段。
MOV C,P1.4
ORL C,/TF1 ;(BC)
ANL C,P1.0 MOV F0,A
MOV C,22H.3
ORL C,/IE1 ;A(BC) ;用户自定义标志位,暂存数据 ;(EF)
ANL C,22H.0 ;D(EF)
CPL C ;D(EF)
ORL C,/F0 ;A(BC)D(EF)
MOV P1.5,C
4.1 试设计数据块传送程序,将起始地址为0400H的100个连续单元中的内容送到以4000H为首址的区域中去
解:分析:地址为16位,且进行数据传送,所以连续单元应为外部的存储器,只能使用外部数据传送指令,由于源和目的地址都为16位,所以要保存DPTR的值,但源低8位和目的低8位相同,可以用一个寄存器保存。
MOV R0,#00
NEXT: MOV DPH,#04H
MOV DPL,R0
MOVX A,@DPTR
MOV DPH,#40H
MOVX @DPTR,A
INC R0
CJNE R0,#100,NEXT
4.2 试编写程序,计算片内RAM区40H~47H8个单元中数的算术平均值,结果存放在4AH中。
解:分析:8个数总和最大值为FFH×8=7F8H,所以求和时必须用两字节加法,设R7保存和高8位,R6保存低8位,求和后再除以8即得算术平均值,这里需使用16/8除法,但因为除数为23,所以可以直
4
接通过算术右移3位实现除以8,前提存储的数据为无符号数。
MOV R0,#40H
MOV R6,#00H ;和低字节清零
MOV R7,#00H ;和高字节清零
NEXT : MOV A,@R0 ;取出一个字节
INC R0 ;地址指针下移
ADD A,R6 ;低字节求和
MOV R6,A ;保存和的低字节
CLR A
ADDC A,R7 ;如果低字节求和有进位,则加至高字节
MOV R7,A ;保存和的高字节
CJNE R0,#48H,NEXT
MOV R1,#03H ;循环移位3次,实现除以8
DIV8: CLR C
MOV A,R7
RRC A ;高字节先移位,将D0移至C
MOV R7,A
MOV A,R6
RRC A ;将C移入低字节的D7,从而实现16位数据的移位
MOV R6,A
DJNZ R3,DIV8
16位除以8位除法子程序:
被除数R6R5,除数R4,商R3R2,余数R1
DIV168: JC NEXT
MOV R3,#00H MOV A,R2
MOV R1,#00H ADD A,#01H
NEXT2: MOV R2,A
CLR C JNC NEXT2
MOV A,R5 INC R3
SUBB A,R4 AJMP NEXT2
MOV R5,A NEXT: MOV A,R5
MOV A,R6 ADD A,R4
SUBB A,#00H MOV R1,A
MOV R6,A RET
4.3 设有两个长度为15的数组,分别存放在0200H和0500H为首地址的存储区域中,试编写程序求其对应项之和,结果存放在以0300H为首地址的存储区域中。
解:分析:0200H和0500H都是片外地址,必须利用MOVX指令获取数据,这将导致DPTR使用不方便,解决办法:
(1)0200H,0500H和0300H低字节地址相同,可以共用DPL,DPH单独处理;
(2)可以考虑先将两个存储区的数据先转移到内部RAM中,然后再进行运算。
这里只是求对应项之和,并不是多位数求和,两数相加,可能产生进位,这里应该只考虑没有进位的情况。
这里采用第一种方法
5
MOV R0,#15 MOVX A,@DPTR
MOV DPL,#00H ADD A,B
NEXT: MOV DPH,#02H MOV DPH,#03H
MOVX A,@DPTR MOVX @DPTR,A
MOV B,A INC DPTR
MOV DPH,#05H DJNZ R0,NEXT
4.4 在起始地址为2100H,长度为64的数表中找F的ASCII码,并将其地址送到1000H和1001H单元中去。
解:都为RAM单元,只要找到“F”,则停止查找。利用寄存器R7保存高8位地址,R6保存低8位地址。
SF: MOV DPTR,#2100H MOVX @DPTR,A
MOV R0,#64 INC DPTR
NEXT1:MOVX A,@DPTR MOV A,R7
CJNE A,#4FH,NEXT2 MOVX @DPTR,A
MOV R7,DPH AJMP SFEND
MOV R6,DPL NEXT2:INC DPTR
MOV DPTR,#1000H DJNZ R0,NEXT1
MOV A,R6 SFEND: RET
4.5 设计一个多字节无符号数加法子程序和减法子程序。
解:
(1)多字节无符号数加法 (2)多字节无符号数减法
设R0为加数首地址,R1为被加数首地址,R2设R0为被减数首地址,R1为减数首地址,R2为字节数 为字节数
JIAFA: CLR C JIANFA: CLR C
NEXT: MOV A,@R0 NEXT: MOV A,@R0
ADDC A,@R1 SUBB A,@R1
MOV @R0,A MOV @R0,A
INC R0 INC R0
INC R1 INC R1
DJNZ R2,NEXT DJNZ R2,NEXT
RET RET
4.6 试设计一个双字节无符号数乘法子程序和除法子程序。
解:设被乘数为R7R6,乘数为R5R4,结果存于R3R2R1R0 R7 R6R5 R4
C2 C1C4 C3C6 C5R6×R4=C2 C1R7×R4=C4 C3R6×R5=C6 C5R7×R5=C8 C7
设被除数为R7R6,除数为R5R4,商存于R3R2,余数存于R1R0
将被除数减除数,够减商加1,然后将差作为被减数,继续前面的减法操作,直到不够减为止,这时需要恢复余数。
6
MUL1616:MOV A,R6 MOV A,B MOV R2,A MOV B,R4 ADC A,#0 MOV A,R7 MUL AB MOV R2,A MOV B,R5 MOV R0,A MOV A,R6 MUL AB MOV R1,B MOV B,R5 ADD A,R2 MOV A,R7 MUL AB MOV R2,A MOV B,R4 ADD A,R1 MOV A,B MUL AB MOV R1,A ADC A,#0 ADD A,R1 MOV A,B MOV R3,A MOV R1,A ADC A,R2 RET
DIV1616:MOV DPTR,#0 JC NEXT MOV R1,A LOOP: CLR C INC DPTR MOV A,DPH MOV A,R6 JMP LOOP MOV R3,A SUBB A,R4 NEXT: MOV A,R6 MOV A,DPL MOV R4,A ADD A,R4 MOV R2,A MOV A,R7 MOV R0,A RET
SUBB A,R5 MOV A,R7
MOV R7,A ADC A,R5
4.7 在3000H为首的存储器区域中,存放着14个由ASCII码表示的0~9之间的数,试编写程序将它们转换成BCD码,并以压缩BCD码的形式存放在2000H~2006H单元中。
解:0~9的ASCII码为30H~39H,首先必须去掉其中的3,可以通过减去30H实现,也可通过ANL实现。另外还得将两个BCD码压缩成一个BCD码,注意低地址对应低字节,比如3000H为31H(低字节),3001H为38H(高字节),合并后应为81H,存于2000H单元,可利用ORL或ADD进行合并。 由于涉及到源和目的地址都为16位,为了方便操作,现将转换结果存于内部RAM。
MOV R0,#30H MOV @R0,A
MOV R1,#14 INC R0
MOV DPTR,#3000H CJNE R1,#37H,NEXT
MOV R0,#30H NEXT: MOVX A,@DPTR ;取出低字节
MOV DPTR,#2000H INC DPTR ;源区地址指针下移
NEXT2:MOV A,@R0 ANL A,#0FH ;低字节转换为BCD码
INC R0 MOV R4,A ;暂存数据
MOVX @DPTR,A MOVX A,@DPTR ;取出高字节
INC DPTR INC DPTR
CJNE R0,#37H,NEXT2 ANL A,#0FH ;高字节转换为BCD码
SWAP A ;高低四位互换
ORL A,R4 ;将两个BCD码合并
4.8 编写一段程序,模拟如图所示的逻辑电路的逻辑功能,要求将四个输入与非门的逻辑模拟先写成一个子程序,然后以多次调用得到整个电路的功能模拟。设X、Y、Z和W都已定义为位地址,若程序中还需要其他地址标号,也可以另行定义。
解:
方法一:设计四输入与非门子程序,利用子程序必定要传递参数,但位操作的传送指令必须由C完成,所以调用子程序时参数传递较复杂。
7
MOV C,W MOV 00H,C MOV C,Z CPL C MOV 01H,C MOV C,Y MOV 02H,C MOV C,X MOV 03H,C ACALL NAND4 MOV 04H,C
SETB MOV MOV MOV MOV MOV MOV ACALL MOV
00H C,X 01H,C C,Y 02H,C C,Z 03H,C NAND4 05H,C
CPL MOV CPL MOV MOV MOV ACALL
01H C,Y C 02H,C C,W 03H,C NAND4
SETB 00H MOV C,X MOV 01H,C
方法二:利用宏实现MACRO,宏可以带参数,所以参数传递将很方便 NAND4 MACRO A1,A2,A3,A4 MOV ONE,C
MOV C,A1 NAND4 X,Y,ONE,W ANL C,A2 MOV 04H,C ANL C,A3 SETB ONE ANL C,A4 NAND4 X,Y,ONE,W CPL C MOV 05H,C ENDM CPL Y SETB ONE
ORG 0000H NAND4 X,Y,ONE,W AJMP MAIN MOV 06H,C ORG 0030H SETB ONE MAIN: MOV C,Z NAND4 04H,05H,06H,ONE CPL C MOV F,C
5.3已知8051单片机系统时钟频率为6MHz,试利用定时器T0和P1口输出矩形脉冲,其波形如图所示(建议用方式2)。
解:定时器T0的工作方式:方式2,定时方式,所以TMOD为:0000010(02H) 定时初值:(28-TH0初值)×时钟周期×12=(28-X)×(1/6M)×12=40μs X=236=0ECH,360μs则为9次定时中断
MOV TMOD,#02H JNB TF0,$ MOV TH0,#0ECH CLR TF0 MOV TL0,#0ECH NEXT1: CLR P1.0 CLR P1.0 WAIT2: JNB TF0,$ SETB TR0 CLR TF0
NEXT3: MOV R0,#09H DJNZ R0,WAIT2
SETB P1.0 AJMP NEXT3
8
SETB 00H
MOV 01H,C MOV C,04H MOV 02H,C MOV C,05H MOV 03H,C ACALL NAND4 MOV F,C AJMP $
NAND4: MOV C,00H ANL C,01H ANL C,02H ANL C,03H CPL C RET END
5.4 要求8051单片机定时器的定时值以内部RAM的20H单元的内容为条件而改变;当(20H)=00H时,定时值为10ms;当(20H)=01H时,定时值为20ms。请根据以上要求编写相应程序。 解:采用定时器T0,工作方式:方式1,定时方式,所以TMOD为:0000001(01H)
定时初值:(216-T0初值)×时钟周期×12=(216-X)×(1/6M)×12=(216-X)2μs=10[(20H)+1]1000μs
10[(20H)1]10006553650005000(20H) 2
605365000(20H)EC78H1388H(20H) X65536
(这里20H单元的内容最大为12,否则超出16为定时器的范围)
TIMER:MOV A,20H
MOV B,#88H
MUL AB ;88H×(20H)
MOV R0,A ;R0保存低字节
MOV R1,B ;R1保存高字节
MOV A,20H
MOV B,#13H
MUL AB ;13H×(20H)
ADD A,R1
MOV R1,A ;只要限制20H单元内容小于13,1388H×(20H)即为两字节
CLR C
MOV A,78H
SUBB A,R0 ;78H减去1388H×(20H)的低字节
MOV TL0,A
MOV A,#0ECH
SUBB A,R1 ;ECH减去1388H×(20H)的高字节
MOV TH0,A
MOV TMOD,#01H
SETB TR0
WAIT: JNB TF0,WAIT
RET ;定时时间到
上述定时初值的设置适合(20H)为00H~12H,即可以实现10ms~190ms的定时。
若仅仅是10ms和20ms两种情况,初值设置将更简单
X00H60536EC78H X01HEC78H1388H(01H)D8F0H
TIMER: MOV A,20H MOV TH0,#0D8H
CJNE A,#00H,NEXT1 MOV TL0,#0F0H
MOV TH0,#0ECH NEXT2: MOV TMOD,#01H ;T0工作方式 MOV TL0,#78H SETB TR0 AJMP NEXT2 WAIT: JNB TF0,WAIT NEXT1: CJNE A,#01H,NEXT2 RET ;定时时间到
5.5 试用定时器T1设计外部事件计数器。要求每计数1万个脉冲,就将T1转为10ms定时方式,当定时到后,又转为计数方式,如此反复循环不止。设系统的时钟频率为6MHz,建议选用方式1编写相应程序。
解:T1工作方式为方式1,计数方式:TMOD:01010000(50H),定时方式:TMOD:00010000(10H) 计数初值X=M-计数模值=65536-10000=55536=D8F0H
定时初值(65536-X)×2=10000,X=60536=EC78H
MAIN: MOV TMOD,#50H WAIT1: JBC TF1,NEXT1
MOV TL1,#0F0H AJMP WAIT1
MOV TH1,#0D8H NEXT1: MOV TMOD,#10H
SETB TR1 MOV TL1,#78H
9
MOV TH1,#0ECH AJMP WAIT2
WAIT2: JBC TF1,MAIN
5.7 利用8051单片机定时器测量某正脉冲宽度宽度,采用何种工作方式可以获得最大的量程?若时钟频率为6MHz,则允许测量的最大脉宽是多少?
解:要获得最大量程,那么定时/计数器的计数值必须达到最大,只有方式1是工作在16位计数模式。 因为测脉宽,所以定时/计数器工作于定时方式,且由外部中断引脚电平启动定时。
最大定时时间为:(M-X)×T=(65536-0)×12×1/6MHz=131.072ms
7.3 某异步通讯接口,其帧格式由一个起始位,7个数据位,1个奇偶校验位和一个停止位组成。当该接口每分钟传送1800个字符时,计算其传送波特率。
解:由帧格式可知:一个字符由1+7+1+1=10位组成,波特率=1800×10/60=300波特。
7.6 为什么定时器T1用作串行口波特率发生器时常采用工作方式2?若已知T1设置成方式2,用作波特率发生器,系统时钟频率为11.0592MHz,求可能产生的最高和最低的波特率各是多少?
答:因为定时器T1的方式2为自动重装定时初值,这样操作方便,也避免了因重装定时初值引起的定2SMODfOSC1时误差。由波特率= 3212256初值
当初值为0,SMOD=0时,得到最低波特率=112.5
当初值为255,SMOD=1时,得到最低波特率=57.6K
7.7在8051应用系统中,时钟频率为6MHz。现需利用定时器T1方式2产生1200波特的波特率。试计算定时器的初值,并指出实际得到的波特率与所要求的波特率是否有误差。 2SMODfOSC1解:根据波特率计算公式 3212256初值
2SMOD6MHz11SMOD1200156252 3212256初值256初值
当SMOD=0时,初值为243,此时实际的波特率为:1201.92
当SMOD=1时,初值为230,此时实际的波特率为:1201.92
所以实际波特率与要求的波特率有误差。
7.8 试设计一个8051单片机的双机通讯系统,并编写程序将A机片内RAM40H~5FH的数据块通过串行口传送B机的片内RAM 60H~7FH中去。
解:该双机通讯系统,是将A机数据发送到B机,所以可以采用单工工作方式
串行口采用方式1 10位异步收发,采用查询方式
MOV R0,#40H A机:发送
MOV TMOD,#20H CLR TI
MOV TL1,#0F3H NEXT: MOV A,@R0
MOV TH1,#0F3H INC R0
SETB TR1 MOV SBUF,A
MOV SCON,#40H JNB TI,$
10
CJNE R0,#60H, NEXT MOV R0,#60H
AJMP $ NEXT: CLR RI
JNB RI,$ B机:接收
MOV TMOD,#20H MOV A,SBUF
MOV TL1,#0F3H MOV @R0,A
MOV TH1,#0F3H INC R0
SETB TR1 CJNE R0,#80H, NEXT
MOV SCON,#50H AJMP $
8.1 8051有几个中断源,各中断标志是如何产生的,又是如何复位的?CPU响应中断时其中断入口地址各是多少?
答:8051有5个中断源,分别是外部中断0,定时器T0中断,外部中断1,定时器T1中断,串行口中断。中断入口地址分别为0003H,000BH,0013H,001BH,0023H。
定时器中断标志TF1和TF0是当计数器溢出时产生的,CPU响应中断时能自动清除;外部中断IE1和IE0则是根据外部INT1和INT0的变化产生的,只有边沿方式的IE1和IE0能在响应中断是自动清除,电平方式的只能软件清除;串行口中断标志RI,TI是在串行口接收和发送是产生的,它们只能利用软件清除。
8.3 如何区分串行通讯中的发送中断和接收中断?
答:串行通讯中,发送和接收中断共用一个中断入口地址,但可以通过RI和TI标志判断是哪种中断,TI=1表示发送中断,RI=1表示接收中断。
8.4 如何设定外部中断源是采用边沿触发还是电平触发?这两种中断触发所产生的中断过程有和不同?
答:可通过IT1和IT0标志位进行设置,IT=0时,为电平触发,IT=1时,为边沿触发。电平触发,CPU响应中断时不会清除IE标志,所以中断返回前应撤销INT引脚上的低电平;边沿触发方式,CPU连续两个机器周期采样到先高后低的电平,则置位IE标志,CPU响应中断时由硬件清除IE标志。
8.7试用中断方法设计秒、分脉冲发生器,即由8051的P1.0每秒钟产生一个机器周期的正脉冲,由P1.1每分钟产生一个机器周期的正脉冲。
解:设系统时钟为6MHz,由定时器完成定时,最大定时时间为65536×2us=131096us=131.096ms,所以设置定时器定时时间为100ms,10次定时为1秒钟,60次一秒为一分钟,所以设置两个计数器分别对10和60计数
(M-X)×2us=100ms,所以X=15536=3CB0H
ORG 0000H MOV R4,#60
AJMP MAIN MOV R3,#10
ORG 0023H STB ET0
AJMP INTTIMER SETB EA
MAIN:
MOV TH0,#3CH INTTIMER:
MOV TL0,#0B0H MOV TL0,#0B0H
MOV TMOD,#01H MOV TH0,#3CH
SETB TR0 DJNZ R3,INTEND
CLR P1.0 SETB P1.0
CLR P1.1 CLR P1.0
11
MOV R3,#10 CLR P1.1
DJNZ R4,INTEND MOV R4,#60
SETB P1.1 INTEND: RETI
8.8 试运用定时器中断技术设计一个秒闪电路,其功能是使发光二极管LED每秒钟闪亮400ms,设系统主频为6MHz。
答:分析题目可知每秒钟LED闪亮400ms,也就是600msLED灭,那也就是只要LED亮400ms,灭600ms即满足要求,即要实现两个延时,根据定时/计数器延时计算公式:(M-X)T=定时值,最大定时值为65536×2us=131.072ms,不足400ms,所以设置基本延时为100ms,400ms和600ms定时通过多次基本延时实现。(M-X)×2us=100ms,所以X=15536=3CB0H
程序如下:
LED
ORG
AJMP
ORG
AJMP
MAIN:
MOV
MOV
MOV
SETB
MOV
STB
SETB
INTTIMER:
MOV
MOV
INC
CJNE
CLR
AJMP
NEXT:
CJNE
SETB
MOV
INTEND: EQU P1.0 0000H MAIN 0023H INTTIMER TH0,#3CH TL0,#0B0H TMOD,#01H LED R3,#00H ET0 EA TL0,#0B0H TH0,#3CH R3 R3,#04H,NEXT LED INTEND R3,#0AH,INTEND LED R3,#00H RETI
12
百度搜索“爱华网”,专业资料,生活学习,尽在爱华网