MAIN: MOV A,#0FEH
MOV P1,A ;第一灯亮 SETB EA
SETB EX0 SETB IT0 SJMP $
汇编语言中只有一个中断源,不存在占用别的中断源向量地址问题,程序顺序排下,应注意程序的执行过程。C语言无循环移位指令移位后,后面补零,因此和01相或。 4.14 略 4.15
图4.13
ORG 0000H AJMP MAIN
ORG 0003H ;中断服务 XRL P1,#0FFH DJNZ R0,NE CLR EA
ORG 0030H SETB EX0
SETB IT0 MOV P1,#0FFH
MOV R0,#0AH
SJMP $ ;等待中断
MAIN: SETB EA
NE: RETI
因一亮一灭为一次,所以共十次。
aa EQU 08H ;存储高四位的段码 bb EQU 09H ;存储第四位的段码 i EQU 0AH ORG 0000H AJMP MAIN ORG 0013H AJMP INTR MOV DPTR,#Tab CLR A
MOVC A,@A+DPTR MOV aa,A MOV bb,A CLR P3.0 CLR P3.1 SETB EA SETB EX0 SETB IT0 SETB P3.0 CLR P3.1 MOV P1,bb CLR P3.0
;显示低位
ACALL Delay ;延时
;开中断
;a=b=Tab[0] ;存储计数值
DB 3FH,06H…… ;段码表略
4.16 两个数码管阳极经驱动器接P1口,阴极分别接P3.0、P3.1。
位] 位]
SETB EX0 RETI END
MOV A,i ANL A,#0F0H SWAP A ;取i的高位 MOVC A,@A+DPTR MOV aa,A
;查表a=Tab[i的高
SETB P3.1 MOV P1,aa SJMP LOOP CLR EX0 INC i MOV A,i ANL A,#0FH MOV DPTR,#Tab MOVC A,@A+DPTR MOV bb,A
;查表b=Tab[i的低
;取i的低位
;i加一 ;显示高位
ACALL Delay ;延时
Tab:
INTR:
MAIN:
LOOP:
Delay: ;略
4.17 提示:将X1至X3分别接至一个三输入或非门的三个输入端,同时还分别接至单片机的三个IO口,或非门的输出端接至单片机的外部中断引脚。中断服务程序中检查三个IO口的值,便可知道具体的故障源。程序略。
第五章、单片机的定时/计数器与串行接口
5.1~5.3 请参考教材
5.4 方式0: 16.38ms 方式1: 131ms 方式2: 512μs 5.5 使用方式2 计数初值C=100H-0AH=F6H 查询方式:
ORG 0000H MOV TMOD,#06H MOV TH0,#0F6H
ABC: JNB TF0,$ CLR TF0 CPL P1.0 SJMP ABC
MOV TL0,#0F6H SETB TR0 中断方式:
ORG 0000H
MOV TH0, #0F6H SETB EA SETB ET0 SETB TR0
SJMP $ ; 等待中断
AJMP MAIN ORG 0000BH CPL P1.0 RETI
MAIN: MOV TMOD,#06H
5.6 1000HZ的周期为1ms,即要求每500μsP1.0变反一次,使用方式T1方式1,MC=12 / fosc=1μs,
C=2-500μs /1μs =FE0CH,除TMOD=10H,TH0=FEH,TL0=0CH外, 程序与5.5题相同,注意每次要重置TH0和TL0
5.7 f=6MHz MC=2μs 方式2的最大定时为 512μs合乎题目的要求。50μs时,计数初值为
C1=256-25=E7H,350μs时计数初值为C2=256-175=51H 汇编语言程序
ORG 0000H MOV TH0,#51H
SJMP AB1 EXT: SETB P1.2
MOV TH0,#0E7H
MOV TL0,#0E7H AB2: JBC TF0,NEXT SJMP AB2
MOV TMOD,#02H
NEXT:
MOV TL0,#51H CLR P1.2 SETB TR0 AB1: JBC TF0,EXT
上述的计数初值没有考虑指令的执行时间,因此误差较大,查每条指令的机器周期,扣除这些时间,算得C=E3H,这样误差较小。
5.8 P1.0输出2ms脉冲,P1.0输出50μs脉冲。
汇编语言程序 ORG 0000H
MOV TMOD,#02H MOV TH0,#06H MOV TL0,#06H SETB TR0
MOV R0,#04H
NE: JNB TF0,$ CLR TF0 CPL P1.1 DJNZ R0,NE
16
CPL P1.0 5.9
ORG 0000H MOV TMOD,#15H LCALL Counter LCALL Timer SJMP LOOP MOV TL0,#18H SETB TR0 CLR TR1 JNB TF0,$
AJMP NE
CLR TF0 RET
MOV TL1,#30H SETB TR1 CLR TR0 JB TF1,$ CLR TF1 RET END
MAIN: LOOP:
Timer: MOV TH1,#0F9H
Counter: MOV TH0,#0FDH
5.10 略
5.11 参见教材5.3.1节
5.12 方式3为每桢11位数据格式 3600*11/60=660(波特)
5.13 T1的方式2模式不需要重装时间常数(计数初值),不影响CPU执行通信程序.
设波特率为fbaut计数初值为x, 依据公式 fbaut=2
somd
/32*(fosc/12(256-x)) 求得x=256-((2D/32)*(fosc/fbaut)) fbaut=(1/32)*( fosc/(12(256-0))=61
SMO
5.14 最低波特率为T1定时最大值时,此时计数初值为256,并且SOMD=0,
最高波特率为T1定时最小值(1)且SOMD=1时
fbaut=(2/32)* fosc/(12(256-1))=31250
5.15 取SMOD=1 计算TH1=TL1=B2
发送
ORG 0000H
NEXT: MOV SBUF,A TES:
JBC T1,ADD1
SJMP TES ADD1: INC A
CJNE A,#20H,NEXT SJMP $ END
MOV TMOD,#20H MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1 MOV SCON,#40H MOV A,#0
接收
ORG 0000H MOV TMOD,#20H MOV TH1,#0B2H MOV TL1,#0B2H SETB TR1 MOV SCON,#50H MOV R0,#20H
TEC: JBC RI,REC
SJMP TEC INC R0
CJNE R0,#40H,TEC SJMP $ END
REC: MOV @R0,SBUF
5.16 略
5.17利用串行通信方式2(波特率固定),采用奇校验方式,将校验位放在TB8中,乙机检验校验位,
如正确,则存于片外4400H开始的RAM中,如错误,通知对方重发,R6存放数据块长度汇编语言程序如下:
发方 ORG 0000H MOV DPTR,#3400H MOV R6,#0A1H MOV SCON,#90H MOV SBUF,R6
L2: JBC T1,L3 AJMP 1.2 L3: MOV 1,@DPTR
JB P,L4
SETB TB8
L4: MOV SBUF ,A 收方 ORG 0000H MOV DPTR,#4400H MOV SCON,#90H L1: JBC RI,L2 AJMP L1 L2: MOV A,SBUF MOV R6,A L3: JBC RI,L4 AJMP L3 L4: MOV A,SBUF
JB P, L5 JNB RB8,L8
SJMP $ 5.18 电路图见教材中图5.18,程序如下:
ORG 0000H MOV R5,#03H CLR A MOV SCON,A LOOP: SETB P3.3
CLR A MOV R7,A
DEF: MOV A,R5
;循环4次
MOV DPTR,#tab
MOVC A,@A+DPTR;查表A=tab[R5] MOV SBUF,A DEC R5 JNB T1,$ CLR T1
CJNE R5,#0FFH,ABC;若R5==255,则
R5=7
MOV R5,#07H
L5: JBC T1,L6 AJMP L5 L6: JBC RI,L7 AJMP L6
L7: MOV A,SBUF
CJNE A,#0FF0H,L8 AJMP L3 L8: INC DPL
DJNZ R6,L4
SJMP $ L5: JB JB8,L8 L6: MOVX @DPTR,A INC DPL INC DPH DJNZ R6,L3 SJMP $ L8: MOV A,#0FFH MOV SBUF,A L9: JBC TI,L3
AJMP L9 SJMP $
END
ABC: INC R7
CJNE R7,#04H,DEF ;循环4次CLR P3.3 LCALL timer SJMP LOOP
timer: MOV A,#64H FOR: JZ ENDD
MOV TMOD,#01H MOV TH0,#0D9H MOV TL0,#0F0H SETB TR0 JNB TF0,$ CLR TF0 DEC A
SJMP FOR
ENDD: RET
tab: DB 0c0H,0f9H,0a4H……;略