在本教程中,我们将学习启用与PIC单片机的UART通信以及如何与计算机之间进行数据传输。到目前为止,我们已经介绍了ADC,定时器,PWM等所有基本模块,还学习了如何连接LCD和7段显示器。现在,我们将为自己配备一个称为UART的新通信工具,该工具已在大多数微控制器项目中广泛使用。在此处查看我们使用MPLAB和XC8的完整PIC单片机教程。
在这里,我们使用了PIC16F877A MCU,它具有一个称为“可寻址通用同步异步接收器和发送器”的模块,简称为USART。USART是两线通信系统,数据在其中串行流动。USART还是全双工通信,意味着您可以同时发送和接收数据,这些数据可用于与CRT终端和个人计算机等外围设备进行通信。
的USART可以在下列模式进行配置:
- 异步(全双工)
- 同步–主站(半双工)
- 同步–从站(半双工)
还有两种不同的模式,即8位和9位模式,在本教程中,我们将USART模块配置为在8位通信系统的异步模式下工作,因为它是最常用的通信类型。由于它是异步的,因此不需要将时钟信号与数据信号一起发送。 UART使用两条数据线发送(Tx)和接收(Rx)数据。两种设备的接地也应通用。这种类型的通信不共享公共时钟,因此公共接地对于系统正常工作非常重要。
在本教程的最后,您将能够在计算机和PIC微控制器之间建立通信(UART),并从笔记本电脑切换PIC板上的LED。LED的状态将从PIC MCU发送到您的笔记本电脑。我们将在计算机中使用超级终端测试输出。本教程末尾还将提供详细视频。
要求:
硬件:
- PIC16F877A性能评估板
- RS232转USB转换器模块
- 电脑
- PICkit 3编程器
软件:
- MPLABX
- 超级终端
需要使用RS232到USB转换器将串行数据转换为计算机可读形式。有很多方法可以设计自己的电路,而不是购买自己的模块,但是由于受到噪声的影响,它们并不可靠。我们正在使用的如下所示
注意: 每个RS232到USB转换器都需要安装特殊的驱动程序。插入设备后,其中大多数应会自动安装。但是,如果它不能放松!使用评论部分,我将为您提供帮助。
编程PIC单片机进行UART通信:
像所有模块(ADC,定时器,PWM)一样,我们还应该初始化PIC16F877A MCU的USART模块,并指示其以UART 8位通信模式工作。让我们定义配置位并从UART初始化功能开始。
初始化PIC单片机的UART模块:
Tx和Rx引脚实际存在于引脚RC6和RC7处。根据数据表,我们将TX声明为output,将RX声明为input。
// ****设置UART的I / O引脚**** // TRISC6 = 0; // TX引脚设置为输出TRISC7 = 1; // RX引脚设置为输入// ________ I / O引脚设置__________ //
现在必须设置波特率。波特率是在通信信道中传输信息的速率。这可以是许多默认值之一,但是在此程序中我们使用9600,因为它是最常用的波特率。
/ **初始化SPBRG寄存器以获取所需的波特率,并将BRGH设置为快速baud_rate ** / SPBRG =((__XTAL_FREQ / 16)/ Baud_rate)-1; BRGH = 1; //高波特率// _________波特率设置结束_________ //
必须使用寄存器SPBRG设置波特率的值,该值取决于外部晶振频率的值,计算波特率的公式如下所示:
SPBRG =((_XTAL_FREQ / 16)/波特率)– 1;
必须将BRGH比特设为高电平,以实现高速比特率。根据数据表(第13页),启用它总是有好处的,因为它可以消除通信期间的错误。
如前所述,我们将在异步模式下工作,因此,应将SYNC位 设为零,并将SPEM位设为高电平,以使能串行引脚(TRISC6和TRICSC5)
// ****启用异步串口******* // SYNC = 0; //异步SPEN = 1; //启用串行端口引脚// _____已启用异步串行端口_______ //
在本教程中,我们将同时在MCU和计算机之间发送和接收数据,因此我们必须同时启用TXEN和CREN位。
// **让我们为发送和接收做准备** // TXEN = 1; //使能传输CREN = 1; //启用接收// __ UART模块准备就绪,可以发送和接收__ //
该位TX9和RX9必须为零,使我们在8位模式下运行。如果必须建立高可靠性,则可以选择9位模式。
// **选择8位模式** // TX9 = 0; //选择8位接收RX9 = 0; //选择8位接收模式// __选择8位模式__ //
这样,我们完成了初始化设置。并准备就绪。
使用UART传输数据:
以下功能可用于通过UART模块传输数据:
// **向UART发送日期的一个字节的功能** // void UART_send_char(char bt){while(!TXIF); //保持程序直到TX缓冲区可用TXREG = bt; //用接收到的值加载发送器缓冲区} // _____________函数结束________________ //
模块初始化后,无论什么值加载到寄存器TXREG中,都会通过UART传输,但是传输可能会重叠。因此,我们应始终检查传输中断标志TXIF。仅当该位为低时,我们才能继续下一个传输位,否则我们应该等待该标志为低。
但是,上述功能只能用于发送一个字节的数据,要发送完整的字符串,应使用以下功能
// **将字符串转换为字节的函数** // void UART_send_string(char * st_pt){while(* st_pt)// //如果有字符UART_send_char(* st_pt ++); //将其作为字节数据处理} // ___________函数结束______________ //
该函数具有指针,可能很难理解,但是请相信我,指针很棒,它们使编程更容易,这是一个很好的例子。
如您 所见, 我们再次调用了 UART_send_char(), 但现在在while循环中。我们已将字符串拆分为单个字符,每次调用此函数时,都会将一个字符发送到TXREG并进行传输。
使用UART接收数据:
以下功能可用于从UART模块接收数据:
// **从UART获取日期的一个字节的函数** // char UART_get_char(){if(OERR)//检查错误{CREN = 0; //如果出错-> Reset CREN = 1; //如果错误->重置} while(!RCIF); //保持程序直到RX缓冲区空闲为止返回RCREG; //接收值并将其发送到主函数} // _____________函数结束________________ //
当UART模块接收到数据时,它将对其进行拾取并将其存储在RCREG寄存器中。我们可以简单地将值传递给任何变量并使用它。但是可能存在重叠错误,或者用户可能正在连续发送数据,而我们尚未将它们传输到变量中。
在这种情况下,接收标志位RCIF会恢复。每当接收到数据并且尚未处理该位时,该位将为低。因此,我们在while循环中使用它,从而创建一个延迟时间来保留程序,直到处理该值为止。
使用PIC微控制器的UART模块切换LED:
现在让我们进入程序的最后一部分, void main(void) 函数,在这里我们将使用PIC与计算机之间的UART通信在计算机中切换LED。
当我们发送字符“ 1”(从计算机)时,LED将打开,状态消息 “红色LED-> ON” 将被发送回(从PIC MCU)到计算机。
同样,我们发送一个字符“ 0”(来自计算机),LED将关闭,状态消息 “红色LED-> OFF” 将被发送回(从PIC MCU)到计算机。
while(1)//无限循环{get_value = UART_get_char(); if(get_value =='1')//如果用户发送“ 1” {RB3 = 1; //打开LED UART_send_string(“ RED LED-> ON”); //将通知发送到计算机UART_send_char(10); // ASCII值10用于回车(在新行中打印)} if(get_value =='0')//如果用户发送“ 0” {RB3 = 0; //关闭LED UART_send_string(“ RED-> OFF”); //将通知发送到计算机UART_send_char(10); // ASCII值10用于回车(在新行中打印)}}
模拟我们的程序:
和往常一样,让我们使用proteus模拟我们的程序,并查看它是否按预期工作。
上图显示了一个虚拟终端,其中一个虚拟终端显示了欢迎消息和LED的状态。可以注意到红色LED已连接到RB3引脚。最后,可以在视频中找到模拟的详细工作。
硬件设置和测试输出:
该电路的连接非常简单,我们使用PIC Perf板,只需将三根线连接到RS232到USB转换器,然后使用USB数据线将模块连接到我们的计算机,如下所示。
接下来,我们安装超级终端应用程序(从此处下载)并打开它。它应该显示这样的东西
现在打开计算机上的设备管理器,检查模块连接到哪个COM端口,我的是否连接到COM端口17,如下所示
注意:模块的COM端口名称可能会根据您的供应商而变化,这不是问题。
现在回到超级终端应用程序并导航到“ 设置”->“端口配置” 或按Alt + C,获得以下弹出框并在弹出窗口中选择所需的端口(在我的情况下为COM17),然后单击“连接” 。
建立连接后,打开PIC性能板,您应该在下面看到类似的内容
将光标放在“命令窗口”中,输入1,然后按Enter。LED将打开,状态将显示如下。
同样,将光标放在“命令窗口”中,输入0,然后按Enter。LED将熄灭,状态将显示如下。
以下是完整的代码和详细的视频,它们将显示LED如何实时响应“ 1”和“ 0”。
就是这样,我们已经将PIC UART与我们的计算机相连,并使用Hyper终端传输了数据以切换LED。希望您理解,如果不是这样,请使用评论部分提出您的查询。在我们的下一个教程中,我们将再次使用UART,但是通过使用蓝牙模块并通过空中广播数据使其更加有趣。
还要检查两个ATmega8微控制器之间的UART通信以及ATmega8与Arduino Uno之间的UART通信。