📄 music.c~
字号:
#include<mega16.h>
#include<delay.h>
/* 计时值=65536-8000000/8/2/频率 */
// 音名 计时值 频率hz
#define DO_L 63627 //262
#define DOA_L 63731 //277
#define RE_L 63835 //294
#define REA_L 63928 //311
#define MI_L 64021 //330
#define FA_L 64103 //349
#define FAA_L 64185 //370
#define SO_L 64270 //392
#define SOA_L 64331 //415
#define LA_L 64400 //440
#define LAA_L 64463 //466
#define TI_L 64524 //494
#define DO 64580 //523
#define DOA 64633 //554
#define RE 64684 //587
#define REA 64732 //622
#define MI 64777 //659
#define FA 64820 //698
#define FAA 64860 //740
#define SO 64898 //784
#define SOA 64934 //831
#define LA 64968 //880
#define LAA 65000 //932
#define TI 65030 //988
#define DO_H 65058 //1046
#define DOA_H 65085 //1109
#define RE_H 65110 //1175
#define REA_H 65134 //1245
#define MI_H 65157 //1318
#define FA_H 65178 //1397
#define FAA_H 65198 //1480
#define SO_H 65217 //1568
#define SOA_H 65235 //1661
#define LA_H 65252 //1760
#define LAA_H 65268 //1865
#define TI_H 65283 //1976
#define ZERO 0 //休止符
#define MusicTable MusicTable1
//十进制: 0
//休止符: 0
//十进制: 1 2 3 4 5 6 7 8 9 10 11 12
//低音 : 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
//十进制: 13 14 15 16 17 18 19 20 21 22 23 24
// 中音 : 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
//十进制: 25 26 27 28 29 30 31 32 33 34 35 36
// 高音 : 1 #1 2 #2 3 4 #4 5 #5 6 #6 7
/*-------------Two Tigers-------------*/
char MusicTable2[]={13,2, 15,2, 17,2, 13,1, 0,1,
13,2, 15,2, 17,2, 13,1, 0,1,
17,2, 18,2, 20,2, 0,2,
17,2, 18,2, 20,2, 0,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
15,2, 8,2, 13,2, 0,2,
15,2, 8,2, 13,2, 0,2,
0xff};
/*--------------Happy New Year-------------------*/
char MusicTable1[]={ 13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
0xff};
// 0, 1, #1, 2, #2, 3, 4, #4, 5, #5, 6, #6, 7,
unsigned int ToneTable[37]={ZERO,DO_L,DOA_L,RE_L,REA_L,MI_L,FA_L,FAA_L,SO_L,SOA_L,LA_L,LAA_L,TI_L,
DO ,DOA ,RE ,REA ,MI ,FA ,FAA ,SO ,SOA ,LA ,LAA ,TI ,
DO_H,DOA_H,RE_H,REA_H,MI_H,FA_H,FAA_H,SO_H,SOA_H,LA_H,LAA_H,TI_H};
unsigned int tone;
interrupt [TIM1_OVF] void tim1_ovf_isr(void)
{
int i;
if(tone)//若不是休止符,则发声
{
TCNT1=tone;
i=PORTA;
PORTA=~i;//A口电平翻转
}
}
void music()
{
char *pMusic=MusicTable;
TCCR1A=0x00; //普通端口操作
TCCR1B=0b0000010;//8分频
while(*pMusic!=0xff)//0xff为音乐结尾符
{
TIMSK=0b00000100;//溢出中断使能
tone=ToneTable[*pMusic];//取音调频率
TCNT1=tone;//将频率值对应的计数值写入计时器,开始发声
*pMusic++;//乐谱音符指针+1 ,取拍数
delay_ms((*pMusic)*100);//按拍数延时,(CodeVision中定义delay_ms(unsigned int);)
delay_ms((*pMusic)*100);
TIMSK=0b0000000;//发声结束 ,屏蔽溢出中断
*pMusic++;//乐谱音符指针+1 ,取下一音符
}
delay_ms(1000);
}
/* ----------------- 主程序 ---------------- */
void main(void)
{
DDRA=0x80; //HappyAVR使用PA7与蜂鸣器相连,设置PA7为输出
PORTA=0xff;
#asm("sei");
while(1)
{
music();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -