arm9裸机开发之蜂鸣器

这两天学习了蜂鸣器,并尝试做了电子琴

//timer.c

#include "2440addr.h"
#include "pwm.h"
#include "uart.h"
#include "song.h"


volatile unsigned int count;


void irq_delay1(unsigned int n)
{
    count=n;
while(count>0);
}
/*
void irq_delay1(int n)
{
    count=n;
    while(1)
    {
        if(count==0)
   {
       break;
   }
    }
}
*/
/******************************************************
函数名:    _irq_sev
功能:      中断处理函数
说明:
形参:      无
返回值:    无
*******************************************************/
static void __irq timer0_sev()
{
volatile unsigned int temp;

temp=rSRCPND;//清除源挂起寄存器
temp&=~(1<<10);
temp|=(1<<10);
rSRCPND=temp;

temp=rINTPND;//清除中断挂起寄存器
temp&=~(1<<10);
temp|=(1<<10);
rINTPND=temp;


if(count>0)
{
count--;
}


}


/******************************************
function name:  timer1_init
Description  : 
Parameter    : 
Return       :
Autor & date :
*******************************************/


void timer0_init(unsigned int hz)
{
volatile unsigned int temp;

temp=rGPBCON;//配置GPB0为TOUT0
temp&=~3;
temp|=2;
rGPBCON=temp;

rTCFG0=99;


temp=rTCFG1;//配置CLOCK DIVIDER
temp&=~(0xf);
temp|=0x1;//CLOCK DIVIDER为1/4
rTCFG1=temp;


rTCNTB0=50000000/(4*(99+1)*hz);//确定timer0计数的起始

rTCMPB0=(rTCNTB0/6);



rSRCPND |= (0x1<<10);


   rINTPND |= (0x1<<10);


   rINTMSK = ~(0x1<<10);   
    
    pISR_TIMER0=(unsigned int)timer0_sev;//安装中断处理函数
    
  //  rTCON=0xa;


// rTCON=0x9;


    temp=rTCON;
    temp&=~(0xf<<0);
    temp|=((1<<3)|(1<<1));
    rTCON=temp;
    
    
    temp=rTCON;
    temp&=~((1<<3)|(1<<2)|(1<<1)|(1<<0));
    temp|=((1<<3)|(0<<1)|(1<<0));
    rTCON=temp;


}


/******************************************************
函数名:    timer0_stop
功能:      初始化中断寄存器和定时器4
说明:
形参:      无
返回值:    无
*******************************************************/
/*void timer0_stop(void)
{
volatile unsigned int temp;

temp=rTCON;//关闭定时器0
temp&=~1;
rTCON=temp;

temp=rGPBCON;
temp&=~3;
temp |= 1;
rGPBCON=temp;

temp=rGPBDAT;
temp &=~1;
rGPBDAT=temp;


}
*/
void timer0_stop()
{
    volatile unsigned int temp;
    temp=rTCON;
    temp&=~((1<<3)|(1<<2)|(1<<1)|(1<<0));
    temp|=((1<<3)|(0<<1)|(0<<0));
    rTCON=temp;
    
    temp=rGPBCON;
    temp&=~(3<<0);
    temp|=(1<<0);
    rGPBCON=temp;
    
    temp=rGPBDAT;
    temp&=~(1<<0);
    temp|=(0<<0);
    rGPBDAT=temp;
}




/******************************************************
函数名:    song
功能:      初始化中断寄存器和定时器4
说明:
形参:      无
返回值:    无
*******************************************************/


void song(void)
{
char ch;
ch=uart_getchar();
switch(ch)
{
case '1':
{
timer0_stop();
timer0_init(262);
irq_delay1(50);
timer0_stop();
break;
}
case '2':
{timer0_stop();
timer0_init(294);
irq_delay1(50);
timer0_stop();
break;
}
case '3':
{timer0_stop();
timer0_init(330);
irq_delay1(50);
timer0_stop();
break;
}
case '4':
{timer0_stop();
timer0_init(349);
irq_delay1(50);
timer0_stop();
break;
}
case '5':
{timer0_stop();
timer0_init(392);
irq_delay1(50);
timer0_stop();
break;
}
case '6':
{timer0_stop();
timer0_init(440);
irq_delay1(50);
timer0_stop();
break;
}
case '7':
{
timer0_stop();
play_song();
timer0_stop();
break;
}
default:
{
break;
}
}

}



音乐song.c


#include "2440addr.h"
#include "song.h"
#include "timer.h"


unsigned short tonefreq[][8]=
{
{0,262,294,330,349,392,440,494},
{0,523,578,659,698,784,880,988},
{0,1046,1175,1318,1397,1568,1760,1976}
};


