⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musicbox.c

📁 C语言辅助单片机实现音乐功能
💻 C
字号:
//NES音乐播放器   AVRNES Music Player1.0

//          BY张皓
//http://www.lotusinvention.cn/ART/nes/NESMusic.htm
//  ICC-AVR Target : ATMEGA16  Crystal: 8M,
#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define schar signed char
#define uint unsigned int  
#define sint signed int  
#define SET_BIT(io ,bit) (   io |=   (1<<bit) ) //置位example: SET_BIT(PORTA,0);SET_BIT(DDRA,0);  
#define CLR_BIT(io ,bit) (   io &= ~(1<<bit) ) //清位example: CLR_BIT(PORTA,0);CLR_BIT(DDRA,0);  
#define GET_BIT(pin,bit) ( pin &    (1<<bit) ) //取得位example: GET_BIT(PINA,0);


const uint music_dataRect0[]={48,5,4, 43,2,5, 43,10,6, 43,5,15, 36,2,16, 36,10,17, 36,5,26, 32,2,32, 32,10,33, 32,5,37, 38,2,49, 38,10,50, 38,5,69, 43,2,71, 43,10,72, 43,5,81, 48,2,82, 48,10,83, 48,5,92, 64,2,93, 64,10,94, 64,5,103, 57,2,104, 57,10,105, 57,5,114, 48,2,120, 48,10,121, 48,5,125, 43,2,137, 43,10,138, 43,5,157, 57,2,159, 57,10,160, 57,5,169, 48,2,170, 48,10,171, 48,5,180, 43,2,181, 43,10,182, 43,5,191, 32,2,192, 32,10,193, 32,5,202, 30,2,208, 30,10,209, 30,5,213, 29,2,225, 29,10,226, 29,5,256, 29,10,259, 32,2,263, 32,10,264, 32,5,268, 38,2,269, 38,10,270, 48,2,274, 48,10,275, 48,5,279, 57,2,280, 57,10,281, 57,5,290, 48,2,296, 48,10,297, 48,5,301, 43,2,313, 43,10,314, 43,5,334, 57,2,335, 57,10,336, 57,5,345, 48,2,346, 48,10,347, 48,5,356, 43,2,357, 43,10,358, 43,5,367, 36,2,368, 36,10,369, 36,5,378, 32,2,384, 32,10,385, 32,5,389, 38,2,401, 38,10,402, 21,15,413, 21,5,417, 21,7,430, 43,7,430, 48,2,434, 48,10,435, 64,8,438, 64,3,446, 64,8,450, 64,3,457, 34,8,462, 33,5,464, 32,1,474, 36,8,485, 32,8,496, 32,3,506, 27,2,518, 27,10,519, 96,10,541, 96,6,543, 96,2,546, 81,10,547, 81,6,549, 81,2,552, 64,10,553, 64,6,555, 54,10,558, 54,6,560, 54,1,563, 43,10,564, 43,6,566, 43,2,569, 54,10,570, 54,6,572, 54,2,575, 64,10,576, 64,6,578, 36,10,581, 36,6,583, 36,1,586, 43,10,587, 43,6,589, 43,2,592, 54,10,593, 54,6,595, 54,2,598, 48,10,599, 48,6,601, 41,10,604, 41,6,606, 41,1,609, 43,10,616, 43,6,618, 43,2,621, 64,8,623, 64,3,630, 64,8,634, 64,3,641, 34,8,646, 33,5,648, 32,1,658, 36,8,669, 32,8,680, 32,3,690, 30,2,702, 30,10,703, 32,2,725, 33,10,726, 33,8,727, 33,7,728, 31,7,732, 32,7,733, 33,7,736, 33,7,737, 31,7,741, 31,7,742, 33,7,745, 33,7,747, 36,2,748, 36,10,749, 35,8,750, 35,7,751, 37,7,755, 37,7,756, 35,7,759, 35,7,760, 37,7,764, 37,7,765, 43,2,771, 44,10,772, 43,7,775, 41,7,777, 42,7,779, 44,7,781, 48,2,783, 48,10,784, 41,2,788, 41,10,789, 32,2,794, 32,10,795, 32,5,799, 22,2,800, 22,10,801, 22,5,805, 64,8,807, 64,3,814, 64,8,818, 64,3,825, 34,8,830, 33,5,833, 32,1,842, 36,8,853, 32,8,864, 32,3,874, 27,2,886, 27,10,887, 21,15,889, 21,5,893, 27,7,906, 96,10,909, 96,6,911, 96,1,914, 81,10,915, 81,6,917, 81,2,920, 64,10,921, 0,0,0};
const uint music_dataRect1[]={64,4,4, 57,1,5, 57,9,6, 57,4,15, 54,1,16, 54,9,17, 54,4,46, 48,1,49, 48,9,50, 48,4,79, 77,1,82, 77,9,83, 77,4,102, 86,1,104, 86,9,105, 86,4,114, 64,1,120, 64,9,121, 64,4,125, 57,1,137, 57,9,138, 57,4,157, 86,1,159, 86,9,160, 86,4,169, 64,1,170, 64,9,171, 64,4,180, 57,1,181, 57,9,182, 57,4,191, 43,1,192, 43,9,193, 43,4,202, 41,1,208, 41,9,209, 41,4,213, 38,1,225, 38,9,226, 38,4,256, 57,1,258, 57,9,259, 57,4,278, 86,1,280, 86,9,281, 86,4,290, 64,1,296, 64,9,297, 64,4,301, 57,1,313, 57,9,314, 57,4,334, 86,1,335, 86,9,336, 86,4,345, 64,1,346, 64,9,347, 64,4,356, 57,1,357, 57,9,358, 57,4,367, 54,1,368, 54,9,369, 54,4,399, 48,1,401, 48,9,402, 34,15,410, 20,15,413, 20,5,417, 48,6,430, 96,1,434, 96,9,435, 86,1,437, 86,9,438, 86,4,446, 86,9,450, 86,4,457, 43,1,461, 43,9,462, 43,4,472, 48,1,484, 48,9,485, 43,1,495, 43,9,496, 43,4,506, 27,1,518, 27,9,519, 28,6,532, 27,6,534, 26,6,537, 26,6,538, 28,6,541, 28,6,543, 26,6,546, 26,6,547, 28,6,550, 28,6,552, 26,6,555, 26,6,556, 28,6,559, 28,6,561, 26,6,564, 26,6,565, 28,6,568, 28,6,570, 26,6,573, 27,6,575, 28,6,577, 27,6,580, 26,6,582, 27,6,584, 28,6,587, 27,6,589, 26,6,592, 27,6,593, 28,6,596, 27,6,598, 26,6,601, 26,6,602, 28,6,605, 28,6,607, 26,6,610, 26,6,611, 28,6,614, 28,6,616, 26,6,619, 26,6,620, 86,1,622, 86,9,623, 86,4,630, 86,9,634, 86,4,641, 43,1,645, 43,9,646, 43,4,656, 48,1,668, 48,9,669, 43,1,679, 43,9,680, 43,4,690, 36,1,702, 36,9,703, 43,1,725, 44,9,726, 45,7,727, 44,6,729, 41,6,731, 42,6,733, 45,6,736, 44,6,738, 42,6,740, 43,6,743, 45,6,745, 44,6,747, 48,1,748, 47,9,749, 46,7,750, 48,6,752, 50,6,754, 49,6,756, 46,6,759, 48,6,761, 50,6,763, 50,6,765, 46,6,768, 48,6,770, 43,1,771, 44,9,772, 43,6,775, 41,6,777, 42,6,779, 44,6,781, 43,6,784, 41,6,786, 42,6,788, 45,6,791, 44,6,793, 41,6,795, 42,6,797, 45,6,800, 44,6,802, 42,6,804, 86,1,806, 86,9,807, 86,4,814, 86,9,818, 86,4,825, 43,1,829, 43,9,830, 43,4,840, 48,1,852, 48,9,853, 43,1,863, 43,9,864, 43,4,874, 34,15,886, 20,15,889, 20,5,893, 27,6,906, 28,6,909, 28,6,911, 26,6,914, 26,6,915, 28,6,918, 28,6,920, 121,7,924, 117,15,925, 107,12,927, 102,12,928, 97,12,929, 92,12,930, 87,12,931, 82,12,932, 76,12,934, 74,12,935, 69,12,937, 64,12,939, 62,12,940, 56,12,942, 54,12,943, 52,12,944, 49,12,945, 47,12,946, 42,12,948, 40,12,949, 38,12,950, 36,12,952, 35,12,953, 32,12,955, 31,12,956, 29,12,958, 28,12,959, 25,12,961, 24,12,962};
const uint music_dataTriangle[]={86,5, 62,16, 108,16, 72,38, 51,49, 96,49, 64,65, 96,76, 115,87, 86,104, 57,126, 86,137, 57,142, 86,164, 57,170, 86,181, 62,192, 108,192, 115,225, 108,263, 102,269, 96,274, 86,280, 57,302, 86,313, 57,318, 86,340, 57,346, 86,357, 62,368, 108,368, 72,390, 51,401, 96,401, 64,417, 115,423, 144,434, 156,437, 64,437, 86,484, 72,495, 54,507, 43,518, 19,622, 64,622, 81,668, 86,679, 121,714, 96,725, 81,737, 61,748, 64,760, 51,765, 89,771, 43,771, 32,777, 36,783, 43,788, 41,794, 36,800, 19,806, 64,806, 86,852, 72,863, 54,875, 43,886, 41,964, 52,965, 63,966, 74,967, 90,968, 74,969};
const uint music_dataNoise[]={229,5, 252,16, 183,38, 252,49, 183,54, 252,76, 137,82, 229,93, 252,104, 183,126, 252,137, 183,142, 252,164, 137,170, 252,203, 137,208, 252,219, 137,225, 229,236, 252,247, 137,258, 252,280, 183,302, 252,313, 183,318, 252,340, 137,346, 229,357, 252,368, 183,390, 252,401, 183,406, 252,428, 137,434, 23,437, 252,449, 183,461, 23,466, 252,484, 183,495, 252,501, 183,518, 252,530, 183,553, 252,564, 183,587, 252,593, 183,610, 23,622, 252,633, 183,645, 23,650, 252,668, 183,679, 252,685, 183,702, 252,714, 183,737, 252,748, 183,771, 252,777, 183,794, 23,806, 252,817, 183,829, 23,834, 252,852, 183,863, 252,869, 183,886, 252,898, 183,921, 298,924, 275,925, 252,927, 229,930, 206,933, 183,936, 160,939, 137,942, 115,945, 92,948, 69,951, 46,954, 23,957, 343,962, 183,964, 160,965, 137,968, 206,971, 229,975, 252,978, 275,981, 298,984, 321,988, 343,991};

//方波0//////////////////
uint i0=0;// 数组位置
uint Tone0 ;//半音长(相当于频率)
uint fcounter0;//音长计数
uint volume0;//音量 
uchar swap0=0;//切换开关

//方波1//////////////////
uint i1=0;// 数组位置
uint Tone1 ;//半音长(相当于频率)
uint fcounter1;//音长计数
uint volume1;//音量 
uchar swap1=0;//切换开关

//三角波//////////////////
uint i2=0; 
uint Tone2 ; 
uint fcounter2; 
uint volume2=6*8;//三角波音量固定为6 
uchar swap2=0; 

//杂波//////////////////
uint i3=0; 
uint Tone3 ; 
uint fcounter3; 
uint volume3=4*8;//杂波音量固定 
uchar swap3=0; 

uint sum_volume;//总音量 
uint T=0;//时间计数


void init_devices(void)
{

    DDRD=0b10000000;  
    PORTD=0b10000000; 
	
	 //#####定时器2/PD7(OC2)pwm控制音量,周期为32us(31.2KHz)######
    TCCR2=0X01;//内部CK/1脉冲
    SET_BIT(TCCR2,WGM20);    //快速PWM方式
    SET_BIT(TCCR2,WGM21);
    SET_BIT(TCCR2,COM21); //减1匹配置位
    OCR2=255;
    //####################
	
    //#####定时器1,周期为0.25ms对音频采样######
	SET_BIT(TCCR1B,CS11);//8分频	
    SET_BIT(TCCR1B,WGM12);//CTC方式,匹配清零后自动计数
    OCR1A=25;
    TCNT1=0;
    SET_BIT(TIMSK,OCIE1A);
    //####################
	
    //#####定时器0,周期为1/60s(16.67ms),对时间进行计数######
    SET_BIT(TCCR0,CS00);//1024分频
    SET_BIT(TCCR0,CS02);
    SET_BIT(TCCR0,WGM01);//CTC方式,匹配清零后自动计数
    OCR0=133;//定时时间
    TCNT0=0;
    SET_BIT(TIMSK,OCIE0);
    //####################



    SET_BIT(SREG,7);  //全局中断
}


void main(void)  
{
    init_devices();
    while(1)
    {
    }
}

void delay_1ms(void)//微秒级延时,单位1微秒
{
    uint i;
    for(i=0;i<(unsigned int)(8*143-2);i++);
}


void delay_ms(uint num)//毫秒级精确延时,单位1毫秒(8M)
{
    uint i;
    for(i=0;i<num;i++) delay_1ms();
}


//#####定时器0,周期为1/60s(16.67ms),对时间T进行计数
#pragma  interrupt_handler T0_counter:20
void T0_counter(void)  
{
T++;

if(music_dataRect0[i0+5]==0)//到尾部了,从头开始
{
delay_ms(1000);
i0=0;
i1=0;
i2=0;
i3=0;
T=0;
}

//方波0//////////////////
if(T>=music_dataRect0[i0+5])
{
i0+=3;
fcounter0=0;
Tone0=music_dataRect0[i0];
volume0=music_dataRect0[i0+1]*8;
}    

  //方波1//////////////////
if(T>=music_dataRect1[i1+5])
{
i1+=3;
fcounter1=0;
Tone1=music_dataRect1[i1];
volume1=music_dataRect1[i1+1]*8;
}   

 //三角波//////////////////
 if(T>=music_dataTriangle[i2+3])
{
i2+=2;
fcounter2=0;
Tone2=music_dataTriangle[i2];
}  

//杂波
if(T>=music_dataNoise[i3+3])
{
i3+=2;
fcounter3=0;
Tone3=music_dataNoise[i3];
}  	  
	             
}


//#####定时器1,周期为0.025ms对音频采样
#pragma  interrupt_handler T1_counter:7
void T1_counter(void)  
{

//方波0//////////////////
fcounter0++;//音长计数
if(fcounter0==Tone0)
{
swap0=(~swap0);
fcounter0=0;
}

//方波1//////////////////
fcounter1++;//音长计数
if(fcounter1==Tone1)
{
swap1=(~swap1);
fcounter1=0;
}

 //三角波//////////////////
 fcounter2++;//音长计数
if(fcounter2==Tone2)
{
swap2=(~swap2);
fcounter2=0;
}

//杂波
 fcounter3++;//音长计数
if(fcounter3==Tone3)
{
swap3=(~swap3);
fcounter3=0;
}

sum_volume=0;
	if(swap0) sum_volume+=volume0;//音量相加
	if(swap1) sum_volume+=volume1;//音量相加
	if(swap2) sum_volume+=volume2;//音量相加	
	if(swap3) sum_volume+=volume3;//音量相加		
	if(sum_volume>255)sum_volume=255;//限制最大音量
	
	OCR2=sum_volume;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -