1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
sbit BUZZ = P2^3; //蜂鸣器控制引脚
int i=0;
unsigned char T0RH = 0;	   //T0重载值高字节
unsigned char T0RL = 0;	   //T0重载值低字节
sbit k2=P2^7;
//延迟函数
void delay_ms(unsigned int m)
{
int  a, b;

for(a=0;a<5000;a++)
for(b=0;b<m;b++);

}
		 
/* 蜂鸣器启动函数,frequ-工作频率 */
void OpenBuzz(unsigned int frequ)
{
	unsigned int reload; //计算所需的定时器重载值
 
	reload = 65536 - (11059200/12)/(frequ*2); //由给定频率计算定时器重载值
	T0RH = (unsigned char)(reload >> 8); //16 位重载值分解为高低两个字节
	T0RL = (unsigned char)reload;
	TH0 = 0xFF; //设定一个接近溢出的初值,以使定时器马上投入工作
	TL0 = 0xFE;
	ET0 = 1; //使能 T0 中断
	TR0 = 1; //启动 T0
}

/* 蜂鸣器停止函数 */
void StopBuzz()
{
	ET0 = 0; //禁用 T0 中断
	TR0 = 0; //停止 T0
}

/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
	TH0 = T0RH; //重新加载重载值
	TL0 = T0RL;
	BUZZ = ~BUZZ; //反转蜂鸣器控制电平
}

调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void main()
{
	//BEEP
	GPIO_Init.Pin  = GPIO_Pin_7;
	GPIO_Init.Mode = GPIO_OUT_PP;
	GPIO_Inilize(GPIO_P4,&GPIO_Init);
	
	TMOD = 0x01; //配置 T0 工作在模式 1,但先不启动
	EA = 1; //使能全局中断
	while(1)
	{
		//延时
		delay_us(100);	  
		OpenBuzz(4000); //以 4KHz 的频率启动蜂鸣器
		for (i=0; i<40000; i++);
		StopBuzz(); //停止蜂鸣器
		for (i=0; i<40000; i++);
		OpenBuzz(1000); //以 1KHz 的频率启动蜂鸣器
		for (i=0; i<40000; i++);
		StopBuzz(); //停止蜂鸣器
		for (i=0; i<40000; i++);	
		
	}
}