主頁 > 作業系統 > 單片機蜂鳴器的控制程式與驅動電路圖

單片機蜂鳴器的控制程式與驅動電路圖

2020-09-13 05:36:52 作業系統

蜂鳴器從結構區分分為壓電式蜂鳴器和電磁式蜂鳴器,壓電式為壓電陶瓷片發音,電流比較小一些,電磁式蜂鳴器為線圈通電震動發音,體積比較小,按照驅動方式分為有源蜂鳴器和無源蜂鳴器,這里的有源和無源不是指電源,而是振蕩源,有源蜂鳴器內部帶了振蕩源,如圖1中所示,給了 BUZZ 引腳一個低電平,蜂鳴器就會直接響,而無源蜂鳴器內部是不帶振蕩源的,要讓他響必須給 500Hz~4.5KHz 之間的脈沖頻率信號來驅動它才會響,有源蜂鳴器往往比無源蜂鳴器貴一些,因為里邊多了振蕩電路,驅動發音也簡單,靠電平就可以驅動,而無源蜂鳴器價格比較便宜,此外無源蜂鳴器聲音頻率可以控制,而音階與頻率又有確定的對應關系,因此就可以做出來“do re mi fa sol la si”的效果,可以用它制作出簡單的音樂曲目,比如生日歌、兩只老虎等等,

 b1b9d54851b0dad7c14df00cd97e0de7.jpg 

來看一下圖1的電路,蜂鳴器電流依然相對較大,因此需要用三極管驅動,并且加了一個 100 歐的電阻作為限流電阻,此外還加了一個 D4 二極管,這個二極管叫做續流二極管,我們的蜂鳴器是感性器件,當三極管導通給蜂鳴器供電時,就會有導通電流流過蜂鳴器,而我們知道,電感的一個特點就是電流不能突變,導通時電流是逐漸加大的,這點沒有問題,但當關斷時,經“電源-三極管-蜂鳴器-地”這潭訓路就截斷了,過不了任何電流了,那么儲存的電流往哪兒去呢,就是經過這個 D4 和蜂鳴器自身的環路來消耗掉了,從而就避免了關斷時由于電感電流造成的反向沖擊,接續關斷時的電流,這就是續流二極管名稱的由來,蜂鳴器經常用于電腦、列印機、萬用表這些設備上做提示音,提示音一般也很簡單,就是簡單發出個聲音就行,我們用程式簡單做了個 4KHZ 頻率下的發聲和 1KHZ 頻率下的發聲程式,同學們可以自己研究下程式,比較下實際效果,

#<reg52.h>

sbit BUZZ = P1^6; //蜂引腳

unsigned char T0RH = 0; //T0 多載值的高位元組

unsigned char T0RL = 0; //T0 多載值的低位元組

OpenBuzz(unsigned int fr);

void StopBuzz();

void main(){

unsigned int i;

TMOD = 0x01; //配置 T0 作業在模式 1,但先不啟動

EA = 1;

(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<40000; i++);

}

}

/* 蜂鳴器啟動函式,frequ-作業頻率 */

void OpenBuzz(unsigned int frequ){

unsigned int reload;//計算所需的多載值

reload = 65536 - (11059200/12)/(frequ*2); //由給定算定時器多載值

T0RH = (unsigned char)(reload >> 8); //16 位多載值分解為高低兩個位元組

T0RL = (unsigned char)reload;

TH0 = 0xFF; //設定一個接近溢位的初值,以使定時器馬上投入作業

TL0 = 0xFE;

ET0 = 1; //使能 T0 中斷

TR0 = 1; //啟動 T0

}

/* 蜂鳴器停止函式 */

void StopBuzz(){

ET0 = 0; //禁用 T0 中斷

TR0 = 0; //停止 T0

}

/* T0 中斷服務函式,用于控制蜂鳴器發聲 */

void InterruptTimer0() 1{

TH0 = T0RH; //重新加載多載值

TL0 = T0RL;

BUZZ = ~BUZZ; //反轉蜂鳴器控制電平

}

另外用蜂鳴器來輸出音樂,僅僅是好玩而已,應用很少,里邊包含了音階、樂譜的相關內容,程式也有一點復雜,所以就不詳細給大家去講解了,僅提供一個可以播放《兩只老虎》的程式,大家可以下載到板子上玩玩,滿足一下好奇心,

 

#include <reg52.h>

sbit BUZZ = P1^6; //蜂鳴器控制引腳

