[MSP430] 蜂鸣器演唱音乐

[复制链接]
 楼主| mnmjmkml 发表于 2019-2-27 18:17 | 显示全部楼层 |阅读模式
本帖最后由 mnmjmkml 于 2019-2-28 18:58 编辑

修改自51单片机,launchpad的P10连接蜂鸣器,蜂鸣器演奏《八月桂花》

  1. #include "msp430g2553.h"

  2. unsigned char n=0;  //n为节拍常数变量   
  3. unsigned char  music_tab[] ={  
  4. 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
  5. 0x20, 0x40, 0x1C , 0x10,   
  6. 0x18, 0x10, 0x20 , 0x10,   
  7. 0x1C, 0x10, 0x18 , 0x40,   
  8. 0x1C, 0x20, 0x20 , 0x20,   
  9. 0x1C, 0x20, 0x18 , 0x20,   
  10. 0x20, 0x80, 0xFF , 0x20,
  11. 0x30, 0x1C, 0x10 , 0x18,   
  12. 0x20, 0x15, 0x20 , 0x1C,   
  13. 0x20, 0x20, 0x20 , 0x26,   
  14. 0x40, 0x20, 0x20 , 0x2B,   
  15. 0x20, 0x26, 0x20 , 0x20,   
  16. 0x20, 0x30, 0x80 , 0xFF,   
  17. 0x20, 0x20, 0x1C , 0x10,   
  18. 0x18, 0x10, 0x20 , 0x20,   
  19. 0x26, 0x20, 0x2B , 0x20,   
  20. 0x30, 0x20, 0x2B , 0x40,   
  21. 0x20, 0x20, 0x1C , 0x10,   
  22. 0x18, 0x10, 0x20 , 0x20,   
  23. 0x26, 0x20, 0x2B , 0x20,   
  24. 0x30, 0x20, 0x2B , 0x40,   
  25. 0x20, 0x30, 0x1C , 0x10,   
  26. 0x18, 0x20, 0x15 , 0x20,   
  27. 0x1C, 0x20, 0x20 , 0x20,   
  28. 0x26, 0x40, 0x20 , 0x20,   
  29. 0x2B, 0x20, 0x26 , 0x20,   
  30. 0x20, 0x20, 0x30 , 0x80,   
  31. 0x20, 0x30, 0x1C , 0x10,   
  32. 0x20, 0x10, 0x1C , 0x10,   
  33. 0x20, 0x20, 0x26 , 0x20,   
  34. 0x2B, 0x20, 0x30 , 0x20,   
  35. 0x2B, 0x40, 0x20 , 0x15,   
  36. 0x1F, 0x05, 0x20 , 0x10,   
  37. 0x1C, 0x10, 0x20 , 0x20,   
  38. 0x26, 0x20, 0x2B , 0x20,   
  39. 0x30, 0x20, 0x2B , 0x40,   
  40. 0x20, 0x30, 0x1C , 0x10,   
  41. 0x18, 0x20, 0x15 , 0x20,   
  42. 0x1C, 0x20, 0x20 , 0x20,   
  43. 0x26, 0x40, 0x20 , 0x20,   
  44. 0x2B, 0x20, 0x26 , 0x20,   
  45. 0x20, 0x20, 0x30 , 0x30,   
  46. 0x20, 0x30, 0x1C , 0x10,
  47. 0x18, 0x40, 0x1C , 0x20,   
  48. 0x20, 0x20, 0x26 , 0x40,   
  49. 0x13, 0x60, 0x18 , 0x20,   
  50. 0x15, 0x40, 0x13 , 0x40,   
  51. 0x18, 0x80, 0x00   
  52. };   

  53. void delay (unsigned char m)   //控制频率延时   
  54. {   
  55.     unsigned i=3*m;   
  56.     while(--i);   
  57. }   

  58. void delaymms(unsigned int a)  //毫秒延时子程序   
  59. {   
  60. unsigned int t;
  61. while(--a)
  62. for(t=0;t<200;t++);
  63. }   

  64. void main(void)
  65. {
  66. unsigned char p,m;   //m为频率常数变量   
  67. unsigned char i=0;     

  68. WDTCTL = WDTPW + WDTHOLD;     // 停止看门狗

  69. P1DIR = 0Xff;        
  70. P2DIR = 0Xff;        

  71. CCTL0 |= CCIE;                             // CCR0 interrupt enabled
  72. CCR0 = 10000;                         //10ms
  73. TACTL = TASSEL_2 ;                  // SMCLK, contmode
  74. _EINT();

  75. while(1)   
  76. {   
  77.    p=music_tab[i];   
  78.    if(p==0x00)      
  79.    {
  80.      i=0;
  81.      delaymms(1000);
  82.      continue;;
  83.    }     //如果碰到结束符,延时1秒,回到开始再来一遍   
  84.    else if(p==0xff)  
  85.    {
  86.      i=i+1;
  87.      delaymms(100);
  88.      TACTL &=~MC_1;
  89.      continue;
  90.    }  //若碰到休止符,延时100ms,继续取下一音符   
  91.    else         
  92.    {
  93.      m=music_tab[i++];
  94.      n=music_tab[i++];
  95.    }  //取频率常数 和 节拍常数   

  96.    TACTL |= MC_1+TACLR;                                           //开定时器   
  97.    while(n!=0) P1OUT ^= BIT0,delay(m);                         //等待节拍完成
  98.    TACTL &=~MC_1;                                           //关定时器     
  99.    }  

  100. }


  101. // Timer A0 interrupt service routine
  102. #pragma vector=TIMER0_A0_VECTOR
  103. __interrupt void Timer_A (void)
  104. {
  105. n--;
  106. }

zhangmangui 发表于 2019-2-27 22:40 | 显示全部楼层
最好编辑一下    看着比较乱
 楼主| mnmjmkml 发表于 2019-2-28 18:59 | 显示全部楼层
zhangmangui 发表于 2019-2-27 22:40
最好编辑一下    看着比较乱

已经编辑好了,实在抱歉,发的比较着急。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部