找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1082|回复: 4
打印 上一主题 下一主题
收起左侧

跪求一个完整的歌曲播放代码的设计思路

[复制链接]
跳转到指定楼层
楼主
哪位大佬能简单的指导一下我啊,求个大致的思路 想靠自己的能力制作出来,提升自己的电子技术水平!C语言!希望大佬帮帮孩子要求:

基于51单片机的代码,主要I为C芯片:89C51/2DAC0832
将歌曲先写入89C52的存储区域,再经DAC0832输出到放大电路驱动speak或者beep。

哪位大佬能简单的指导一下我啊,求个大致的思路 想靠自己的能力制作出来,提升自己的电子技术水平


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:284488 发表于 2019-6-20 08:27 | 只看该作者
51hei论坛就有很多可参考的啊!
例如:
单片机+无源蜂鸣器实现音乐—世上只有妈妈好 视频演示Proteus仿真程序
http://www.51hei.com/bbs/dpj-163324-1.html
回复

使用道具 举报

板凳
ID:320663 发表于 2019-6-20 09:04 | 只看该作者
将歌曲转换成频率值存进数组,再用频率值驱动喇叭,这样做出来只有音调,而且89c52也存不了多长时间的音乐,想放音乐最好学学SD卡的使用
回复

使用道具 举报

地板
ID:558085 发表于 2019-6-20 12:44 | 只看该作者
拿去吧,不谢!



// --------------------  拥抱你的离去  ---------------
#include<reg51.h>               
#define uint8        unsigned char
#define uint16  unsigned int

sbit Music=P2^0;

uint16 code FreTab_Low[7]={262,294,330,349,392,440,494};                    //低音频率表
uint16 code FreTab_Mid[7]={523,578,659,698,784,880,988};                    //中音频率表
uint16 code FreTab_Hight[7]={1046,1175,1318,1397,1568,1760,1976};        //高音频率表


uint8 code  ybnlc[]={
0x06,0x08,0x06,0x04,0x06,0x04,0x06,0x04,0x11,0x04,0x06,0x04,0x05,0x04,0x06,0x0f,
0x11,0x04,0x12,0x04,0x13,0x08,0x13,0x08,0x15,0x04,0x15,0x04,0x13,0x04,0x12,0x04,0x13,0x0f,
0x13,0x04,0x15,0x04,0x12,0x08,0x12,0x08,0x12,0x04,0x13,0x04,0x12,0x04,0x11,0x04,0x12,0x0f,
0x12,0x04,0x13,0x04,0x06,0x08,0x06,0x04,0x06,0x04,0x06,0x04,0x11,0x04,0x06,0x04,0x05,0x04,
0x05,0x04,0x03,0x0f,
0x06,0x08,0x06,0x08,0x06,0x04,0x11,0x04,0x06,0x04,0x05,0x04,0x06,0x0f,
0x11,0x04,0x12,0x04,0x13,0x08,0x13,0x08,0x15,0x04,0x15,0x04,0x13,0x04,0x12,0x04,0x13,0x0f,
0x13,0x04,0x15,0x04, 0x12,0x08, 0x12,0x04, 0x12,0x04,  0x12,0x04, 0x11,0x04, 0x12,0x0f,
0x06,0x08,0x06,0x04,0x05,0x04,0x06,0x12,

0x11,0x08,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x04,
0x12,0x04,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x08,0x15,0x08,
0x16,0x04,0x16,0x08,0x16,0x04,0x16,0x04,0x15,0x04,0x15,0x08,0x16,0x0f,
0x15,0x04,0x16,0x04,
0x21,0x08,0x21,0x04,0x21,0x04,
0x16,0x04, 0x16,0x04,0x15,0x04,0x15,0x0c,0x15,0x04,
0x15,0x04, 0x16,0x04,0x15,0x04,0x13,0x04,0x13,0x12,  
0x15,0x08, 0x13,0x04,0x12,0x04,0x12,0x0c,0x12,0x04,
0x13,0x04, 0x12,0x04,0x11,0x04,0x12,0x08,
0x15,0x08, 0x13,0x04,0x12,0x04,
0x12,0x08, 0x12,0x04,0x12,0x04,0x12,0x04,
0x13,0x04, 0x12,0x04,0x11,0x04,0x06,0x0a,        
0x06,0x08, 0x05,0x0a,0x06,0x04,  0x07,0x08,
0x05,0x04, 0x13,0x08,0x05,0x08,         0x06,0x0f,

0x11,0x08,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x04,
0x12,0x04,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x08,0x15,0x08,
0x16,0x04,0x16,0x08,0x16,0x04,0x16,0x04,0x15,0x04,0x15,0x08,0x16,0x0f,
0x15,0x04,0x16,0x04,
0x21,0x08,0x21,0x04,0x21,0x04,
0x16,0x04, 0x16,0x04,0x15,0x04,0x15,0x0c,0x15,0x04,
0x15,0x04, 0x16,0x04,0x15,0x04,0x13,0x04,0x13,0x12,  
0x15,0x08, 0x13,0x04,0x12,0x04,0x12,0x0c,0x12,0x04,
0x13,0x04, 0x12,0x04,0x11,0x04,0x12,0x08,
0x15,0x08, 0x13,0x04,0x12,0x04,
0x12,0x08, 0x12,0x04,0x12,0x04,0x12,0x04,
0x13,0x04, 0x12,0x04,0x11,0x04,0x06,0x0a,        
0x06,0x08, 0x05,0x0a,0x06,0x04,  0x07,0x08,
0x05,0x04, 0x13,0x08,0x05,0x08,         0x06,0x0f,
0x11,0x08,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x04,
0x12,0x04,0x12,0x08,0x13,0x04,0x13,0x08,0x13,0x04,0x13,0x08,0x15,0x08,
0x16,0x04,0x16,0x08,0x16,0x04,0x16,0x04,0x15,0x04,0x15,0x08,0x16,0x0f,
0x15,0x04,0x16,0x04,
0x21,0x08,0x21,0x04,0x21,0x04,
0x16,0x04, 0x16,0x04,0x15,0x04,0x15,0x0c,0x15,0x04,
0x15,0x04, 0x16,0x04,0x15,0x04,0x13,0x04,0x13,0x12,
0x15,0x04,0x16,0x04,
0x21,0x08,0x21,0x04,0x21,0x04,
0x16,0x04, 0x16,0x04,0x15,0x04,0x15,0x0c,0x15,0x04,
0x15,0x04, 0x16,0x04,0x15,0x04,0x13,0x04,0x13,0x12,
0x15,0x04,0x15,0x04, 0x16,0x04,0x15,0x04,0x13,0x04,0x13,0x12,

0x00,0x00

                                                };
