×

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

51单片机学习纪实:2.1-控制蜂鸣器发声后停止_【基础实验1】

一哥 一哥 发表于2021-12-09 21:36:42 浏览1146 评论0

抢沙发发表评论

实验思路:

蜂鸣器是一体化结构的电子讯响器,采用直流电源供电。根据驱动方式分为“有源蜂鸣器”和“无源蜂鸣器”。“有源蜂鸣器”内部自带振荡源,只需要接通电源即可发声,而“无源蜂鸣器”内部没有振荡源,需要一定频率的脉冲信号,才能驱动它发出声音。本次实验使用的为“无源蜂鸣器”,因为些需要产生一定的脉冲频率,方可使其发声。实验思路如下:

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值基础上进行取反。这样不断取反,且每一次取反后都延迟一定的时间,就可以形成一定频率的脉冲信号,使蜂鸣器发出声音。

少长咸集

群贤毕至

访客