本帖最后由 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);
}
}
大家可以试试效果如何,好的话给接力下!
第二个例程--音乐.zip
(2.5 MB)
|