《智能取餐柜实战》6-LED控制逻辑与实现

目标:

  1. 掌握 STM32 配置 IO 口功能
  2. 控制板上 LED 灯的亮灭

往期

《智能取餐柜实战》5-STM32工程创建-CSDN博客

《智能取餐柜实战》4-系统组成和项目分解-CSDN博客

《智能取餐柜实战》3-常用软件安装和使用-CSDN博客

《智能取餐柜实战》2-嵌入式软件开发规范-CSDN博客

《智能取餐柜实战》01-项目介绍-CSDN博客

1. 前言

目标:使用 STM32 控制 LED 灯的亮灭。

相信各位同学在高中的时候肯定学习过,一个直流灯要亮,只需要在正负极两端加上电压,就可以亮起来了,那么对于学习 STM32 驱动 LED 灯肯定是易如反掌。


开始打广告开始打广告开始打广告开始打广告开始打广告开始打广告


本专栏适合什么人群?

  1. 需要找一个项目做毕业设计(学士硕士)的做做,这个项目可以优选,都可以从本专栏中得到实现项目功能的代码,只需要简单的变通,就能实现各式各样的功能!!!
  2. 需要找一个项目作为课程设计的,可以选用本教程的阶段性成果,在每个阶段都会有现成的代码,可直接使用!!!
  3. 刚毕业大学生,物联网工程专业、电子工程专业等,对学习的知识不是很了解,想找一个项目练练手,那么这个专栏是你的不二之选。

专栏特色

本专栏涉及到代码的小节,都会以压缩包的形式将代码打包好贡献给各位读者,还会有详细的视频教各位如何运行,由于 CSDN 不允许上传视频,专栏以 QQ 群的方式,向各位读者提供讲解视频和答疑,关注《柴头物联网》公众号,点击“找到柴头”,拿到 QQ 二维码,扫码添加,拉您进群。

结束打广告结束打广告结束打广告结束打广告结束打广告结束打广告结束打广告结束打广告


2. 认识基本符号

从左到右

  • GND: 电源地,以后看到 GND、G 都是电源地
  • VCC:电源,一般指 5V,其他电压会写成 3V3、12V、24V 等
  • LED:这是一个发光二极管,也是一个 LED 灯,根据三角形的反向,可以判断出左边是正极

3. 如何亮灯

  • 那么这样一接,灯就亮了

由于 LED 灯的内阻过小,这样接过去会导致 VCC、GND 直接导通,造成短路,我们就需要在中间加一个电阻,如下图。

到此,我们就知道了如何看懂一个 LED 的电路图了,那么接下来我们就要学习,如何使用 STM32 的引脚来驱动一个 LED 灯。

其实不难发现,我们只需要将 VCC 更换成 STM32 上的一个引脚,然后让其输出高电平,就能驱动 LED 灯了,如下图(使用 PC13)

这个时候,我们只需要将 STM32 上的 PC13 引脚设置为高电平输出,就可以驱动 LED 灯,当 PC13 为低电平时,LED 灯就是灭的。

4. 那么如何配置才能将 PC13 设置为高电平输出呢?

这个时候就需要配置 PC13 为推挽输出,当然 STM32 的引脚功能还有很多其他的,一共 8 种,此处我们只需要知道,使用推挽输出可以驱动 LED 灯。

5. 在 STM32 控制 LED 灯实现步骤

  1. 将 STM32 上连接灯的引脚配置为推挽输出
  2. 亮灯:将该引脚设置为输出高电平
  3. 灭灯:将该引脚设置为输出低电平

5.1. 将 STM32 上连接灯的引脚配置为推挽输出

void dledInit(){
    GPIO_InitTypeDef gpioInitStruct;					//结构体定义
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//总线2时钟开关
    gpioInitStruct.GPIO_Pin = GPIO_Pin_13;				//引脚
    gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;		//模式为推挽输出
    gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;		//设置频率为50HZ
    GPIO_Init(GPIOC,  &gpioInitStruct);				//GPIO初始化
}

5.2. 亮灯与灭灯

我们可以通过以下的方式控制 led 灯的状态,这是最简单快捷的方式,但是不好移植,也没有做软件架构分层

int main(){
    GPIO_SetBits(GPIOC, GPIO_Pin_13);// 设置引脚输出高电平
    delay(1000);
    GPIO_ResetBits(GPIOC, GPIO_Pin_13);		// 设置引脚输出低电平
}
  • 通过设置引脚输出高电平 、低电平就可以控制 LED 灯的状态了

  1. 所以我们应该在 drive 中新增两个方法,用于控制高低电平的
void dLedHigh(){
    GPIO_SetBits(GPIOC, GPIO_Pin_13);
}

void dLedLow(){
    GPIO_ResetBits(GPIOC, GPIO_Pin_13);	
}
  1. 新增一个 service_led.c 文件
void sLedOpen(){
    dLedHigh();
}

void sLedClose(){
    dLedLow();
}

上述的头文件引入都省略了

  1. 我们在 main 函数中调用 service 中的方法,如下
int main(){
    uDelayInit();
    while(1){
        sLedOpen();
        uDelayMs(1000);
        sLedClose();
        uDelayMs(1000);
    }

}
  • uDelayInit是工具类中的延时初始化函数
  • uDelayMs是用来延时毫秒的,这里传入参数 1000 就是延时一秒钟

通过这样,我们就可以控制 LED 灯的亮灭了!

6. 结语

本小节讲了 LED 灯的控制,同时巩固了之前讲到的嵌入式软件开发规范中提到的规范,相信各位读者已经对软件架构的设计有了更深的理解。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值