OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1918|回复: 10

请问用定时器控制蜂鸣器发出“滴滴“声应该怎么做最好

[复制链接]

  离线 

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-10-3
在线时间
21 小时
发表于 2018-1-23 16:12:56 | 显示全部楼层 |阅读模式
5金钱

最佳答案

查看完整内容[请看2#楼]

如果是传统51单片机,自然只能按最常规的思路来。定时器中断,中断服务程序,给蜂鸣器引脚取反。完毕。 当然,如果是STM32这样的东西,可以直接把IO口与定时器绑定,用定时器产生响、不响、响、不响的方波。 以上针对有源蜂鸣器而言。 无源蜂鸣器可以用timer0产生鸣响的方波,用timer1控制响、不响、响、不响。
回复

使用道具 举报

  离线 

5

主题

427

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2017-12-15
在线时间
90 小时
发表于 2018-1-23 16:12:57 | 显示全部楼层
本帖最后由 a496298685 于 2018-1-23 16:19 编辑

如果是传统51单片机,自然只能按最常规的思路来。定时器中断,中断服务程序,给蜂鸣器引脚取反。完毕。
当然,如果是STM32这样的东西,可以直接把IO口与定时器绑定,用定时器产生响、不响、响、不响的方波。

以上针对有源蜂鸣器而言。

无源蜂鸣器可以用timer0产生鸣响的方波,用timer1控制响、不响、响、不响。
回复

使用道具 举报

  离线 

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-10-3
在线时间
21 小时
 楼主| 发表于 2018-1-23 17:58:06 | 显示全部楼层
a496298685 发表于 2018-1-23 16:16
如果是传统51单片机,自然只能按最常规的思路来。定时器中断,中断服务程序,给蜂鸣器引脚取反。完毕。
当 ...

那如果同一个项目中,我要让蜂鸣器可以嘀一声长音,嘀嘀两声,嘀嘀嘀三声,大概框架要怎么写?
回复

使用道具 举报

  离线 

5

主题

427

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2017-12-15
在线时间
90 小时
发表于 2018-1-23 18:17:04 | 显示全部楼层
ryanwong 发表于 2018-1-23 17:58
那如果同一个项目中,我要让蜂鸣器可以嘀一声长音,嘀嘀两声,嘀嘀嘀三声,大概框架要怎么写?

你还没说你用的是什么单片机呢。我现在不知道你的系统资源是什么样的。
回复

使用道具 举报

  离线 

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-10-3
在线时间
21 小时
 楼主| 发表于 2018-1-23 19:13:19 | 显示全部楼层
正点原子公众号
a496298685 发表于 2018-1-23 18:17
你还没说你用的是什么单片机呢。我现在不知道你的系统资源是什么样的。

新唐,N76E003,谢谢
回复

使用道具 举报

  离线 

5

主题

427

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2017-12-15
在线时间
90 小时
发表于 2018-1-23 20:17:07 | 显示全部楼层
N76E003_Block_Diagram.png_1088171299.png
它是具备16位计数的timer0和timer1的。
我就按你是有源蜂鸣器来说,那么只需要timer0开一个10ms左右的定时器中断。下方是顺手写的一个思路。可以在这个的基础上完善一下。
[C] 纯文本查看 复制代码
uint8_t Beep_times=1;//鸣响次数
#define TermValue 150 //总共鸣响时间恒定为1.5s(10ms*150=1.5s)
void Timer0_ISR(void) interrupt 1 //10ms定时器中断
{
	static uint8_t Current_Beep_times=0;//用于检测鸣响设定是否更新
	static uint8_t Steps=0;//每进入Steps次中断,蜂鸣器电平更改一次
	static uint8_t CountBack_0=0;
	static uint8_t CountBack_1=0;
	if(Current_Beep_times!=Beep_times)//鸣响设定更新
	{
		Buzzer_Pin=Buzzer_OFF;//确保蜂鸣器不会意外常响
		
		Current_Beep_times=Current_Beep_times;//更新鸣响次数
		Steps=TermValue/(2*Current_Beep_times);
		CountBack_0=Steps;//定时中断计数
		CountBack_1=2*Current_Beep_times;//切换次数计数
		if(Current_Beep_times==1)
		{
			Steps=TermValue;
			CountBack_1=Current_Beep_times;
		}
	}
	if(CountBack_1)
	{
		if(!CountBack_0--)
		{
			Buzzer_Pin=~Buzzer_Pin;//蜂鸣器电平取反
			CountBack_1--;//切换次数计数自减
			CountBack_0=Steps;//定时中断计数复位
		}
		if(!CountBack_1)
		{
			Buzzer_Pin=Buzzer_OFF;//确保蜂鸣器不会意外常响
			Timer0_SwitchOFF();//这是一个用于关掉定时器的函数
	}


这是示意图。
TIM截图20180123201637.png
回复

使用道具 举报

  离线 

0

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-11-14
在线时间
3 小时
发表于 2018-1-24 08:33:08 | 显示全部楼层
所有的蜂鸣器都可以直接用单片机的定时器的pwm输出功能控制,有些单片机还自带buzz就是蜂鸣器驱动,只要设置频率就行了。

有源内置震荡电路,你加个电压就会响,无源的没有震荡电路,需要给指定频率的方波,现在基本都用无源的,2根IO口能让蜂鸣器发出动听的和旋音,网上随便搜就有电路和程序
回复

使用道具 举报

  离线 

14

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2337
金钱
2337
注册时间
2013-6-27
在线时间
309 小时
发表于 2018-1-24 08:36:34 | 显示全部楼层
本帖最后由 DongInker 于 2018-1-24 08:41 编辑

分享我的蜂鸣器设计代码长叫:SetBeep(1,0,1)
单次:SetBeep(1,5,0) --可以用于按键交互
多次:SetBeep(5,20,30)
连续:SetBeep(0xff,20,30)
根据自己的感觉设置声音的开关时间,去表示相应的事件声音。

定时器10mS执行调用

定时器10mS执行调用

蜂鸣器模块代码

蜂鸣器模块代码
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

  离线 

11

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-10-3
在线时间
21 小时
 楼主| 发表于 2018-1-24 09:52:40 | 显示全部楼层
a496298685 发表于 2018-1-23 20:17
它是具备16位计数的timer0和timer1的。
我就按你是有源蜂鸣器来说,那么只需要timer0开一个10ms左右的定 ...

谢谢你的解答,不好意思我忘了说,我用的是无源的。你之前提到的思路,我觉得可以,但是好像处理起来不方便啊
回复

使用道具 举报

  离线 

5

主题

427

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2017-12-15
在线时间
90 小时
发表于 2018-1-24 13:52:12 | 显示全部楼层
ryanwong 发表于 2018-1-24 09:52
谢谢你的解答,不好意思我忘了说,我用的是无源的。你之前提到的思路,我觉得可以,但是好像处理起来不方 ...

无源的话也可以很简单地稍作改动。
用Timer1产生方波,用Timer0控制Timer1工作与否。具体操作是完全相同的。

我的实现可能麻烦了一些,但是可以确保音效,每一次响声总用时都是相同的。
回复

使用道具 举报

  离线 

0

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
566
金钱
566
注册时间
2018-2-7
在线时间
60 小时
发表于 2018-2-7 16:28:08 | 显示全部楼层
如果偶尔调用一次蜂鸣器可以用延时做,蜂鸣器响,延时,蜂鸣器关。 封装成一个函数,需要的时候调用一下就行了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-5-24 04:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */