欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 【单片机通过蜂鸣器模拟警号 救护车 警车 等声音 】

【单片机通过蜂鸣器模拟警号 救护车 警车 等声音 】

2025/4/28 11:16:00 来源:https://blog.csdn.net/qq_36296398/article/details/145184270  浏览:    关键词:【单片机通过蜂鸣器模拟警号 救护车 警车 等声音 】

单片机通过蜂鸣器模拟警号 救护车 警车 等声音

  • 模拟原理
    • 实现代码

模拟原理

该函数利用定时器中断,通过改变 u16Compare 的值,并使用 Adt_SetPeriodBuf 和 Adt_SetCompareValue 函数调整定时器的周期和比较值,产生不同类型的声音。
SoundType 变量控制当前播放的声音类型,不同类型的声音通过不同的参数和算法进行生成。
定时器 Timer_1ms 和 timer_50ms 作为时间计数变量,用于控制声音的周期性变化。
对于不同的声音类型,使用不同的周期参数(如 _PERIOD_1k8_VALUE、_PERIOD_3k5_VALUE 等)和步长(如 ((_PERIOD_1k8_VALUE - _PERIOD_3k5_VALUE)/50)、_PERIOD_2us 等)来调整声音的频率和占空比,以模拟不同的声音效果。

实现代码


uint8_t Timer_1ms=0;
uint8_t SoundType=SOUND_TYPE_FIRE;uint8_t timer_50ms = 200;
uint16_t u16Compare = _PERIOD_3k5_VALUE;void Buzz_Pwm_Init(void)
{en_adt_unit_t enAdt;uint16_t u16Period;en_adt_compare_t enAdtCompare;uint16_t u16Compare;stc_adt_basecnt_cfg_t stcAdtBaseCntCfg;stc_adt_CHxX_port_cfg_t stcAdtTIM6ACfg;DDL_ZERO_STRUCT(stcAdtBaseCntCfg);DDL_ZERO_STRUCT(stcAdtTIM6ACfg);Clk_SetPeripheralGate(ClkPeripheralAdt, TRUE);//ADT外设时钟使能Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //端口外设时钟使能Gpio_SetFunc_TIM6_CHA_P02();enAdt = AdTIM6;Adt_StopCount(enAdt);Adt_ClearCount(enAdt);stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;stcAdtBaseCntCfg.enCntDir = AdtCntUp;stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div8;//0.67usAdt_Init(enAdt, &stcAdtBaseCntCfg);                      //ADT载波、计数模式、时钟配置u16Period =  936;Adt_SetPeriod(enAdt, u16Period);                         //周期enAdtCompare = AdtCompareA;u16Compare   = 468;Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare);    //通用比较基准值寄存器A设置Adt_EnableValueBuf(enAdt, AdtCHxA, TRUE);                //使能A stcAdtTIM6ACfg.enCap    = AdtCHxCompareOutput;stcAdtTIM6ACfg.bOutEn   = TRUE;stcAdtTIM6ACfg.enPerc   = AdtCHxPeriodHigh;stcAdtTIM6ACfg.enCmpc   = AdtCHxCompareLow;stcAdtTIM6ACfg.enStaStp = AdtCHxStateSelSS;stcAdtTIM6ACfg.enStaOut = AdtCHxPortOutLow;stcAdtTIM6ACfg.enStpOut = AdtCHxPortOutLow;Adt_CHxXPortConfig(enAdt, AdtCHxA, &stcAdtTIM6ACfg);   //端口CHA配置Adt_StartCount(enAdt);Adt_SetPeriodBuf( AdTIM6,  936);Adt_SetCompareValue(AdTIM6, AdtCompareA, 468); Adt_StopCount(AdTIM6);
}
void buzz_interrupt(void)
{switch(SoundType){case SOUND_TYPE_ANFANG:if(Timer_1ms >=2){Timer_1ms = 0;timer_50ms++;if (timer_50ms <= 50){u16Compare += ((_PERIOD_1k8_VALUE-_PERIOD_3k5_VALUE)/50);}else if (timer_50ms <= 100){u16Compare -= ((_PERIOD_1k8_VALUE-_PERIOD_3k5_VALUE)/50);}else{u16Compare = _PERIOD_3k5_VALUE;timer_50ms = 0;}//								Adt_SetPeriod(AdTIM6, u16Compare); 		Adt_SetPeriodBuf( AdTIM6,  u16Compare);Adt_SetCompareValue(AdTIM6, AdtCompareC, u16Compare/2);       }break;/**************************火警声:***********************************************
初始脉冲宽度950us,占空比1:1;20ms每次的速度递减4us,递减100次,然后以同样的速度和步长递增,
直到回到950us,循环!看声音 效果,可以适当微调递减或者递增的步长和次数,以达到最好的效果
1us=8ad
****************************************************************************************/case SOUND_TYPE_FIRE:if(Timer_1ms >=10)//20ms{
//                #define _PERIOD_950us  936U
//                #define _PERIOD_4us    8U
//                #define _PERIOD_2us    4U#define _PERIOD_950us  1872U#define _PERIOD_4us    16U#define _PERIOD_2us    8U            Timer_1ms = 0;timer_50ms++;if (timer_50ms <= 100)//100次{u16Compare += _PERIOD_2us;}else if (timer_50ms <= 200)//第二个100次{u16Compare -= _PERIOD_2us;}else{u16Compare = _PERIOD_950us/2;timer_50ms = 0;}Adt_SetPeriodBuf( AdTIM6,  u16Compare);Adt_SetCompareValue(AdTIM6, AdtCompareC, u16Compare/2);          }break;/**************************报警声:***********************************************
初始脉宽1200us,占空比1:1,20ms每次的速度递减5us,递减150次,然后静音500MS,循环!
1us=8ad
****************************************************************************************/case SOUND_TYPE_ALARM:if(Timer_1ms >=20)//20ms{#define _PERIOD_1200us  1417U#define _PERIOD_5us     6U#define _PERIOD_2p5us   3UTimer_1ms = 0;timer_50ms++;if (timer_50ms <= 100)//100次{u16Compare += _PERIOD_2p5us;}else if (timer_50ms <= 200)//第二个100次{u16Compare -= _PERIOD_2p5us;}else{u16Compare = _PERIOD_1200us/2;timer_50ms = 0;}	Adt_SetPeriodBuf( AdTIM6,  u16Compare);Adt_SetCompareValue(AdTIM6, AdtCompareC, u16Compare/2);         }break;default:SoundType = SOUND_TYPE_FIRE;break;}       
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词