1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > CC2530 蜂鸣器 播放音乐

CC2530 蜂鸣器 播放音乐

时间:2022-08-03 07:55:16

相关推荐

CC2530 蜂鸣器 播放音乐

最近研究zigbee的CC2530 ,想利用它来播放音乐。网上有很多C51的例子,但实际与CC2530的语法并不相同。下面是利用CC2530的timer3定时器,移植了一下C51的蜂鸣器音乐播放程序。分享一下

/*

CC2530 Test

网上一个蜂鸣器音乐移植到CC2530芯片,使用了CC2530 timer3 中断

* 蜂鸣器的输出引脚 P1.0

* 采用定时器3 中断

* 用于学习,请注明出处

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

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。