这两天学习了蜂鸣器,并尝试做了电子琴
//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唱歌