PWM (2541)控制无源蜂鸣器发出不同的声音

PWM (2541)控制无源蜂鸣器发出不同的声音

#define M_LOW   0x00
#define M_MID   0x01
#define M_HIGH  0x02


#define DO       1
#define RE       2
#define MI       3
#define FA       4
#define SO       5
#define LA       6
#define SI       7


int main()
{
  CLKCONCMD &= ~0x40;                        //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);                   //等待晶振稳定为32M
  CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ   


  


  while(1)
  {
       for( uint8 i = 0; i < 3; i++ )           // 一次循环将七个音符的高中低三音放出来
      {
          for( uint8 j = 1; j < 8; j++)
         {
           PWM_BUZZER( i, j );
           Delay_ms(125);                // 这是我的延时函数每个音符之间延时125毫秒
         
       }
    }
  }
}


void PWM_BUZZER( uint8 light, uint8 musical )
{
    // 设置PWM端口为外设端口,非GPIO
    P1SEL |= BV(1);
    // 设置PWM端口为输出
    P1DIR |= BV(1);
    
    // 定时器的备用位置2
    PERCFG |= BV(6);
    
    // 32分频,模模式从0x0000到T1CC0反复计数  我现在的工作频率是1Mhz,为了方便计算
    T1CTL = BV(3) | BV(1);
    
    // 设置通道1,向上比较设置输出,比较模式,未捕获
    T1CCTL1 = 0x1C;
    switch( light )
    {
    case M_LOW:                  // 低音
      switch ( musical )
      {
      case DO:
        T1CC0H = 3816 / 0xFF;
        T1CC0L = 3816 % 0xFF;
        
        T1CC1H = 1908 / 0xFF;
        T1CC1L = 1908 % 0xFF;
        break;
        
      case RE:
         T1CC0H = 3401 / 0xFF;
        T1CC0L = 3401 % 0xFF;
        
        T1CC1H = 1700 / 0xFF;
        T1CC1L = 1700 % 0xFF;
        break;
        
      case MI:
         T1CC0H = 3030 / 0xFF;
        T1CC0L = 3030 % 0xFF;
        
        T1CC1H = 1515 / 0xFF;
        T1CC1L = 1515 % 0xFF;
        break;
        
      case FA:
         T1CC0H = 2865 / 0xFF;
        T1CC0L = 2865 % 0xFF;
        
        T1CC1H = 1433 / 0xFF;
        T1CC1L = 1433 % 0xFF;
        break;
        
      case SO:
         T1CC0H = 2551 / 0xFF;
        T1CC0L = 2551 % 0xFF;
        
        T1CC1H = 1276 / 0xFF;
        T1CC1L = 1276 % 0xFF;
        break;
        
      case LA:
         T1CC0H = 2272 / 0xFF;
        T1CC0L = 2272 % 0xFF;
        
        T1CC1H = 1136 / 0xFF;
        T1CC1L = 1136 % 0xFF;
        break;
        
      case SI:
         T1CC0H = 2024 / 0xFF;
        T1CC0L = 2024 % 0xFF;
        
        T1CC1H = 1012 / 0xFF;
        T1CC1L = 1012 % 0xFF;
        break;
      }
      break;
      
    case M_MID:            // 中音
      switch ( musical )
      {
      case DO:
        T1CC0H = 1912 / 0xFF;
        T1CC0L = 1912 % 0xFF;
        
        T1CC1H = 956 / 0xFF;
        T1CC1L = 956 % 0xFF;
        break;
        
      case RE:
        T1CC0H = 1703 / 0xFF;
        T1CC0L = 1703 % 0xFF;
        
        T1CC1H = 851 / 0xFF;
        T1CC1L = 851 % 0xFF;
        
        break;
        
      case MI:
        T1CC0H = 1517 / 0xFF;
        T1CC0L = 1517 % 0xFF;
        
        T1CC1H = 758 / 0xFF;
        T1CC1L = 758 % 0xFF;
        break;
        
      case FA:
        T1CC0H = 1432 / 0xFF;
        T1CC0L = 1432 % 0xFF;
        
        T1CC1H = 716 / 0xFF;
        T1CC1L = 716 % 0xFF;
        break;
        
      case SO:
        T1CC0H = 1275 / 0xFF;
        T1CC0L = 1275 % 0xFF;
        
        T1CC1H = 637 / 0xFF;
        T1CC1L = 637 % 0xFF;
        break;
        
      case LA:
        T1CC0H = 1136 / 0xFF;
        T1CC0L = 1136 % 0xFF;
        
        T1CC1H = 568 / 0xFF;
        T1CC1L = 568 % 0xFF;
        break;
        
      case SI:
        T1CC0H = 1012 / 0xFF;
        T1CC0L = 1012 % 0xFF;
        
        T1CC1H = 506 / 0xFF;
        T1CC1L = 506 % 0xFF;
        break;
      }
      break;
      
    case M_HIGH:    // 高音
      switch ( musical )
      {
      case DO:
        T1CC0H = 955 / 0xFF;
        T1CC0L = 955 % 0xFF;
        
        T1CC1H = 477 / 0xFF;
        T1CC1L = 477 % 0xFF;
        break;
        
      case RE:
        T1CC0H = 851 / 0xFF;
        T1CC0L = 851 % 0xFF;
        
        T1CC1H = 425 / 0xFF;
        T1CC1L = 425 % 0xFF;
        break;
        
      case MI:
        T1CC0H = 758 / 0xFF;
        T1CC0L = 758 % 0xFF;
        
        T1CC1H = 379 / 0xFF;
        T1CC1L = 379 % 0xFF;
        break;
        
      case FA:
        T1CC0H = 751 / 0xFF;
        T1CC0L = 751 % 0xFF;
        
        T1CC1H = 375 / 0xFF;
        T1CC1L = 375 % 0xFF;
        break;
        
      case SO:
         T1CC0H = 637 / 0xFF;
        T1CC0L = 637 % 0xFF;
        
        T1CC1H = 318 / 0xFF;
        T1CC1L = 318 % 0xFF;
        break;
        
      case LA:
        T1CC0H = 568 / 0xFF;
        T1CC0L = 568 % 0xFF;
        
        T1CC1H = 284 / 0xFF;
        T1CC1L = 284 % 0xFF;
        break;
        
      case SI:
         T1CC0H = 508 / 0xFF;
        T1CC0L = 508 % 0xFF;
        
        T1CC1H = 254 / 0xFF;
        T1CC1L = 254 % 0xFF;
        break;
      }
      break;
    }
    
    
}

C调各音符频率对照表
音符 频率Hz 周期us
低1Do 262 3816
低2Re 294 3401
低3Mi 330 3030
低4Fa 349 2865
低5So 392 2551
低6La 440 2272
低7Si 494 2024
中1Do 523 1912
中2Re 587 1703
中3Mi 659 1517
中4Fa 698 1432
中5So 784 1275
中6La 880 1136
中7Si 988 1012
高1Do 1047 955
高2Re 1175 851
高3Mi 1319 758
高4Fa 1397 751
高5So 1568 637
高6La 1760 568
高7Si 1967 508

有疑问可以咨询[email protected]

你可能感兴趣的:(PWM)