struct songdata /*定义歌曲结构体*/
{
  int tone;//音调
  int freq;//频率
  int time;//时间
}music[] = 
{   //大海
    {TONE-1,5,TIME/2},
    {TONE-1,6,TIME/2},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE-1,6,TIME/2},
    {TONE-1,5,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME},
    {TONE,2,TIME},
    {TONE,1,TIME},
    {TONE-1,6,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE-1,6,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME},
    {TONE,3,TIME/2},
    {TONE,2,TIME},
    {TONE,3,TIME},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE-1,6,TIME},
    {TONE-1,5,TIME/2},
    {TONE-1,6,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE-1,6,TIME/2},
    {TONE,1,TIME*2},
    {TONE-1,5,TIME/2},
    {TONE-1,6,TIME},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME*2},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE+1,1,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME*2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE+1,1,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,6,TIME},
    {TONE+1,1,TIME},
    {TONE+1,1,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME*2},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE,6,TIME},
    {TONE+1,1,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME*2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,1,TIME},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE-1,6,TIME*2},
    {TONE,6,TIME},
    {TONE,3,TIME},
    {TONE,2,TIME},
    {TONE,1,TIME*2}
    
 /*/让我们荡起双桨
    {TONE-1,6,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,6,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME/2},
    {TONE,6,TIME},
    {TONE,2,TIME/2},
    {TONE,3,TIME},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME},
    {TONE,5,TIME},
    {TONE+1,6,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,7,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,3,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,1,TIME},
    {TONE,5,TIME/2},
    {TONE,1,TIME},
    {TONE-1,6,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,5,TIME/2},
    {TONE,3,TIME},
    {TONE,6,TIME},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME},
    {TONE,2,TIME},
    {TONE,3,TIME},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME},
    {TONE+1,1,TIME},
    {TONE,7,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME}
    //小星星
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,4,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,4,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,4,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,4,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME/2}
   //新年好
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,4,TIME/2},
    {TONE,4,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,1,TIME/2},
    {TONE,1,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,5,TIME/2},
    {TONE,7,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME/2}*/
 /*   //感恩的心
    {TONE,1,TIME/2},
    {TONE,1,TIME},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE+1,1,TIME},
    {TONE,7,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE,1,TIME},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME/2},
    {TONE+1,1,TIME},
    {TONE+1,2,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/4},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,1,TIME},
    {TONE,2,TIME/2},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/4},
    {TONE,2,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/2},
    {TONE,2,TIME/2},
    {TONE,1,TIME/2},
    {TONE,2,TIME/4},
    {TONE,2,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE,3,TIME},
    {TONE,3,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME/2},
    {TONE,5,TIME},
    {TONE,3,TIME},
    {TONE,5,TIME/4},
    {TONE,5,TIME/2},
    {TONE,3,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,3,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,6,TIME/2},
    {TONE+1,2,TIME},
    {TONE,5,TIME/2},
    {TONE+1,3,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,3,TIME},
    {TONE,3,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,7,TIME/2},
    {TONE,6,TIME},
    {TONE,6,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE,6,TIME/4},
    {TONE+1,1,TIME/2},
    {TONE+1,2,TIME/4},
    {TONE+1,2,TIME/4},
    {TONE+1,2,TIME/4},
    {TONE+1,2,TIME/4},
    {TONE+1,1,TIME/4},
    {TONE+1,3,TIME/2},
    {TONE+1,3,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE,5,TIME/2},
    {TONE+1,3,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,3,TIME},
    {TONE,3,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE,7,TIME/2},
    {TONE,6,TIME},
    {TONE,5,TIME/2},
    {TONE,6,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,1,TIME/4},
    {TONE+1,1,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,3,TIME/2},
    {TONE+1,2,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,7,TIME/2},
    {TONE+1,1,TIME/2},
    {TONE+1,1,TIME/2}
    */
    /*
    {TONE-1,6,TIME/2},
    {TONE,6,TIME/2},
    {TONE+1,4,TIME/2},
    {TONE+1,6,TIME/2},
    {TONE-1,4,TIME/2},
    {TONE+1,3,TIME/2},
    {TONE,3,TIME/2},
    {TONE,6,TIME/2},
    {TONE+1,7,TIME/2},
    {TONE+1,6,TIME/2},
    {TONE+1,7,TIME/2},
    {TONE+1,6,TIME/2},
    {TONE+1,6,TIME/2},
    {TONE+1,7,TIME/2},
    {TONE+1,5,TIME/2}*/


};


void play_song(void)
{
//
int i=0;
while(1)
{
timer0_init(tonefreq[music[i].tone][music[i].freq]);

//timer0_init(300);
/* if()
{
music[i].time--;
}
else
{*/
irq_delay1(music[i].time);
timer0_stop();
//timer0_init(tonefreq[music[i].tone][music[i].freq]);
//if(music[i].freq)
// {
// timer0_init(tonefreq[music[i].tone][music[i].freq]);
// }
// music[i].time--;
i++;

if(i>=(sizeof(music)/(sizeof(struct songdata))))
{
timer0_stop();
break;
}
}
}

//song.h

#ifndef _SONG_H
#define _SONG_H


#define TONE 1
#define TIME 400


extern void play_song(void);


#endif



//timer.h

#ifndef _TIMER_H
#define _TIMER_H


extern void song();


#endif


然后在头文件中调用song()函数

单机1、2、3、4、5、6分别发出不同的音调。单机7唱歌

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值