OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14434|回复: 10

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

[复制链接]

16

主题

53

帖子

0

精华

初级会员

Rank: 2

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

最佳答案

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

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

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

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

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

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

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

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

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

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

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

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

新唐,N76E003,谢谢
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
904
金钱
904
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-23 20:17:07 | 显示全部楼层
N76E003_Block_Diagram.png_1088171299.png
它是具备16位计数的timer0和timer1的。
我就按你是有源蜂鸣器来说,那么只需要timer0开一个10ms左右的定时器中断。下方是顺手写的一个思路。可以在这个的基础上完善一下。
[mw_shl_code=c,true]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();//这是一个用于关掉定时器的函数
        }[/mw_shl_code]

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

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

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

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

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 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执行调用

蜂鸣器模块代码

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

使用道具 举报

16

主题

53

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

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

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

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

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 11:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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