unsigned int code NoteFrequ[] = { //中音 1-7 和高音 1-7 對應頻率串列

523, 587, 659, 698, 784, 880, 988, //中音 1-7

1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音 1-7

};

unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 對應的定時器多載值

65536 - (11059200/12) / (523*2), //中音 1

65536 - (11059200/12) / (587*2), //2

65536 - (11059200/12) / (659*2), //3

65536 - (11059200/12) / (698*2), //4

65536 - (11059200/12) / (784*2), //5

65536 - (11059200/12) / (880*2), //6

65536 - (11059200/12) / (988*2), //7

65536 - (11059200/12) / (1047*2), //高音 1

65536 - (11059200/12) / (1175*2), //2

65536 - (11059200/12) / (1319*2), //3

65536 - (11059200/12) / (1397*2), //4

65536 - (11059200/12) / (1568*2), //5

65536 - (11059200/12) / (1760*2), //6

65536 - (11059200/12) / (1976*2), //7

};

bit = 1; //蜂鳴器發聲使能標志

bit tmrflag = 0; //完成標志

unsigned char T0RH = 0xFF; //T0 多載值的高位元組

unsigned char T0RL = 0x00; //T0 多載值的低位元組

void PlayTwoTiger();

void main(){

unsigned int i;

EA = 1; //使能全域中斷

TMOD = 0x01; //配置 T0 作業在模式 1

TH0 = T0RH;

TL0 = T0RL;

ET0 = 1; //使能 T0 中斷

TR0 = 1; //啟動 T0

while (1){

PlayTwoTiger(); //播放樂曲--兩支老虎

for (i=0; i<40000; i++); //停止一段時間

}

}

/* 兩支老虎樂曲播放函式 */

void PlayTwoTiger(){

unsigned char beat; //當前節拍索引

unsigned char note; //當前節拍對應的音符

unsigned int e = 0; //當前節拍計時

unsigned int beatTime = 0; //當前節拍總時間

unsigned int soundTime = 0; //當前節拍需發聲時間

//兩只老虎音符表

unsigned char code TwoTigerNote[] = {

1, 2, 3, 1, 1, 2, 3, 1, 3, 4, 5, 3, 4, 5,

5,6, 5,4, 3, 1, 5,6, 5,4, 3, 1, 1, 5, 1, 1, 5, 1,

};

//兩只老虎節拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍

unsigned char code TwoTigerBeat[] = {

4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 4, 8,

3,1, 3,1, 4, 4, 3,1, 3,1, 4, 4, 4, 4, 8, 4, 4, 8,

};

//用節拍索引作為回圈變數

for (beat=0; beat<sizeof(TwoTigerNote); ){

while (!tmrflag); //每次定時器中斷完成后,檢測并處理節拍

tmrflag = 0;

if (time == 0){ //當前節拍播完則啟動一個新節拍

note = TwoTigerNote[beat] - 1;

T0RH = NoteReload[note] >> 8;

T0RL = NoteReload[note];

//計算節拍總時間,右移 2 位相當于除 4,移位代替除法可以加快執行速度

beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;

//計算發聲時間,為總時間的 0.75,移位原理同上

soundTime = beatTime - (beatTime >> 2);

enable = 1; //指示蜂鳴器開始發聲

time++;

}e{ //當前節拍未播完則處理當前節拍

//當前持續時間到達節拍總時間時歸零,

//并遞增節拍索引,以準備啟動新節拍

if (time >= beatTime){

time = 0;

beat++;

}else{ //當前持續時間未達到總時間時,

time++; //累加時間計數

//到達發聲時間后,指示關閉蜂鳴器,

//插入 0.25*總時間的靜音間隔,

if (time == soundTime){

enable = 0; //用以區分連續的兩個節拍

}

}

}

}

}

/* T0 中斷服務函式,用于控制蜂鳴器發聲 */

void InterruptTimer0() interrupt 1{

TH0 = T0RH; //重新加載多載值

TL0 = T0RL;

tmrflag = 1;

if (enable){ //使能時反轉蜂鳴器控制電平

BUZZ = ~BUZZ;

}else{ //未使能時關閉蜂鳴器

BUZZ = 1;

}

}

本文轉自小平頭電子技術社區:https://www.xiaopingtou.cn/q-134697.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/20656.html

標籤:嵌入式

上一篇:初級模擬電路:4-3 BJT晶體管的交流建模

下一篇:關于C 語言的字串常量拼接

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more