利用TC1设计实现的单音手机音乐播放器

上一篇 / 下一篇  2007-10-03 14:22:59 / 天气: 阴雨 / 心情: 平静 / 个人分类:AVR单片机

/****************************************************
/****************************************************
名称:4利用TC1设计实现的单音手机音乐播放器
参数:使用外部晶振(4M)
用法:将SAVR-51板上的PORTD5接M区的峰铭器,PORTD3接K1按键    
设计人:kaiser-朱

日期:
/****************************************************
/****************************************************/
#include <mega16.h>

flash unsigned int t[9] = {0,956,865,759,716,638,568,506,470};
flash unsigned char d[9] = {0,105,116,132,140,157,176,198,209};
#define Max_note    32
flash unsigned char music[Max_note] =
   {5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};

unsigned char note_n;
unsigned int int_n;
bit play_on;

interrupt [EXT_INT1] void ext_int1_isr(void) // INT1中断服务程序
{
    if (!play_on)
    {
        TCCR1B = 0x09;      // 启动T/C1,播放音乐
    }
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void) // T/C1比较匹配中断服务
{
    if (!play_on)
    {
        note_n = 0;
        int_n = 1;
        play_on = 1;   // 开始重头播放音乐
    }
    else
    {          // 播放一个音符
        if (--int_n == 0)
        {          // 一个音符播放完成
            TCCR1B = 0x08;      // 停止T/C1工作
            if (note_n < Max_note)
            {         // 音乐未播完
                OCR1A = t[music[note_n]];   // 取下一个音符
                int_n = d[music[note_n]];   // 取该音符的基本节拍单位
                note_n++;
                int_n = int_n * music[note_n];  // 计算该音符的节拍值
                note_n++;
                TCCR1B = 0x09;     // 启动T/C1,播放1个音符
            }
            else
                play_on = 0;     // 整个音乐播放完成
        }
    }         
}

void main(void)
{
    PORTD=0x08;  // PD5匹配输出方式,脉冲输出,驱动发声;
    DDRD=0x20;  // PD3按键(INT1)输入口,输入方式,且上拉电阻有效

TCCR1A=0x40;   // T/C1初始化代码。T/C1工作于CTC方式,
TCCR1B=0x08;   // OCR1A为比较寄存器,OC1A为触发取反方式
TIMSK=0x10;   // 允许比较匹配OC1A中断

GICR|=0x80;   // 外部中断初始化代码
MCUCR=0x08;   // 允许INT1中断
MCUCSR=0x00;   // INT1中断采用下降沿出发方式
GIFR=0x80;
#asm("sei")   // 开放全局中断标志

while (1)    // 主程序
    { TCCR1B = 0x09; }
}


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-11-21  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

我的存档

数据统计

  • 访问量: 710
  • 日志数: 5
  • 商品数: 1
  • 建立时间: 2007-10-02
  • 更新时间: 2007-10-03

RSS订阅

Open Toolbar