?? music_m8.c
字號(hào):
/******************************************************************************/
/* 單片機(jī)放音機(jī)源程序(V1.0b) */
/* 創(chuàng)建人:QQQ 創(chuàng)建日期:2005-3-8 */
/* 修改人:QQQ 修改日期:2005-3-18 */
/******************************************************************************/
// 目標(biāo)CPU : ATmega8
// 晶 振: 8.0000MHz
/* ---------
RESET<--RST 1---| |---28
2---| |---27
3---| |---26
NEXT<--INT0 4---| AT |---25
PAUSE<--INT1 5---| MEGA |---24
6---| 8L |---23 PC0-->9013-->SPEAK
7---| |---22
8---| |---21
9---| |---20
10---| 8MHz |---19
11---| |---18
12---| |---17
13---| |---16
14---| |---15
---------
*/
//============================================================================//
// 頭文件和變量定義 //
//============================================================================//
#include <iom8v.h>
#include <macros.h>
#include "music.h"
#include "music_data.h"
byte yinyue,jiepai,tone_dl,play_flag,play_num,play_tmp,j;
word i,nop_time;
const byte (*p)[2];//指向flash存儲(chǔ)區(qū)的二維數(shù)組指針
//============================================================================//
// 函數(shù)名稱:timer0_ovf_isr() //
// 功 能:定時(shí)器0中斷服務(wù)程序,對(duì)節(jié)拍等提供時(shí)基 //
// 參 數(shù):無(wú) //
// 影響變量:tone_dl //
// 創(chuàng) 建:2005-3-8 by QQQ //
// 修 改: //
//============================================================================//
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0=0x74;
tone_dl++;
nop_time++;
}
//==============================================================================
// 函數(shù)名稱:timer1_compa_isr()
// 功 能:定時(shí)器1中斷服務(wù)程序,翻轉(zhuǎn)PC.0口的狀態(tài)
// 參 數(shù):無(wú)
// 影響變量:無(wú)
// 創(chuàng) 建:2005-3-8 by QQQ
// 修 改:
//==============================================================================
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
PORTC^=0x01;
}
//==============================================================================
// 函數(shù)名稱:int0_isr()
// 功 能:外部中斷0服務(wù)程序,選曲下一首
// 參 數(shù):無(wú)
// 影響變量:play_num
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:2005-3-14 by QQQ
//==============================================================================
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
byte tmp0,tmp1;
tmp0=TCCR0;tmp1=TCCR1B;//保存定時(shí)器狀態(tài)
TCCR0=0x00;TCCR1B=0x00;
CLI();
for(i=0;i<5000;i++);//延時(shí)去抖動(dòng)
if((PIND&0x04)==0&&j==0x01){
if(play_num>6)play_num=0;
else play_num+=1;}
while((PIND&0x04)==0);//等待按鍵釋放
nop_time=0;//清無(wú)操作時(shí)間
SEI();
TCCR0=tmp0;TCCR1B=tmp1;//恢復(fù)定時(shí)器狀態(tài)
}
//==============================================================================
// 函數(shù)名稱:int1_isr()
// 功 能:外部中斷1服務(wù)程序,播放/暫停
// 參 數(shù):無(wú)
// 影響變量:play_flag
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:2005-3-14 by QQQ
//==============================================================================
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
byte tmp0,tmp1;
tmp0=TCCR0;tmp1=TCCR1B;
TCCR0=0x00;TCCR1B=0x00;
CLI();
for(i=0;i<5000;i++);//延時(shí)去抖動(dòng)
if((PIND&0X08)==0&&j==0x01){
play_flag^=0x01;}
while((PIND&0X08)==0);//等待按鍵釋放
nop_time=0;//清操作時(shí)間
SEI();
TCCR0=tmp0;TCCR1B=tmp1;
}
//==============================================================================
// 函數(shù)名稱:init_device()
// 功 能:初始化各寄存器及I/O口
// 參 數(shù):無(wú)
// 影響變量:無(wú)
// 創(chuàng) 建:2005-3-8 by QQQ
// 修 改:
//==============================================================================
void init_device(void)
{
CLI();
//port initialized
DDRB=0xFF;PORTB=0xFF;
DDRC=0xFF;PORTC=0xFE;
DDRD=0xFF;PORTD=0xFF;
//timer0 initialized
TCCR0=0x00;
TCNT0=0x74;//定時(shí)時(shí)長(zhǎng)18mS,按1/4拍為187ms
//timer1 initialized
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0xFF;
OCR1AL=0xFF;
TCCR1A=0x00;
//
MCUCR=0x00;
GICR=0xC0;
TIMSK=0x11;
}
//==============================================================================
// 函數(shù)名稱:get_music_num()
// 功 能:通過曲目值讓指針指向?qū)?yīng)的歌曲,實(shí)現(xiàn)曲目查找
// 參 數(shù):無(wú)
// 影響變量:*p
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:
//==============================================================================
void get_music_num(void)
{
switch(play_num)
{
case 0 : p=music_dt0;break;
case 1 : p=music_dt1;break;
case 2 : p=music_dt2;break;
case 3 : p=music_dt3;break;
case 4 : p=music_dt4;break;
case 5 : p=music_dt5;break;
case 6 : p=music_dt6;break;
case 7 : p=music_dt7;break;
}
}
//==============================================================================
// 函數(shù)名稱:sound()
// 功 能:將得到的數(shù)據(jù)轉(zhuǎn)化為聲音信號(hào)
// 參 數(shù):無(wú)
// 影響變量:yinyue,yinfu,jiepai,num
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:2005-3-14 by QQQ
//==============================================================================
void sound(void)//
{
yinyue=(*p)[0];
if(yinyue != 0)
{
OCR1A=tone_frq[yinyue];//取得音符對(duì)應(yīng)的頻率值
TCCR1B=0x09;
TCNT1=0x00;
}
else TCCR1B=0x00;//若音樂為零,表示休止符
while((tone_dl<jiepai)&&(play_num==play_tmp)&&(play_flag!=0));
if(play_flag==0)
{
MCUCR|=0xA0;
PORTC=0xFE;
j=0x01;//等待標(biāo)志
SLEEP();
MCUCR=0x00;
TCCR0=0x05;TCCR1B=0x09;
}
while((tone_dl<jiepai)&&(play_num==play_tmp)&&(play_flag!=0));
tone_dl=0;
p++;
jiepai=(*p)[1];
}
//==============================================================================
// 函數(shù)名稱:main()
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:2005-3-14 by QQQ
//==============================================================================
void main(void)
{
init_device();
nop_time=0;
play_num=0;
play_flag=0;
SEI();//開中斷
while(1)
{start:
get_music_num();
play_tmp=play_num;
if(play_flag==0x01)
{TCCR0=0x05;TCCR1B=0x09;}
jiepai=(*p)[1];//取得第一個(gè)節(jié)拍
while(jiepai!=0)//若為零,表示結(jié)束
{
if(play_tmp!=play_num)//播放與用戶指定樂曲不同
{TCCR0=0x00;
TCCR1B=0x00;
goto start;} //結(jié)束當(dāng)前播放的曲子
sound();
}
TCCR0=0x00;TCCR1B=0x00;
if(play_num<7)play_num++;
else play_num=0;
PORTC=0xFE;
if(nop_time>16666)//大于300s無(wú)鍵盤操作進(jìn)入待機(jī)狀態(tài)
{MCUCR|=0xA0;
PORTC=0xFE;
j=0x00;//進(jìn)入待機(jī)標(biāo)志
SLEEP();
play_num=play_tmp;//任意鍵喚醒后繼續(xù)播放進(jìn)入待機(jī)時(shí)播的歌曲
MCUCR=0x00;//防止意外進(jìn)入休眠
}
}
}
/******************************************************************************/
/* END */
/******************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -