怎么用单片机C语言编写驱动蜂鸣器发出7个音的电路图和程序代码(最好有解释)。

如题所述

51单片机的P1.2口连接到蜂鸣器的一个管脚上,另外一个管脚接地。若声音小,则添加一个三级管放大电路或直接串一个UL2003
/*------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动?
//头文件包含特殊功能寄存器的定义
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
sbit SPK=P1^2; //定义音乐输出端口
unsigned char Timer0_H,Timer0_L,Time;
//世上只有妈妈好数据表
code unsigned char MUSIC[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
// 音阶频率表 定时器高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表 定时器低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
节拍延时函数
各调1/4节拍时间:
调4/4 125ms
调2/4 250ms
调3/4 187ms
------------------------------------------------*/
void delay(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)
DelayMs(250);
TR0=0;
}
/*------------------------------------------------
定时器0中断
------------------------------------------------*/
void TIM0_ISR() interrupt 1
{
TR0=0;
SPK=!SPK;
TH0=Timer0_H;
TL0=Timer0_L;
TR0=1;
}
/*------------------------------------------------
歌曲处理函数
------------------------------------------------*/
void Song()
{
TH0=Timer0_H;//赋值定时器时间,决定频率
TL0=Timer0_L;
TR0=1; //打开定时器
delay(Time); //延时所需要的节拍
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
unsigned char k,i;
TMOD|=0x01; //置定时器0工作方式1
EA=1; //打开全局中断
ET0=1; //打开定时0中断
while(1)
{
i=0;
while(i<100)
{ //音乐数组长度 ,唱完从头再来
k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
Timer0_H=FREQH[k];
Timer0_L=FREQL[k];
Time=MUSIC[i+2]; //节拍时长
i=i+3;
Song();
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-27
搜:
基于51单片机的4×4矩阵键盘电子琴

百度一下。
第2个回答  2012-12-27
弄明白蜂鸣器的原理很简单,你听别人说的功夫其实就弄明白了
第3个回答  2012-12-27
对不起啊~~~我不是嵌入式的~~~不能解决你的问题哦

怎样用stc89c52单片机控制蜂鸣器发出音乐的c语言程序?
include\\r\\n#include\\r\\n\/\/本例采用89C52,晶振为11.0592MHZ\\r\\n\/\/关于如何编制音乐代码,其实十分简单,各位可以看以下代码.\\r\\n\/\/频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;\\r\\n\/\/所以拿出谱子,试探编吧!\\r\\nsbitBeep=P1^5;\\r\\n\\r\\nunsignedcharn=0;\/\/n为节拍常数变...

单片机驱动蜂鸣器电路?
while (1){ \/\/使能全局中断 OpenBuzz(4000); \/\/以 4KHz 的频率启动蜂鸣器 for (i=0; i<40000; i++);StopBuzz(); \/\/停止蜂鸣器 for (i=0; i<40000; i++);OpenBuzz(1000); \/\/以 1KHz 的频率启动蜂鸣器 for (i=0; i<40000; i++);StopBuzz(); \/\/停止蜂鸣器 for (i=0; i...

单片机蜂鸣器发声代码
这个程序会使蜂鸣器发出中央C的音符,然后停止。然后,它会等待另一半秒(500毫秒),然后重复这个过程。你可以通过改变 NOTE_C2 来改变播放的音符,或者通过改变 delay() 的参数来改变音符之间的间隔时间。

单片机蜂鸣器怎么发出7阶音符
蜂鸣器要发出7阶音符,必须用无源的蜂鸣器,这样,由单片机产生7阶音符的信号,最好再放大后加到蜂鸣器上。单片机用定时器控制控制输出一定频率的信号,是最简单的应用了。音阶与频率对应关系表如下

单片机驱动蜂鸣器原理是什么
单片机驱动蜂鸣器的原理其实很简单,就是通过单片机控制蜂鸣器的开关,从而改变蜂鸣器的发声状态。具体来说,蜂鸣器是一个电气元件,可以通过控制电流的流动来发声。因此,我们可以通过控制单片机的输出引脚来控制蜂鸣器的电流流动,从而控制蜂鸣器的发声状态。要控制蜂鸣器的发声状态,可以使用单片机的模拟输出功能。...

求一个关于单片机的蜂鸣器的C语言程序,如果好,可行的话有追加分~
1. 实验任务 用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2. 电路原理图 图4.6.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1....

求51单片机蜂鸣器播放音乐的教程 C语言
uchar keyscan(void);\/\/键盘扫描程序 void delay(uint i); \/\/延时子程序\/*--- T0的值,及输出频率对照表 ---*\/ uchar code freq[36*2]={ 0xA9,0xEF, \/\/0x3F,0XEE,\/\/00220HZ ,1 \/\/0 0x93,0xF0, \/\/0X3D,0XEF,\/\/00233HZ ,1 0x73,0xF1, \/\/0X30,0XF0,\/\/0024...

使用51单片机蜂鸣器播放音乐 求keil程序
\/\/12代表低音来 22代表高音来 2代表中音来,是不是翻译乐谱很方便 include<reg52.h> sbit SPK = P3^7; \/\/P3.7外接扬声器,可以改成你所说的P1^5 define uint unsigned int;define uchar unsigned char;uint x,y;uint i,j,k;\/\/以下是根据歌谱转来的音乐代码 3代表中音咪 1个全音被...

protues中蜂鸣器如何发出声音给个电路图
电路图如下:蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小。单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。三极管的作用为驱动,通过三极管放大驱动电流,从而可以让蜂鸣器发出声音。

单片机蜂鸣器
3、C语言编程为:include<reg51.h>\/\/头文件 sbit d1=P1^2;\/\/位定义,把P1口的P1.2位设为驱动口,当然其它口也可。void main()\/\/主函数 { d1=0\/\/单片机默认状态为1,不用初始化了,此处直接赋值0则可驱动 };此为最最简单的电路程序设计。下载后,蜂鸣器一会一直处于鸣叫状态。你可以加一...

相似回答