#51单片机# 用中断实现蜂鸣器

蜂鸣器常作为提示音,用于计算机、打印机、万用表等设备中。提示音一般很简单,能响就行。

某单片机的蜂鸣器原理图:
一张蜂鸣器原理图
该单片机的CPU原理图:
与之配套的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;//反转蜂鸣器控制电平
}
  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值