1. 程式人生 > >51微控制器驅動無源蜂鳴器

51微控制器驅動無源蜂鳴器

在學習過程中遇到如下例題:8個發光管由上至下間隔1s流動,其中每個管亮500ms,500ms,亮時蜂鳴器響,滅時關閉蜂鳴器,一直重複下去。

流水燈的程式相對我個人來說比較簡單,但是蜂鳴器有些難度,正常給I/0口一個訊號,蜂鳴器既然不響,後經查證是無源蜂鳴器;

無源的蜂鳴器,就要通過IO口輸出振盪訊號來驅動蜂鳴器

蜂鳴器簡介:蜂鳴器根據結構不同分為壓電式蜂鳴器和電磁式蜂鳴器;而兩種蜂鳴器又分為有源蜂鳴器和無源蜂鳴器,這裡的源特指振盪源;有源蜂鳴器直接加電就可以響起,無源蜂鳴器需要我們給提供振盪源。理想的振盪源為一定頻率的方波。

由於系統採用了無源蜂鳴器,所以需要我們通過程式設計來控制I/0口的翻轉來產生一定頻率的方波訊號。本文采用預設頻率

0.5KHZ的標準方波。可以算出週期T = 2ms 脈寬t = 1ms,因此我們可以通過簡單的延時函式延時1ms。然後控制P3.7口的電平高低產生0.5KHZ的方波訊號;

本程式只是通過簡單延時達到驅動蜂鳴器的效果。

#include <reg52.h>

sbit buzzer = P1^5;

void delayms(unsigned int xms)   //延時函式 ,延時xms
{
      unsigned int i , j;
          for(i = 0; i < xms; i++)
              for(j = 0; j < 110; j++);
}

void fengming()    //蜂鳴函式,脈寬t = 1ms 週期T = 2ms 頻率f = 0.5khz 實際發現延時1ms的時候效果最好
{
        buzzer = 0; //
P1.5口送低電平
        delayms(1);   //
延時1ms
        buzzer = 1;   //
P1.5口送高電平
        delayms(1);   //
延時1ms
}

void main()
{
       while(1)
      {
            fengming();
       }
}