最近研究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 蜂鸣器 播放音乐相关推荐

  1. 利用CC2530单片机的蜂鸣器播放音乐的代码

    使用 CC2530 单片机播放音乐需要使用蜂鸣器,这是一个较简单的方法. 下面是一个例子,它使用蜂鸣器播放了著名的<莫扎特第五交响曲>的第一段: #include "ioCC25 ...

  2. 蜂鸣器播放音乐 fpga实现

    目录 原理 实现 原理 蜂鸣器分为有源蜂鸣器和无源蜂鸣器,即以有无震荡源分类, 有震荡源直接通直流电就可发生,无震荡源则需要通震荡波才能发声. 这里介绍无源蜂鸣器播放音乐的方法. 思路: 利用计数器产 ...

  3. 【FPGA】五、蜂鸣器播放音乐

    文章目录 前言 一.蜂鸣器简介 二.音频音符简介 三.任务要求 四.程序设计 1.设计思路 2.程序代码 总结 前言 蜂鸣器(Buzzer)是现代常用的一种电子发声器,主要用于产生声音信号.它是一种一 ...

  4. 单片机并行口控制蜂鸣器播放音乐

    要用单片机并行口控制蜂鸣器播放音乐,需要完成以下步骤: 设计音乐:需要先确定音乐的节拍和音符,并将其转换为代码中的数值. 设置并行口:需要将单片机的并行口配置为输出模式,以便控制蜂鸣器. 编写代码:需 ...

  5. MCU-51:单片机蜂鸣器播放音乐和提示音

    目录 一.蜂鸣器介绍 二.驱动电路 2.1 三极管驱动 2.2 集成电路驱动 三.蜂鸣器播放音乐 3.1 键盘与音符对照 3.2 音符与频率对照 3.3 简谱 四.代码演示 4.1 按键蜂鸣器播放提示 ...

  6. 51单片机_11-2 蜂鸣器播放音乐

    文章目录 要求 资源 main函数 要求 控制蜂鸣器播放音乐 资源 工程文件压缩包 链接:https://pan.baidu.com/s/1hA-aa0JRP33IlOYFNzKf7A 提取码:0id ...

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

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

  8. STC-B学习板蜂鸣器播放音乐

    功能:单片机烧录好程序后,按key1按键播放<IF YOU>,再次按key1可暂停播放,按key2可切换歌曲到<国际歌>,再按key3可切换歌曲到<孤勇者> 芯片: ...

  9. 鸿蒙开发板HI3861 利用蜂鸣器播放音乐 open Harmony1.0.0(附cmsis_os2.h源码)

    本文利用鸿蒙开发板HI3861在鸿蒙1.0.0源码下利用蜂鸣器播放音乐. pwm_buz.c #include <stdio.h> #include "ohos_init.h&q ...

最新文章

  1. Windows7 自动更新时遇到故障
  2. vb 6.0服务器组件选哪个,VB 6.0包括几种版本?分别是什么?
  3. 在.net中构建Google Map( Building Google Map Mashups in .NET)
  4. C语言函数题-查找数组每行的最大值
  5. 链表之删除链表中间节点
  6. angular 注入器配置_Angular依赖注入介绍
  7. 机器学习算法--协同过滤算法
  8. POJ 1716 Integer Intervals【差分约束】
  9. idea 搜索不到gsonformat_idea之GsonFormat插件使用
  10. Ehcache(06)——监听器
  11. [读码时间] 自定义右键菜单
  12. Atitit it sftwr dev 原则准则 principle 目录 第一章 简单原则 kiss 1 第一节 . You Ain’t Gonna Need It(YAGNI)避免过度设计 1
  13. arm开发板挂载win10和ubuntu haneWIN NFS Server
  14. 免费的pdf编辑软件
  15. 服务器pe安装win7系统安装教程,win7 winpe安装过程图文教程
  16. Android版数据结构与算法(十二):经典排序算法再回顾
  17. VirtualBox虚拟机E_INVALIDARG (0x80070057)
  18. HTTP提交方式之PUT详细介绍及POST和PUT的区别
  19. [数学学习笔记]函数的连续性
  20. ThreadPoolExecutor(四)——Interrupt

热门文章

  1. java递归实现俄罗斯套娃_缠论的俄罗斯套娃
  2. 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...
  3. 高等数学-二重积分思维导图
  4. 推荐一位川大零基础转行 Python 的人生勇士
  5. 记录一次wagon报错Failed to execute goal org.codehaus.mojo:wagon-maven-plugin:1.0:upload-single
  6. mailbox 编程_一种通过mailbox协议实现服务器主机访问BMCFLASH的系统及方法与流程...
  7. faulting module msctfime.ime 纠结的微软拼音输入法
  8. office 2010 32位软件安装教程
  9. lightroom最新版本下载_277手游盒子最新版本下载(完美世界)
  10. 如何解决eclipse中没有代码提示的问题