摘要

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

PWM简介

Pulse Width Modulation 翻译成中文是 脉冲宽度调制,简单的可以理解为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 3T1CCTL4 = 0x24;   //设置T1输出的通道4,Channel 4T1CC2L = 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;//关闭LED1LED2 = 0;//关闭LED2LED3 = 0;//关闭LED3LED4 = 0;//关闭LED4P0SEL |= 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();}
}

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

  1. 【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  2. SoC 外设-自定义 ip 实验 PWM实现呼吸灯

    SoC 外设-自定义 ip 实验 PWM实现呼吸灯 DS-5 中eclipse更新第二种代码为: /** main.c** Created on: 2021年12月9日* Author: awclou ...

  3. 【mcuclub】PWM(呼吸灯、调节灯亮度)

    一.简介 PWM,脉冲宽度调制,是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应 ...

  4. 嵌入式系统开发13——STM32输出PWM实现呼吸灯

    本文主要介绍在STM32F103C8T6上,利用定时器输出PWM波形,进而驱动LED实现呼吸灯. 目录 一.任务要求 二.PWM简介 1.什么是PWM 2.相关概念 3.PWM的产生 4.PWM的通道 ...

  5. 【STM32F4教程】第六节:通用定时器之PWM实现呼吸灯

    Conceit is the quicksand of success. 自负是成功的流沙. PWM实现呼吸灯 PWM概述 相关概念 PWM设置流程 呼吸灯实现例程 pwm.c main.c PWM概 ...

  6. 【Arduino】一个按键开关控制RGB音乐彩灯(蜂鸣器播放音乐+按键控制播放暂停+RGB彩灯随音乐节奏跳动)

    一.项目说明 这里我们需要使用到RGB LED.蜂鸣器.按键开关这个元件.为什么要叫RGB呢?是因为这个LED是由红(Red).绿(Green)和蓝(Blue)三种颜色组成.我们可以通过调整三个LED ...

  7. Arduino 蜂鸣器播放音乐LED灯闪烁

    一.实验所需组件: led灯 三脚蜂鸣器 面包板 Arduino开发板 杜邦线 二.实验原理 蜂鸣器实现音乐播放: 控制好频率和节拍,就能演奏出好听的音乐.因此,在实验之前要先弄清楚各音调的频率.可参 ...

  8. STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验

    文章目录 1. 代码 关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成.然后查看数据手册,了解定时器的重映射引脚情况.所以配置时, ...

  9. 单片机(STC12C5A60S2)内部PWM实现呼吸灯

    上个文章写了用单片机的两个定时器给大家实现了呼吸灯,其实上个文章是在为大家解析PWM的原理,今天我们将使用单片机内部自带的PWM来进行呼吸灯设计,自己可以查看该单片机型号的中文资料.所看章节如下: 直 ...

最新文章

  1. keil5函数 默认返回值_Python中如何调用random()函数
  2. 进程与线程的一个简单解释(转)
  3. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?
  4. 高效神器!小目标检测迎来曙光!SSPNet金字塔网络!川大出品
  5. 蓝牙 查询码 android,android bluetooth UUID蓝牙查询表
  6. 20200203_knn分类算法
  7. 浅谈JVM中如何自动回收内存
  8. Yandex浏览器安装crx插件
  9. ResourceHacker(4.5.30)单文件绿色汉化版
  10. 方剂学(综合练习)题库【1】
  11. 国外遥感影像如何下载之利用USGS网站影像下载无需JAVA
  12. 【六种解决思路尝试】VMware Workstation 无法连接到虚拟机。
  13. 光盘中的vob格式怎么转换成mp4格式
  14. 解决微信“聊天界面中的新消息通知”设置按钮不见了问题
  15. 数据结构与算法笔记:分治策略之Greatest Slice,2-Way Merge,Counting Inversions,linearSelect,Diameter,Closest Pair
  16. 机器视觉学习系列四:身份证识别
  17. FINVASIA集团宣布收购ActTrader
  18. 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
  19. Linux口语什么软件,wine 一个非常好的英语听力口语学习软件
  20. Excel如何设置文本框的透明度

热门文章

  1. 2022A特种设备相关管理(电梯)复训题库及模拟考试
  2. 三十五、jQuery(JavaScript 库)
  3. Linux 入门教程 1
  4. hardmard积 用什么符号表示_复数域符号相乘的差分网络编码
  5. linux服务端 完美世界 下载,完美世界服务端(linux架设版)[模板源码]
  6. java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.INT
  7. 74HC14中文资料
  8. python爬虫案例教程~淘女郎、百度百科文本、规范化爬虫
  9. Vue移动端——隐藏滚动条
  10. 量化投资技术六大环节