【CC2530授课笔记】⑧ PWM实现呼吸灯,RGB三色灯,蜂鸣器播放音乐

摘要

这篇文章通过定时器产生PWM波,控制LED实现呼吸灯的效果,并且通过三路PWM分别控制RGB三色灯,实现了颜色渐变。最后通过调制PWM频率,使用蜂鸣器实现了音乐播放。

PWM简介

Pulse Width Modulation 翻译成中文是 脉冲宽度调制,简单的可以理解为PWM就是控制方波的频率占空比

PWM


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

RGB灯渐变源代码

/*
接线方法:

P0.4 -- 红灯
P0.5 -- 绿灯
P0.6 -- 蓝灯
*/
#include <ioCC2530.h>

//定义控制灯的端口
#define LED1 P1_0 //定义LED1为P1_0口控制
#define LED2 P1_5 //定义LED2为P1_5口控制
#define LED3 P1_3 //定义LED3为P1_3口控制
#define LED4 P1_4 //定义LED4为P1_4口控制

#define SW1 P1_2        //定义SW1为P1_2端口
#define SW2 P0_1        //定义SW2为P0_1端口

#define SRCLK P0_4
#define RCLK  P0_5
#define SER   P0_6

#define LEDS0 P0_7
#define LEDS1 P1_7
#define LEDS2 P0_0
/****************************
//延时
*****************************/
char pause = 0;
void Delay_mS(unsigned int n)
{
    unsigned int tt,i = 0; 
    for(i = 0; i < n; i ++)
        for(tt = 0; tt<1040; tt++);
     while(pause);
}

void Delay_uS(unsigned int n)
{
  unsigned int i = 0;
  for(;i < n; i++);
}

/****************************
//初始化函数
*****************************/
void Initial(void)
{
        CLKCONCMD = 0x80; //32MHz 外部晶振
        P0DIR = 0xFF;
        P0SEL = 0xFF;    //设置P0为外设功能
        P2DIR = 0xC0;    //设置Timer外设引脚的优先级
        
        //配置工作模式和分频系数
        T1CTL = 0x01;
        
        T1CCTL2 = 0x24;   //设置T1输出的通道2,Channel 2 
        T1CCTL3 = 0x24;   //设置T1输出的通道3,Channel 3
        T1CCTL4 = 0x24;   //设置T1输出的通道4,Channel 4
        
        T1CC2L = 0x10;    
        T1CC2H = 0x00;
            
        T1CC3L = 0x10;    
        T1CC3H = 0x00;
            
        T1CC4L = 0x10;    
        T1CC4H = 0x00;    
}
/***************************
//主函数
***************************/
void main(void)
{      
      unsigned short r = 60000;
      unsigned short g = 300;
      unsigned short b = 300;
      
      int stage = 1;
      Initial();  //调用初始化函数
      while(1)
      {
        if(stage == 1)
        {
            r -= 300;
            g += 300;
            
            if(g == 60000) 
            {
              stage = 2;
            }
        }
        else if(stage == 2)
        {
            g -= 300;
            b += 300;
            if(b == 60000) 
            {
              stage = 3;
            }
        }
        else if(stage == 3)
        {
            b -= 300;
            r += 300;
            if(r == 60000) 
            {
              stage = 1;
            }
        }
        
        T1CC2L = r;
        T1CC2H = r>>8;
        T1CC3L = g;
        T1CC3H = g>>8;
        T1CC4L = b;
        T1CC4H = b>>8;
        Delay_mS(10);
      }
}

在这里插入图片描述


在这里插入图片描述


音符与频率对应关系

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述



播放音乐源代码

/*
接线方法:
P0.6连接蜂鸣器
*/
#include <ioCC2530.h>

//定义控制灯的端口
#define LED1 P1_0 //定义LED1为P1_0口控制
#define LED2 P1_5 //定义LED2为P1_5口控制
#define LED3 P1_3 //定义LED3为P1_3口控制
#define LED4 P1_4 //定义LED4为P1_4口控制

#define SW1 P1_2        //定义SW1为P1_2端口
#define SW2 P0_1        //定义SW2为P0_1端口

#define SRCLK P0_4
#define RCLK  P0_5
#define SER   P0_6
#define LEDS0 P0_7
#define LEDS1 P1_7
#define LEDS2 P0_0

