打印
[PIC®/AVR®/dsPIC®产品]

使用Microchip PIC18F MCU实现UART串口通信的简单应用

[复制链接]
1359|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Clyde011|  楼主 | 2024-10-4 08:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在最近的项目中,我使用了Microchip的PIC18F系列单片机来实现UART串口通信功能,整个过程简单明了。接下来,我分享一下实现串口通信的完整步骤和代码,方便大家参考。

硬件部分:我用的是PIC18F4520这款MCU,开发环境是MPLAB X IDE和XC8编译器。串口通信主要用来和PC进行数据交互,通过USB转串口模块实现。

软件配置:
  • 时钟设置:使用了8MHz外部晶振,并配置PLL使其工作在32MHz频率下。
  • 串口配置:UART工作在9600波特率,8位数据,1位停止位,无奇偶校验。

代码实现:以下是通过UART发送和接收数据的基本代码示例:
#include <xc.h>

#define _XTAL_FREQ 32000000  // 定义时钟频率

void UART_Init(void) {
    TRISC6 = 0;  // TX引脚设为输出
    TRISC7 = 1;  // RX引脚设为输入
    SPBRG = 51;  // 波特率9600,(Fosc / (64 * 波特率)) - 1

    TXSTAbits.BRGH = 0;  // 低速波特率
    TXSTAbits.SYNC = 0;  // 异步模式
    TXSTAbits.TXEN = 1;  // 启动发送功能
    RCSTAbits.SPEN = 1;  // 启动串口
    RCSTAbits.CREN = 1;  // 启动接收功能
}

void UART_Write(char data) {
    while (!TXSTAbits.TRMT);  // 等待上一个字符发送完成
    TXREG = data;  // 发送数据
}

char UART_Read(void) {
    while (!PIR1bits.RCIF);  // 等待数据接收
    return RCREG;  // 返回接收的数据
}

void main(void) {
    UART_Init();  // 初始化串口
    UART_Write('H');  // 发送字符 'H'
    UART_Write('i');  // 发送字符 'i'
   
    while(1) {
        char received_data = UART_Read();  // 接收数据
        UART_Write(received_data);  // 回传接收到的数据
    }
}
功能说明:
  • UART_Init():初始化UART模块,配置波特率和传输设置。
  • UART_Write():发送一个字符到串口。
  • UART_Read():从串口接收一个字符。

测试与验证:通过终端软件(如Tera Term)连接到USB转串口模块,可以看到MCU发送的字符,并且能实时回传接收到的字符。这段代码非常适合新手快速上手串口通信的实现。

总结:通过Microchip的PIC18F MCU进行串口通信的配置非常简单,只需要几行代码即可实现基础的发送和接收。UART是嵌入式系统中常用的通信方式,适合多种应用场景,如数据采集、传感器通讯等。如果你刚开始学习PIC单片机,这段代码会是一个很好的入门参考。





使用特权

评论回复
沙发
Clyde011|  楼主 | 2024-10-4 08:04 | 只看该作者
这代码看着好简单啊,PIC18F用起来确实很顺手,UART的功能太实用了!

使用特权

评论回复
板凳
公羊子丹| | 2024-10-4 08:04 | 只看该作者
我正好最近在弄串口通信,楼主这篇文章来的太及时了,感谢分享!

使用特权

评论回复
地板
周半梅| | 2024-10-4 08:05 | 只看该作者
请问一下这个波特率是怎么计算的?新手表示有点懵。

使用特权

评论回复
5
帛灿灿| | 2024-10-4 08:05 | 只看该作者
之前一直用STM32,没想到PIC18F也挺方便的,改天试试。

使用特权

评论回复
6
童雨竹| | 2024-10-4 08:05 | 只看该作者
代码挺清晰的,我准备按照这个思路去跑一下看效果。

使用特权

评论回复
7
万图| | 2024-10-4 08:06 | 只看该作者
我有个项目也需要串口通信,感觉你的这个代码可以直接用上!

使用特权

评论回复
8
Wordsworth| | 2024-10-4 08:06 | 只看该作者
UART初始化那部分写得很直观,学习了!

使用特权

评论回复
9
Bblythe| | 2024-10-4 08:06 | 只看该作者
请问接收数据那部分可以直接处理更复杂的数据流吗?

使用特权

评论回复
10
Pulitzer| | 2024-10-4 08:06 | 只看该作者
一直听说PIC单片机强大,今天算是见识到了,代码也不复杂。

使用特权

评论回复
11
Uriah| | 2024-10-4 08:07 | 只看该作者
实测成功!PC端能正常收发数据,楼主讲得很明白,谢谢啦!

使用特权

评论回复
12
angelfu| | 2024-10-5 07:11 | 只看该作者
有没有中断式的收发范例阿?

使用特权

评论回复
13
kaif2n9j| | 2024-10-23 16:38 | 只看该作者
还不错啊,这代码写的很模块化了

使用特权

评论回复
14
q1d0mnx| | 2024-10-23 17:42 | 只看该作者
我觉得可以考虑使用固件库的方式来写代码

使用特权

评论回复
15
q1d0mnx| | 2024-10-23 18:46 | 只看该作者
话说,这个返回数据是一个字节一返回么?

使用特权

评论回复
16
p0gon9y| | 2024-10-23 19:55 | 只看该作者
我觉得可以考虑把程序模块化,可移植化,这样就会好用很多

使用特权

评论回复
17
w2nme1ai7| | 2024-10-23 21:00 | 只看该作者
实现串口通讯挺不错了,其实建议在做一些协议解析之类的会更好

使用特权

评论回复
18
y1n9an| | 2024-10-23 22:12 | 只看该作者
对的,非常适合新手快速上手

使用特权

评论回复
19
q1ngt12| | 2024-10-24 07:20 | 只看该作者
其实我想说,这PIC18是否可以仿真啊?

使用特权

评论回复
20
zhizia4f| | 2024-10-24 08:32 | 只看该作者
看起来挺好,就是寄存器不是很好理解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

3444

帖子

0

粉丝