[应用方案] 基于赛元SC95F7571 MCU的UART通信与应用

[复制链接]
 楼主| Uriah 发表于 2024-10-10 08:16 | 显示全部楼层 |阅读模式

赛元SC95F7571是一款高性能、低功耗的8位单片机,具有丰富的外设资源,尤其是在工业控制和消费电子等领域广泛应用。其中,UART串行通信功能是其重要的外设之一,能够实现与其他设备的数据通信。本文将详细介绍如何使用SC95F7571 MCU实现UART通信,并通过代码实例演示如何发送和接收数据。

1. 硬件准备
  • 赛元SC95F7571开发板
  • USB转TTL模块(用于调试UART通信)
  • PC串口调试助手
  • 若干杜邦线

2. 开发环境
  • Keil C51 编译器
  • 赛元官方提供的开发工具和驱动库

3. UART简介UART(Universal Asynchronous Receiver Transmitter)是一种通用的异步收发器,通过串行通信进行数据传输。在赛元SC95F7571 MCU中,UART模块能够配置波特率、数据位、停止位和校验位,并且支持全双工通信。
UART通信的主要特点:
  • 异步通信:无时钟信号,需要设置发送和接收设备的波特率相同。
  • 全双工:可以同时发送和接收数据。
  • 单线通信:只需一根TX(发送)和RX(接收)线,简单高效。

4. UART配置步骤
  • 设置波特率:配置通信速度,如9600bps。
  • 配置数据位和停止位:常见的配置是8数据位、1停止位,无校验。
  • 使能UART发送和接收功能:配置SC95F7571的UART外设寄存器,使能发送和接收功能。
  • 中断处理:如果需要,可以启用UART中断,处理数据收发。

5. 实例代码:UART发送与接收以下是基于SC95F7571 MCU的UART通信代码,用于实现简单的数据发送与接收功能:
  1. #include <SC95F7571.h>  // 引入SC95F7571的头文件

  2. // 定义波特率为9600
  3. #define BAUDRATE 9600

  4. // 初始化UART
  5. void UART_Init(void) {
  6.     // 设置波特率
  7.     PCON &= 0x7F;     // 选择波特率模式
  8.     SCON = 0x50;      // 配置串口为模式1(8位数据,1停止位)
  9.     TMOD |= 0x20;     // 定时器1设置为模式2(8位自动重装载)
  10.     TH1 = 256 - (11059200 / 12 / 32 / BAUDRATE);  // 计算波特率值
  11.     TR1 = 1;          // 启动定时器1
  12.     ES = 1;           // 使能串口中断
  13.     EA = 1;           // 使能总中断
  14. }

  15. // 发送一个字节
  16. void UART_SendByte(unsigned char byte) {
  17.     SBUF = byte;          // 将数据写入发送寄存器
  18.     while (!TI);          // 等待发送完成
  19.     TI = 0;               // 清除发送中断标志
  20. }

  21. // 接收一个字节
  22. unsigned char UART_ReceiveByte(void) {
  23.     while (!RI);          // 等待接收完成
  24.     RI = 0;               // 清除接收中断标志
  25.     return SBUF;          // 返回接收到的数据
  26. }

  27. // 主函数
  28. void main(void) {
  29.     UART_Init();  // 初始化UART

  30.     while (1) {
  31.         UART_SendByte('H');   // 发送字符'H'
  32.         UART_SendByte('e');   // 发送字符'e'
  33.         UART_SendByte('l');   // 发送字符'l'
  34.         UART_SendByte('l');   // 发送字符'l'
  35.         UART_SendByte('o');   // 发送字符'o'
  36.         
  37.         // 接收字符并发送回去(回显功能)
  38.         unsigned char receivedData = UART_ReceiveByte();
  39.         UART_SendByte(receivedData);  // 将接收到的数据回传
  40.     }
  41. }

6. 代码解析
  • UART_Init函数配置了SC95F7571的串口,使用定时器1生成波特率,设置为9600bps,8数据位、1停止位、无校验。
  • UART_SendByte函数将一个字节的数据发送到串口的发送缓冲区(SBUF),并等待发送完成。
  • UART_ReceiveByte函数则用于接收串口数据,当接收到数据后,清除接收中断标志,并返回接收到的数据。
  • 在主函数中,发送"Hello"字符串,并实现简单的回显功能,接收一个字节的数据并将其发送回去。

7. 实际应用场景UART通信广泛应用于各种场景中,尤其是在嵌入式设备中与外设的通信中。以下是SC95F7571 UART通信的几种典型应用场景:
  • 传感器数据读取:通过UART从外部传感器获取数据,并通过MCU进行处理。
  • 无线模块通信:UART用于MCU与WiFi、蓝牙等无线模块的通信。
  • 调试信息输出:开发过程中,UART可以输出调试信息,便于定位和解决问题。

8. 项目开发中的注意事项
  • 波特率匹配:通信双方的波特率必须匹配,否则会出现数据丢失或乱码。
  • 中断处理:在复杂应用中,建议使用UART中断处理数据收发,避免因等待串口数据而造成主程序阻塞。
  • 电平转换:MCU与外设的工作电压不同可能需要使用电平转换芯片,避免直接连接造成损坏。
  • 抗干扰设计:UART通信线路容易受到外部电磁干扰,特别是在工业环境中,建议加装滤波器或屏蔽线。

9. 总结通过这篇文章的介绍和代码实例,大家可以看到赛元SC95F7571 MCU的UART功能是非常易于使用的。无论是简单的字符发送,还是复杂的双向通信,SC95F7571都能胜任各种应用场景。在嵌入式开发中,掌握UART通信对于设备间的数据交互和系统调试是非常重要的,希望本文对大家有所帮助。



公羊子丹 发表于 2024-10-10 08:16 | 显示全部楼层
这个UART代码写得清晰明了,刚好用到,帮大忙了!
周半梅 发表于 2024-10-10 08:16 | 显示全部楼层
原来SC95F7571的串口配置这么简单,刚好拿来做我的传感器项目。
帛灿灿 发表于 2024-10-10 08:17 | 显示全部楼层
我也用Keil做赛元的项目,串口通信总算搞懂了。
童雨竹 发表于 2024-10-10 08:17 | 显示全部楼层
请教一下,如果要改成115200的波特率,代码怎么改呢?
万图 发表于 2024-10-10 08:17 | 显示全部楼层
好实用的例子!能不能再分享个串口中断接收的代码?
Wordsworth 发表于 2024-10-10 08:17 | 显示全部楼层
我用这个MCU做了个LED控制的小项目,效果不错!
Pulitzer 发表于 2024-10-10 08:18 | 显示全部楼层
串口的回显功能很有意思,刚好适合调试时用。
Bblythe 发表于 2024-10-10 08:18 | 显示全部楼层
波特率的计算有点绕,幸好这代码都帮我们写好了。
Clyde011 发表于 2024-10-10 08:18 | 显示全部楼层
有没有人知道,这个MCU支持多串口通信吗?
gangong 发表于 2025-2-27 22:30 | 显示全部楼层
gangong 发表于 2025-3-1 07:55 | 显示全部楼层
完美111111111
zzjsql 发表于 2025-3-6 11:58 | 显示全部楼层
帛灿灿 发表于 2024-10-10 08:17
我也用Keil做赛元的项目,串口通信总算搞懂了。

您好,咨询您一下,赛元的单片机资料写的TX和RX到底哪个是接收哪个是发送。我用的STC的是RX是接收,是外部进入MCU的信号,PIC单片机也是。但是赛元的看资料迷糊了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

5820

帖子

1

粉丝

139

主题

5820

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部