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
低1Do2623816
低2Re2943401
低3Mi3303030
低4Fa3492865
低5So3922551
低6La4402272
低7Si4942024
中1Do5231912
中2Re5871703
中3Mi6591517
中4Fa6981432
中5So7841275
中6La8801136
中7Si9881012
高1Do1047955
高2Re1175851
高3Mi1319758
高4Fa1397751
高5So1568637
高6La1760568
高7Si1967508

有疑问可以咨询edgarshang@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值