- 单片机C语言程序设计实训100例
- 彭伟编著
- 458字
- 2025-02-19 23:22:38
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); } } }