学习目标

  1. 熟悉原理图设计
  2. 熟悉对应引脚功能
  3. 能够使用IO控制多个LED开关
  4. 能够制作流水灯

    学习内容

    原理图

    107.png

    控制分析

    S8550 PNP 特性

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

    开关控制

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

    LED控制

    微信截图_20221207094546.png
    通过LED的负极控制灯是否亮。如果负极为低则亮,负极为高则不亮。

功能设计

点亮LED

点亮灯泡1

几种GPIO模式
  1. 准双向口,也称为弱上拉模式,可做输入和输出操作,电流小,通常作为信号功能使用
  2. 推挽输出,也称为强上拉模式,作为输出操作,电流持续,作为功率输出
  3. 开漏输出,可做输入和输出操作,需要外部提供上拉电阻
  4. 高阻输入,电流无法输入,但是可以外部输入电平会拉高或拉低其位寄存器,用于数模转换
    三极管特点
    三极管是电流控制的器件,如果需要三极管导通或是关闭,需要持续给B极输入电流。(相对于mos管而言,三极管功耗较大,mos管耗电要少很多)
    示例代码
    ```c

    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); //初始化

  1. GPIO_InitStructure.Pin = GPIO_Pin_5; //指定要初始化的IO,
  2. GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  3. GPIO_Inilize(GPIO_P4,&GPIO_InitStructure); //初始化

}

int main() { //GPIO 初始化
GPIO_config();

  1. // led 开关打开
  2. P45 = 0;
  3. while(1) {
  4. P27 = 1;
  5. delay_ms(250);
  6. delay_ms(250);
  7. delay_ms(250);
  8. delay_ms(250);
  9. P27 = 0;
  10. delay_ms(250);
  11. delay_ms(250);
  12. delay_ms(250);
  13. delay_ms(250);
  14. }
  15. return 0;

}

  1. <a name="ieQPI"></a>
  2. #### 走马灯
  3. 实现灯的顺序点亮
  4. ```c
  5. #include "config.h"
  6. #include "GPIO.h"
  7. #include "delay.h"
  8. #define LED1 P27
  9. #define LED2 P26
  10. #define LED3 P15
  11. #define LED4 P14
  12. #define LED5 P23
  13. #define LED6 P22
  14. #define LED7 P21
  15. #define LED8 P20
  16. #define LED_SW P45
  17. void GPIO_config(void) {
  18. GPIO_InitTypeDef GPIO_InitStructure; //结构定义
  19. GPIO_InitStructure.Pin = GPIO_Pin_5; //指定要初始化的IO,
  20. GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  21. GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
  22. GPIO_InitStructure.Pin = GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO,
  23. GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  24. GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);//初始化
  25. GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,
  26. GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  27. GPIO_Inilize(GPIO_P2, &GPIO_InitStructure);//初始化
  28. }
  29. int main() {
  30. int i;
  31. GPIO_config();
  32. EA = 1;
  33. LED_SW = 0;
  34. while(1) {
  35. for(i = 0;i < 8;i++) {
  36. LED1 = i == 0 ? 0 : 1;
  37. LED2 = i == 1 ? 0 : 1;
  38. LED3 = i == 2 ? 0 : 1;
  39. LED4 = i == 3 ? 0 : 1;
  40. LED5 = i == 4 ? 0 : 1;
  41. LED6 = i == 5 ? 0 : 1;
  42. LED7 = i == 6 ? 0 : 1;
  43. LED8 = i == 7 ? 0 : 1;
  44. delay_ms(100);
  45. }
  46. for(i = 7;i >= 0;i--) {
  47. LED1 = i == 0 ? 0 : 1;
  48. LED2 = i == 1 ? 0 : 1;
  49. LED3 = i == 2 ? 0 : 1;
  50. LED4 = i == 3 ? 0 : 1;
  51. LED5 = i == 4 ? 0 : 1;
  52. LED6 = i == 5 ? 0 : 1;
  53. LED7 = i == 6 ? 0 : 1;
  54. LED8 = i == 7 ? 0 : 1;
  55. delay_ms(100);
  56. }
  57. }
  58. }

练习题

  1. 实现单个LED灯的点亮
  2. 实现走马灯
  3. 通过串口控制,实现左转弯流水灯和右转弯流水灯效果