无源蜂鸣器c语言编程,无源蜂鸣器鸣叫
输出方波图解
我们现在要给单片机IO端口输出4khz的方波。
现在我们算出方波的周期:1/(4*1000)s=0.00025s=0.25ms
高电平时间:(0.25/2)ms=0.125ms 低电平时间:(0.25/2)ms=0.125ms

2.驱动代码
由于仅编写过最低延时1ms的函数,在本节中使用了一个延时0.125ms的测试用例。本节所使用的单片机IO端口配置为开发板上的P1.6引脚。与LED等有源器件不同的是,无源蜂鸣器的硬件连接相对简单,在实际应用中所使用的代码也相对简洁。安装完成后,在开发板上运行代码后,蜂鸣器一直持续发出声音并带有文字信息:包括必要的调试信息。
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(int i=0; i < 14; i++);//在低电平状态下持续时间为0.125毫秒,在这种情况下如果我们尝试将这两个for语句中的参数从14改为更大的数值,则鸣叫的音调会变得更低沉。
}
}
3.代码书写新知识
我们现在引入新的代码书写知识“BEEP=!BEEP;”。
NOT Beel表示对当前自身值进行取反操作。例如,在尚未执行"Beel = NOT Beel;"的情况下,请注意当前该变量的值。
当执行到“BEEP =!BEEP;”时,“!BEEP”是等于上一次的状态1变为0。
那现在的这条“BEEP =!BEEP;”就跟“BEEP=0;”是一样的了。
下一次再执行“BEEP =!BEEP;”时同理变为了“BEEP=1;”。
所以该语句实现的是来回变换赋给BEEP的值(0或1)。
这样我们就可以把上面的代码中while(1)部分简写为while(1)
{
BEEP=!BEEP;
for(i=0;i<14;i++);//只需改变一次for语句中的14就可以实现不同音调的鸣叫了
}
也可参考第二章第五讲将代码改为" LED2= ! LED2 "同样可实现LED灯的闪烁效果。
4.单片机IO端口初始电平
当同学们询问时,在程序中未赋值的情况下,这些IO端口最初会被设置为高电平还是低电平?
该款芯片具备总共24个IO端口,在开机状态下均为高电平输出。其中,该芯片的P1、P2、P3三个端口在开机状态下均为高电平输出。然而,在该款芯片中存在一个特殊功能模块:其主控单元中的一个引脚(即 chip’s P0 端口)在未连接任何外部电路的情况下会处于一种不确定状态(可能高可能低)。但因我们在实际应用中对该款芯片的 P0 端口配置了一个上拉电阻器(见《手把手教你学51单片机》中的相关内容),因此,在开发板上的 P0.0 至 P0.7 初始状态也为高电平(建议参考《手把手教你学51单片机》中的相关内容)。
最初启动一盏灯时,在代码中未配置P₀₁、P₀₂等参数内容的情况下,默认状态下相应的指示灯无法显示;只有在程序中将P₀₁设置为低电平时指示灯才会点亮;因此其他指示灯保持关闭的原因是IO端口已默认设置为高电平状态。
在此处,请注意,在程序初始化阶段,所有未被设为低电平的IO端口默认处于高电平输出状态这一规律
