Megawin MG51单片机实现UART通信与PWM控制

[复制链接]
2370|9
 楼主| Pulitzer 发表于 2024-10-13 14:41 | 显示全部楼层 |阅读模式

Megawin(笙泉)推出的MG51系列MCU是一款低功耗、高性价比的8位单片机,支持丰富的外设资源,如UART、PWM、I2C等,非常适合用于小家电和工业控制领域。在本文中,我们将基于MG51DB9AE芯片实现UART串口通信与PWM调光控制,展示其强大的外设功能。



开发环境
  • MCU型号:MG51DB9AE
  • 开发工具:Keil uVision 5
  • 编程语言:C语言
  • 硬件平台:MG51最小系统开发板
  • 烧录工具:Nu-Link仿真器



实现功能
  • 利用UART与PC端进行数据通信,并控制LED的亮度。
  • 使用PWM生成占空比可调的波形控制LED亮度变化。



硬件连接
  • LED:连接在P0.4引脚,用于PWM亮度控制。
  • UART:使用P0.6(TX)和P0.7(RX)连接到USB转串口模块,与PC通信。



代码实现
  1. #include "mg51_sdcc.h"

  2. // 初始化UART,波特率9600
  3. void UART_Init(void) {
  4.     P06_Quasi_Mode;  // 设置P0.6为TX模式
  5.     P07_Quasi_Mode;  // 设置P0.7为RX模式

  6.     SCON = 0x50;  // 设置UART为8位数据,1个停止位
  7.     TMOD |= 0x20;  // 选择定时器1为8位自动重装模式
  8.     TH1 = 0xFD;  // 设置波特率为9600
  9.     TR1 = 1;  // 启动定时器1
  10.     TI = 1;  // 准备发送
  11. }

  12. // UART发送一个字节
  13. void UART_SendByte(uint8_t data) {
  14.     SBUF = data;
  15.     while (TI == 0);
  16.     TI = 0;
  17. }

  18. // 初始化PWM用于LED调光
  19. void PWM_Init(void) {
  20.     P04_PushPull_Mode;  // 设置P0.4为推挽输出模式

  21.     PWMPH = 0x00;  
  22.     PWMPL = 0xFF;  // PWM周期设为255
  23.     PWM2H = 0x00;  
  24.     PWM2L = 0x80;  // 初始占空比为50%

  25.     PWM2_Output_Enable;  // 开启PWM2输出
  26.     set_PWMCON0_LOAD;  // 载入PWM配置
  27.     set_PWMCON0_PWMF;  // 启动PWM
  28. }

  29. // 主函数:根据接收的数据调整LED亮度
  30. void main(void) {
  31.     uint8_t brightness;

  32.     UART_Init();  // 初始化UART
  33.     PWM_Init();   // 初始化PWM

  34.     while (1) {
  35.         if (RI) {  // 检测是否有数据接收
  36.             brightness = SBUF;  // 读取接收数据
  37.             RI = 0;  // 清除接收中断标志

  38.             PWM2L = brightness;  // 根据接收值调整占空比
  39.             UART_SendByte(brightness);  // 回传数据确认
  40.         }
  41.     }
  42. }


代码解析
  • UART初始化:配置定时器1用于波特率的生成,UART波特率为9600。
  • PWM配置:PWM周期设置为255,占空比可调,用于控制LED亮度。
  • 主循环逻辑:检测串口接收的数据,并将其作为PWM的占空比,实时调节LED亮度。



实验效果
  • 当从PC串口工具发送0-255之间的数值时,LED的亮度会随之改变。
  • MCU通过串口将接收到的数值回传给PC,确保通信正常。



功能扩展
  • 多通道PWM控制:可以增加更多LED,并使用不同PWM通道独立控制。
  • 按键调光模式:增加按键,在本地控制LED亮暗。
  • I2C传感器:结合I2C传感器,实现环境光亮度自动调节LED。



总结通过这个项目,我们学习了如何在Megawin MG51单片机上实现UART通信与PWM调光。这展示了MG51芯片的基本GPIO、UART和PWM功能,非常适合作为学习8位MCU的入门项目。在实际应用中,这类项目还可以扩展为智能灯光控制系统或远程调光模块。

公羊子丹 发表于 2024-10-13 15:04 | 显示全部楼层
这个代码看着简单,但功能很实用,我已经在家里的LED灯上试了。
周半梅 发表于 2024-10-13 15:04 | 显示全部楼层
Megawin的芯片用起来还真不错,之前一直以为只做低端市场。
帛灿灿 发表于 2024-10-13 15:05 | 显示全部楼层
我用这个项目做了个简易台灯控制,效果蛮好。
童雨竹 发表于 2024-10-13 15:06 | 显示全部楼层
看了这篇帖子,我对8位单片机又有了新的兴趣。
万图 发表于 2024-10-13 15:06 | 显示全部楼层
有人试过用I2C传感器配合这个PWM控制吗?想要个参考。
Wordsworth 发表于 2024-10-13 15:07 | 显示全部楼层
代码运行很流畅,MG51的UART还挺稳定的。
Bblythe 发表于 2024-10-13 15:08 | 显示全部楼层
这个项目给我启发了,我想把它改成遥控车灯的控制模块。
Uriah 发表于 2024-10-13 15:08 | 显示全部楼层
有没有人试过用手机蓝牙控制这种LED?感觉应该很酷。
Clyde011 发表于 2024-10-13 15:09 | 显示全部楼层
我用多个PWM通道控制RGB灯,真的可以玩出花样来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

6055

帖子

0

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