[应用方案] 基于新唐N76E003AT20 MCU的UART通信应用与实现

[复制链接]
 楼主| 万图 发表于 2024-10-10 07:58 | 显示全部楼层 |阅读模式

新唐(Nuvoton)推出的 N76E003AT20 是一款低功耗、高性能的 8 位单片机,广泛应用于各种嵌入式系统中。这款 MCU 拥有 18 KB Flash、256 字节 SRAM 和丰富的外设接口,如 UART、SPI、I2C 等。在嵌入式应用中,UART(通用异步收发传输)是常见的通信方式之一,用于设备之间的数据交换。
本文将介绍如何使用 N76E003AT20 的 UART 接口实现基本的串口通信,包括数据的发送和接收,并提供完整的代码示例。

1. 硬件准备
  • 新唐 N76E003AT20 开发板
  • USB 转串口模块(如 CP2102)
  • PC 端串口调试工具(如 SSCOM、Tera Term 等)

2. 软件工具
  • Keil C51 开发环境
  • 新唐提供的标准库文件

3. UART 通信原理UART 是一种异步通信协议,它使用两个数据线进行数据交换:一个用于发送(TX),一个用于接收(RX)。通信双方需要提前约定好波特率等参数,以确保数据能正确传输。

4. N76E003AT20 的 UART 配置N76E003AT20 的 UART 支持全双工通信,可以灵活配置波特率,适合应用于各种串口通信场景。在本示例中,我们将设置 MCU 以 9600 波特率进行通信,并实现基本的数据发送和接收功能。

5. 实现代码
  1. #include "N76E003.h"    // N76E003AT20的头文件
  2. #include "SFR_Macro.h"
  3. #include "Function_define.h"
  4. #include "Common.h"

  5. // UART 初始化,波特率为9600
  6. void UART_Init() {
  7.     P06_Quasi_Mode;       // 将P0.6设置为UART TX引脚
  8.     P07_Quasi_Mode;       // 将P0.7设置为UART RX引脚

  9.     SCON = 0x50;          // 配置为8位UART模式
  10.     TMOD |= 0x20;         // 使用Timer 1,模式2,8位自动重载
  11.     TH1 = 0xFD;           // 设置波特率9600(11.0592 MHz晶振)
  12.     TR1 = 1;              // 启动Timer 1
  13.     ES = 1;               // 使能串口中断
  14.     EA = 1;               // 全局中断使能
  15. }

  16. // UART 发送数据
  17. void UART_Send(char data) {
  18.     SBUF = data;          // 将数据写入SBUF寄存器
  19.     while (TI == 0);      // 等待发送完成
  20.     TI = 0;               // 清除发送中断标志
  21. }

  22. // UART 接收数据
  23. char UART_Receive() {
  24.     while (RI == 0);      // 等待接收数据
  25.     RI = 0;               // 清除接收中断标志
  26.     return SBUF;          // 返回接收到的数据
  27. }

  28. // UART 中断服务程序
  29. void UART_ISR() interrupt 4 {
  30.     if (RI) {
  31.         RI = 0;           // 清除接收中断标志
  32.         UART_Send(SBUF);  // 回显接收到的数据
  33.     }
  34. }

  35. void main() {
  36.     UART_Init();           // 初始化UART

  37.     while (1) {
  38.         // 在此处可以加入其他逻辑
  39.     }
  40. }

6. 代码解析
  • UART_Init 函数:该函数配置 MCU 的 UART 模块,波特率设为 9600。P0.6 和 P0.7 分别作为 TX 和 RX 引脚。使用 Timer 1 产生波特率,并使能串口中断。
  • UART_Send 函数:该函数用于发送单个字符,通过将数据写入 SBUF 寄存器,并等待发送完成。
  • UART_Receive 函数:该函数用于接收数据,接收到的数据保存在 SBUF 中,函数返回接收到的数据。
  • UART_ISR 中断服务程序:当 MCU 接收到数据时,该中断服务程序会触发。程序中简单实现了回显功能,即将接收到的数据重新发送回去。
  • 主函数:在主函数中,调用 UART_Init 函数初始化 UART,进入无限循环,可以在这里添加其他的应用逻辑。


7. 实际应用
  • 串口调试:在嵌入式系统中,串口调试是非常常见的调试方式。通过 UART,开发者可以实时监测系统的运行状态,打印调试信息,帮助快速定位问题。
  • 模块通信:UART 是一种低成本、简单易用的通信方式,适用于多种场景,比如 MCU 和外部传感器、无线模块之间的通信。
  • 远程控制:在某些应用中,UART 可以用于远程控制设备,比如通过串口命令控制外设的工作状态。


8. 扩展功能
  • 调整波特率:如果需要更高或更低的波特率,可以修改 Timer 1 的重载值(TH1)。例如,将 TH1 设置为 0xFA,可以实现 4800 的波特率。
  • 多设备通信:在一些复杂的系统中,可能需要多个设备之间进行通信。在这种情况下,可以将 UART 和其他通信方式结合使用,如 I2C 或 SPI。
  • 低功耗通信:在电池供电的设备中,可以将 MCU 设置为低功耗模式,并通过 UART 接收中断来唤醒 MCU,节省功耗。


9. 总结本文介绍了如何基于新唐 N76E003AT20 MCU 实现 UART 通信,展示了基本的 UART 配置、数据发送与接收功能。通过使用 UART 接口,MCU 可以轻松与外部设备进行通信,是嵌入式系统中最常用的通信方式之一。开发者可以根据具体应用需求,对代码进行扩展和优化,以实现更多功能。



公羊子丹 发表于 2024-10-10 07:58 | 显示全部楼层
这个代码太棒了,我刚好在用 N76E003AT20,试了一下很顺利。
周半梅 发表于 2024-10-10 07:59 | 显示全部楼层
原来 UART 这么容易实现啊,之前以为很复杂。
帛灿灿 发表于 2024-10-10 07:59 | 显示全部楼层
新唐的这款 MCU 确实功能强大,价格还亲民,用得很顺手。
童雨竹 发表于 2024-10-10 07:59 | 显示全部楼层
按照你的代码走了一遍,波特率设成 115200 也能跑得很稳。
Wordsworth 发表于 2024-10-10 07:59 | 显示全部楼层
终于搞懂 UART 中断怎么用的了,感谢分享!
Bblythe 发表于 2024-10-10 08:00 | 显示全部楼层
请问这个代码可以用于多个 UART 设备通信吗?
Pulitzer 发表于 2024-10-10 08:00 | 显示全部楼层
我加了个 LCD 显示器,现在串口数据还能显示在屏幕上。
Uriah 发表于 2024-10-10 08:00 | 显示全部楼层
用了你这套代码做项目,串口通信太顺了,效率高!
Clyde011 发表于 2024-10-10 08:00 | 显示全部楼层
能不能讲讲 UART 和 SPI 的区别?我在考虑用哪种方式。
菜鸟的第一步 发表于 2024-10-10 14:31 | 显示全部楼层
新唐的8位单片机有库函数的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

152

主题

5815

帖子

1

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

152

主题

5815

帖子

1

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