基于单片机的蓝牙可调PWM波形发生器设计

基于单片机的蓝牙可调PWM波形发生器设计

点击下载资料:https://download.csdn.net/download/m0_51061483/91644952


1. 系统功能介绍

本系统设计的题目为"基于单片机的蓝牙可调PWM波形发生器设计"。本设计以STC89C52单片机为核心控制器,通过内部定时器产生PWM(脉宽调制)信号,实现波形频率与占空比的可调节输出。系统支持两种操作方式:按键控制与串口控制,用户既可以通过按键实时调整PWM的频率和占空比,也可以通过手机蓝牙APP或上位机串口发送指令远程设置参数。此外,系统使用LCD1602显示当前波形的频率和占空比信息,实现人机交互功能。

系统的主要功能如下:

  1. 输出PWM波形,默认频率为300Hz ,默认占空比为50%

  2. PWM波形频率与占空比均可通过按键或串口命令调节;

  3. 系统设置四个按键:

    • S1:模式切换键,用于在修改"频率"与"占空比"之间切换;
    • S2:加键,用于增加当前设定值;
    • S3:减键,用于减少当前设定值;
    • S4:确认键,用于保存并生效当前设置;
  4. 串口通信方式采用蓝牙模块(如HC-05/HC-06),可通过发送命令设置参数。

    • 例如:发送字符串"30050",表示频率为300Hz,占空比为50%;
    • 单片机成功接收并设置后返回"1",若命令错误则返回"0";
  5. LCD1602用于实时显示当前的频率与占空比信息。

该系统实现了PWM波形可视化调节与无线控制,不仅能满足信号发生器基础功能,还能应用于教学实验、电子控制及智能系统的调试中。


2. 系统电路设计

本系统的硬件电路主要由以下几个模块组成:

  • STC89C52单片机最小系统;
  • PWM信号输出电路;
  • 按键输入电路;
  • 串口蓝牙通信模块电路;
  • LCD1602显示模块电路;
  • 电源电路。

下面分别介绍各个部分的设计原理与功能。


2.1 单片机最小系统

STC89C52单片机是本系统的核心控制模块,负责PWM信号的产生、按键输入的检测、串口通信及LCD显示控制。

最小系统由以下部分组成:

  1. 主控芯片:采用STC89C52RC单片机,具有丰富的I/O口资源和定时/计数器功能,适合PWM信号产生与控制。
  2. 时钟电路:外接12MHz晶振,为单片机提供系统时钟信号,确保定时器与PWM频率精确。
  3. 复位电路:由电容、上拉电阻及复位按键组成,保证系统上电时自动复位。
  4. 电源系统:采用5V稳压供电,保证主控与外围模块稳定工作。

2.2 PWM波形输出电路

PWM波形由单片机内部定时器控制P1.0引脚输出,通过软件调节计数器的溢出周期与高电平时间比例,实现频率与占空比的可控输出。

PWM输出端口可直接驱动小功率负载,若需输出到功率设备(如电机、LED灯带等),可通过NPN三极管或MOSFET进行功率放大。

PWM信号的主要特征:

  • 占空比可在1%~99%之间调节;
  • 频率可在几十Hz至几kHz范围内设置;
  • 输出波形为标准矩形波,可用于调速、调光或信号源测试。

2.3 按键控制电路

系统包含四个独立按键,分别为S1~S4。

  • S1:功能模式切换键,依次在"调频模式"和"调占空比模式"之间切换。
  • S2:加键,每按一次增加当前值1个单位;
  • S3:减键,每按一次减少当前值1个单位;
  • S4:确认键,用于保存当前设置并更新显示与PWM输出。

每个按键均采用下拉电阻接地的独立接法,按下时输入为高电平,松开为低电平。

系统内通过消抖程序对按键输入进行处理,保证调节的稳定性与准确性。


2.4 串口蓝牙通信模块

本设计采用HC-05蓝牙模块与单片机UART口连接,实现无线参数设置功能。

  • 连接方式

    • HC-05的TXD连接单片机RXD(P3.0);
    • HC-05的RXD连接单片机TXD(P3.1);
    • 电源引脚接5V与GND;
  • 通信波特率:设置为9600bps。

蓝牙模块与手机APP或上位机进行双向通信,用户可以通过发送命令修改PWM参数:

例如:

复制代码
30050

表示频率300Hz,占空比50%。

单片机解析命令后设置PWM参数,若成功则通过串口返回"1",否则返回"0"。

该模块的加入大大增强了系统的灵活性与实用性,实现了无线控制与远程调节。


2.5 LCD1602显示模块

LCD1602液晶显示模块负责实时显示PWM信号的当前频率和占空比值。

  • 接口说明:LCD1602采用4位数据线模式,节省单片机I/O口;
  • 显示内容
    第一行显示:"Freq: XXXHz"
    第二行显示:"Duty: XX%"

例如:

复制代码
Freq: 300Hz
Duty: 50%

LCD模块通过动态刷新更新显示信息,当按键或串口修改参数时立即更新显示内容。


2.6 电源电路

系统由5V直流电源供电,所有模块电源由主电源分配。蓝牙模块和单片机共享5V电源,电流由稳压芯片7805提供。为保证系统稳定,电源部分设计有滤波电容,以降低高频干扰。


3. 系统程序设计

本系统的软件程序采用模块化设计思想,包括主程序、按键检测模块、PWM信号控制模块、LCD显示模块、串口通信模块五大部分。系统使用Keil C51开发环境进行编写与调试。


3.1 主程序设计

主程序负责系统初始化、任务调度和功能逻辑控制。程序运行后初始化LCD、PWM、串口和按键模块,并进入主循环,根据按键状态或串口输入更新PWM参数。

