实验思路:
救护车警音分两段:f1=1000Hz,持续1s;f2=800Hz,持续1s。因此需要一个产生1000Hz频率的延时函数和一个产生800Hz频率的延时函数。具体思路如下:
重定义P0.P管脚为BEEP,并分别重定义系统数据类型unsigned char为U8;unsigned int为U16。
定义一个基准延时函数delay_10us,用于频率控制函数。
定义一个产生1000Hz频率声音的延时函数delay_500us和一个产生800Hz频率的延时函数delay_625us。
大循环开始前定义一个无符号字符型变量“i”,用于控制发声次数。定义一个无符号整型变量“y”,用于控制频率脉冲发声时间。
完整代码:
/*****************************程序信息********************************* * 实验名称:控制蜂鸣器发出救护车警音 * 文件名称:main.c * 版 本:V1.00 * 日 期:2021-12-14 * 编 著:gefon * 说 明:使用普中A7开发版,控制蜂鸣器发声救护车警音。救护车发声频率分 两段:f1=1000Hz,持续1s f2=800Hz,持续1s *******************************声明区*********************************/ #include "reg52.h" sbit BEEP=P0^0; //对P0.0管脚重定义 typedef unsigned int U16; //对系统数据类型重定义 typedef unsigned char U8; /*******************************子程序********************************* * 函 数 名 :delay_10us * 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us * 输 入 :ten_us * 输 出 :无 ***********************************************************************/ void delay_10us(U8 ten_us) { while(ten_us--); } /*******************************子程序********************************* * 函 数 名 :delay_500us * 函数功能 :延时函数,约延时500us。用于1000Hz频率脉冲信号 * 输 入 :无 * 输 出 :无 ***********************************************************************/ void delay_500us() { delay_10us(50); //延时约500us,产生1000Hz频率脉冲信号 } /*******************************子程序********************************* * 函 数 名 :delay_625us * 函数功能 :延时函数,延时约625us。用于800Hz频率脉冲信号 * 输 入 :无 * 输 出 :无 ***********************************************************************/ void delay_625us() { delay_10us(62); //延时约625us,产生800Hz频率脉冲信号 } /*******************************主程序********************************* * 函 数 名 :main * 函数功能 :主函数 * 输 入 :无 * 输 出 :无 ***********************************************************************/ void main() { U8 i=11; //控制蜂鸣器发出警音次数 U16 y; while(1) { for(;i>0;i--) //初值调用变量i的初始赋值 { for(y=0;y<2000;y++) //1000Hz频率,持续1秒 { BEEP=0; delay_500us(); BEEP=1; delay_500us(); } for(y=0;y<1600;y++) //800Hz频率,持续1秒 { BEEP=0; delay_625us(); BEEP=1; delay_625us(); } } i=0; //清零 BEEP=0; //关闭蜂鸣器 } }
实验分析:
以上程序使用for循环嵌套完成警音发声,也可以用while循环嵌套来实现蜂鸣器发声。while循环嵌套主程序代码如下:
void main() { U8 i=11; //控制蜂鸣器发出警音次数 U16 y; while(1) { /********使用while循环嵌套实现蜂鸣器发出警音方案********/ while(i--) { y=2000; while(y--) //1000Hz频率,持续1秒 { BEEP=0; delay_500us(); BEEP=1; delay_500us(); } y=1600; while(y--) //800Hz频率,持续1秒 { BEEP=0; delay_625us(); BEEP=1; delay_625us(); } } /********使用while循环嵌套实现蜂鸣器发出警音方案********/ i=0; //清零 BEEP=0; //关闭蜂鸣器 } }