单片机
返回首页

51单片机-无源蜂鸣器鸣叫

2021-08-17 来源:eefocus

1.输出方波图解

我们现在要给单片机IO端口输出4khz的方波。


现在我们算出方波的周期:1/(4*1000)s=0.00025s=0.25ms

高电平时间:(0.25/2)ms=0.125ms      低电平时间:(0.25/2)ms=0.125ms

8.png


2.驱动代码

因为我们只写过最低延时1ms的函数,所以这里测试用“for(i=0;i<14;i++);”作为延时0.125ms,本节的单片机IO端口为开发板中的P1.6,无源蜂鸣器的硬件连接因为不像LED那样都接了很多其他器件来初始化,所以本节的代码就显得相当简短,下载进开发板蜂鸣器就一直鸣叫了

1
2
3
4
5
6
7
8
9
10
11
12
13
#include  
sbit BEEP = P1^6;
void main()
{  
    unsigned int i; 
    while(1)
    {
        BEEP=1;
        for(i=0;i<14;i++);//延时接近0.125ms,给P1.6保持了0.125ms高电平时间
        BEEP=0;
        for(i=0;i<14;i++);//低电平时间保持了0.125ms, 我们可以尝试把两个for语句里的14改大一点就会发现鸣叫的音调变得低沉一些了
    } 
}


3.代码书写新知识

我们现在引入新的代码书写知识“BEEP=!BEEP;”。

“!BEEP”是把此时自身的值非一下,比如当还没执行“BEEP =!BEEP;”语句时,假设此时的BEEP是等于1的。


当执行到“BEEP =!BEEP;”时,“!BEEP”是等于上一次的状态1变为0。

那现在的这条“BEEP =!BEEP;”就跟“BEEP=0;”是一样的了。

下一次再执行“BEEP =!BEEP;”时同理变为了“BEEP=1;”。

所以该语句实现的是来回变换赋给BEEP的值(0或1)。

这样我们就可以把上面的代码中while(1)部分简写为

1
2
3
4
5
 while(1)
 {
     BEEP=!BEEP;
     for(i=0;i<14;i++);//只需改变一次for语句中的14就可以实现不同音调的鸣叫了
 }

大家也可以回到第二章的第五讲改写为“LED2=!LED2”同样也可以实现LED闪烁的。

 

4.单片机IO端口初始电平

有同学会问,单片机的其他IO端口在程序里没有给0或1时,它们初始时是输出高电平还是低电平呢?


STC89C52RC这款芯片的P1,P2,P3这一共24个IO端口由于内部硬件的原因上电的时候都是输出高电平的,而P0一开始是一种不确定的状态(有时是高有时是低),但我们用的开发板已经把P0端口接了上拉电阻,所以开发板的P0.0~P0.7初始时也是输出高电平的(可参考《手把手教你学51单片机》文档2.4.1节的复位值和9.1节、9.2节的上下拉电阻了解一下,了解不了可暂时放一下,继续往下学)。


这也就解释了,当初点亮一盏灯的时候,代码没有写过P0.1,P0.2···这些内容,对应的这些灯都没有亮,只有在程序中写让P0.1输出0时灯才亮,所以其他灯不亮是因为IO端口已经默认输出了高电平。


这里我们先记住:所有的IO端口在程序初始时没有给0则全都是输出高电平这样的概念先。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章