分析此段代码void beep(u8 tick) { while(tick--) { BEEP = !BEEP; delay_ms(100); } BEEP = 0; }
时间: 2024-03-22 20:40:38 浏览: 83
这段代码的功能是控制蜂鸣器发出一定数量的响声。该函数的输入参数tick表示需要响的次数,每次响100ms。其具体步骤如下:
1. 在输入的tick大于0时,进入循环。
2. 每次循环将BEEP引脚取反,使蜂鸣器发出一声响。
3. 调用delay_ms()函数延时100ms,控制每次响100ms。
4. tick减1,继续循环,直到tick减为0。
5. 将BEEP引脚置低电平,关闭蜂鸣器。
需要注意的是,该函数实现了一定的简单延时,可能存在一定精度误差,使用时需要考虑这一点。
相关问题
#include "beep.h" /** * @brief 初始化蜂鸣器引脚 */ void Beep_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = BEEP_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStruct); } /** * @brief 蜂鸣器报警 */ void Beep_Alert(void) { u8 i = 0; while (i < 10) { GPIO_SetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN); Delay_ms(500); GPIO_ResetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN); Delay_ms(500); i++; } } /** * @brief 停止蜂鸣器报警 */ void Beep_Stop(void) { GPIO_ResetBits(BEEP_GPIO_PORT, BEEP_GPIO_PIN); }程序中的函数怎么调用,()里要不要加viod
调用该函数时,需要在函数名后加上括号,括号中填写该函数需要的参数(如果有的话),如果不需要参数,则不需要在括号中填写任何内容。例如:
- 调用 Beep_Init 函数时,应该写成 Beep_Init();
- 调用 Beep_Alert 函数时,应该写成 Beep_Alert();
- 调用 Beep_Stop 函数时,应该写成 Beep_Stop();
在括号中不需要加上 void,因为 void 表示没有实参,而不是函数不需要实参。
优化这段程序int main(void) { uint8_t key; uint16_t led_freq = 100; uint16_t beep_freq = 100; sys_stm32_clock_init(336, 8, 2, 7); delay_init(168); led_init(); beep_init(); key_init(); LED0(0); while(1) { key = key_scan(0); if (key) { switch (key) { case WKUP_PRES: beep_freq--; if (beep_freq == 0) { BEEP_TOGGLE(); beep_freq = 100; } break; case KEY0_PRES: led_freq--; if (led_freq == 0) { LED0_TOGGLE(); led_freq = 100; } break; case KEY1_PRES: led_freq++; if (led_freq > 500) { LED1_TOGGLE(); led_freq = 100; } break; case KEY2_PRES: beep_freq--; if (beep_freq == 0) { BEEP_TOGGLE(); beep_freq = 100; } break; default : break; } } else { delay_ms(10); } } }如何用一个按键500ms频率闪烁led,按下另一个按键切换成1000ms频率闪烁led,一个按键500ms频率控制蜂鸣器,按下另一个按钮以1000ms频率控制蜂鸣器
您可以按照以下代码进行修改:
```c
int main(void)
{
uint8_t key;
uint16_t led_freq = 500;
uint16_t beep_freq = 500;
sys_stm32_clock_init(336, 8, 2, 7);
delay_init(168);
led_init();
beep_init();
key_init();
LED0(0);
while(1)
{
key = key_scan(0);
if (key)
{
switch (key)
{
case WKUP_PRES:
if (beep_freq == 500)
{
beep_freq = 1000;
}
else
{
beep_freq = 500;
}
break;
case KEY0_PRES:
led_freq = 500;
break;
case KEY1_PRES:
led_freq = 1000;
break;
case KEY2_PRES:
if (beep_freq == 500)
{
beep_freq = 1000;
}
else
{
beep_freq = 500;
}
break;
default :
break;
}
}
LED0_TOGGLE(); //闪烁LED
delay_ms(led_freq); //延时
if (beep_freq == 500)
{
BEEP_TOGGLE();
}
delay_ms(beep_freq); //延时
}
}
```
在此代码中,我们添加了两个变量 led_freq 和 beep_freq 分别用于控制 LED 和蜂鸣器的频率。初始值都设置为 500ms。当按下 WKUP_PRES 或 KEY2_PRES 时,beep_freq 将切换到 1000ms。当按下 KEY0_PRES 或 KEY1_PRES 时,led_freq 将分别设置为 500ms 或 1000ms。在循环中,我们使用 LED0_TOGGLE() 和 BEEP_TOGGLE() 来切换 LED 和蜂鸣器的状态,并使用 delay_ms() 函数来延时 led_freq 和 beep_freq 的时间。
阅读全文