DJNZ R6,$;2VS
DJNZ R7,LOOP0 DJNZ R5,LOOP1 RET
⑶ 中断服务程序(PITO)
中断服务程序的主要功能是进行计时操作。程序开始先判断计数溢出是否满了8次, 满8次表明还没达到最小计时单位秒,中断返回;如满8次则表明已达到最小计时单位秒,顺序继续向下执行,进行计时操作。中断服务程序流程如图9-8所示。
中断子程序清单: INTT0: PUSH ACC
PUSH PSW SETB PSW.3 MOV TL0,#0DCH MOV TH0,#0CH MOV A,30H
DEC A
MOV 30H,A JNZ RET0 MOV 30H,#08H MOV R0,#7AH ACALL DAAD1 MOV A,R2 XRL A,#60H
JNZ
RET0
ACALL CLR0 MOV R0,#7CH ACALL DAAD1 MOV A,R2 XRL
A,#60H JNZ RET0 ACALL CLR0
MOV R0,#7EH ACALL DAAD1 MOV A,R2 XRL
A,#24H JNZ RET0
ACALL CLR0 RET0: POP ACC POP PSW
RETI
⑷ 清缓冲单元子程序 CLR0: CLR A MOV @R0,A
33
1组通用寄存器
1
8次转移 8次开始计时 1
1后秒值在R2 60秒
60S显示单元清0 1 60分 60分显示单元清0 1 24小时 24小时清缓冲单元
0
;现场保护;选;计数器重新加载 ;循环次数减
;不满;满;秒显示缓冲单元;秒加;加;判是否到;不到转移;到;分显示缓冲单元地址;分加;判是否到;到;时显示缓冲单元地址;时加;判是否;到;现场恢复;中断返回;清缓冲单元子程序;十位数缓冲单元清
DEC R0 MOV @R0,A ;个位数缓冲单元清0 RET ;返回 (5) 加1子程序(DAAD1)
加1子程序用于完成对秒、分和时的加1操作,
中断服务程序中在秒、分、时加1时共有三处调用此子程序。加1子程序流程图如图9-7所示。
加1子程序清单:
DAAD1: MOV A,@R0
DEC R0 SWAP A ORL ADD DA
A,@R0 A,#01H A
;;R0= ;加1子程序,十位送A ;十位数占高4位 ;个位数占低4位 ;加1
;十进制调整
;全值暂存R2中
;屏蔽十位数,取个位数 ;个位值送显示缓冲单元
MOV R2,A ANL A,#0FH MOV @R0,A MOV INC ANL SWAP MOV RET DB DB
A,R2 R0
A,#0F0H A
;屏蔽个位数取出十位数 ;使十位数占低4位 ;十位数送显示缓冲单元 ;返回
;字形代码表0 ;字形代码表1 ;字形代码表2 ;字形代码表3 ;字形代码表4 ;字形代码表5 ;字形代码表6 ;字形代码表7 ;字形代码表8 ;字形代码表9 ;字形代码表A ;灭
TAB:
@R0,A 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F8H 80H 90H 88H 0FFH
DB DB DB DB DB DB DB DB DB DB
END
说明:1、上述程序经过软件模拟调试成功,但未与硬件联调。
2、程序中没有日的加1计算。
7.设计一个单片机的双机通信系统。试变成将甲机片外RAM 8001H~9000H存储区的数据块通过串行口传送到乙机片外RAM 3001H~4000H存储区中去。要求发送和接收均采用中断方式。
解:用串行口工作方式1进行甲(发送)、乙(接收)两机的异步通信,串行通信的波特率定为1200bps。
34
定时器T1采用工作方式2,作为波特率发生器。由表5-1可知,fosc取11.059MHz时,定时器T1的初始值为0E8H,波特率为1200。
甲机发送:将甲机外部RAM首地址为8001H~9000H单元的数据块,通过串行口的发送端TXD发送到乙机。
乙机接收:接收来自串行输入端RXD的数据,将接收到的数据块依次存入乙机片外RAM 3001H~4000H存储区中。
;甲机发送程序
ORG LJMP ORG LJMP
ORG TRANSFER: MOV MOV MOV SETB CLR E CLR MOV SETB MOV MOV MOV MOV
SETB
TWAIT:
SJMP ;中断服务程序 TINT: MOV CLR
MOV
CLR
SUBS1:
MOV SUBB MOV MOV SUBB MOV ORL JNZ
35
0000H
TRANSFER 0023H TINT
0100H
TMOD,#20H TH1,#0E8H TL1,#0E8H EA
T1
ES PCON,#10H TR1 SCON,#10H R1,#00H R2,#10H
DPTR,#8001H ES
TWAIT X A,@DPTR
TI SBUF,A C A,R1 A,#1 R1,A A,R2 A,#00
R2,A A,R1
TNEXT
T1方式2
T1装入时间常数 T1中断 T1
1 1000H
;从数据块中取数
;定时器;定时器;禁止;关闭串行口中断;波特率不增倍;启动;置串口方式;数据块长度;数据块首地址;允许串行口中断;等待中断 ;清除串行口中断标志;发送数据;数据块未完,则继续
CLR ES
CLR
TR1
RETI TNEXT: INC DPTR RETI END
;乙机接收程序
ORG 0000H LJMP
RECEIVE ORG
0023H
LJMP RINT ORG 0100H
RECEIVE: MOV TMOD,#20H MOV TH1,#0E8H MOV TL1,#0E8H SETB EA
CLR ET1
CLR ES
MOV PCON,#00H SETB TR1 MOV R2,#10H MOV R1,#00H
MOV DPTR,#3001H
MOV
SCON,#50H SETB ES
RWAIT: SJMP
RWAIT
;中断服务程序 RINT: MOV A,SBUF CLR
RI
MOVX @DPTR,A SUBS1:
MOV A,R1 SUBB A,#1 MOV R1,A MOV A,R2 SUBB A,#00
MOV R2,A ORL A,R1
JNZ
RNEXT
36
;数据结束关中断 ;关定时器
;指向下一个数据单元
;定时器T1方式2 ;定时器T1装入时间常数
;禁止T1中断 ;关闭串行口中断 ;波特率不增倍 ;启动T1
;共接收1000H个字节数据;数据存放区首地址
;串行口方式1,允许接收 ;串行口中断允许 ;等待中断
;接收数据
;清除接收数据中断标志
;存放数据
;未完,则继续
CLR CLR
ES TR1
;接收数据已完成,关中断 ;关闭定时器T1
RETI RNEXT: INC
RETI END
DPTR ;指向下一个单元
37