找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机蜂鸣器如何演奏音乐 求帮助

  [复制链接]
回帖奖励 50 黑币 回复本帖可获得 10 黑币奖励! 每人限 2 次(中奖概率 50%)
跳转到指定楼层
楼主
ID:417679 发表于 2018-11-5 01:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用51单片机 如何让蜂鸣器演奏音乐

评分

参与人数 1黑币 +5 收起 理由
芦苇劫 + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:310519 发表于 2018-11-5 08:16 | 只看该作者
控制振动的频率和振动时间的长短。
回复

使用道具 举报

板凳
ID:419294 发表于 2018-11-8 13:05 | 只看该作者
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5;
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
212,212,106,126,159,169,190,119,119,126,159,142,159,0};

uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
9,3,12,12,12,12,12,9,3,12,12,12,24,0};

//延时
void DelayMS(uint x)
{
uchar t;
while(x--) for(t=0;t<120;t++);
}

void PlayMusic()
{
uint i=0,j,k;
while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{ //播放各个音符,SONG_LONG 为拍子长度
    for(j=0;j<SONG_LONG[i]*20;j++)
{
    beep=~beep;
//SONG_TONE 延时表决定了每个音符的频率
    for(k=0;k<SONG_TONE[i]/3;k++);
}
    DelayMS(10);
    i++;
}
}


void main()
{

beep=0;
while(1)
{
PlayMusic(); //播放生日快乐
DelayMS(500); //播放完后暂停一段时间
}
}
复制代码





