[菜农助学交流] 菜鸟学习第四帖:用蜂鸣器播放音乐的代码

[复制链接]
 楼主| gaochy1126 发表于 2011-9-12 19:14 | 显示全部楼层 |阅读模式
本帖最后由 gaochy1126 于 2011-9-12 20:14 编辑

#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "Drvtimer.h"
unsigned char n;
unsigned char  music_tab[] ={   
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
0x20, 0x40, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x10,   
0x1C, 0x10, 0x18 , 0x40,   
0x1C, 0x20, 0x20 , 0x20,   
0x1C, 0x20, 0x18 , 0x20,   
0x20, 0x80, 0xFF , 0x20,   
0x30, 0x1C, 0x10 , 0x18,   
0x20, 0x15, 0x20 , 0x1C,   
0x20, 0x20, 0x20 , 0x26,   
0x40, 0x20, 0x20 , 0x2B,   
0x20, 0x26, 0x20 , 0x20,   
0x20, 0x30, 0x80 , 0xFF,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x80,   
0x20, 0x30, 0x1C , 0x10,   
0x20, 0x10, 0x1C , 0x10,   
0x20, 0x20, 0x26 , 0x20,   
0x2B, 0x20, 0x30 , 0x20,   
0x2B, 0x40, 0x20 , 0x15,   
0x1F, 0x05, 0x20 , 0x10,   
0x1C, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x30,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x40, 0x1C , 0x20,   
0x20, 0x20, 0x26 , 0x40,   
0x13, 0x60, 0x18 , 0x20,   
0x15, 0x40, 0x13 , 0x40,   
0x18, 0x80, 0x00 ,  
};
void Timer0_Callback(void)
{
n--;
}

int main (void)
{
unsigned char p,m,flag;   //m为频率常数变量   
  unsigned char i=0;
UNLOCKREG();               
    SYSCLK->;PWRCON.XTL12M_EN = 1;         
    DrvSYS_Delay(5000);              

DrvTIMER_Init();

/*定时器初始化函数*/

DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0);

/*TIMER0 时钟源选择:000 =外部12MHz 晶振 、001 =外部 32KHz 晶振 、010 = HCLK 、011 = 外部触发时钟 、1xx =内部 22MHz 振荡器 */

DrvTIMER_Open(E_TMR0,100,E_PERIODIC_MODE);

/*设定定时器 tick 周期并且启动定时器:定时器通道 TMR0 每秒1次 周期模式*/

DrvTIMER_SetTimerEvent(E_TMR0,1,(TIMER_CALLBACK) Timer0_Callback,0);

/* 隔1个tick执行事件,parameter3-事件处理函数指针,4-传递参数*/

DrvTIMER_EnableInt(E_TMR0); //使能定时器中断

DrvTIMER_Start(E_TMR0); //启动定时器



DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);         //  设置GPB10端口为输出模式
// DrvGPIO_ClrBit(E_GPB, 10);            //  清GPB10端口  蜂鸣器不叫唤

play:   
   while(1)   
    {   
    a: p=music_tab;   
       if(p==0x00)       { i=0;DrvSYS_Delay(1000000); goto play;}     
       else if(p==0xff)  { i=i+1;DrvSYS_Delay(100000);DrvTIMER_DisableInt(E_TMR0); goto a;}      
            else         {m=music_tab[i++];n=music_tab[i++];}      
    DrvTIMER_EnableInt(E_TMR0); //使能定时器中断
DrvTIMER_Start(E_TMR0); //启动定时器
     while(n!=0)
     {
     if (flag) DrvGPIO_ClrBit(E_GPB, 10);
     else
     DrvGPIO_SetBit(E_GPB, 10);
     DrvSYS_Delay(3*m);
      flag=~flag;
     }
  DrvTIMER_DisableInt(E_TMR0);                          
    }      
               
  

}

大家可以试试效果如何,好的话给接力下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| gaochy1126 发表于 2011-9-12 19:16 | 显示全部楼层
自己做沙发
mcsgy 发表于 2011-9-12 20:45 | 显示全部楼层
哇,这个不错
顶一下
hotpower 发表于 2011-9-12 21:08 | 显示全部楼层
非常好!!!

记得俺用AVR时做过
 楼主| gaochy1126 发表于 2011-9-12 21:53 | 显示全部楼层
我用过51单片机做过,AVR不经常用! 4# hotpower
hotpower 发表于 2011-9-13 09:13 | 显示全部楼层
挺好玩的
nixianmin 发表于 2011-9-13 10:23 | 显示全部楼层
顶,下来玩玩
gogogobomb 发表于 2011-9-13 11:15 | 显示全部楼层
哎呀我顶!
d0001 发表于 2011-9-13 14:04 | 显示全部楼层
学无止境
白雨的印记 发表于 2011-9-13 16:20 | 显示全部楼层
有意思 很好
lixiaoxu2meng 发表于 2011-9-13 16:47 | 显示全部楼层
毅如靳往 发表于 2011-9-13 19:22 | 显示全部楼层
俺用PIC做过  看看楼主的啥效果
asdx147258 发表于 2011-9-13 23:19 | 显示全部楼层
谢谢,很好
 楼主| gaochy1126 发表于 2011-9-14 21:28 | 显示全部楼层
大家喜欢就行啊!
zzyaizll 发表于 2011-9-14 22:42 | 显示全部楼层
俺用51做过
yaoyyie2003 发表于 2011-9-16 21:31 | 显示全部楼层
听不出来什么调子
 楼主| gaochy1126 发表于 2011-9-19 12:28 | 显示全部楼层
能听出来的
冰茶爽爽 发表于 2012-9-1 19:51 | 显示全部楼层
做来听听,谢谢楼主!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1148

主题

11651

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部