标题: 51单片机蜂鸣器如何演奏音乐 求帮助 [打印本页]
作者: lilraymond 时间: 2018-11-5 01:13
标题: 51单片机蜂鸣器如何演奏音乐 求帮助
使用51单片机 如何让蜂鸣器演奏音乐
作者: diy1997 时间: 2018-11-5 08:16
控制振动的频率和振动时间的长短。
作者: Dremt 时间: 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++;}
}
}
作者: ~~~~坦~~~~~ 时间: 2018-11-8 19:50
应该是控制振动的频率和振动时间的长短。
作者: Creepy_King 时间: 2018-11-8 23:19
建立声音库,输入想要播放的音调排列,运用函数输出就行
作者: 51凡尘 时间: 2018-11-11 12:54
用pwm控制输出的信号频率
作者: Xmmm.1 时间: 2018-11-11 15:34
无源的蜂鸣器会控制频率让他响就够了,想让他出音乐去网上找一个51乐谱软件,
作者: 六城 时间: 2018-11-11 15:46
建立一个声音库,把你准备放的东西存在里面输入想要播放的音调排列,再运用函数把它输出就ok
作者: feifeishe01 时间: 2018-11-11 19:02
音色就是控制频率大小,不同音色“DO RE MI FA SO LA XI ”对应不同的频率,频率定好后然后调用就可以了
作者: zl2168 时间: 2018-11-12 08:50
本帖最后由 zl2168 于 2018-11-13 23:28 编辑
给你介绍几个播放音乐参考案例
实例31 单音频输出 简易电子琴
还有报警声输出,在《实例78 功能齐全的电子密码锁》中
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
作者: 黄天三盖 时间: 2018-11-12 09:16
网上找代码复制就可以了
作者: tony_200812 时间: 2018-11-12 14:10
可以,pwm加积分电路或者dac
作者: 浮念 时间: 2018-11-13 11:07
建立一个声音库,输入想要播放的音调排列,运用函数输出就行
作者: zl2168 时间: 2018-11-14 08:29
实例75 定时器控制播放生日快乐歌 世上只有妈妈好
作者: 15014649604 时间: 2018-11-14 11:19
试试去网上找一下
作者: 999999999潇洒 时间: 2018-11-17 12:23
请参考https://wenku.baidu.com/view/cf9d36d128ea81c758f57818.html
作者: Blessed 时间: 2018-11-17 14:00
控制振动 的频率就可以,这个可以通过控制电流电压来实现
作者: User_Ard 时间: 2018-11-17 14:50
需要用到音调,音频,节拍
作者: bnd 时间: 2018-11-17 15:07
不同音调对应不同频率,在实际乐曲中还有不同音调对应的播放时间问题。
作者: bnd 时间: 2018-11-17 15:07
正好一起学习学习。
作者: opration 时间: 2018-11-17 16:32
如果是无源的蜂鸣器,只需控制0(低电平)和1(高电平)的赋值频率就行了。赋值周期基本就是一条语句执行的周期,可以根据CPU的频率计算出来。
作者: 相似性 时间: 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++);
}
作者: weiweimao1 时间: 2018-11-17 22:28
yy[]={ }; 括号里是什么数字?你发的有点乱码,能给我发一下吗?
作者: dzxiaobaibai 时间: 2018-11-19 21:53
改变频率
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |