串行通信原理及应用什么是通信两个设备之间交换数据的过程我们称之为通信单工双工AB通信的方式从同时传输的数据位数来分为:1、并行通信(Parrel)2、串行通信(Serial)串并行方式各自特点速度价格距离并行串行相对快相对慢短远贵廉价如何并行通信(有时间再讲)DB0-DB7WRRDCSALE信号等举例:内存的写数据过程(两部分)。通过时序图让学生明白CLKA[15:0]ALEWRPhase2Phase1AddressD[7:0]Data如何串行通信就用极少的数据线就能实现数据通信,那么是如何实现的呢?桢的概念:起始位,数据位,速率(波特率),应答位或停止位。串行通信桢格式常见的串行通信协议名称特点USARTUSBI2CCAN用途PC与MCUPC与MCUMCU之间MCU之间特点简单快,可靠简单复杂,可靠USARTPC与MCU简单USART特点支持同步串行通信和异步串行通信支持全双工桢格式可编程串行输出原理串行输入原理PIC的USART结构起始位数据停止位接收发送起始位停止位起始位TXEN0111TXIF接收缓冲寄存器波特率发生器RCIF88SPEN10波特率发生器SPEN发送缓冲寄存器1发送移位寄存器01接收移位寄存器0停止位(教材89页)图3-9USART异步传送模式结构原理及时序图串行通信时必须要考虑的问题硬件如何连接?传输速度是多少?通信格式是什么样的?要发送或接收的数据放在哪里?如何判断发送或接收完毕?MCU通过UART与PC连接图+5V代表10V代表0+12V代表1-12V代表0TXPCMAX232电平转换器+12V/-12V+5V/0VRX寄存器设置PORTC6:TXDTransmitterPORTC7:RXDReceiverRXSTASPEN:1b7b6b5b4B3b2b1b0SPENRX9SRENCRENADDENFERROERRRX9Db7SPEN考虑传输速率问题可能出现设备之间的主频不同的情况,为了解决这个问题,两个设备之间必须协商通信速率。对于UART而言,传输速率是两个设备之间预先协商好的,通过设置相应寄存器来实现。传输速率相关寄存器及标志位波特率发生寄存器:SPBPG(99H)高波特率标志位:BRGH@TXSTA2同步收发标志位:SYNC@TXSTA4常用SPBPG的值:当主频是4Mhz时,速度希望采用9600bps进行异步通信则SPBRG=25,BRGH=1,SYNC=0串行通信格式图相关寄存器有两个:TXSTA:发送控制寄存器RCSTA:接收控制寄存器TXSTA(98H):发送控制寄存器765432100TX9TXENSYNC0BRGH0TX9D功能:控制UART发送数据的格式TXSTA(98H):发送控制寄存器765432100TX9TXENSYNC0BRGH0TX9D9位发送使能发送使能同步模式使能高波特率使能发送位第9位无用位,清0TXSTA(98H):发送控制寄存器7bit6bit5bit43bit2bit1bit0CSRCTX9TXENSYNC-BRGHTRMTTX9D思考题:我想让PIC的USART模块采用8位数据位发送数据,异步方式,高速状态,请问TXSTA该设定何值?TXSTA=0b00100100;RCSTA:接收控制寄存器bit7654SPENRX9SRENCREN3bit2bit1bit0ADDENFERROERRRX9D功能:控制UART接收数据的格式和状态RCSTA:接收控制寄存器bit76543bit2bit1bit0SPENRX90CREN0FERROERRRX9D串口使能9位使能连续接收使能桢格式错溢出错接收的第9位未用,置0思考题:我想让PIC的USART模块在异步方式下采用8位数据位接收数据,请问RCSTA该设定何值?RCSTA=0b10010000;要发送或接收的数据放在哪里?要发送的数据放在TXREG里收到的数据放在RCREG里TXREG和RCREG都在0体中TXREG=‘A’;charvar=RCREG;如何判断发送成功?对于发送而言,当一个字节发送完毕后PIR1的TXIF标志位会被自动置1,通过判断此位就可得知数据发送是否完毕,当TXREG被赋值后,TXIF自动被清空。思考题:如何用程序判断是否发送成功?76543210TXIFPIR1:if((PIR1&0b00010000)!=0){//TXIF=1,本次发送成功//发下一个数据或结束发送}如何判断接收完毕?对于接收而言,当接收到一个字节后PIR1的RCIF标志位会置1,通过判断此位可得知是否收到一个数据,当RCREG被读取后,RCIF自动被清空。思考题:如何用程序判断是否接收完毕?76543210RCIFPIR1:if((PIR1&0b00100000)!=0){//RCIF=1,说明收到一个数据//把收到的数据读走。}例题1电路图如上图通过PIC16F877向PC的COM1不停的发送字符’A’,要求波特率为9600bps8位数据位,无奇偶校验位,一位停止位,无数据流控,请编程实现。流程图初始化串行口TXREG‘A’PIR1的TXIF位==1TXREG‘A’TRUEFALSE程序源代码MAIN(){RCSTA=0b10010000;SPBRG=25;TXSTA=0b00100100;TXREG=‘A’;while(1){if((PIR1&0b00010000)!=0){TXREG=‘A’;}}}//串口使能,接收使能//9600bps@4MHz//发送字符‘A’//发送使能,高波特率//发送完毕吗?//再发送一个字符‘A’//死循环,循环发送例题2电路图如上图用超级终端软件通过PC的COM1向PIC发送一个字符(由键盘输入),MCU收到后把此字符加一后回传给PC。要求波特率为9600bps,8位数据位,无奇偶校验位,一位停止位,无数据流控,请编程实现。流程图初始化串行口PIR1的RXIF位==1TXREG=RCREG+1;程序源代码MAIN(){RCSTA=0b10010000;SPBRG=25;TXSTA=0b00100100;while(1){if((PIR1&0b00100000)!=0){TXREG=RCREG+1;}}}//串口使能,接收使能//9600bps@4MHz//发送使能,高波特率//接收完毕吗?//把收到的字符+1后发送//死循环,循环发送作业PIC16F877的主频为4Mhz,通过MAX232与PC的COM1正确相连,编程实现PC通过超级终端发给MCU一个字符串(以\r结尾),MCU收到此字符串把此串长度反馈给PC,而后循环此过程,通信方式为:波特率9600bps,8位数据位,奇偶校验位无,1位停止位,数据流控制为无。