单片机串行通信技术 下载本文

inbyte = buf '输入到接收的字节数组中 buf2 = \

s1 = \

For i = LBound(inbyte) To UBound(inbyte) '将收到的数据以字符形式显示 buf2 = buf2 & Hex(inbyte(i)) & \ s1 = s1 & Chr(inbyte(i))

Next

Text2.Text = s1 '在接收文本框中显示数据 Text1.SelStart = 0 '选中输入文本框中所有字符 Text1.SelLength = Len(Text1.Text) Text1.SetFocus

End Sub

Private Sub Form_Load()

Show

MSComm1.PortOpen = True '打开串口

Text1.SetFocus '将光标移到输入文本框中 End Sub

2.单片机通信程序

采用单片机主频为6M,串口工作于方式1,波特率选为1200bps(注意与上位PC机波特率一定相同),由表5-4查得定时器T1工作于方式2,初值为F3H。源程序如下:

ORG 0000H

MOV SP,#60H

MOV SCON,#50H ;串口设为方式1 MOV TMOD,#20H ;定时器1设为模式2 MOV TL1,#0F3H ;置定时器初值 MOV TH1,#0F3H

SETB TR1 ;启动T1 CLR ET1

CLR ES

WAIT1: JBC RI,REVE ;接收字符数据(为所发字符ASCII码) SJMP WAIT1

REVE: MOV A,SBUF SEND1: CLR TI

MOV SBUF,A ;将收到字符回送PC WAIT2: JBC TI,SEND2 SJMP WAIT2

SEND2: AJMP WAIT1 ;等待接收下一字符

END

运行单片机程序与PC机程序。在“发送字符”文本框中键入任一字符,点击通信按钮,若在“接收字符”文本框中显示该字符,则表示通信成功,见图5-11。

由于篇幅所限,本程序仅为演示参考程序,并无实际意义。读者可在此基础上加入一些握手信号和校验码以便成为应用程序,并思考如何实现多字符的通信。

图5-11 PC机与单片机通信

三、单片机多机通信

MCS-51具有多机通信功能,所谓多机通信是指一台主机和多台从机之间的通信,构成主从式多机分布通信系统。主机发送的信息可以传输到各个从机,各从机只能向主机发送信息,从机间不能进行相互通信。图5-12为多机通信联接示意图。

图5-12 单片机多机通信系统

8051TXDRXD主 机TXDRXDTXDRXDTXDRXD80511#从 机80512#从 机80513#从 机多机通信的实现,主要是依靠主、从机之间正确设置与判断SM2和发送或接收的第9位

数据(TB8或RB8)来完成的。多机通信过程如下:

(1)使所有从机的SM2置1,处于只接收地址帧的状态。 (2)主机发送一帧地址信息,与所需从机联络。主机应置RB8为1,表示发送的是地址。 (3)各从机接收到地址信息后,因RB8为1,置中断标志RI,向CPU申请中断。中断后,将所接收地址与本从机的地址相比较,对于地址相符的从机,使SM2清0以接收主机随后发来的所有信息;对于地址不相符的从机,仍保持SM2为1的状态,对从机随后发送的数据不予接收,直至发送新的地址帧。

(4)主机发送控制命令和数据信息给被寻址的从机。此时,主机置RB8为0,表示发送的

是数据或控制命令。对于没选中的从机,因为SM2=1,RB8=0,所以不会产生中断,不接收主机发送的信息。

例5.6:多机通信实训电路见图5-13,若距离通信较远,主机与从机间可采用485接口芯片联接。本实训旨在说明多机通信的基本原理。设有一台主机,两台从机,主机呼叫从机,若联系成功则主机向从机发送指令,从机利用P1口所接发光二极管显示从机机号。主频6M,波特率为2400bps。为易于理解,主、从机均采用查询工作方式。 主机工作程序:

ORG 0000H MOV TMOD,#20H MOV TL1,#0FAH

MOV TH1,#0FAH SETB TR1

MOV SCON,#0D8H MOV PCON,#00H CLR TI CLR EA STAR1: MOV A, #01H MOV SBUF,A

WAIT1: JBC TI,WAIT2 AJMP WAIT1

WAIT2: JBC RI, CONT1 ACALL SE19 JBC RI ,CONT1 AJMP STAR2 CONT1: MOV A,SBUF XRL A,#01H

JZ CONT2 MOV SBUF,#0FFH AJMP STAR1 CONT2: CLR TB8 MOV SBUF,#01H SETB TB8 WW :JBC TI , STAR2

AJMP WW

STAR2: MOV A, #02H MOV SBUF,A WAIT3: JBC TI ,WAIT4 AJMP WAIT3

;波特率设置

;主机工作于方式3,REN=1,TB8=1

;SMOD为0

;清发送标志 ;关中断 ;发送1#机地址

;若1#机回应则转移进行地址比较 ;调延时等待

;继续查询是否回应

;1#机无回应则与2#机通信

;取1#机回应地址 ;与发送地址相符则发送对1#机控制命令

回应地址与发时不符,发送1#机复位命令,使1#机SM2=1 ;重新呼叫1#机

;置发送命令(数据)标志

;发送命令(1#机发光二极管显示机号) ;重置地址发送标志 ;与2#机通信 ; WAIT4: JBC RI, CONT3 ACALL SE19 JBC RI, CONT3 AJMP JX CONT3: MOV A,SBUF XRL A,#02H JZ CONT4

MOV SBUF,#0FFH AJMP STAR2 CONT4: CLR TB8

MOV SBUF,#02H SETB TB8 NN: JBC TI, JX AJMP NN

JX: AJMP STAR1

SE19: MOV R6,#0A0H ;延时子程序 LO36: MOV R7,#0FFH LO35: DJNZ R7,LO35 DJNZ R6,LO36 RET END

1#机工作程序(2#机程序仅是机号不同,在此略): ORG 0000H

MAIN:MOV TMOD,#20H ;设置波特率 MOV TL1,#0FAH MOV TH1,#0FAH

SETB TR1

MOV SCON,#0F8H ;从机工作于方式3,REN=1,SM2=1,TB8=1 MOV PCON,#00H

CLR EA ;关中断 CLR RI ;清接收标志 WAIT: JBC RI, JSDZ ;接收等待 AJMP WAIT

JSDZ: MOV A ,SBUF ;读接收地址 XRL A,#01H ;与本机地址比较 JNZ WAIT ;不是呼叫本机返回

CLR SM2 ;若呼叫本机,打开数据接收