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,如需转载请自行联系原作者
相关文章
|
6月前
|
Windows
【计算机基础】解决Win10电脑主机前面的耳机插口没声音的问题
【计算机基础】解决Win10电脑主机前面的耳机插口没声音的问题
679 0
|
7月前
kali2023.1配置模拟钢琴midi环境(圆it/网安猫猫们的钢琴梦)
kali2023.1配置模拟钢琴midi环境(圆it/网安猫猫们的钢琴梦)
26 0
|
9月前
|
Shell 芯片
荔枝派Zero(全志V3S)驱动开发之RGB LED灯
查看 V3S 原理图,查看 RGB LED对应的引脚 PG0 -> green LED PG1 -> blue LED PG2 -> red LED
291 0
|
人工智能 自然语言处理 物联网
慵懒午后的音乐时光 DingDong智能音箱点亮新生活
慵懒午后的音乐时光 DingDong智能音箱点亮新生活
慵懒午后的音乐时光 DingDong智能音箱点亮新生活
|
Python
一起玩转树莓派(5)——让蜂鸣器播放音乐
一起玩转树莓派(5)——让蜂鸣器播放音乐
573 0
一起玩转树莓派(5)——让蜂鸣器播放音乐
|
传感器 人工智能 安全
不用键盘也能玩超级玛丽!当乐高马里奥变身遥控器,真‧手动控制
不用键盘也能玩超级玛丽!当乐高马里奥变身遥控器,真‧手动控制
223 0
|
人工智能 算法 前端开发
基于wujian100 SoC的智能五子棋设备的设计实现及其与QQ游戏玩家的对战
在本文中,我们设计了一个实现五子棋AI核心算法的IP核并将其集成到wujian100 SoC上。将整个设计下载到FPGA开发板后便构成了一个“擅长下五子棋”的智能设备。
532 0
基于wujian100 SoC的智能五子棋设备的设计实现及其与QQ游戏玩家的对战
|
Android开发
Android Things创客DIY第五课-硬件开发案例教程-PWM调色-触摸开关-数码管显示-OLED显示
Android Things开发,离不开硬件的DIY组合,本例来介绍一些好玩的硬件模块的使用。如果你手上有Google派发的NXP开发板,或者已有树莓派3B,那么就可以开始你的Android Things创客DIY之旅了。
1982 0