#51单片机# 中断与蜂鸣器的应用
程序员文章站
2022-03-13 17:18:41
...
蜂鸣器常作为提示音,用于计算机、打印机、万用表等设备中。提示音一般很简单,能响就行。
某单片机的蜂鸣器原理图:
该单片机的CPU原理图:
下面这段程序用到了中断的算法,实现了蜂鸣器在4kHz和1kHz频率下的发声。
#include <reg52.h>
sbit Buzz = P0^7;//蜂鸣器控制引脚
unsigned char T0RH = 0;//T0重载值的高字节
unsigned char T0RL = 0;//T0重载值的低字节
void StartBuzz(unsigned int frequ);
void StopBuzz();
void main()
{
unsigned int i;
TMOD = 0X01;//设置定时器模式
EA = 1;//中断使能总开关
while(1)
{
StartBuzz(4000);//以4kHz启动蜂鸣器
for(i=0;i<40000;i++);
StopBuzz(); //关闭蜂鸣器
for(i=0;i<40000;i++);
StartBuzz(1000);//以1kHz启动蜂鸣器
for(i=0;i<40000;i++);
StopBuzz(); //关闭蜂鸣器
for(i=0;i<40000;i++);
}
Buzz = 0;
}
//启动蜂鸣器,frequ指蜂鸣器工作频率
void StartBuzz(unsigned int frequ)
{
unsigned int reload;//计算所需的定时器重载值
reload = 65536- (11059200/12)/(frequ*2);//根据传入的形参frequ,计算定时器重载值
T0RH =(unsigned char)(reload>>8); //将16位的reload分成2个8位的数值,分别存入T0重载值的高位和低位
T0RL = (unsigned char)reload;
TH0 = 0XFF;
TL0 = 0XFE;
ET0 = 1;//使能T0中断
TR0 = 1;//启动T0
}
//关闭蜂鸣器
void StopBuzz()
{
ET0 = 0; //禁用T0中断
TR0 = 0; //关闭T0
}
//中断服务函数,用于控制蜂鸣器发声
void InterrupteTimer0() interrupt 1
{
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
Buzz = ~Buzz;//反转蜂鸣器控制电平
}
下一篇: AT89C51单片机之点亮LED