找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2145|回复: 2
收起左侧

C51单片机多声道播放音乐

[复制链接]
ID:886808 发表于 2021-3-11 13:30 来自手机 | 显示全部楼层 |阅读模式
物理学中我们知道,频率增加(或降低)一倍声音就提高{或降低)8度。
因为单片机用的是二进制,左移或右移就是增减几倍。所以频率就同比例增减。
下面以播放《祝你平安》为例:其实实现起来非常简单,多一个声道就多加一个蜂鸣器或扬声器。相应新加的播放时左右移就行了。
同样道理,也能实现和弦等。具体单片机代码如下:
#include "reg52.h"
unsigned char Count;
sbit _Speak =P3^4 ;                        //讯响器控制脚 
usbit _Speakr =P3^7;                        //新加讯响器控制脚
nsigned char code SONG[] ={      //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
                                  //路边的野华不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,

};

void Time0_Init()
{
        TMOD = 0x01;
        IE          = 0x82;
        TH0  = 0xD8;
        TL0  = 0xEF;                //12MZ晶振,10ms
}

void Time0_Int() interrupt 1
{
        TH0 = 0xD8;
        TL0 = 0xEF;
        Count++;                        //长度加1
}

/*-------------------------------------------------
功能:1MS延时子程序
-------------------------------------------------*/
void Delay_xMs(unsigned int x)
{
    unsigned int i,j;
    for( i =0;i < x;i++ )
    {
        for( j =0;j<3;j++ );
    }
}

/*-------------------------------------------------
功能:歌曲播放子程序i为播放哪一段曲目
-------------------------------------------------*/
void Play_Song(unsigned char i)
{
        unsigned char Temp1,Temp2;
        unsigned int Addr;
        Count = 0;                                                //中断计数器清0
        Addr = i * 217;
        while(1)
        {
                Temp1 = SONG[Addr++];
            if ( Temp1 == 0xFF )          //休止符
            {
                    TR0 = 0;
                    Delay_xMs(100);
            }
            else if ( Temp1 == 0x00 )          //歌曲结束符
            {
                    return;
            }
            else
            {
                    Temp2 = SONG[Addr++];
                    TR0 = 1;
                          while(1)
                          {
                            _Speak = ~_Speak;
                            Delay_xMs(Temp1);
                            if ( Temp2 == Count )
                            {
                                    Count = 0;
                                    break;
                           
                    }         
//以下为新加的声道播放
        _Speakr = ~_Speakr;//新加的蜂鸣器或扬声器发声
                            Delay_xMs(Temp1>>1);//新加的发音声道频率,左移或右移。
                            if ( Temp2 == Count )
                            {
                                    Count = 0;
                                    break;
                            }

            }
        }
}
/*-------------------------------------------------
功能:主程序
-------------------------------------------------*/
void main()
{
        Time0_Init();                        //定时器0中断初始化
        while(1)
        {
                Play_Song(0);                //播放
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:610740 发表于 2021-3-11 15:00 来自手机 | 显示全部楼层
有录音或者视频吗?听听会出来怎么样的声音
回复

使用道具 举报

ID:886808 发表于 2021-3-11 15:46 来自手机 | 显示全部楼层
Tesla000 发表于 2021-3-11 15:00
有录音或者视频吗?听听会出来怎么样的声音

我用耳机试的,就是一面是高音面是低音。高低之间最大我试到左右移功4位。现在眼睛不行了,焊点东西特费劲,加个三极管和蜂鸣器都短路不知多少回。后来直接在蜂鸣器上取两个端点,加上地线,接在耳麦上试听。因为两边声音有高有低,听以才可行发表。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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