1.先来看一下蜂鸣器的原理图和使用延时函数进行发音
我们可以知道,只有当IN5输出电压的时候,才能促进OUT5的电压,IN5到OUT5是取反的过程的,只有当BZ为低电平的时候,才能让蜂鸣器点响。
但是要记住蜂鸣器一定要有频率进行震动,要不然长期处于高电平会烧毁蜂鸣器所以要不断对蜂鸣器的输入电平进行转化,这样子才可以稳定发音
基本用法:
//蜂鸣器端口:
sbit Buzzer=P1^5;
void Buzzer_Time(unsigned int ms)
{
unsigned int i;
for(i=0;i<1000;i++)
{
Buzzer=!Buzzer; //在这里表示产生一定周期频率
Buzzer_Delay500us(); //在这里表示一定的延时函数,产生一个周期稳定蜂鸣器的发音
}
}
2.使用中断函数进行发音
可以使用一个中断函数进行发音,一旦发生中断就会触发定时器
单独定义一个中断函数
Timer0.c
#include <REGX52.H>
/**
* @brief 定时器0初始化,1毫秒@12.000MHz
* @param 无
* @retval 无
*/
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值 第一次开始的时候是从这个值开始出发
直到溢出的,但是到了后面是要根据中断函数当中定义的值进行重新计时了
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__
void Timer0Init(void);
#endif
在主函数当中调用定时器,并定义中断时发生的函数
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
//蜂鸣器端口定义
sbit Buzzer=P1^5;
void main()
{
Timer0Init();
while(1){
}
}
void Timer0_Routine() interrupt 1
{
if(FreqTable[FreqSelect]) //如果不是休止符
{
/*取对应频率值的重装载值到定时器*/
TL0=0x18; //设置定时初值
TH0=0xFC; //设置定时初值
Buzzer=!Buzzer; //翻转蜂鸣器IO口
}
}