打印
[学习资料]

使用Microchip MCU实现UART通信与LED控制的应用

[复制链接]
5823|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Wordsworth|  楼主 | 2024-10-5 13:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近在使用Microchip的PIC系列MCU,做了一个小项目来熟悉UART串口通信和GPIO控制LED。通过UART接收指令,控制板子上的LED开关,代码比较简单,适合刚入门的小伙伴。下面是我的实现代码:
#include <xc.h>

#define _XTAL_FREQ 8000000  // 设置晶振频率
#define LED_PIN LATBbits.LATB0  // LED连接到RB0引脚

void UART_Init(void) {
    // 设置波特率
    SPBRG = 12;  // 对应9600波特率,假设8MHz时钟
    TXSTAbits.SYNC = 0;  // 异步模式
    RCSTAbits.SPEN = 1;  // 使能串口
    TXSTAbits.TXEN = 1;  // 使能发送
    RCSTAbits.CREN = 1;  // 使能接收
    TRISCbits.TRISC6 = 0;  // 设置TX为输出
    TRISCbits.TRISC7 = 1;  // 设置RX为输入
}

void UART_SendChar(char data) {
    while (!TXSTAbits.TRMT);  // 等待发送寄存器空
    TXREG = data;
}

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

void LED_Control(char command) {
    if (command == '1') {
        LED_PIN = 1;  // 打开LED
    } else if (command == '0') {
        LED_PIN = 0;  // 关闭LED
    }
}

void main(void) {
    TRISBbits.TRISB0 = 0;  // 设置RB0为输出(LED)
    UART_Init();  // 初始化UART

    while (1) {
        char receivedData = UART_ReceiveChar();  // 接收串口数据
        LED_Control(receivedData);  // 根据接收到的命令控制LED
    }
}

代码说明:
  • UART初始化:设置波特率、发送和接收配置。
  • UART发送与接收:接收单个字符数据,根据接收到的命令控制LED开关。
  • LED控制逻辑:接收'1'时点亮LED,接收'0'时关闭LED。

这个例子很基础,通过串口可以和MCU交互,输入'1'或'0'来控制LED的状态,非常适合用来入门Microchip的MCU开发。如果有小伙伴刚接触PIC单片机,可以试着改动这段代码,增加更多功能,比如多路LED控制或其他传感器的集成。

如果有问题,大家可以在下面留言一起讨论!

使用特权

评论回复
沙发
公羊子丹| | 2024-10-5 13:41 | 只看该作者
这个例子看起来挺实用的,简单明了!我也打算试试控制多个LED,看看效果怎么样。

使用特权

评论回复
板凳
周半梅| | 2024-10-5 13:41 | 只看该作者
刚好最近在搞UART通信,这段代码挺适合入门的,感谢分享!

使用特权

评论回复
地板
帛灿灿| | 2024-10-5 13:41 | 只看该作者
我也是刚接触Microchip MCU,这个项目对我帮助很大!我试着加个PWM看看能不能调光。

使用特权

评论回复
5
童雨竹| | 2024-10-5 13:42 | 只看该作者
有意思,我可以把它扩展一下,用手机通过蓝牙发指令控制LED,应该会更酷!

使用特权

评论回复
6
万图| | 2024-10-5 13:42 | 只看该作者
请问一下,如果我想把波特率改成115200,这段代码里该怎么改?

使用特权

评论回复
7
Bblythe| | 2024-10-5 13:42 | 只看该作者
这个LED控制的小项目确实是不错的练手项目,学到了一些基本的串口通信方法!

使用特权

评论回复
8
Pulitzer| | 2024-10-5 13:42 | 只看该作者
可以试着让MCU做个反馈,收到指令后返回当前LED的状态,增加点互动性哈哈

使用特权

评论回复
9
Uriah| | 2024-10-5 13:43 | 只看该作者
我用的是16F877A,这段代码稍微改一下就能用,非常方便!

使用特权

评论回复
10
Clyde011| | 2024-10-5 13:43 | 只看该作者
看起来挺好,我这边用的是12MHz时钟,波特率好像要调整一下。

使用特权

评论回复
11
liu96jp| | 2024-10-23 16:19 | 只看该作者
确实,使用串口通讯控制外设挺有意义的

使用特权

评论回复
12
g0d5xs| | 2024-10-23 17:21 | 只看该作者
其实使用MCC还是MPLAB这种软件配置的话会更好

使用特权

评论回复
13
cen9ce| | 2024-10-23 18:34 | 只看该作者
微芯如果在中国的生态再做好点就好了

使用特权

评论回复
14
zhizia4f| | 2024-10-23 19:39 | 只看该作者
我觉得你要是加个协议的话会更稳定一些吧

使用特权

评论回复
15
y1n9an| | 2024-10-23 21:48 | 只看该作者
我觉得LED用串口控制的话,可以加点协议判断,这样更加的稳定

使用特权

评论回复
16
suw12q| | 2024-10-23 22:50 | 只看该作者
一般来说,这算是基础,但是微芯的芯片确实基础都很难

使用特权

评论回复
17
w2nme1ai7| | 2024-10-24 09:00 | 只看该作者
代码还行的,但是你这算是寄存器操作?

使用特权

评论回复
18
tax2r6c| | 2024-10-24 10:25 | 只看该作者
可以考虑使用高级一些的芯片来玩啊,可以更简单的应用的

使用特权

评论回复
19
l1uyn9b| | 2024-10-24 14:07 | 只看该作者
看着还不错,代码写的还挺清晰的

使用特权

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

本版积分规则

29

主题

3652

帖子

1

粉丝