專注電子技術學習與研究
當前位置:單片機教程網(wǎng) >> MCU設計實例 >> 瀏覽文章

51單片機驅(qū)動無源蜂鳴器

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年12月02日   【字體:

 

在學習過程中遇到如下例題:8個發(fā)光管由上至下間隔1s流動,其中每個管亮500ms,500ms,亮時蜂鳴器響,滅時關閉蜂鳴器,一直重復下去。
流水燈的程序相對我個人來說比較簡單,但是蜂鳴器有些難度,正常給I/0口一個信號,蜂鳴器既然不響,后經(jīng)查證是無源蜂鳴器;

無源的蜂鳴器,就要通過IO口輸出振蕩信號來驅(qū)動蜂鳴器
 

蜂鳴器簡介:蜂鳴器根據(jù)結構不同分為壓電式蜂鳴器和電磁式蜂鳴器;而兩種蜂鳴器又分為有源蜂鳴器和無源蜂鳴器,這里的源特指振蕩源;有源蜂鳴器直接加電就可以響起,無源蜂鳴器需要我們給提供振蕩源。理想的振蕩源為一定頻率的方波。
 
由于系統(tǒng)采用了無源蜂鳴器,所以需要我們通過編程來控制I/0口的翻轉來產(chǎn)生一定頻率的方波信號。本文采用默認頻率0.5KHZ的標準方波?梢运愠鲋芷T = 2ms 脈寬t = 1ms,因此我們可以通過簡單的延時函數(shù)延時1ms。然后控制P3.7口的電平高低產(chǎn)生0.5KHZ的方波信號;
本程序只是通過簡單延時達到驅(qū)動蜂鳴器的效果。
#include <reg52.h>
sbit buzzer = P1^5;
void delayms(unsigned int xms)   //延時函數(shù) ,延時xms
{
      unsigned int i , j;
          for(i = 0; i < xms; i++)
              for(j = 0; j < 110; j++);
}
void fengming()    //蜂鳴函數(shù),脈寬t = 1ms 周期T = 2ms 頻率f = 0.5khz 實際發(fā)現(xiàn)延時1ms的時候效果最好
{
        buzzer = 0; //
P1.5口送低電平
        delayms(1);   //
延時1ms
        buzzer = 1;   //
P1.5口送高電平
        delayms(1);   //
延時1ms
}

 
如果去掉delay(1);那么你的蜂鳴器控制端狀態(tài)大約在2us左右翻轉一次(晶振12M,12T單片機),這個時間對于驅(qū)動電路和蜂鳴器來講都是很短的,可以通俗的理解成他們沒反應過來,還沒到最響的時候就被關掉了,加上延時之后顯然可以讓它到達峰值,所以就能聽到更響。
void main()
{
       while(1)
      {
            fengming();
       }
}



 

#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit buzzer=P1^5;
sbit D1=P1^0;
void delay(uint z)//延時1ms
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<114;y++)
{
}
}
}
fasheng() //發(fā)聲子程序
unsigned int a,x;
for (a=0;a<456;a++) 
buzzer=!buzzer; 
for (x=0;x<45;x++); //45為蜂鳴器發(fā)聲頻率
}
}
void main()
{
while (1)
D1=0; 
fasheng(); 
D1=1; 
delay(200); 
}
關閉窗口

相關文章