单片机中改变蜂鸣器的发声频率是什么原理

利用编程来改变蜂鸣器的发声频率是什么原理,最好能附一小段代码解释,谢谢

你说的应该是无源蜂鸣器,需要外部提供脉冲信号才会发声,且声音会随脉冲频率变化而变化。而有源蜂鸣器内部有振荡器,所以只需要提供电压(高电平)就能发声,它们的原理不同,你提到的应该是前者。
举例说明吧,你定义 一个IO连接蜂鸣器。比如,sbit fmq=P1^0; 再来个500US延时函数。
void beep() //所以会产生1KHZ频率声音
{
fmq=0;
delay500us();
fmq=1;
delay500us();

}追问

为什么500us的延时函数就可以产生1kHz的频率呢,那如果要产生2kHz,5kHz呢

追答

500us高电平,500us低电平,那周期不正好是1MS嘛,所以频率就是1K HZ啊。 如果是其它频率你可以换个延时函数啊,给你个 MS 延时函数,

void delayms(unsigned int i)
{
unsigned char j;
while(i--)
{
for(j=0;j<115;j++); //1ms基准延时程序
}
}
你只需要在 delayms函数中,修改参数即可。
比如, delayms(100)就是100MS,
delayms(1000) 就是1S。

追问

那中间需不需要反相什么的呢,比如P1^0=~P1^0,这个又是干嘛用的呢

追答

这就是取反,P1^0=~P1^0 ,延时。就相当于
fmq=0;
延时;
fmq=1;
延时);
它们是相同的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-21
ORG 0000H
AJMP LOOP
ORG 0030H
LOOP:
CPL P1.0
LCALL DELAY
AJMP LOOP
DELAY:
MOV R5,#20
DE1: MOV R6,#100
DE2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DE2
DJNZ R5,DE1
RET
END
这个汇编做的程序。 你把蜂鸣器的正级接5V,负极接在单片机P1.0口。 电路工作后,蜂鸣器将滴滴叫。 你改变R5,R6,R7 的值将改变滴滴的快慢。也就是 改变了频率。本回答被网友采纳
第2个回答  2014-07-21
用好计数\定时器,在一定时间内对某P口给一个高电平,在等同时间内给一个低电平,一直循环下去,接上蜂鸣器,就可以发声。也可以用延时程序实现:*********************
TEST: SETB P0.0 ;
LCALL DELAY ;延时
CLR P0.0
; LCALL DELAY ;延时
AJMP TEST
DELAY: MOV R7,#XXH
DJNZ R7 ,$
RST
第3个回答  2014-07-21
改变蜂鸣器工作和不工作的延时时间