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;          //下次的中断时间, 这个时间, 控制音调高低
        } 
        
 }

展开阅读全文

没有更多推荐了,返回首页