×

51单片机笔记 51单片机学习纪实

51单片机学习纪实:2.3-控制蜂鸣器发出救护车警音_【增强实验2】

一哥 一哥 发表于2021-12-14 20:49:13 浏览2999 评论0

抢沙发发表评论

实验思路:

救护车警音分两段:f1=1000Hz,持续1s;f2=800Hz,持续1s。因此需要一个产生1000Hz频率的延时函数和一个产生800Hz频率的延时函数。具体思路如下:

  1. 重定义P0.P管脚为BEEP,并分别重定义系统数据类型unsigned char为U8;unsigned int为U16。

  2. 定义一个基准延时函数delay_10us,用于频率控制函数。

  3. 定义一个产生1000Hz频率声音的延时函数delay_500us和一个产生800Hz频率的延时函数delay_625us。

  4. 大循环开始前定义一个无符号字符型变量“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;  //关闭蜂鸣器
    }
}


少长咸集

群贤毕至

访客