实验思路:
蜂鸣器是一体化结构的电子讯响器,采用直流电源供电。根据驱动方式分为“有源蜂鸣器”和“无源蜂鸣器”。“有源蜂鸣器”内部自带振荡源,只需要接通电源即可发声,而“无源蜂鸣器”内部没有振荡源,需要一定频率的脉冲信号,才能驱动它发出声音。本次实验使用的为“无源蜂鸣器”,因为些需要产生一定的脉冲频率,方可使其发声。实验思路如下:
1、重定义P0.0管脚为BEEP,重定义系统数据类型
#include "reg52.h" sbit BEEP=P0^0; //对P0.0管脚重定义 typedef unsigned int U16; //对系统数据类型重定义
2、定义一个延时函数delay_10us,用于产生脉冲信号
void delay_10us(U16 ten_us) { while(ten_us--); }
3、主程序大循环开始前,定义一个无符号整型变量“i”。用于循环一定时间后停止。
4、循环中,不断取反蜂鸣器,即可发出一定频率的脉冲信号。
完整代码:
/*****************************程序信息********************************* * 实验名称:控制蜂鸣器发声后停止 * 文件名称:main.c * 版 本:V1.00 * 日 期:2021-12-09 * 编 著:gefon * 说 明:使用普中A7开发版,控制蜂鸣器发声一段时间后停止发声 *******************************声明区*********************************/ #include "reg52.h" sbit BEEP=P0^0; //对P0.0管脚重定义 typedef unsigned int U16; //对系统数据类型重定义 /*******************************子程序********************************* * 函 数 名 :delay_10us * 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us * 输 入 :ten_us * 输 出 :无 ***********************************************************************/ void delay_10us(U16 ten_us) { while(ten_us--); } /*******************************主程序********************************* * 函 数 名 :main * 函数功能 :主函数 * 输 入 :无 * 输 出 :无 ***********************************************************************/ void main() { U16 i=4000; while(1) { while(i--) { BEEP=!BEEP; //产生一定频率的脉冲信号 delay_10us(10); //延时约1ms(11.0592MHz) /*下方代码为另一种实现方案,调整高低电平的延时时间,可调整蜂鸣器音量。 调整上方代码的延时时间为调整蜂鸣器音调(即改变发声周期)*/ // BEEP=0; // delay_10us(30); // BEEP=1; // delay_10us(30); } i=0; //清零 BEEP=0; //关闭蜂鸣器 } }
实验分析:
在给BEEP取反中,当上一循环BEEP值为“0”,当前循环就会在上一循环BEEP值“0”基础上进行取反,下一循环会又在当前循环的BEEP值基础上进行取反。这样不断取反,且每一次取反后都延迟一定的时间,就可以形成一定频率的脉冲信号,使蜂鸣器发出声音。