📄 music_test.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "music.h"
/***********音乐数据(卡秒莎) ***********/
/* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
/* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
/* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
/* 高1-F*/
unsigned int toneconst; //音阶重装常数
unsigned char sound[]={0x66,0x27,0x68,0x26,0x28,
0x28,0x27,0x26,0x47,0x43,0x67,0x28,0x69,0x27,
0x29,0x29,0x28,0x27,0x46,0x46,0x4a,0x4d,0x4c,
0x2d,0x2c,0x2b,0x2b,0x2a,0x29,0x4a,0x46,0x20,
0x4b,0x29,0x6a,0x28,0x27,0x23,0x28,0x27,0x46,
0x46,0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,
0x29,0x4a,0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,
0x23,0x28,0x27,0x46,0x46,0x00};
/***********音阶表***********/
const unsigned int TONETABLE[15]={DO,RE,MI,
FA,SO,LA,TI,DO_H,RE_H,MI_H,FA_H,SO_H,
LA_H,TI_H,DO_HH}; /***********微秒级延时程序***********/
void delay_1ms(void)
{
unsigned int i;
for(i=1142;i>0;i--)
;
}
/***********毫秒级延时程序***********/
void delay_ms(unsigned int n)
{
for(;n>0;n--)
delay_1ms();
}
/***********T1溢出中断服务程序***********/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1=toneconst;
PORTC^=1;
}
/***********音乐服务程序***********/
void music(void)
{
unsigned char temp,temp1;
unsigned int sound_add=0;
TCCR1A = 0x00;
TCCR1B =(1<<CS11); //8分频
temp1=sound[sound_add];
while(temp1!=0)
{
temp=temp1;
temp&=0x0f;
if(temp!=0)
{
TIMSK|=(1<<TOIE1);
//根据SOUNDTABLE中数据的低四位选择音调频率
temp--;
toneconst=TONETABLE[temp];
TCNT1=toneconst;
}
temp=temp1;
temp>>=4;
temp&=0x0f;
delay_ms(temp*129);
//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
TIMSK&=~(1<<TOIE1);
sound_add++;
temp1=sound[sound_add];
}
delay_ms(1000);
}
/***********主程序***********/
void main(void)
{
DDRC=0x01;
PORTC=0xff;
SEI();
while(1)
{
music();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -