• 嵌入式进阶——LED灯


    🎬 秋野酱:《个人主页》
    🔥 个人专栏:《Java专栏》《Python专栏》

    ⛺️心若有所向往,何惧道阻且长

    原理图

    在这里插入图片描述

    控制分析

    S8550 PNP 特性
    在这里插入图片描述
    B: base, 基极。(理解:基于/根据 这个条件做什么事情)
    E: emitter, 发射极。(理解:发射端)
    C: collector, 集电极。(理解:收集电的区域,用电的器件在这个区域)
    PNP型三极管,E极为输入端,C极为输出端,B极为控制端
    B极 为高电平时,E极到C极的电路截止,无法导通。
    B极 为低电平时,E极到C极的电路打开,正常导通。

    开关控制

    通过引脚 LED_SW来控制 B极是否为高低电平来控制是否导通

    LED控制

    在这里插入图片描述
    通过LED的负极控制灯是否亮。如果负极为低则亮,负极为高则不亮。

    功能设计

    点亮LED

    点亮灯泡1
    几种GPIO模式

    1. 准双向口,也称为弱上拉模式,可做输入和输出操作,电流小,通常作为信号功能使用
    2. 推挽输出,也称为强上拉模式,作为输出操作,电流持续,作为功率输出
    3. 开漏输出,可做输入和输出操作,需要外部提供上拉电阻
    4. 高阻输入,电流无法输入,但是可以外部输入电平会拉高或拉低其位寄存器,用于数模转换

    三极管特点

    三极管是电流控制的器件,如果需要三极管导通或是关闭,需要持续给B极输入电流。(相对于mos管而言,三极管功耗较大,mos管耗电要少很多)
    示例代码

    #include "config.h"
    #include "GPIO.h"
    #include "delay.h"
    
    void	GPIO_config(void)
    {
    	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
    	GPIO_InitStructure.Pin  = GPIO_Pin_7;		//指定要初始化的IO,
    	GPIO_InitStructure.Mode = GPIO_PullUp;		//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    	GPIO_Inilize(GPIO_P2,&GPIO_InitStructure);	//初始化
    	
    	GPIO_InitStructure.Pin  = GPIO_Pin_5;		//指定要初始化的IO,
    	GPIO_InitStructure.Mode = GPIO_OUT_PP;		//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    	GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);	//初始化
    }
    
    
    int main() {
    	//GPIO 初始化	
    	GPIO_config();
    	
    	// led 开关打开
    	P45 = 0;
    	
    	while(1) {
    		P27 = 1;
    		delay_ms(250);
    		delay_ms(250);
    		delay_ms(250);
    		delay_ms(250);
    		P27 = 0;
    		delay_ms(250);
    		delay_ms(250);
    		delay_ms(250);
    		delay_ms(250);
    	}
    	
    	return 0;
    }
    

    走马灯

    实现灯的顺序点亮

    #include "config.h"
    #include "GPIO.h"
    #include "delay.h"
    
    #define LED1		P27
    #define LED2		P26
    #define LED3		P15
    #define LED4		P14
    #define LED5		P23
    #define LED6		P22
    #define LED7		P21
    #define LED8		P20
    #define LED_SW	P45
    
    void GPIO_config(void) {
    	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
    	GPIO_InitStructure.Pin  = GPIO_Pin_5;		//指定要初始化的IO,
    	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    	GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
    	
    	GPIO_InitStructure.Pin  = GPIO_Pin_4 | GPIO_Pin_5;		//指定要初始化的IO,
    	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    	GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);//初始化
    	
    	GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7;		//指定要初始化的IO,
    	GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    	GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);//初始化
    }
    
    
    int main() {
    	int i;
    	GPIO_config();
    	
    	EA = 1;
    	
    	LED_SW = 0;
    	while(1) {
    		for(i = 0;i < 8;i++) {
    			LED1 = i == 0 ? 0 : 1;
    			LED2 = i == 1 ? 0 : 1;
    			LED3 = i == 2 ? 0 : 1;
    			LED4 = i == 3 ? 0 : 1;
    			LED5 = i == 4 ? 0 : 1;
    			LED6 = i == 5 ? 0 : 1;
    			LED7 = i == 6 ? 0 : 1;
    			LED8 = i == 7 ? 0 : 1;
    			delay_ms(100);
    		}
    		for(i = 7;i >= 0;i--) {
    			LED1 = i == 0 ? 0 : 1;
    			LED2 = i == 1 ? 0 : 1;
    			LED3 = i == 2 ? 0 : 1;
    			LED4 = i == 3 ? 0 : 1;
    			LED5 = i == 4 ? 0 : 1;
    			LED6 = i == 5 ? 0 : 1;
    			LED7 = i == 6 ? 0 : 1;
    			LED8 = i == 7 ? 0 : 1;
    			delay_ms(100);
    		}
    	}
    }
    
  • 相关阅读:
    1053 Path of Equal Weight
    mysql中update更新时加条件和不加条件速度对比
    JavaEE:File类查询一个文件的路径(举例+源码 )
    map & set
    DAMO-YOLO训练自己的数据集,使用onnxruntime推理部署
    几个强力的nodejs库
    02.1、数据操作
    visual studio code中base环境切换的问题
    Linux系统调优详解(七)——网络状态查看命令nethogs
    Eureka介绍与使用
  • 原文地址:https://blog.csdn.net/qiuyeyyy/article/details/139128424