打印
[应用方案]

基于新唐N76E003AT20 MCU的UART通信应用与实现

[复制链接]
733|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
万图|  楼主 | 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. 实现代码
#include "N76E003.h"    // N76E003AT20的头文件
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"

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

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

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

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

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

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

    while (1) {
        // 在此处可以加入其他逻辑
    }
}

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 确实功能强大,价格还亲民,用得很顺手。

使用特权

评论回复
5
童雨竹| | 2024-10-10 07:59 | 只看该作者
按照你的代码走了一遍,波特率设成 115200 也能跑得很稳。

使用特权

评论回复
6
Wordsworth| | 2024-10-10 07:59 | 只看该作者
终于搞懂 UART 中断怎么用的了,感谢分享!

使用特权

评论回复
7
Bblythe| | 2024-10-10 08:00 | 只看该作者
请问这个代码可以用于多个 UART 设备通信吗?

使用特权

评论回复
8
Pulitzer| | 2024-10-10 08:00 | 只看该作者
我加了个 LCD 显示器,现在串口数据还能显示在屏幕上。

使用特权

评论回复
9
Uriah| | 2024-10-10 08:00 | 只看该作者
用了你这套代码做项目,串口通信太顺了,效率高!

使用特权

评论回复
10
Clyde011| | 2024-10-10 08:00 | 只看该作者
能不能讲讲 UART 和 SPI 的区别?我在考虑用哪种方式。

使用特权

评论回复
11
菜鸟的第一步| | 2024-10-10 14:31 | 只看该作者
新唐的8位单片机有库函数的吧

使用特权

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

本版积分规则

38

主题

3713

帖子

0

粉丝