🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》
⛺️心若有所向往,何惧道阻且长
文章目录
- 原理图
- 控制分析
- 开关控制
- LED控制
- 功能设计
- 点亮LED
- 三极管特点
- 走马灯
原理图
控制分析
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模式
- 准双向口,也称为弱上拉模式,可做输入和输出操作,电流小,通常作为信号功能使用
- 推挽输出,也称为强上拉模式,作为输出操作,电流持续,作为功率输出
- 开漏输出,可做输入和输出操作,需要外部提供上拉电阻
- 高阻输入,电流无法输入,但是可以外部输入电平会拉高或拉低其位寄存器,用于数模转换
三极管特点
三极管是电流控制的器件,如果需要三极管导通或是关闭,需要持续给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_PPGPIO_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_PPGPIO_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 P45void 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_PPGPIO_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_PPGPIO_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_PPGPIO_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);}}
}