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

📄 music_m8.c

📁 用单片机
💻 C
字号:
/******************************************************************************/
/*                          单片机放音机源程序(V1.0b)                         */
/*                   创建人:QQQ             创建日期:2005-3-8               */
/*                   修改人:QQQ             修改日期:2005-3-18              */
/******************************************************************************/
// 目标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存储区的二维数组指针
//============================================================================//
//             函数名称:timer0_ovf_isr()                                     //
//             功    能:定时器0中断服务程序,对节拍等提供时基                //
//             参    数:无                                                   //
//             影响变量:tone_dl                                              // 
//             创    建:2005-3-8  by  QQQ                                    //
//             修    改:                                                     //
//============================================================================//
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0=0x74;
 tone_dl++;
 nop_time++;
}
//==============================================================================
//             函数名称:timer1_compa_isr()
//             功    能:定时器1中断服务程序,翻转PC.0口的状态
//             参    数:无
//             影响变量:无
//             创    建:2005-3-8  by  QQQ
//             修    改:
//==============================================================================
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
 PORTC^=0x01;
}
//==============================================================================
//             函数名称:int0_isr()
//             功    能:外部中断0服务程序,选曲下一首
//             参    数:无
//             影响变量:play_num
//             创    建: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;//保存定时器状态
 TCCR0=0x00;TCCR1B=0x00;
 CLI();
 for(i=0;i<5000;i++);//延时去抖动
 if((PIND&0x04)==0&&j==0x01){
      if(play_num>6)play_num=0;
      else play_num+=1;}
 while((PIND&0x04)==0);//等待按键释放
 nop_time=0;//清无操作时间
 SEI();
 TCCR0=tmp0;TCCR1B=tmp1;//恢复定时器状态
}
//==============================================================================
//             函数名称:int1_isr()
//             功    能:外部中断1服务程序,播放/暂停
//             参    数:无
//             影响变量:play_flag
//             创    建: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++);//延时去抖动
 if((PIND&0X08)==0&&j==0x01){
      play_flag^=0x01;}
 while((PIND&0X08)==0);//等待按键释放
 nop_time=0;//清操作时间
 SEI();
 TCCR0=tmp0;TCCR1B=tmp1; 
}

//==============================================================================
//             函数名称:init_device() 
//             功    能:初始化各寄存器及I/O口
//             参    数:无 
//             影响变量:无
//             创    建: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;//定时时长18mS,按1/4拍为187ms
 //timer1 initialized
 TCCR1B=0x00;
 TCNT1H=0x00;
 TCNT1L=0x00;
 OCR1AH=0xFF;
 OCR1AL=0xFF;
 TCCR1A=0x00;
 //
 MCUCR=0x00;
 GICR=0xC0;
 TIMSK=0x11;
}
//==============================================================================
//             函数名称:get_music_num()
//             功    能:通过曲目值让指针指向对应的歌曲,实现曲目查找
//             参    数:无
//             影响变量:*p
//             创    建: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;
   }
}
//==============================================================================
//             函数名称:sound()
//             功    能:将得到的数据转化为声音信号
//             参    数:无
//             影响变量:yinyue,yinfu,jiepai,num
//             创    建:2005-3-9  by  QQQ
//             修    改:2005-3-14 by  QQQ
//============================================================================== 
void sound(void)//
{
 yinyue=(*p)[0];
 if(yinyue != 0)
      {
       OCR1A=tone_frq[yinyue];//取得音符对应的频率值
	   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;//等待标志
       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];
}
//==============================================================================
//             函数名称:main()
//             创    建: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];//取得第一个节拍
   while(jiepai!=0)//若为零,表示结束
   {
	if(play_tmp!=play_num)//播放与用户指定乐曲不同
	   {TCCR0=0x00;
	    TCCR1B=0x00;
		goto start;}	//结束当前播放的曲子
    sound();
	}
   TCCR0=0x00;TCCR1B=0x00;
   if(play_num<7)play_num++;
   else play_num=0;
   PORTC=0xFE;
   if(nop_time>16666)//大于300s无键盘操作进入待机状态
      {MCUCR|=0xA0;
	   PORTC=0xFE;
	   j=0x00;//进入待机标志
	   SLEEP();
	   play_num=play_tmp;//任意键唤醒后继续播放进入待机时播的歌曲
	   MCUCR=0x00;//防止意外进入休眠
	   }
   }
}
/******************************************************************************/
/*                                 END                                        */
/******************************************************************************/

⌨️ 快捷键说明

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