这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » IO 单片机IO口输出音乐的程序(可改写)

共2条 1/1 1 跳转至

IO 单片机IO口输出音乐的程序(可改写)

院士
2006-09-17 18:14:16     打赏
IO 单片机IO口输出音乐的程序(可改写)



关键词: 单片机     输出     乐的     程序     改写    

院士
2006-12-22 22:43:00     打赏
2楼
问 //文件名:two_tigers.c
//本程序使用MSP430f412单片机的P65口驱动一个扬声器来循环播放歌曲《两只老虎》
//本程序原型出自南航魏小龙《MSP430系列单片机接口技术与系统设计实例》351页

//作者:erlking
//email:sentout163.com
//2004/11

//读者根据自己的情况需要修改的地方有如下几点:
//1、如果mcu不是41x则需要修改include文件名以及在编译设置里面选择相应的xcl文件和ddf文件
//2、按照作者要求的格式修改music[]中的内容来播放您自己的音乐
//3、修改输出音乐的IO

#include "MSP430x41x.h"
#define UCHAR unsigned char
#define UINT unsigned int
#define PxDIR P6DIR //指定输出音乐的IO
#define PxOUT P6OUT
#define P_BIT BIT5

const UINT low[8]={60000,0xeef,0xd4e,0xbda,0xb30,0x9f8,0x8e1,0x7e9}; //高音的7个音调
const UINT mid[8]={60000,0x778,0x6a7,0x5ed,0x598,0x4fc,0x471,0x3f5}; //中音的7个音调
const UINT high[8]={60000,0x3bc,0x354,0x2f7,0x2cc,0x27e,0x239,0x1f8}; //高音的7个音调
//以下为曲子的简谱,格式说明如下:
//一个三位十进制数表示一个节拍
//百位表示节拍速度,0表示慢速,1表示快速
//十位表示高、中、低音--0表示中音,1表示低音,2表示高音
//个位是1~7的简谱代码,如果为0,表示休止符不发声
//曲子以255结束

//两只老虎的音乐程序
const UCHAR music[]={
001,002,003,001,0, //歌词:两只老虎
001,002,003,001,0, //两只老虎
003,004,005,0, //跑得快
003,004,005,0, //跑得快
105,106,105,104,003,001,0, //一只没有耳朵
105,106,105,104,003,001,0, //一只没有尾巴
003,015,001,001,0,0,255 //真奇怪-
};
UCHAR beat=0; //节拍数
UINT tone=0; //音调
UINT beat_time; //一个节拍时间

void delay(UINT i)
{
for(;i>0;i--);
}

void main(void)
{
WDTCTL = WDTPW+WDTHOLD;

TACTL = TASSEL1+TACLR+MC1; //SMCLK, Clear TAR,continuous mode
CCTL0 = CCIE;
CCR0 = 1000;
PxDIR = P_BIT;
_EINT();
for(;;)
{
/***************************************************************************/
tone=music[beat]; //读简谱
if(tone==255) //曲子是否结束
{
beat=0;
tone=music[beat];
beat_time=50000;
}
else if(tone>100)
{
tone-=100;
beat_time=25000;
}
else
{
beat_time=50000;
}
/***************************************************************************/
if(tone<10) //翻译简谱
{
tone=mid[tone];
}
else if(tone<20)
{
tone-=10;
tone=low[tone];
}
else if(tone<30)
{
tone-=20;
tone=high[tone];
}
if(tone==60000)
{
beat_time=10000;
}
delay(beat_time);
beat++;
}

}
interrupt [TIMERA0_VECTOR] void TA_0( void )
{
PxOUT^=P_BIT; //输出方波
TAR=0;
CCR0=tone; //音调对应的时间累加到CCR0上
} 1: 哈哈!兄弟好久不见啊

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]