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,如需转载请自行联系原作者

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

相关文章
《Pro ASP.NET MVC 3 Framework》学习笔记之三【MVC模式介绍】
主题:MVC模式 1.MVC的历史: MVC(model-view-controller)这个概念在20世纪70年代就已经被使用了,MVC是从Smalltalk项目中提出的。所以原始的MVC模式所包含非常好的细节跟Smalltalk项目的具体概念是紧密相关的。
883 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4485 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7758 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10768 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=.
2141 0
Flash/Flex学习笔记(12):FMS 3.5之如何做视频实时直播
硬件条件:一个摄像头 + 一台FMS服务器即可 原理:摄像头实时采集视频源,然后推送到FMS服务器,其它客户从FMS上获取视频流。 需要做二个fla,一个用于向FMS服务端推送视频源(即发送端),一个用于从FMS服务器获取并播放视频(即接收端) Server.
785 0
黑马springmvc学习笔记
springMVC是表现层框架,而表现层一般采用MVC设计模式
263 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16829 0
3572
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载