1nnocet- 发表于 2019-7-21 19:55

【ufun学习】学习篇4:《基础例程3 - 蜂鸣器控制》

<div class='showpostmsg'> 本帖最后由 1nnocet- 于 2019-7-22 10:23 编辑

<p><br />
<br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">1nnocet-</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b><br />
《基础例程3 - 蜂鸣器控制》</p>

<p>有学过单片机的相信一定对蜂鸣器有较深的印象,蜂鸣器分为有源蜂鸣器和无源蜂鸣器,这两种蜂鸣器有什么 本质区别呢?其中有源蜂鸣器内部有振荡器,只要外部给电源便能发声;无源蜂鸣器内部没有振荡器,所以提供电源不足以使其发声。下面我们就来验证一下学习板上的蜂鸣器是有源还是无源的蜂鸣器。</p>

<p>我们验证使用的是《基础例程3 - 蜂鸣器控制》改编的代码,除了while(1)里面的代码内容,其余都是跟例程一样的。</p>

<p>首先我们先给对应的GPIO高电平(即PA8),</p>

<p>烧写程序后运行,蜂鸣器没有发声,因此可以大致断定该蜂鸣器为无源蜂鸣器。</p>

<p></p>

<p></p>

<pre>
<code>#include "stm32f10x.h"
#include "stdio.h"
#include "main.h"
#include "stdlib.h"
#include "BEEP.h"
#include "TOUCH_KEY.h"
#include "DELAY.h"

int main()
{
int i;
int Sheet_music[]={6,7,8,8,7,8,8,10,10,7,7,0,0,3,3,6,6,6,5,6,6,8,8,5,5,5};//乐谱
int Sheet_length=sizeof(Sheet_music) / sizeof(Sheet_music);                        //乐谱数组长度计算
BEEP_Init();                                                                                                                        //蜂鸣器配置
               
while (1)
{       
    GPIO_SetBits(GPIOA,GPIO_Pin_8);      //此注释部分测试蜂鸣器是否为有源蜂鸣器
//GPIO_SetBits(GPIOA,GPIO_Pin_8);      这四行注释掉的代码是验证蜂鸣器是否为无源蜂鸣器的代码
//Delay_Ms(1);               
//GPIO_ResetBits(GPIOA,GPIO_Pin_8);
//Delay_Ms(1);
}       
}</code></pre>

<p>为了进一步确定蜂鸣器的种类我们再次进行试验,这次我们给一个时间间隔为1ms的高电平时钟(代码while(1)里面注释掉的部)。</p>

<p>烧写代码后验证,以下视频为延时1ms程序运行情况。</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNDI4MTkzMjkwMA" style="background:#eee;margin-bottom:10px;" width="100%"></iframe></p>

<p>蜂鸣器发出响声,断定该蜂鸣器为无源蜂鸣器。</p>

<p>&nbsp;</p>

<p>下面简单介绍下例程,main函数代码依旧是先对使用到的外设进行初始化(该部分与前面的学习篇基本一致,不再赘述),这个例程的难点在于乐谱的产生,这个乐谱应该使用软件生成的,之前也有使用过,但对本人来说用处不是很大就没有去深究,感兴趣的可以在百度找找,相信都难不倒大家的。</p>

<p>下面是例程运行的情况,循环播放乐谱</p>

<pre>
<code>                                case 1:                                                             //do
                                        scale(doo);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 2:                                                             //re
                                        scale(re);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 3:                                                             //mi
                                        scale(mi);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 4:                                                             //fa
                                        scale(fa);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 5:                                                             //sol
                                        scale(sol);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 6:                                                             //la
                                        scale(la);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 7:                                                             //si
                                        scale(si);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 8:                                                             //高音do
                                        scale(DO);                                                      
                                break;                                                                   
                                                                                                                                                                                                                                                                                                               
                                case 9:                                                             //高音re
                                        scale(RE);                                                      
                                break;                                                            
                                                                                                                                                                                                                                                                                                               
                                case 10:                                                            //高音mi
                                        scale(MI);                                                      
                                break;                </code></pre>

<p>scale()函数里面的元素是宏定义来的,在main.h文件里面。</p>

<p>验证蜂鸣器中用到的函数GPIO_SetBits(GPIOA,GPIO_Pin_8);是在GPIO.h文件中找到的,里面还有很多对GPIO操作的函数。</p>

<p><iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNDI4MTk3ODcyNA" style="background:#eee;margin-bottom:10px;" width="100%"></iframe><br />
&nbsp;</p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

desk1983 发表于 2019-7-23 08:26

<p>非常好的资料,感谢分享;<br />
共享精神万岁。<br />
希望楼主以后多多分享资料,帮助更多的电子爱好者。</p>
页: [1]
查看完整版本: 【ufun学习】学习篇4:《基础例程3 - 蜂鸣器控制》