GD32用IO口模拟呼吸灯

本文介绍了如何使用C语言控制单片机的IO口实现LED灯的闪烁效果,并扩展到模拟呼吸灯功能。通过按键控制呼吸频率,展示了如何调整LED灯的亮暗周期。核心代码和关键技术如单片机控制、定时器延时、按键中断都被详细讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“呼吸灯”其实就是小灯的亮度是逐渐变化的,也就是说,只要能够使用单片机控制小灯的亮度,“呼吸灯”的效果也就实现了。

使用C语言控制单片机IO交替输出高低电平,实现LED小灯的闪烁效果。核心代码如下:

while(1){
        P20 = 0;
        delay(10);
        P20 = 1;
        delay(10);
    }

IO输出的高低电平持续时间都是10个单位,一个完整的周期内,LED小灯的亮灭时间都是相等的。由此可见,使用单片机控制小灯亮度,就是控制一个周期内,LED小灯的亮灭持续时间长短而已。代码如下:


/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"

void delay(uint32_t i);

void delay(unsigned int n) {
    char darkTime = 0, dir = 1;
    unsigned int cnt = 0;
     unsigned int x ;
	   while(n--) {
	    x=50;
       while(x--);			 		 
	}
}

void twinkle_once(unsigned char darkTime) {
      gd_eval_led_off(LED2);
	    delay(100-darkTime);
	    gd_eval_led_on(LED2);
	     delay(darkTime);

}
int main(void)
{  
   char darkTime = 0, dir = 1;
    unsigned int cnt = 0;
    gd_eval_led_init(LED2);
    
    while(1){

        cnt ++;
        twinkle_once(darkTime);
        if(cnt == 50){
            cnt = 0;
            if(dir)
                darkTime += 1;
            else
                darkTime -= 1;

            if(darkTime >= 100)
                dir = 0;
            if(darkTime <= 60)
                dir = 1;
        }
    }
}
  

通过按键控制呼吸频率代码如下:



/*
    Copyright (C) 2017 GigaDevice

    2017-06-23, V1.0.0, demo for GD32F30x
*/

/* IO模拟呼吸灯*/
#include "gd32f30x.h"
#include "gd32f303c_eval.h"
#include "systick.h"

uint16_t darkTime = 0, dir = 1;
unsigned int cnt = 0;
uint32_t temp;


void delay(unsigned int n) {
     unsigned int x ;
	   while(n--) {
	    x=50;
       while(x--);			 		 
	}
}
/*闪烁次数*/
void twinkle_once(unsigned char darkTime) {
      gd_eval_led_off(LED2);
	    delay(100-darkTime);
	    gd_eval_led_on(LED2);
	     delay(darkTime);

}
int main(void)
{  
    gd_eval_led_init(LED2);
	 gd_eval_led_init(LED3);
	   

	gd_eval_key_init(KEY_WAKEUP,KEY_MODE_GPIO);
	gd_eval_key_init(KEY_TAMPER,KEY_MODE_GPIO);
    systick_config();
    
    while(1){
				if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
            /* delay 50ms for software removing jitter */
            delay_1ms(50);
            if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){				 
    while(1){

        cnt ++;
        twinkle_once(darkTime);
        if(cnt == 50){
            cnt = 0;
            if(dir)
                darkTime += 8;
            else
                darkTime -= 8;

            if(darkTime >= 100)
                dir = 0;
            if(darkTime <= 60)
                dir = 1;
        }
  }
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值