CC2530 蜂鸣器 播放音乐
最近研究zigbee的CC2530 ,想利用它来播放音乐。网上有很多C51的例子,但实际与CC2530的语法并不相同。下面是利用CC2530的timer3定时器,移植了一下C51的蜂鸣器音乐播放程序。分享一下
/*
CC2530 Test
网上一个蜂鸣器音乐移植到CC2530芯片,使用了CC2530 timer3 中断
* 蜂鸣器的输出引脚 P1.0
* 采用定时器3 中断
* 用于学习,请注明出处
2015年8月6日
战斗机
QQ1013347382
*/
#include <ioCC2530.h>
#include <string.h>
#include "HAL_Type.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define buzzer P1_0
void IO_Init(void)
{
P1DIR |= 0x01; //P1_0定义为输出
buzzer = 0;
}
uchar time, count,t3count;//用于定时器计数
//--------------------------------------
//单片机晶振采用32MHz Tcy = 256 * (1/16000000)=16us;
// 频率周期数据表
__code const uchar FREQL[] = {1, //0的时候没有音符
239, 213, 189, 179, 159, 142, 127, //低音1234567 3.817ms 3.401ms 3.030ms 2.858ms 2.552ms 2.273ms 2.024ms
119, 106, 95, 90, 80, 71, 63, 60,//1,2,3,4,5,6,7,i 1.908ms 1.700ms 1.514ms 1.432ms 1.276ms 1.136ms 1.012ms 0.955ms
53, 48, 45, 40, 36, 32, //高音 234567 0.852ms 0.759ms 0.717ms 0.638ms 0.568ms 0.506ms
30, 27, 24, 22, 20, 18, 16}; //超高音 1234567 0.478ms 0.426ms 0.379ms 0.358ms 0.319ms 0.284ms 0.253ms
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以1/4拍为单位)。
//6, 2, 6 分别代表:6, 中音, 6个1/4拍;
//5, 2, 2 分别代表:5, 中音, 2个1/4拍;
//3, 2, 4 分别代表:3, 中音, 4个1/4拍;
//5, 2, 4 分别代表:5, 中音, 4个1/4拍;
//1, 3, 4 分别代表:1, 高音, 4个1/4拍;
//低音为1,中音为2,高音为3,超高音为4;
//
/********************世上只有妈妈好*********************/
__code const uchar sszymmh[] = {
6,2,6, 5,2,2, 3,2,4, 5,2,4,
1,3,4, 6,2,2, 5,2,2, 6,2,8,
3,2,4, 5,2,2, 6,2,2, 5,2,4,
3,2,4, 1,2,2, 6,1,2, 5,2,2,
3,2,2, 2,2,8, 2,2,6, 3,2,2,
5,2,4, 5,2,2, 6,2,2, 3,2,4,
2,2,4, 1,2,8, 5,2,6, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2,
5,1,16, 0,0,0};
/**********************两只耗子**********************/
__code const uchar TwoMouse[]={
3,2,2, 6,2,2, 7,2,2, 5,2,2,
3,2,2, 6,2,2, 7,2,2, 5,2,2,
7,2,2, 1,3,2, 2,3,4,
7,2,2, 1,3,2, 2,3,4,
2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,
2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,
6,2,2, 2,2,2, 5,2,4, 6,2,2, 2,2,2, 5,2,4,
0,0,0};
/***********************两只蝴蝶**********************/
__code const uchar TwoButterfly[]={
3,2,2, 2,2,2, 3,2,6, 3,2,2, 3,2,2, 2,2,2,
1,2,6, 6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 5,1,12,3,2,2,
2,2,2, 3,2,8, 3,2,2, 2,2,2, 3,2,2, 3,2,2,
1,2,12,6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 2,2,12,3,2,2,
2,2,2, 3,2,8, 3,2,2, 2,2,2, 3,2,2, 2,2,2,
1,2,12,6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 5,2,12,3,2,2,
5,2,2, 5,2,8, 5,2,2, 5,2,2, 6,2,2, 5,2,2,
3,2,12,2,2,2, 3,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 6,1,1, 1,2,1, 1,2,1,
1,2,1, 1,2,12,0,0,4, 5,2,2, 5,2,2, 6,2,2,
1,3,2, 7,2,2, 7,2,2, 6,2,2, 3,2,2, 2,2,2,
2,2,2, 3,2,2, 3,2,8, 3,2,2, 3,2,2,
5,2,2, 6,2,4, 6,2,6, 6,1,2, 3,2,2, 2,2,2,
2,2,12,3,2,2, 5,2,2, 5,2,2, 3,2,2, 5,2,4,
1,3,4, 7,2,2, 6,2,2, 7,2,2, 3,2,4,
6,2,2, 6,2,2, 7,2,2, 6,2,2, 5,2,2,
3,2,2, 2,2,4, 3,2,2, 2,2,2, 3,2,2, 5,2,6,
5,2,2, 5,2,2, 6,2,2, 6,2,2, 5,2,2,
3,2,2, 2,2,4, 5,1,2, 5,1,2, 6,1,2, 1,2,12,
0,0,0};
/*****************happy birthday***********************/
__code const uchar Birthday[]={
5,1,2, 5,1,2, 6,1,4, 5,1,4, 1,2,4, 7,1,8,
5,1,2, 5,1,2, 6,1,4, 5,1,4, 2,2,4, 1,2,8,
5,1,2, 5,1,2, 5,2,4, 3,2,4, 1,2,4, 7,1,4,
6,1,4, 4,2,2, 4,2,2, 3,2,4, 1,2,4, 2,2,4,
1,2,4, 0,0,0};
//-----------------------------------------------------
void InitT3()
{
T3CTL |= 0x08 ; //开溢出中断
T3IE = 1; //开总中断和T3中断
T3CTL&=~0xE0; //1分频,Tcy = 256 * (1/16000000)=16us; 其中256是timer3 装满一次是256步
T3CTL &= ~0X03; //自动重装 00->0xff
EA = 1;
}
//--------------------------------------
void delay(uchar t) //延时程序,控制发音的时间长度(1/4拍)
{
uchar t1;
ulong t2;
for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍
for(t2 = 0; t2 < 8000; t2++); //延时期间
T3CTL &=~0x10; //关闭timer3, 停止发音
}
//--------------------------------------
void singachar() //演奏一个音符
{
T3CTL &=~0x10; //关闭timer3
count = t3count; //控制音调
T3CTL |=0X10; //启动, 由timer3输出方波去发音
delay(time); //控制时间长度即 节拍
}
//--------------------------------------
/**************演奏一首歌***********************************/
void song(uchar const __code *str)
{
uchar k,i;
i = 0;
time = 1;
while(time)
{
k = str[i] + 7 * (str[i + 1]);//第i个是音符, 第i+1个是第几个八度
//从数据表中读出频率数值
t3count = FREQL[k]; //实际上, 是定时的时间长度
time = str[i + 2]; //读出时间长度数值 节拍时间
i += 3;
singachar();
}
}
void main(void)
{
IO_Init(); //初始化IO
InitT3();
while(1)
{
song(TwoMouse);
delay(20);
song(sszymmh);
delay(20);
song(TwoButterfly);
delay(20);
song(Birthday);
delay(20);
}
//发出一个音符
}
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void) //timer3中断处理
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
if(--count == 0)
{
T3CTL &=~0X10; //关闭timer3
buzzer = ~buzzer; //输出方波, 发音
T3CTL |=0X10; //启动
count = t3count; //下次的中断时间, 这个时间, 控制音调高低
}
}
CC2530 蜂鸣器 播放音乐相关推荐
- 利用CC2530单片机的蜂鸣器播放音乐的代码
使用 CC2530 单片机播放音乐需要使用蜂鸣器,这是一个较简单的方法. 下面是一个例子,它使用蜂鸣器播放了著名的<莫扎特第五交响曲>的第一段: #include "ioCC25 ...
- 蜂鸣器播放音乐 fpga实现
目录 原理 实现 原理 蜂鸣器分为有源蜂鸣器和无源蜂鸣器,即以有无震荡源分类, 有震荡源直接通直流电就可发生,无震荡源则需要通震荡波才能发声. 这里介绍无源蜂鸣器播放音乐的方法. 思路: 利用计数器产 ...
- 【FPGA】五、蜂鸣器播放音乐
文章目录 前言 一.蜂鸣器简介 二.音频音符简介 三.任务要求 四.程序设计 1.设计思路 2.程序代码 总结 前言 蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号.它是一种一 ...
- 单片机并行口控制蜂鸣器播放音乐
要用单片机并行口控制蜂鸣器播放音乐,需要完成以下步骤: 设计音乐:需要先确定音乐的节拍和音符,并将其转换为代码中的数值. 设置并行口:需要将单片机的并行口配置为输出模式,以便控制蜂鸣器. 编写代码:需 ...
- MCU-51:单片机蜂鸣器播放音乐和提示音
目录 一.蜂鸣器介绍 二.驱动电路 2.1 三极管驱动 2.2 集成电路驱动 三.蜂鸣器播放音乐 3.1 键盘与音符对照 3.2 音符与频率对照 3.3 简谱 四.代码演示 4.1 按键蜂鸣器播放提示 ...
- 51单片机_11-2 蜂鸣器播放音乐
文章目录 要求 资源 main函数 要求 控制蜂鸣器播放音乐 资源 工程文件压缩包 链接:https://pan.baidu.com/s/1hA-aa0JRP33IlOYFNzKf7A 提取码:0id ...
- Arduino 蜂鸣器播放音乐LED灯闪烁
一.实验所需组件: led灯 三脚蜂鸣器 面包板 Arduino开发板 杜邦线 二.实验原理 蜂鸣器实现音乐播放: 控制好频率和节拍,就能演奏出好听的音乐.因此,在实验之前要先弄清楚各音调的频率.可参 ...
- STC-B学习板蜂鸣器播放音乐
功能:单片机烧录好程序后,按key1按键播放<IF YOU>,再次按key1可暂停播放,按key2可切换歌曲到<国际歌>,再按key3可切换歌曲到<孤勇者> 芯片: ...
- 鸿蒙开发板HI3861 利用蜂鸣器播放音乐 open Harmony1.0.0(附cmsis_os2.h源码)
本文利用鸿蒙开发板HI3861在鸿蒙1.0.0源码下利用蜂鸣器播放音乐. pwm_buz.c #include <stdio.h> #include "ohos_init.h&q ...
最新文章
- Windows7 自动更新时遇到故障
- vb 6.0服务器组件选哪个,VB 6.0包括几种版本?分别是什么?
- 在.net中构建Google Map( Building Google Map Mashups in .NET)
- C语言函数题-查找数组每行的最大值
- 链表之删除链表中间节点
- angular 注入器配置_Angular依赖注入介绍
- 机器学习算法--协同过滤算法
- POJ 1716 Integer Intervals【差分约束】
- idea 搜索不到gsonformat_idea之GsonFormat插件使用
- Ehcache(06)——监听器
- [读码时间] 自定义右键菜单
- Atitit it sftwr dev 原则准则 principle 目录 第一章 简单原则 kiss	1 第一节 . You Ain’t Gonna Need It(YAGNI)避免过度设计	1
- arm开发板挂载win10和ubuntu haneWIN NFS Server
- 免费的pdf编辑软件
- 服务器pe安装win7系统安装教程,win7 winpe安装过程图文教程
- Android版数据结构与算法(十二):经典排序算法再回顾
- VirtualBox虚拟机E_INVALIDARG (0x80070057)
- HTTP提交方式之PUT详细介绍及POST和PUT的区别
- [数学学习笔记]函数的连续性
- ThreadPoolExecutor(四)——Interrupt
热门文章
- java递归实现俄罗斯套娃_缠论的俄罗斯套娃
- 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...
- 高等数学-二重积分思维导图
- 推荐一位川大零基础转行 Python 的人生勇士
- 记录一次wagon报错Failed to execute goal org.codehaus.mojo:wagon-maven-plugin:1.0:upload-single
- mailbox 编程_一种通过mailbox协议实现服务器主机访问BMCFLASH的系统及方法与流程...
- faulting module msctfime.ime 纠结的微软拼音输入法
- office 2010 32位软件安装教程
- lightroom最新版本下载_277手游盒子最新版本下载(完美世界)
- 如何解决eclipse中没有代码提示的问题