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 |
有疑问可以咨询edgarshang@163.com