如何利用蜂鸣器发出七种乐音

 
点击 94回复 0 原帖 2022-01-14 11:08

首先我们要将程序烧MSP430单片机

MSP430单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,以提供"单片机"解决方案。该系列单片机多应用于需要电池供电的便携式仪器仪表中。

MSP430系列单片机是美国德州仪器(TI)1996年开始推向市场的一种16位超低功耗、具有精简指令集(RISC)的混合信号处理器(Mixed Signal Processor)。


此次我们选择的是通过光电门来对蜂鸣器进行控制

第一个程序是扫一下光电门,蜂鸣器通过延时顺序发出七种乐音。

在这里为大家提供了程序参考:

#include <msp430f5529.h>
void fmq_pwm(int m)
{
TA1CCR0 = m; // PWM Period
TA1CCTL1 = OUTMOD_7; // CCR1 reset/set
TA1CCR1 = m/2; // CCR1 PWM duty cycle
TA1CCTL2 = OUTMOD_7; // CCR2 reset/set
TA1CCR2 = 128; // CCR2 PWM duty cycle
TA1CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, up mode, clear TAR
__delay_cycles(1000000);
}

void fmq_a(int n)
{
switch(n)
{
case 1:
fmq_pwm(3787); break;
case 2:
fmq_pwm(3367); break;
case 3:
fmq_pwm(3030); break;
case 4:
fmq_pwm(2840); break;
case 5:
fmq_pwm(2525); break;
case 6:
fmq_pwm(2272); break;
case 7:
fmq_pwm(2020); break;
}
}

void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P2DIR |= BIT0+BIT1; // P2.0 and P2.1 output
P2SEL |= BIT0+BIT1; // P2.0 and P2.1 options select
while(1)
{
for(i=1;i<8;i++)
{
fmq_a(i);
__delay_cycles(1000000);
}
}
}

第二个程序则是,每扫一下光电门,蜂鸣器发出一种声音,顺序发出七种声音。

第二种程序要通过中断来写。

范例如下:

#include <msp430f5529.h>
int i=1;
void fmq_pwm(int m)
{
TA1CCR0 = m; // PWM Period
TA1CCTL1 = OUTMOD_7; // CCR1 reset/set
TA1CCR1 = m/2; // CCR1 PWM duty cycle
TA1CCTL2 = OUTMOD_7; // CCR2 reset/set
TA1CCR2 = 128; // CCR2 PWM duty cycle
TA1CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, up mode, clear TARg
__delay_cycles(1000000);
}

void fmq_a(int n)
{
switch(n)
{
case 1:
fmq_pwm(3787); break;
case 2:
fmq_pwm(3367); break;
case 3:
fmq_pwm(3030); break;
case 4:
fmq_pwm(2840); break;
case 5:
fmq_pwm(2525); break;
case 6:
fmq_pwm(2272); break;
case 7:
fmq_pwm(2020); break;
}
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P2DIR |= BIT0+BIT1; // P2.0 and P2.1 output
P2SEL |= BIT0+BIT1; // P2.0 and P2.1 options select
P1OUT &=~ BIT3;
P1REN |= BIT3;
P1IE |= BIT3;
P1IES &=~ BIT3;
P1IFG &=~BIT3;


_EINT();//开总中断

while(1);
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT_1(void)
{

fmq_a(i);
__delay_cycles(1000000);
i++;
P1IFG&=~BIT3;//中断标志位清零
}

有了以上两个程序的参考,编写相关的程序就更为方便了。


举报收藏 0打赏 0