单片机跑马灯实验 配置两个LED灯,一个每 200ms 改变一次状态,一个每 300ms改变一次状态(提示 使用时基)
时间: 2024-05-09 20:20:47 浏览: 48
以下是单片机跑马灯实验的代码:
```
#include <reg52.h> // 引入单片机头文件
#define LED1 P1_0 // 配置 LED1 连接的引脚
#define LED2 P1_1 // 配置 LED2 连接的引脚
void delay(unsigned int time) // 延时函数,以毫秒为单位
{
unsigned int i, j;
for (i = time; i > 0; i--)
for (j = 114; j > 0; j--);
}
void main()
{
while (1)
{
LED1 = ~LED1; // LED1 状态翻转
delay(200); // 延时 200ms
LED2 = ~LED2; // LED2 状态翻转
delay(100); // 延时 100ms
LED2 = ~LED2; // LED2 状态翻转
delay(200); // 延时 200ms
}
}
```
以上代码中,使用了 `delay` 函数实现了延时操作,而 `LED1` 每 200ms 改变一次状态,`LED2` 每 300ms 改变一次状态,在代码中的实现是先将 `LED2` 改变一次状态,然后等待 100ms,再将 `LED2` 再次改变一次状态,最后等待 200ms,再将 `LED1` 改变一次状态,如此循环往复,就实现了单片机跑马灯的效果。
相关问题
stm32单片机跑马灯实现一秒亮一个灯,下一秒亮两个灯,以此类推直至亮八个灯。得出代码
STM32单片机实现这种跑马灯效果通常需要使用定时器配合GPIO控制LED灯。我们可以使用 TIM1 定时器的 PWM 功能,通过改变占空比逐个点亮不同数量的灯。这里假设我们有8个独立的LED连接到GPIO。
首先,我们需要配置TIM1为PWM模式,并设置适当的预分频值和周期,使得每过一秒钟可以实现不同的灯数闪烁。下面是一个基本的示例代码片段,使用了Keil STM32CubeMX生成的基本框架:
```c
#include "stm32f10x_tim.h"
// LED GPIO初始化
void LedInit(uint8_t ledPin[], uint8_t numLEDs) {
GPIO_InitTypeDef GPIO_InitStructure;
for (uint8_t i = 0; i < numLEDs; i++) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启PB口时钟
GPIO_InitStructure.GPIO_Pin = ledPin[i]; // 设置每个LED对应的GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode Outs; // 输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 高速
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
}
// PWM设置函数
void TimInitForPulseWidthModulation() {
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure;
TIM_TimeBaseInitTypeDef.TIM_PrescalerValue = 8400 - 1; // 根据系统频率和周期计算
TIM_TimeBaseInitTypeDef.TIM_Period = 192; // 一秒钟内的脉冲周期,比如1000ms * 8 / 16 = 50Hz * 192
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitTypeDef);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 输出通道1为PWM模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 0; // 脉冲宽度为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平
TIM_OC2Init(TIM1, &TIM_OCInitStructure); // 初始化第一个LED对应的OC2
TIM_Cmd(TIM1, ENABLE); // 启动TIM1
}
// 主函数
int main(void) {
LedInit(LedPinArray, NUM_LEDS); // LED引脚数组和LED总数
TimInitForPulseWidthModulation();
while (1) {
// 每隔一定时间调整下一个LED的占空比,例如每隔0.125秒
if (millisecond_counter % 8 == 0) { // millisecond_counter模拟毫秒计数
TIM_OC2PreloadConfig(TIM1, DISABLE); // 清除当前的PWM值
TIM_OC2LoadConfig(TIM1, (millisecond_counter % 8) << 4); // 设置新的占空比
TIM_OC2PreloadConfig(TIM1, ENABLE); // 更新占空比
}
}
return 0;
}
```
这里的`LedPinArray`是LED引脚数组,`NUM_LEDS`是LED的数量。注意这个代码只是一个简化版的示例,实际应用中可能需要处理中断、延时等细节。此外,你需要替换`millisecond_counter`为实际的时间管理函数,如硬件定时器或其他计数方法。
阅读全文