官术网_书友最值得收藏!

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);
            }
          }
        }
主站蜘蛛池模板: 牙克石市| 白河县| 隆化县| 阿鲁科尔沁旗| 定边县| 大名县| 黔南| 临夏县| 正宁县| 临桂县| 岐山县| 汨罗市| 临沧市| 湘乡市| 佳木斯市| 宜兴市| 汽车| 江城| 章丘市| 绥芬河市| 温泉县| 广元市| 阿坝县| 北宁市| 兴和县| 桃江县| 兰坪| 南昌市| 龙州县| 出国| 宁夏| 宜君县| 克山县| 萨迦县| 台湾省| 怀来县| 乌海市| 海门市| 溧水县| 长武县| 炉霍县|