/****************************
//延时
*****************************/
char pause = 0;
void Delay_mS(unsigned int n)
{
	unsigned int tt,i = 0;
	for(i = 0; i < n; i ++)
	for(tt = 0; tt<1040; tt++);
	while(pause);
}

void Delay_uS(unsigned int n)
{
  unsigned int i = 0;
  for(;i < n; i++);
}
/****************************
//初始化函数
*****************************/
void Initial(void)
{
	CLKCONCMD = 0x88;
	
	P0DIR = 0xFF;
	P1DIR = 0xFB;//将P12设为输入,其他设为输出 (0xFB = 11111011)
	LED1 = 0;//关闭LED1
	LED2 = 0;//关闭LED2
	LED3 = 0;//关闭LED3
	LED4 = 0;//关闭LED4
	P0SEL |= 0x40;    //设置P0.6为外设功能
	
	//配置工作模式和分频系数
	T1CTL = 0x0E;
	T1CCTL4 = 0x24;   //设置T1通道4比较输出功能
	T1CC4L = 0xA;    //设置T1CC4,PWM输出时比较值值
	T1CC4H = 0x00; 
}
void PWM_Play(int tune, int time)
{
      if(tune == 0)
      {
        P0SEL  = 0x00; 
        P0_6   = 0; 
        Delay_mS(time);
        P0SEL |= 0x40; 
        return;
      }
      T1CNTL = 0;
      T1CNTH = 0;
      T1CC0L = 125000/tune;
      T1CC0H = (125000/tune) >> 8;
      Delay_mS(time);
}

void birth()
{
	  PWM_Play(784,500);
	  PWM_Play(0, 25);
	  PWM_Play(784,500);
	  PWM_Play(880,1000);
	  PWM_Play(784,1000);
	  PWM_Play(1046,1000);
	  PWM_Play(988,2000);
	  
	  PWM_Play(0, 300);
	  
	  PWM_Play(784,500);
	  PWM_Play(0, 25);
	  PWM_Play(784,500);
	  PWM_Play(880,1000);
	  PWM_Play(784,1000);
	  PWM_Play(1175,1000);
	  PWM_Play(1046,2000);
	  PWM_Play(0, 1000);
}

void mamahao()
{
	PWM_Play(880,1500);
	PWM_Play(784,500);
	PWM_Play(659,1000);
	PWM_Play(784,1000);
	PWM_Play(1046,1000);
	PWM_Play(880,500);
	PWM_Play(784,500);
	PWM_Play(880,2000);
	
	PWM_Play(0, 1000);
}
/***************************
//主函数
***************************/
void main(void)
{      
 	Initial();  //调用初始化函数
    PWM_Play(0, 100);
    
 	while(1)
 	{
		birth()mamahao();
 	}
}
  • 26
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32中,可以使用PWM输出来控制蜂鸣器播放音乐PWM(脉冲宽度调制)是一种通过改变脉冲的宽度来控制电平的技术。通过改变PWM的频率和占空比,可以产生不同的音调和音乐效果。 在你提供的代码中,可以看到以下几个函数用于控制蜂鸣器发声: - `TIM_SetTIM1Compare1`函数用于设置TIM1通道2的比较值,即脉冲的宽度。 - `TIM_SetTIM1Autoreload`函数用于设置TIM1的自动重装载值,即PWM的频率。 - `buzzerQuiet`函数用于停止发声,将脉冲宽度设置为0。 - `buzzerOpen`函数用于开始发声,使能PWM输出。 - `buzzerSound`函数用于控制蜂鸣器发声模块,根据输入的频率和音量级别来设置脉冲宽度和频率。 通过调用这些函数,你可以实现在STM32上使用PWM输出来控制蜂鸣器播放音乐。具体的实现细节可以参考你提供的代码和STM32学习笔记中的PWM介绍和应用实例。\[1\] \[2\] \[3\] #### 引用[.reference_title] - *1* *2* [基于STM32制作的音乐播放器,用PWM控制蜂鸣器](https://blog.csdn.net/weixin_69250798/article/details/125709863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32-PWM驱动无源蜂鸣器播放音乐(附网盘代码)](https://blog.csdn.net/MOS_JBET/article/details/130051643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值