c 复制代码
#include <reg52.h>
#include "lcd1602.h"
#include "uart.h"
#include "key.h"
#include "pwm.h"

unsigned int freq = 300;
unsigned char duty = 50;

void main(void)
{
    LCD_Init();
    UART_Init(9600);
    PWM_Init();
    Key_Init();
    
    LCD_ShowString(0,0,"PWM Generator");
    LCD_ShowString(0,1,"Freq:300Hz Duty:50%");
    
    while(1)
    {
        Key_Scan(&freq, &duty);
        PWM_Set(freq, duty);
        LCD_Display(freq, duty);
        UART_Receive(&freq, &duty);
    }
}

该程序实现了主循环中多任务并行执行,实时检测按键与串口命令,并更新PWM输出与显示。


3.2 PWM信号控制程序

PWM波形的生成依赖于定时器中断实现,通过调节定时器的溢出周期与高电平计数实现不同频率与占空比输出。

c 复制代码
void PWM_Set(unsigned int freq, unsigned char duty)
{
    unsigned int period = 1000000 / freq;     // 周期us
    unsigned int highTime = (period * duty) / 100;
    Set_Timer0(period, highTime);
}

void Timer0_ISR(void) interrupt 1
{
    static unsigned int cnt = 0;
    cnt++;
    if(cnt < highTime)
        P1_0 = 1;
    else if(cnt < period)
        P1_0 = 0;
    else
        cnt = 0;
}

该模块实现高精度PWM输出,确保波形稳定性。


3.3 按键扫描程序

按键模块用于检测用户输入并实现模式切换、加减调节与确认操作。

c 复制代码
void Key_Scan(unsigned int *freq, unsigned char *duty)
{
    static bit mode = 0;  // 0-频率 1-占空比
    
    if(S1_Pressed())
        mode = !mode;
    
    if(S2_Pressed())
    {
        if(mode == 0 && *freq < 1000) (*freq)++;
        else if(mode == 1 && *duty < 99) (*duty)++;
    }
    if(S3_Pressed())
    {
        if(mode == 0 && *freq > 10) (*freq)--;
        else if(mode == 1 && *duty > 1) (*duty)--;
    }
    if(S4_Pressed())
        PWM_Set(*freq, *duty);
}

通过按键切换模式并修改参数,用户可精准地控制输出波形特性。


3.4 串口通信程序

串口模块实现蓝牙命令解析功能,接收输入数据并根据格式设置PWM参数。

c 复制代码
void UART_Receive(unsigned int *freq, unsigned char *duty)
{
    unsigned char buffer[10];
    unsigned char i = 0;
    if(RI)
    {
        while(RI)
        {
            buffer[i++] = SBUF;
            RI = 0;
        }
        buffer[i] = '\0';
        if(i >= 5)
        {
            *freq = (buffer[0]-'0')*100 + (buffer[1]-'0')*10 + (buffer[2]-'0');
            *duty = (buffer[3]-'0')*10 + (buffer[4]-'0');
            SBUF = '1'; // 成功返回
        }
        else
        {
            SBUF = '0'; // 失败返回
        }
    }
}

该程序支持固定长度命令输入,通过蓝牙发送如"30050"可直接设置300Hz、50%占空比。


3.5 LCD显示程序

LCD模块用于实时显示PWM状态信息。

c 复制代码
void LCD_Display(unsigned int freq, unsigned char duty)
{
    LCD_ShowString(0,0,"PWM Generator");
    LCD_ShowString(0,1,"Freq:");
    LCD_ShowNum(5,1,freq,4);
    LCD_ShowString(9,1,"Hz ");
    LCD_ShowString(0,2,"Duty:");
    LCD_ShowNum(5,2,duty,2);
    LCD_ShowString(8,2,"%");
}

该模块确保操作反馈及时,使用户清晰了解当前系统输出状态。


4. 总结

本设计以STC89C52单片机为核心,结合按键输入与蓝牙串口通信,实现了PWM波形的频率与占空比的实时可调。系统通过LCD1602直观显示波形参数,具备操作简便、功能灵活、控制精度高等优点。

该设计在教学实验、电子调试及智能设备控制中具有广泛的应用价值,可作为单片机PWM应用的典型实例,为后续扩展多波形输出或自动信号调制提供良好的基础平台。

相关推荐
小莞尔8 小时前
【51单片机】【protues仿真】基于51单片机汽车智能灯光控制系统
c语言·单片机·嵌入式硬件·汽车·51单片机
Logintern098 小时前
只有通过Motor 获取 mongodb的collection,才能正常使用 async with collection.watch()监听集合变更
数据库·mongodb
Python私教9 小时前
5分钟上手 MongoDB:从零安装到第一条数据插入(Windows / macOS / Linux 全平台图解)
windows·mongodb·macos
电子科技圈10 小时前
芯科科技第三代无线SoC现已全面供货
嵌入式硬件·mcu·物联网·网络安全·智能家居·智能硬件·iot
zm10 小时前
数据结构整理
单片机·嵌入式硬件
云和数据.ChenGuang10 小时前
MongoDB 连接时的**认证参数配置错误**
数据库·mongodb
爱吃汽的小橘11 小时前
异步串口通信和逻辑分析仪
运维·服务器·网络·单片机·嵌入式硬件·fpga开发
m0_5557629011 小时前
伺服滑差补偿方案
单片机
IT学长编程11 小时前
计算机毕业设计 基于k-means的校园美食推荐系统 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·毕业设计·kmeans·课程设计·毕业论文·美食推荐系统