第21题[问答题] 难度系数(一般)
设有甲、乙两台单片机,编出两台单片机间实现如下串行通讯功能的程序。
甲机发送:将首址为ADDRT的128个字节的数据块顺序向乙机发送;
乙机接收:将接收的128个字节的数据,顺序存放在以首址为ADDRR的数据缓冲区中。
sad
参考答案:
发送程序如下;
ORG 0000H
LJMP MAINT ;跳至主程序入口
ORG 0023H
LJMP INTSE1 ;转至串行中断服务程序
MAINT: MOV SCON,#01000000B ;置串行口工作方式1
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0D9H ;产生400波特率的时间常数
MOV TL1,#0D9H
SETB TR1 ;启动定时器1
SETB EA ;开中断
SETB ES ;串行口开中断
MOV DPTR,#ADDRT ;首址送DPTR
MOV R0,#00H ;传送字节数初值
MOVX A,@DPTR ;取第一个发送字节
MOV SBUF,A ;启动串行口发送
SJMP $
;中断服务程序
INTSE1: CLR TI ;将中断标志清零
CJNE R0,#7FH,LOOP ;判别128个字节都发送完没有
CLR ES ;全部发送完毕,禁止串行口中断
SJMP ENDT ;转中断返回
LOOP: INC R0 ;修改字节数指针
INC DPTR ;修改地址指针
MOVX A,@DPTR ;取发送数据
MOV SBUF,A ;启动串行口
ENDT: RETI ;中断返回
END
接收程序如下:
ORG 0000H
LJMP MAINR ;转主程序
ORG 0023H
LJMP INTSE2 ;转串行口中断服务程序
MAINR: MOV SCON,#01010000B ;串行口为接收口,在工作方式1
MOV TMOD,#20H ;定时器1为工作方式2
MOV TH1,#0D9H ;产生400波特率的时间常数
MOV TL1,#0D9H
SETB TR1 ;启动定时器1
SETB EA ;开中断
SETB ES ;串行口开中断
MOV DPTR,#ADDRR ;数据缓冲区首址送DPTR
MOV R0,#128 ;置传送字节数初值
SJMP $
;中断服务程序
INTSE2: CLR RI ;清中断标志
MOV A,SBUF ;取接收的数据
MOVX @DPTR,A ;接收的数据送缓冲区
DJNZ R0,LOOP ;判别接收完没有。
CLR TR1 ;全部接收完毕则关定时器1
CLR ES ;关串行口中断
SJMP SEND
LOOP: INC DPTR ;修改地址指针
SEND: RETI