×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-18 发布时间:
|

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


  1. /********************************************* 

  2. 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 

  3. ---------------------------------------------- 

  4. 拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF 

  5. 测试说明:聆听蜂鸣器“唱出”的乐曲 

  6.  

  7. 既然是演奏乐曲对于一个音符应该包括两个部分 

  8. 一是声调 二是持续时间,在这个程序中声调是用简单的 

  9. 延时-电平翻转来实现的,改变了延时的时间就改变了 

  10. 声调,而时间是通过计数比较来实现的,当计数值相等时 

  11. 就跳出循环演奏下一个音符。 

  12. *********************************************/  

  13. #include    

  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 

  89.     {  

  90.         for( j = 0;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. }  

 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
物联传感与Atmel强强联手 达成智能家居战略合作协议