欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#51单片机# 中断与蜂鸣器的应用

程序员文章站 2022-03-13 17:18:41
...
蜂鸣器常作为提示音,用于计算机、打印机、万用表等设备中。提示音一般很简单,能响就行。

某单片机的蜂鸣器原理图:
#51单片机# 中断与蜂鸣器的应用
该单片机的CPU原理图:
#51单片机# 中断与蜂鸣器的应用
下面这段程序用到了中断的算法,实现了蜂鸣器在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;//反转蜂鸣器控制电平
}
相关标签: 单片机