MSP430学习笔记5-利用蜂鸣器演奏音乐-阿里云开发者社区

开发者社区> 文艺小青年> 正文

MSP430学习笔记5-利用蜂鸣器演奏音乐

简介:
+关注继续查看

这个小程序仍然是定时器的运用,比较简单,具体的地方都在注释中注明了,参考注释。

  1. /********************************************* 
  2. 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 
  3. ---------------------------------------------- 
  4. 拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF 
  5. 测试说明:聆听蜂鸣器“唱出”的乐曲 
  6.  
  7. 既然是演奏乐曲对于一个音符应该包括两个部分 
  8. 一是声调 二是持续时间,在这个程序中声调是用简单的 
  9. 延时-电平翻转来实现的,改变了延时的时间就改变了 
  10. 声调,而时间是通过计数比较来实现的,当计数值相等时 
  11. 就跳出循环演奏下一个音符。 
  12. *********************************************/  
  13. #include  <msp430x14x.h>  
  14.   
  15. typedef unsigned char uchar;  
  16.   
  17. #include  "music.h"  
  18.   
  19. #define   Buzzer        BIT7  
  20. #define   Buzzer_Port   P6OUT  
  21. #define   Buzzer_DIR    P6DIR  
  22.   
  23. uchar counter;  
  24. void Play_Song(void);  
  25.   
  26. /***************主函数****************/  
  27. void main(void)  
  28. {  
  29.     uchar i;  
  30.       
  31.     /*下面六行程序关闭所有的IO口*/  
  32.     P1DIR = 0XFF;P1OUT = 0XFF;  
  33.     P2DIR = 0XFF;P2OUT = 0XFF;  
  34.     P3DIR = 0XFF;P3OUT = 0XFF;  
  35.     P4DIR = 0XFF;P4OUT = 0XFF;  
  36.     P5DIR = 0XFF;P5OUT = 0XFF;  
  37.     P6DIR = 0XFF;P6OUT = 0XFF;  
  38.     P6DIR |= BIT2;P6OUT |= BIT2;         //关闭电平转换  
  39.        
  40.     WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗  
  41.     /*------选择系统主时钟为8MHz-------*/  
  42.     BCSCTL1 &= ~XT2OFF;                       // 打开XT2高频晶体振荡器  
  43.     do  
  44.     {  
  45.         IFG1 &= ~OFIFG;                       //清除晶振失败标志  
  46.         for (i = 0xFF; i > 0; i--);           // 等待8MHz晶体起振  
  47.     }  
  48.     while ((IFG1 & OFIFG));                   // 晶振失效标志仍然存在?  
  49.     BCSCTL2 |= SELM_2 + SELS;                 //主时钟和从时钟都选择高频晶振  
  50.       
  51.       
  52.     //设置定时器A每10ms中断一次  
  53.     CCTL0 = CCIE;  
  54.     CCR0 = 10000;//改变这个值就改变了演奏的速度  
  55.     TACTL |= TASSEL_2 + ID_3;   
  56.     //设置控制蜂鸣器的IO方向为输出  
  57.     Buzzer_DIR |= Buzzer;  
  58.     //打开全局中断  
  59.     _EINT();  
  60.     //循环演奏歌曲  
  61.     while(1)  
  62.     {  
  63.         Play_Song();  
  64.     }  
  65. }  
  66.   
  67. /******************************************* 
  68. 函数名称:TimerA_ISR 
  69. 功    能:定时器A的中断服务函数 
  70. 参    数:无 
  71. 返回值  :无 
  72. ********************************************/  
  73. #pragma vector = TIMERA0_VECTOR  
  74. __interrupt void TimerA_ISR(void)  
  75. {  
  76.     counter++;  
  77. }  
  78. /******************************************* 
  79. 函数名称:Delay_Nms 
  80. 功    能:延时N个ms的函数              ps:不知道这个地方怎么算出来的是延时毫秒 
  81. 参    数:n--延时长度 
  82. 返回值  :无 
  83. ********************************************/  
  84. void Delay_Nms(uchar n)  
  85. {  
  86.     uchar i,j;  
  87.       
  88.     for( i = 0;i < n; i++ )  
  89.     {  
  90.         for( j = 0;j < 3;j++ )  
  91.           _NOP();  
  92.     }  
  93. }  
  94. /******************************************* 
  95. 函数名称:Play_Song 
  96. 功    能:播放《祝你平安》的乐曲 
  97. 参    数:无 
  98. 返回值  :无 
  99. ********************************************/  
  100. void Play_Song(void)  
  101. {  
  102.     uchar Temp1,Temp2;  
  103.     uchar addr = 0;  
  104.       
  105.     counter = 0; //中断计数器清0  
  106.     while(1)  
  107.     {  
  108.         Temp1 = SONG[addr++];  
  109.         if ( Temp1 == 0xFF )        //休止符  
  110.         {  
  111.             TACTL &=~MC_1;          //停止计数  
  112.             Delay_Nms(100);  
  113.         }  
  114.         else if ( Temp1 == 0x00 )   //歌曲结束符  
  115.         {  
  116.             return;  
  117.         }  
  118.         else  
  119.         {  
  120.             Temp2 = SONG[addr++];  
  121.             TACTL |=MC_1;           //开始计数  
  122.             while(1)  
  123.             {  
  124.                 Buzzer_Port ^= Buzzer;//电平取反  
  125.                 Delay_Nms(Temp1);//Temp1的值决定了延时的长短,也决定了声音的频率  
  126.                 if ( Temp2 == counter )//决定了音调持续的时间,计数时间到时就跳出循环演奏下一个。  
  127.                 {  
  128.                     counter = 0;  
  129.                     break;  
  130.                 }  
  131.             }  
  132.         }  
  133.     }  
  134. }  

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2010/07/22/2198220.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Flash/Flex学习笔记(10):FMS 3.5之Hello World!
Adobe的FMS真的是一个倍儿牛叉的技术!(至少Silverlight在"实时广播"方面目前还没有任何能超越FMS的迹象) 曾经盛极一时的tudou,ku6,第一视频...等一大堆视频分享类网站,几乎都使用的是Adobe的FMS技术.
973 0
【批处理学习笔记】第一课:什么是批处理
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。
882 0
Flash/Flex学习笔记(7):FMS3.5基于IIS的安装
一般来讲,在windows上安装软件从来都不是什么难事儿,但FMS却在安装过程中"充满"了误导(好吧,其实也就是夸张的说法而已)   1.下载FMS3.5 http://www.adobe.com/products/flashmediainteractive/?promoid=DJDTG 这上面有一个免费开发版(除了连接数有限制,其它功能完全一样)   2.
712 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11860 0
《Pro ASP.NET MVC 3 Framework》学习笔记之十二【示例项目SportsStore及MyBatis.NET的使用】
距上次的笔记已经有2个多星期了,之所以没保持前面的笔记频率,是因为书中后面的例子是基于EF实体框架的。我有点不愿意使用EF框架,不是它不好,而是我打算在操作完书中讲的例子后能够试着将这个MVC3的项目移植到mono里面,当然数据库也换了,我这里会用MySQL。
959 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4548 0
Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
硬件条件:一个摄像头 + 一台FMS服务器即可 原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。 需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端) Server.
797 0
Flash/Flex学习笔记(15):FMS 3.5之远程共享对象(Remote Shared Object)
FMS中的“远程共享对象”可以让多个Client端的flash应用共享同一个全局对象,并且当客户端中的任何一个改变该对象时,系统会自动将该对象回发到FMS服务器,同时FMS服务器也会将该对象重新广播到所有客户端。
763 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载