📄 sound.c
字号:
/**********************************************
http://www.sl.com.cn
双龙电子公司----电脑音乐演示程序(ICCAVR)
作者:詹卫前
1、学习定时器T0溢出中断的使用
2、学习定时器T1比较中断的使用
3、学习电脑音乐的产生
**********************************************/
#include <io8535.h>
#include <macros.h>
#pragma interrupt_handler timer0:IT_TIMER0_OVF0
#pragma interrupt_handler timer1:IT_TIMER1_COMPA
const unsigned int music_data[][2]=
/*******************************************
卡秋莎音乐数据{x,y}
x:对应音符音阶(频率),0表示休止符
y:对应音符节拍
********************************************/
{
{440,600} ,{494,200} ,{523,600} ,{440,200},
{523,400} ,{494,200} ,{440,200} ,{494,400},
{330,400} ,{494,600} ,{523,200} ,{578,600},
{494,200} ,{578,400} ,{523,200} ,{494,200},
{440,800} ,{659,400} ,{880,400} ,{784,400},
{880,200} ,{784,200} ,{698,400} ,{659,200},
{578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
{698,400} ,{578,200} ,{659,600} ,{523,200},
{494,200} ,{330,200} ,{523,200} ,{494,200},
{440,800} ,{659,400} ,{880,400} ,{784,400},
{880,200} ,{784,200} ,{698,400} ,{659,200},
{578,200} ,{659,400} ,{440,400} ,{ 0,200},//休止符
{698,400} ,{578,200}, {659,600} ,{523,200},
{494,200} ,{330,200}, {523,200} ,{494,200},
{440,800} ,
{0,0}};
#pragma data:data
unsigned int delay=0;
/*******************************
MCU初始化
*******************************/
void music_init(void)
{
MCUCR=0x00;
DDRC=0x01;
TCCR1A=0x00;
TCCR1B=0x09;
TCCR0=0x03;
TCNT0=0x19;
TIMSK=(1<<OCIE1A)|(1<<TOIE0);
}
/**************************************************
T0中断程序,产生音乐节拍
**************************************************/
void timer0(void)
{
delay++;
TCNT0=0x19;
}
/**************************************************
T1中断程序,根据SOUND函数输出一定频率的方波
**************************************************/
void timer1(void)
{
PORTC^=0x01;
}
/*****************************************************
SOUND程序,输出频率为 x HZ的方波,延时 y MS
x:100~20000 HZ, 0表示不发声
y:0~65536 MS
*****************************************************/
void sound(unsigned int x,unsigned int y)
{
SEI();
delay=0;
if (x!=0)
{
x=4000000/x;
OCR1A=x;
TCNT1=0x00;
TIMSK|=(1<<OCIE1A);
while(delay<y)
;
TIMSK&=~(1<<OCIE1A);
}
else
{
TIMSK&=~(1<<OCIE1A);
while(delay<y)
;
}
CLI();
}
/*******************************
主程序
*******************************/
void main(void)
{
unsigned char i=0;
music_init();
while(1)
{
while(music_data[i][1]!=0)
{
sound(music_data[i][0],music_data[i][1]);
i++;
}
i=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -