搜索
bottom↓
回复: 6

分享:M48的音乐程序。

[复制链接]

出0入0汤圆

发表于 2005-6-18 02:31:04 | 显示全部楼层 |阅读模式
刚把M48发音乐的程序搞响了,发给大家共享,以作为在这上面学了很多东西的回报。



首先说明,这个程序本来就是从本站下载的,只是原来是M8的,并且是ICC编译的,我现在只是做了小小改动:改用M48,并且用WINAVR编译。原来的程序还有几个按键控制,我都省掉了。因为现在这个程序是准备嵌入另外的程序里的。

感谢原来的作者。



点击此处下载armok0153367.rar

出0入0汤圆

发表于 2005-6-18 20:06:33 | 显示全部楼层
顶一下

出0入0汤圆

 楼主| 发表于 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;

}

出0入0汤圆

发表于 2005-12-14 23:24:22 | 显示全部楼层
编译通不过啊,

F:\TDdownload\armok0153367/music_m48.c:107: undefined reference to `in_sound'

出0入0汤圆

发表于 2007-5-12 15:44:29 | 显示全部楼层
这样放出来的效果,说其是音乐,还不如说是音调,与人唱声相差太远了。以前我也用51系列的做过,

出0入0汤圆

发表于 2007-10-11 17:18:45 | 显示全部楼层
是呀,只是有音高和音长,没有音强。。。
各位大侠,是否有办法把音强也加进去??我曾在外围加了一层正弦,但效果并不好。
谢谢!希望有大侠指点下

出0入0汤圆

发表于 2010-10-13 21:03:31 | 显示全部楼层
哪位大哥改成ICC的啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 09:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表