实验思路:
救护车警音分两段: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; //关闭蜂鸣器
}
}