/*两只蝴蝶歌曲*/  
/*******************************************/
#include <reg51.h>             // 这是  单片机音乐代码生成器  生成的代码
#define uchar unsigned char
sbit beepIO=P1^5;                 // 输出 为 P1.5  可以修改 成 其它 IO 口
uchar m,n;
uchar code T[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
uchar code music[][2]={{0,4},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{21,24},
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},
{23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20},
{26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},{23,4},{23,4},{26,4},{28,8},{28,12},{16,4},{23,4},{21,4},
{21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{0,4},{31,8},{30,4},{28,4},{30,4},{23,8},{0,4},{28,4},{28,4},{30,4},{28,4},{26,4},{23,4},{21,8},{23,4},{21,4},{23,4},{26,16},
{0xFF,0xFF}};
void delay(uchar p)
{
    uchar i,j;
    for(;p>0;p--)
    for(i=181;i>0;i--)
    for(j=181;j>0;j--);
}
void pause()
{
    uchar i,j;
    for(i=150;i>0;i--)
    for(j=150;j>0;j--);
}
void T0_int() interrupt 1
{
beepIO=!beepIO;
TH0=T[m][0]; TL0=T[m][1];
}
void main()
{
uchar i=0;
TMOD=0x01;  EA=1; ET0=1;
while(1)
      {
        m=music[i][0];n=music[i][1];
           if(m==0x00)
             {TR0=0;delay(n);i++;}
           else if(m==0xFF)
             {TR0=0;delay(30);i=0;}
           else if(m==music[i+1][0])
             {TR0=1;delay(n);TR0=0;pause();i++;}
           else
             {TR0=1;delay(n);i++;}
      }
}

评分

参与人数 1黑币 +10 收起 理由
芦苇劫 + 10 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:423203 发表于 2018-11-8 19:50 | 只看该作者
应该是控制振动的频率和振动时间的长短。
回复

使用道具 举报

5#
ID:423342 发表于 2018-11-8 23:19 | 只看该作者
建立声音库,输入想要播放的音调排列,运用函数输出就行
回复

使用道具 举报

6#
ID:424408 发表于 2018-11-11 12:54 | 只看该作者
用pwm控制输出的信号频率
回复

使用道具 举报

7#
ID:408178 发表于 2018-11-11 15:34 | 只看该作者
无源的蜂鸣器会控制频率让他响就够了,想让他出音乐去网上找一个51乐谱软件,
回复

使用道具 举报

8#
ID:413355 发表于 2018-11-11 15:46 | 只看该作者

建立一个声音库,把你准备放的东西存在里面输入想要播放的音调排列,再运用函数把它输出就ok
回复

使用道具 举报

9#
ID:424615 发表于 2018-11-11 19:02 | 只看该作者
音色就是控制频率大小,不同音色“DO RE MI FA SO LA XI ”对应不同的频率,频率定好后然后调用就可以了
回复

使用道具 举报

10#
ID:111634 发表于 2018-11-12 08:50 | 只看该作者
本帖最后由 zl2168 于 2018-11-13 23:28 编辑

给你介绍几个播放音乐参考案例
实例31  单音频输出  简易电子琴

Proteus仿真一下,确认有效。 实例31 简易电子琴.rar (28.34 KB, 下载次数: 25)

实例13  双音频输出 实例13 双音频输出.rar (26.69 KB, 下载次数: 9) 救护车警车铃声输出.rar (27.04 KB, 下载次数: 10)
实例75  定时器控制播放生日快乐歌 实例75 定时器控制播放生日快乐歌.rar (26.96 KB, 下载次数: 15)
实例76 定时器控制播放世上只有妈妈好歌曲.rar (27.15 KB, 下载次数: 12)
还有报警声输出,在《实例78  功能齐全的电子密码锁》中
电子密码锁1.rar (1.13 MB, 下载次数: 4)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
回复

使用道具 举报

11#
ID:424820 发表于 2018-11-12 09:16 | 只看该作者
网上找代码复制就可以了
回复

使用道具 举报

12#
ID:424964 发表于 2018-11-12 14:10 | 只看该作者
可以,pwm加积分电路或者dac
回复

使用道具 举报

13#
ID:411940 发表于 2018-11-13 11:07 | 只看该作者
建立一个声音库,输入想要播放的音调排列,运用函数输出就行
回复

使用道具 举报

14#
ID:111634 发表于 2018-11-14 08:29 | 只看该作者
实例75  定时器控制播放生日快乐歌   世上只有妈妈好
回复

使用道具 举报

15#
ID:426249 发表于 2018-11-14 11:19 | 只看该作者
试试去网上找一下
回复

使用道具 举报

16#
ID:422661 发表于 2018-11-17 12:23 | 只看该作者
回复

使用道具 举报

17#
ID:428171 发表于 2018-11-17 14:00 | 只看该作者
控制振动 的频率就可以,这个可以通过控制电流电压来实现
回复

使用道具 举报

18#
ID:428195 发表于 2018-11-17 14:50 | 只看该作者
需要用到音调,音频,节拍
回复

使用道具 举报

19#
ID:428212 发表于 2018-11-17 15:07 | 只看该作者
不同音调对应不同频率,在实际乐曲中还有不同音调对应的播放时间问题。
回复

使用道具 举报

20#
ID:428212 发表于 2018-11-17 15:07 | 只看该作者
正好一起学习学习。
回复

使用道具 举报

21#
ID:428260 发表于 2018-11-17 16:32 | 只看该作者
如果是无源的蜂鸣器,只需控制0(低电平)和1(高电平)的赋值频率就行了。赋值周期基本就是一条语句执行的周期,可以根据CPU的频率计算出来。
回复

使用道具 举报

22#
ID:428270 发表于 2018-11-17 16:45 | 只看该作者
#include "reg51.h"

code unsigned int yindiao[] = {0,120,106,94,89,79,71,62};
code unsigned int jiepai[] = {0,523,587,659,698,784,880,988};
code unsigned int yy[]={′ËÇøóò¿é×Ô¼oìî′ê};

void play(unsigned int yd,unsigned int jp);
void delay(unsigned int a);

sbit beep=P2^2;
void main(void)
{
        unsigned int i;
        while (1)
        {
                for(i=0;i<13;i++)
                {
                        play(yindiao[yy[i]],jiepai[yy[i]]);
                        delay(1000);
                }
        delay(4000);
        }
}
void play(unsigned int yd,unsigned int jp)
{   
unsigned int i,j;
        for (i=0;i<jp;i++)
        {
                beep=0;
                for (j=0;j<yd;j++);
                beep=1;
                for (j=0;j<yd;j++);
        }
}
void delay(unsigned int a)  
{
        unsigned int b;
        while(a--)
                for(b=0;b<115;b++);
}

回复

使用道具 举报

23#
ID:423511 发表于 2018-11-17 22:28 | 只看该作者
相似性 发表于 2018-11-17 16:45
#include "reg51.h"

code unsigned int yindiao[] = {0,120,106,94,89,79,71,62};

yy[]={    };   括号里是什么数字?你发的有点乱码,能给我发一下吗?
回复

使用道具 举报

24#
ID:421917 发表于 2018-11-19 21:53 | 只看该作者
改变频率
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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