标题:
51单片机驱动蜂鸣器
[打印本页]
作者:
Kansa
时间:
2018-10-5 19:46
标题:
51单片机驱动蜂鸣器
蜂鸣器
会
根据输入的脉冲发声,脉冲频率不一样发出的声音也不一样
。
Proteus中提供有3种声音部件:BUZZER、SPEAKER、SOUNDER。
输入的脉冲频率
用延时函数或计时器来实现。
在这里我将
通过独立按键启动警灯警笛(频率和节拍可能控制的不准确,仅供参考),控制报警灯旋转(旋转灯用
8个LED灯实现旋转时低3位亮,然后每次左移一位形成旋转显示),并让蜂鸣器发出警报声(即通过定时产生两种不同频率的输入脉冲给蜂鸣器)。
蜂鸣器驱动.zip
(18.23 KB, 下载次数: 12)
2018-10-5 19:46 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-10-7 01:08
0.png
(18.21 KB, 下载次数: 47)
下载附件
2018-10-7 01:08 上传
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar fre=0x00;
sbit BEEP=P2^3;
uchar temp=0xf8;
uchar num=0;
uint num1;
uint index=1;
uint code SONG_TONE[]={7360,7835};
uint code SONG_LONG[]={275,265};
bit flag=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()
{
TMOD=0x01;//定时器0,工作方式1
TH0=55536/256;
TL0=55536%256;
TH1=7192/32;
TL1=7192%32;
EA=1;//打开全局中断允许
EX0=1;//打开外部中断0中断
IE0=1;//外部中断0请求
IT0=1;//外部中断0下降沿触发
ET0=1;//打开定时器/计数器0中断
ET1=1;
TR0=0;//关闭定时器0
TR1=0;
while(1) {
//if(flag==0)
//PlayMusic();
}
}
void EX_INT0() interrupt 0
{
P0=0xff;
TR0=~TR0;
TR1=~TR1;
flag=~flag;
BEEP=1;
}
void ET_T0() interrupt 1
{
num++;
TH0=55536/256;
TL0=55536%256;
if(num==10)
{
P0=temp;
temp=_crol_(temp,1);
num=0;
}
}
void ET_T1() interrupt 3
{
TH1=SONG_TONE[index]/32;
TL1=SONG_TONE[index]%32;
num1++;
BEEP=~BEEP;
if(num1==SONG_LONG[index])
{
num1=0;
index=(index+1)%2;
BEEP=1;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1