8051单片机的异步串行通信技术 联系客服

发布时间 : 星期一 文章8051单片机的异步串行通信技术更新完毕开始阅读

可得甲机发送主程序如下:

ORG 0030H

MOV TMOD, #20H

MOV TL1, #0F3H MOV TH1, #0F3H CLR EA MOV PCON, #00H MOV SCON, #40H MOV DPTR, #1000H

MOV R7, #20H SETB TR1 SEND:MOVX A, @DPTR MOV SBUF,A

JNB TI, $ CLR TI INC DPTR DJNZ R7, SEND CLR TR1

RET 乙机接收参考程序如下: ORG 0030H

MOV TMOD, #20H MOV TL1, #0F3H MOV TH1, #0F3H CLR EA

MOV PCON, #00H MOV SCON, #40H MOV DPTR, #1000H MOV R7, #20H

;设定时器1工作方式2。 ;设置定时器初值。 ;设置重装值。 ;禁止中断。 ;(SMOD)=0。

;设串行工作方式1,禁止接收。 ;建立发送数据地址指针初值。 ;建立计数指针。 ;启动定时器1。 ;取数据。

;启动数据传送操作。

;等待一帧发送完毕。

;清TI标志。 ;指向下一单元。

;数据块传送结束? 没结束继续传送。 ;传送结束,停止定时器1工作。;返回。

;设定时器1工作方式2。 ;设置定时器初值。 ;设置重装值。

;禁止中断。

;SMOD=0。

;设串行工作方式1。 ;建立接收地址指针初值。 ;建立计数指针。

SETB TR1 SETB REN

;启动定时器T1。 ;启动接收数据操作。

;等待数据接收完毕。

RECIV:JNB RI, $ CLR RI

;清RI标志。

;取数据。

MOV A, SBUF

MOVX @DPTR,A ;送外部RAM。 INC DPTR DJNZ R7, RECIV CLR TR1 RET

;指向下一单元。

;数据块接收完毕?没完继续接收。 ;接收完毕, 停止定时器1工作。 ;返回。

如改用中断方式甲机发送参考程序如下: ORG 0000H AJMP MAIN ORG 0023H LJMP ASEND

ORG 0030H

MAIN:MOV SP, #30H MOV TMOD, #20H MOV TL1, #0F3H

;设置堆栈。

;建立串行中断口地址。

;设定时器1工作方式2。

;设置定时器初值。

MOV TH1, #0F3H ;设置重装值。 MOV PCON, #00H MOV SCON, #40H

;SMOD=0。

;设串行工作方式1。 ;建立计数指针。 ;建立发送地址指针初值。

MOV R7, #1FH MOV DPTR, #1000H SETB EA SETB ES SETB TR0

;总中断允许。

;串行中断允许。

;启动定时器0。

;第一个数据送A。 ;启动传送数据操作。

MOVX A, @DPTR MOV SBUF, A

INC DPTR WAIT:AJMP $ 中断服务子程序: ORG 0100H

;指向下一RAM单元。

;等待中断。

CLR TI ;清TI。

ASEND:MOVX A, @DPTR

;取数据。

MOV SBUF,A ;传送数据

INC DPTR ;指向下一单元。

DJNZ R7, GOON ;传送结束?没结束继续传送。 CLR EA ;传送结束,关闭。 CLR TR1

GOON:RETI ;返回。

顺便指出,甲机以中断方式传送数据时,计数指示为1FH而非20H,这是因为在启动甲机发送时已经向SBUF发送了一个数据。

至于乙机,既可用上述查询方式接收,也可用中断方式接收。中断方式程序设计思路与查询方式类似,不再细述。

在异步串行通讯中,接收机以波特率的3倍检测RXD端信号,检测到两次以上相同信号即为有效信号。

在实际应用中,可根椐需要加入奇偶校验位一起传送,以提高传送的可靠性。

例8—3 甲,乙两单片机同样以工作方式1进行串行数据通信,波特率为1200,甲机发送,发送数据在甲机外部RAM 1000H-101FH单元中,在发送之前先将数据块长度发送给乙机,发送完后,向乙机发送一个累加校验和。 乙机接收,乙机首先接收数据长度,然后接收数据,并把接收数据依次放入乙机外部RAM 1000H-101FH单元中,接收完毕后进行一次累加和校验,数据全部接收完毕时向甲机送出状态字,表示传送状态。甲、乙机晶振频率均为6MHZ。 连接方式见图8—6:

甲 乙 TXD RXD RXD TXD

图8—6 例8—3示意图

解:设定如下:

(1)波特率约定为1200,以定时器T1为波特率发生器,T1用工作方式2(SMOD)=0,波特率不倍增。

6 则初值: 6×10×1

X=256 — 384×1200 =243=F3H

(2)设置R5为累加和寄存器,R6为数据块长度寄存器。 (3)用查询传送方式。

(4)串行口为工作方式1,允许接收,即; SCON=01010000B=50H

可得甲机发送主程序如下:

ORG 0030H

MOV TMOD, #20H ;设定时器1工作方式2。 MOV TL1, #0F3H ;设置定时器初值。 MOV TH1, #0F3H ;设置重装值。

SETB TR1 ;启动定时器1。 MOV PCON, #00H ;(SMOD)=0。 MOV SCON, #50H ;设串行工作方式1,允许接收。 AGAIN:MOV DPTR, #1000H ;建立发送数据地址指针初值。 MOV R6, #20H ;数据块长度送 R6。

MOV R5, #00H ;累加和寄存器清“0”。 MOV SBUF, R6 ;先发送长度值。

L1:JBC TI, L2 ;等待发送结束。 AJMP L1

L2:MOVX A, @DPTR ;取数据块中数据。

MOV SBUF, A ;发送数据。

ADD A, R5 ;发送数据累加。 MOV R5, A ;累加和送R5。 INC DPTR ;地址加1。

L3:JBC TI, L4 ;等待一帧数据发送完毕。 AJMP L3

L4:DJNZ R6, L2 ;判断数据块是否发送完,若未完继续发送。

MOV SBUF, R5 ;数据块发送完毕,发累加和校验码。 L5:JBC TI, L6 ;等待发送累加和码结束。 AJMP L5