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);
            }
          }
        }