?? music.c
字號(hào):
/******************************************************************************/
/* 單片機(jī)放音機(jī)源程序(V1.0) */
/* 創(chuàng)建人:QQQ 創(chuàng)建日期:2005-3-8 */
/* 修改人: 修改日期: */
/******************************************************************************/
// 目標(biāo)CPU : AT90S8515
// 晶 振: 6.0000MHz
//==============================================================================
// 頭文件和變量定義
//==============================================================================
#include <io8515v.h>
#include <macros.h>
#include "music.h"
#include "music_data.h"
byte yinyue,jiepai,tone_dl,play_flag,play_num,play_tmp;
word yinfu,i;
const byte (*p)[2];//指向flash存儲(chǔ)區(qū)的二維數(shù)組指針
//==============================================================================
// 函數(shù)名稱(chēng):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:8
void timer0_ovf_isr(void)
{
TCNT0=0xB8;
tone_dl++;
}
//==============================================================================
// 函數(shù)名稱(chēng):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:5
void timer1_compa_isr(void)
{
PORTC^=0x01;
}
//==============================================================================
// 函數(shù)名稱(chēng):int0_isr()
// 功 能:外部中斷0服務(wù)程序,選曲下一首
// 參 數(shù):無(wú)
// 影響變量:play_num
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:
//==============================================================================
//void timer_cnt(byte cnt);
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
byte tmp0,tmp1;
tmp0=TCCR0;tmp1=TCCR1B;
TCCR0=0x00;TCCR1B=0x00;
//timer_cnt(3);
CLI();
for(i=0;i<5000;i++);
if((PIND&0x04)==0){
if(play_num>6)play_num=0;
else play_num+=1;
while((PIND&0x04)==0);}
SEI();
TCCR0=tmp0;TCCR1B=tmp1;
}
//==============================================================================
// 函數(shù)名稱(chēng):int1_isr()
// 功 能:外部中斷1服務(wù)程序,播放/暫停
// 參 數(shù):無(wú)
// 影響變量:play_flag
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:
//==============================================================================
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
byte tmp0,tmp1;
tmp0=TCCR0;tmp1=TCCR1B;
TCCR0=0x00;TCCR1B=0x00;
//timer_cnt(3);
CLI();
for(i=0;i<5000;i++);
if((PIND&0X08)==0){
play_flag^=0x01;
while((PIND&0x08)==0);}
SEI();
TCCR0=tmp0;TCCR1B=tmp1;
}
//==============================================================================
// 函數(shù)名稱(chēng):init_device()
// 功 能:初始化各寄存器及I/O口
// 參 數(shù):無(wú)
// 影響變量:無(wú)
// 創(chuàng) 建:2005-3-8 by QQQ
// 修 改:
//==============================================================================
void init_device(void)
{
CLI();
//port initialized
DDRA=0xFF;PORTA=0xFF;
DDRB=0xFF;PORTB=0xFF;
DDRC=0xFF;PORTC=0xFE;
DDRD=0xFF;PORTD=0xFF;
//timer0 initialized
TCCR0=0x00;
TCNT0=0x8B;//定時(shí)時(shí)長(zhǎng)20mS
//timer1 initialized
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0xFF;
OCR1AL=0xFF;
TCCR1A=0x00;
//
MCUCR=0x00;
GIMSK=0xC0;
TIMSK=0x42;
}
//==============================================================================
// 函數(shù)名稱(chēng):get_music_num()
// 功 能:通過(guò)曲目值讓指針指向?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;
//default: p=music_dt0;
}
}
//==============================================================================
// 函數(shù)名稱(chēng):sound()
// 功 能:將得到的數(shù)據(jù)轉(zhuǎn)化為聲音信號(hào)
// 參 數(shù):無(wú)
// 影響變量:yinyue,yinfu,jiepai,num
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:
//==============================================================================
void sound(void)//
{
yinyue=(*p)[0];
if(yinyue != 0)
{
yinfu=tone_frq[yinyue];//取得音符對(duì)應(yīng)的頻率值
OCR1A=3000000/yinfu;//計(jì)算得到比較值
TCCR1B=0x09;
TCNT1=0x00;
}
else TCCR1B=0x00;//若音樂(lè)為零,表示休止符
jiepai=jiepai*5;//計(jì)算得到節(jié)拍長(zhǎng)度
while((tone_dl<jiepai)&&(play_num==play_tmp)&&(play_flag!=0));
if(play_flag==0)
{
MCUCR|=0x30;
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ù)名稱(chēng):main()
// 創(chuàng) 建:2005-3-9 by QQQ
// 修 改:
//==============================================================================
void main(void)
{
init_device();
play_num=0;
play_flag=0;
SEI();//開(kāi)中斷
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;}
sound();
}
TCCR0=0x00;TCCR1B=0x00;
play_num++;
PORTC=0xFE;
if(play_tmp==8)SLEEP();
}
}
/******************************************************************************/
/* END */
/******************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -