|
楼主 |
发表于 2005-6-18 23:45:53
|
显示全部楼层
再贴,已经改成函数,可以直接调用。
缺点:调用函数后,持续直到完成。会阻塞其它任务。会再改动。
/******************************************************************************/
/* 单片机放音机源程序(V1.0b) */
/* 创建人:QQQ 创建日期:2005-3-8 */
/* 修改人:QQQ 修改日期:2005-3-18 */
/* 修改人:CWD 修改日期:2005-6-15 */
/******************************************************************************/
/*修改内容:改为M48,并用GCC编译。 */
// 目标CPU : ATmega48
// 晶 振: 默认:8.0000MHz/8
//缺点:调用函数后,持续直到完成。会阻塞其它任务。
// 头文件和变量定义 //
//============================================================================//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
//#include <avr/eeprom.h>
#include <avr/pgmspace.h>
//#include <avr/wdt.h>
//#include <avr/sleep.h>
//#include <avr/delay.h>
//#include <inttypes.h>
#include "music.h"
//#include "music_data.h"
typedef unsigned char u08;
#define music_out PC4
extern u08 in_sound; //标志位,0: 可以调用;1:将要调用;〉1:表示在放音中。
volatile byte tone_dl; //节拍延时计数。
/*第一首:莫斯科郊外的夜晚*/
const byte music_dt0[][2] PROGMEM=
{{L6,P8},{M1,P8},{M3,P8},{M1,P8},{M2,P4},{M1,P8},{L7,P8},{M3,P4},{M2,P4},{L6,P2},
{M1,P8},{M3,P8},{M5,P8},{M5,P8},{M6,P4},{M5,P8},{M4,P8},{M3,P2},
{M4,P4},{M5,P4},{M7,P8},{M6,P8},{M3,P4},{M3,P8},
{L7,P4},{L6,P8},{M3,P8},{M2,P8},{M4,P4},{M4,P8},{0,P8},
{M5,P8},{M4,P8},{M3,P4},{M2,P8},{M1,P8},{M3,P4},{M2,P4},{L6,P2},{L6,P8},{0,P8},
{0,P4},{0,0}};
//============================================================================//
// 函数名称:timer0_ovf_isr() //
// 功 能:定时器0中断服务程序,对节拍等提供时基 //
// 参 数:无 //
// 影响变量:tone_dl //
// 创 建:2005-3-8 by QQQ //
// 修 改: //
//============================================================================//
INTERRUPT(SIG_OVERFLOW0)
{
TCNT0=0xb7;
tone_dl++;
}
//==============================================================================
// 函数名称:timer1_compa_isr()
// 功 能:定时器1中断服务程序,翻转PC.0口的状态
// 参 数:无
// 影响变量:无
// 创 建:2005-3-8 by QQQ
// 修 改:
//==============================================================================
INTERRUPT(SIG_OUTPUT_COMPARE1A)
{
PORTC^=_BV(music_out);
}
//==============================================================================
// 函数名称:sound()
// 功 能:将得到的数据转化为声音信号
// 参 数:无
// 影响变量:yinyue,yinfu,jiepai,num
// 创 建:2005-3-9 by QQQ
// 修 改:2005-3-14 by QQQ
//==============================================================================
void sound(void)
{
byte yinyue,jiepai;
const byte (*p)[2]; //指向flash存储区的二维数组指针
p=music_dt0;
in_sound++;
start:
yinyue=pgm_read_byte(p);
jiepai=pgm_read_byte(*p+1);//取得第一个节拍
TCCR0B=0x04; //timer0 run,f/256.
// TCCR1B=0x09; //time1 run,f/1.
while(jiepai!=0) //若为零,表示结束
{
if(yinyue != 0)
{
OCR1A=pgm_read_word(tone_frq+yinyue);//取得音符对应的频率值
TCCR1B=0x09; //+TCCR1A 0X00,设置为CTC,时钟无分频。
TCNT1=0x00;
}
else TCCR1B=0x00;//若音乐为零,表示休止符
while(tone_dl<jiepai); //节拍未完成,等待。
tone_dl=0;
p++;
goto start;
}
TCCR0B=0x00;
TCCR1B=0x00;
in_sound=0;
} |
|