日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机驱动蜂鸣器(有源和无源)

發布時間:2023/12/8 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机驱动蜂鸣器(有源和无源) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有源的驅動可直接通過GPIO輸出高低電平驅動:

#include "reg52.h" #define uchar unsigned char sbit beep = P2^0; //定義蜂鳴器的引腳void Delay_10us(unsigned int t) {while(t--); }void main() {while(1){//--------------有源-----------------------beep = ~beep; //高低電平切換Delay_10us(50000); //延時約500ms}}

無源需要進行占空比計算輸出周期性電平來對無源蜂鳴器進行驅動
占空比計算時間:占空比=輸出高電平的時間/周期
而占空比通常為小數,如0.21,但是程序中時常會用整數作為占空比參數
來計算輸出高電平的時間,所以通常有輸出高電平時間=占空比周期=占空比程序函數參數/100周期。
所以可以設計這樣的函數:

//輸入參數:頻數frequency,占空比duty 周期=頻數*每次延時時間 void Pwm(unsigned char frequency, unsigned char duty) {unsigned char low = frequency * duty / 100; //低電平延時次數unsigned char high = frequency - low; //高電平延時次數beep = 0; //蜂鳴器IO電平置低Delay_10us(low); //低電平延時時間beep = 1; //蜂鳴器IO電平置高Delay_10us(high);//高電平延時時間}

由于蜂鳴器是低電平觸發,所以電平對應的輸出相反。

完整的程序為:

#include "reg52.h" #define uchar unsigned char sbit beep = P2^0; //定義蜂鳴器的引腳void Delay_10us(unsigned int time) {while(time--); }//輸入參數:頻數frequency,占空比duty 周期=頻數*每次延時時間 void Pwm(unsigned char frequency, unsigned char duty) {unsigned char low = frequency * duty / 100; //低電平延時次數unsigned char high = frequency - low; //高電平延時次數beep = 0; //蜂鳴器IO電平置低Delay_10us(low); //低電平延時時間beep = 1; //蜂鳴器IO電平置高Delay_10us(high);//高電平延時時間 }void main() {while(1){//--------------有源----------------------- // beep = ~beep; //高低電平切換 // Delay_10us(50000); //延時約500ms//--------------無源-----------------------Pwm(2000, 10); //周期100*10us,占空比50%——頻率:1KHz} }

總結

以上是生活随笔為你收集整理的单片机驱动蜂鸣器(有源和无源)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。