- 單片機C語言程序設計實訓100例
- 彭偉編著
- 458字
- 2018-12-27 05:12:07
3.21 開關控制報警器
本例運行時,將開關接低電平會使系統發出報警聲音。
本例電路如圖3-18所示。

圖3-18 開關控制報警器電路
程序設計調試與實訓:
本例代碼編寫的關鍵在于Alarm函數的設計,函數中SPK = ~SPK語句向P1.0引腳持續輸出1010101010這樣的序列,形成的脈沖使SOUNDER發出聲音,如果SPK = ~SPK語句的執行間隔相等,系統會發出單調的聲音,不會模擬出報警效果。
在本例Alarm函數的雙重for循環中,內層的for循環使用了參數t,不同的t值使SPK = ~SPK具有可變的延時間隔,因此形成了可變頻率,從而模擬出報警聲音的效果。本例中的Alarm(90)和Alarm(120)使SOUNDER循環發出兩種不同頻率的聲音,模擬出很逼真的報警器效果。
讀者可嘗試修改參數90與120,看能夠聽到什么樣的聲音效果,另外,還可以使用虛擬示波器,觀察P1.0的輸出波形。
源程序代碼:
//----------------------------------------------------------------- // 名稱: 開關控制報警器 //----------------------------------------------------------------- // 說明: 用K1開關控制報警器,程序控制P1.0輸出兩種不同頻率的聲音, // 模擬很逼真的報警效果。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit SPK = P1^0; sbit K1 = P1^7; //----------------------------------------------------------------- // 發聲子程序 //----------------------------------------------------------------- void Alarm(uchar t) { uchar i,j; for(i = 0;i < 200;i++) { SPK = ~SPK; //由參數t形成不同的頻率 for ( j = 0 ;j < t; j++ ); } } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { while(1) { if(K1 == 1) { Alarm(90); Alarm(120); } } }
推薦閱讀
- Go Web編程
- Java 9 Concurrency Cookbook(Second Edition)
- JavaFX Essentials
- Mastering AndEngine Game Development
- PostgreSQL Replication(Second Edition)
- Flux Architecture
- C程序設計實踐教程
- 從零開始學C語言
- Domain-Driven Design in PHP
- 鴻蒙OS應用編程實戰
- 測試架構師修煉之道:從測試工程師到測試架構師
- ASP.NET 4.0 Web程序設計
- 數據分析與挖掘算法:Python實戰
- Clojure Polymorphism
- UML基礎與Rose建模實用教程(第三版)