历史上的今天
今天是:2024年12月03日(星期二)
2019年12月03日 | PIC单片机EUSART串行通信接口的应用方法解析
2019-12-03 来源:elecfans
PIC单片机的EUSART是一种串行通信接口,我们可以利用他让不同设备之间传输数据,我们来讲讲我们最常用的串行异步接收和发送。
管脚
串行异步接收和发送。如果只要两个引脚,一个是接收RX一个是发送TX。
数据格式
我们先来讲讲TX是如何发送出数据的,数据格式具体是什么样的。

如果我们要向其他设备发送个大写字母A。将是什么样的呢。“A”这个字母对应的ASCII码是65,对应的八位二进制数则是01000100。TX就将对应的二进制码发送出去。
发送时用高电平来代表1,用低电平代表0.那不发送数据的时候管脚就一直为高电平。
启动位和停止位
怎么区分现在是在发送数据还是在常态呢?所以在每次发送一个字节的数据之前TX脚都会先输出一小段的低电平。来告诉对方,我要发送数据了这一小段低电平便是启动位(起始位)。
如果我们发送的不仅仅只有一个字节,而是好几个字节,两个数据之间总要有个间隔吧!要不然分不清谁跟谁。所以每发送完一个字节的数据,TX脚就会输出一小段的高电平这便是停止位。
波特率
在数据发送中每个位的时间都要事先定好,而且发送和接收的双方都必须事先知道并设置好。那这个时间是怎么确定的呢?这就牵扯的一个东西波特率。在这里波特率=比特率。比特率也就是一秒钟发送多少位的数据。如果要一秒钟发送为9600个位,我们将波特率设置为9600。1/9600约等于0.0001s也就是每个位的发送时间。
小端发送
如果发送大写字母“A”也就是发送二进制数“01000100”,串行通信是从低位开始发送。
下图为字母”A”数据发送的时序图。

实例:我们可以利用PC机的串口和单片机进行异步串行通信,单片机接收到什么样的数据,就在给PC机发送数据,波特率为115200。不过单片机输出的TTL信号,需TTL转232.PC机才能接收。有关这方面的硬件设计网上很多故不赘述。
在官方的数据手册有对应配置步骤,不过我将根据我的实例来讲解其实也是大同小异。
1,配置端口
1.1配置备用功能
我们可以看单片机的引脚图,第13和第6脚都标有TX说明这两个引脚是可以作为EUSART数据输出。第12和第5脚都标有RX说明这两个引脚是都可以作为EUSART数据输入的。但是同时只有一个引脚作为RX或者TX。不可以同时有两个RX或TX。RX与TX的选择是通过APFCON。我们这里选择13脚作为TX,选择12脚作为RX.配置如下:
APFCONbits.TXCKSEL=1;//RA0
APFCONbits.RXDTSEL=1;//RA1

1.2将RX脚配置位数字输入。
我们可以看第12脚上标有AN1,说明该引脚还带有模拟输入的功能。所以我们必须将其设置为数字输入。配置如下:
TRISA1=1;//RA1RXinput
ANSELAbits.ANSA1=0;
2配置波特率
如何设置波特率为115200呢,这里我们必须先要知道计算公式。在官方的数据手册中有给我们提供表格。到底选择那个公式由SYNC,BRG16,BRGH这三个位的配置决定。
我们选在异步通信模式故SYNC为0;
波特率发生器位,可以选择8位或者16位。不过选择16位。波特率的精度会更高。所以选择16位。BRG16为1.
我们这里选择高速的波特率BRGH为1;
配置如下:
TXSTAbits.BRGH=1;//highspeed
BAUDCONbits.BRG16=1;//16bitBaudrateGeneratorisused
TXSTAbits.SYNC=0;//Asynchronousmode

我们可以得出我们的计算公式为波特率=FOSC/[4(n+1)];
我们的波特率为115200,时钟定为32MHz。计算出n的值。
115200=32MHz/[4(n+1)];可以得到n=68.444即n=0x44;
将0x44存入到SPBRGH和SPBRGL中,配置如下
SPBRGH=0x00;//
SPBRGL=0x44;//Baudrate115200
3,配置接收中断
实际可以根据自己的需求配置是否用中断接收。不过这里设置为中断接收,配置如下。
PIE1bits.RCIE=1;//enablestheUSARTReceiveinterrupt
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
4,开启串口的功能
开启接收,开启发送,开启串口功能,配置如下:
RCSTAbits.CREN=1;//Enablesreceiver
TXSTAbits.TXEN=1;//Transmitenabled
RCSTAbits.SPEN=1;//serialportenable
实例代码:单片机型PIC16LF1823,开发环境MPLAB X IDE.
#include
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON
&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去
__CONFIG(PLLEN_OFF&LVP_OFF);
unsignedcharRC_DATA;
unsignedcharRC_FLAG;
voidinit_fosc(void)
{
OSCCON=0xF0;//32MHz
}
voidinit_eusart()
{
APFCONbits.TXCKSEL=1;//RA0
APFCONbits.RXDTSEL=1;//RA1
TRISA1=1;//RA1RXinput
ANSELAbits.ANSA1=0;
SPBRGH=0x00;//
SPBRGL=0x44;//Baudrate115200
TXSTAbits.BRGH=1;//highspeed
BAUDCONbits.BRG16=1;//16bitBaudrateGeneratorisused
TXSTAbits.SYNC=0;//Asynchronousmode
PIE1bits.RCIE=1;//enablestheUSARTReceiveinterrupt
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
RCSTAbits.CREN=1;//Enablesreceiver
TXSTAbits.TXEN=1;//Transmitenabled
RCSTAbits.SPEN=1;//serialportenable
}
voidtx_eusart(unsignedchartx_data)
{
TXREG=tx_data;
while(TRMT==0);//loop
}
voidinterruptisr(void)
{
if(RCIE&&RCIF){
RC_DATA=RCREG;
RC_FLAG=1;
LATA2=1;
}
}
/*
*
*/
intmain(intargc,char**argv){
init_fosc();
init_eusart();
RC_FLAG=0;
TRISA2=0;
LATA2=0;
while(1)
{
if(RC_FLAG》0)
{
tx_eusart(RC_DATA);
RC_FLAG=0;
LATA2=0;
}
}
}


注意异步通信的back-to-back与单字节操作时的区别。

图示是3个字节内容在RX上面的,需要注意,使用上面程序无法完成操作。
史海拾趣
|
ppt课件的地址:http://www.top-e.org/wdxz/html/?12.html 视频地址:http://www.tudou.com/programs/view/hNl59pyEYv0/… 查看全部问答> |
|
今天写了个pli程序,编译、生成dll文件都没有问题,就是仿真装载过程中,modelsim崩溃,请大家给分析一下,这是什么病,怎么治!源码如下: top.v `timescale 1ns/1ns module top(clk,AM,AS,WRITE,IACK,LWORD,DS0,DS1,DTACK,BERR,RETRY,AB,DB,SY ...… 查看全部问答> |
|
急急急急——高分求救,可加分!串口通讯相关,打印相关,wince + vs2005 + c/c++ 配置:wince6.0 , vs2005 使用语言: c/c++ 问题背景:现在有一个类似于PDA的终端设备,使用RS232片,需要驱动其打印机来打印由磁卡扫描得到的数据,可是,使用串口COM均失败。使用GetLastError得到的错误为55,即设备不可用。首要问题,如何解 ...… 查看全部问答> |
|
HI,各位 最近在做一个WINCE5的项目,需要用到GPRS,使用SIM300模块做MODEM,设置都OK了 现在的问题是,使用我自己写的小程序,程序使用的是SOCKET,可以正常通讯,但是用IE不能上网 在CE下,所有IP都ping不通,但是用自己写的小程序连接过某个IP以后,就可 ...… 查看全部问答> |
|
如題,我要用8051讀取USB 鼠標的數據,請USB高手推荐比較好的USB HOST 開發板,要有齊全的相關資料和詳細的原代碼說明,最好是中文的.… 查看全部问答> |
|
1、连接4个串口 2、用220V供电 3、访问桌面SQL Server数据库 操作系统采用windows ce请问使用什么CPU的嵌入式主板?相应厂家的联系方式?… 查看全部问答> |
|
我刚开始学STM32,买的开发板是ALIENTEK MiniSTM32,想移植uCOSII,并实现图像采集与传输,大概思路就是这样子的,具体实现还没想好,请各位大侠给点建议!!谢谢~~~… 查看全部问答> |
|
最近刚接触FPGA,接触的第一个实验室是流水灯,我流水灯已经能跑通了,现在想在实验室里加一个按键,按一下流水灯就暂停,再按一下流水灯接着跑。下边是我的代码,流水灯每1秒钟左移1位,求高人指点上边按键的问题。 刚接触问题很多 ...… 查看全部问答> |
|
年末,论坛活跃贴: 响应号召https://bbs.eeworld.com.cn/thread-363212-1-1.html,开个贴,希望各位网友参与一下. 上一楼提问,下一楼回答并再提一个问题,依次类推; 要认真啊.不来说谎的. 我先来: 问: 你目前最大的心愿是什么?… 查看全部问答> |