uint16 Fre;  //存放获取频率值的变量

void Timer_Init()
{
        TMOD=0x11;
        EA=1;
        ET0=1;
        ET1=0;
        TR0=0;
        TR1=0;
}

void Timer0_i() interrupt 1
{
        TH0=Fre/256;
        TL0=Fre%256;
        if(Music==0)
                Music=1;
        else Music=0;               
}


void Music_Play(uint8 *MusicTab)
{
        uint8 *pMusic;
        uint8 temp,i;

        pMusic=MusicTab;  //将歌曲首地址给指针变量
        while(*pMusic!=0)
        {
                if((*pMusic&0xf0)==0x00)
                        Fre=65536-1000000/FreTab_Low[*pMusic&0x0f];
                else if((*pMusic&0xf0)==0x10)
                        Fre=65536-1000000/FreTab_Mid[*pMusic&0x0f];
                else if((*pMusic&0xf0)==0x20)
                        Fre=65536-1000000/FreTab_Hight[*pMusic&0x0f];
                       
                TH0=Fre/256;                //计算频率初值,赋高八位
                TL0=Fre%256;                //计算频率初值,赋低八位
                TH1=0x3c;                    //定时器1赋初值,定时50ms
                TL1=0xb0;
               
                pMusic++;                    //获得节拍值
                temp=*pMusic;
                TR0=1;                        //开启定时器T0
                TR1=1;                        //开启定时器T1
                for(i=0;i<temp;i++)
                {
                        while(TF1==0);        //判断定时器1是否溢出
                        TH1=0x3c;
                        TL1=0xb0;
                        TF1=0;       
                }
                pMusic++;
        }
}

void main()
{
        Timer_Init();
        while(1)
        {
                Music_Play(ybnlc);
        }
}       


回复

使用道具 举报

5#
ID:558085 发表于 2019-6-20 12:54 | 只看该作者
若要再深入,会有更精彩!




音乐选播.rar (22 KB, 下载次数: 8)



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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