基于STM32单片机的流水灯控制-74HC595

基于STM32单片机的流水灯控制-74HC595

冰果派-棉花糖V1.0开发板

在这里插入图片描述


一 任务

  • 实现8个灯的流水灯控制

二 硬件电路如何设计

1. IO口不够用

能够预留给灯的IO只有4个

2.74HC595D

在这里插入图片描述

  • 作用

    1. IO口扩展

      串口转并口芯片(跟单片机采用串口方式进行通信,然后将单片机发来的数据转换成并口输出)

    2. 提高驱动能力

      STM32F103C8T6:MCU 微控制器(主要功能是:控制 不能用作驱动)

  • 引脚简介

    在这里插入图片描述

    • 一共16个引脚
      在这里插入图片描述
  • 硬件电路设计

    单片机一共就3个引脚,如何控制8路LED

    • 595连接LED电路

在这里插入图片描述

  • 转换开关

在这里插入图片描述

  • 芯片端

在这里插入图片描述

三 程序怎么编写

1.单片机怎么把数据给595

  • SER

    数据引脚

    比如:0x80 1000 0000 给74HC595

  • SCR

    双方同步时钟信号

  • RCK

    当数据传输完成后,RCK来一个上升沿之后595就把接收到的串行数据转成并行数据输出

  • 总结

    单片机和595通过SER和SCK两个引脚配合,就可以把数据从单片机传送给595,传送完成让RCK出现一个上升沿,595就把接受的数据输出

  • 核心

    单片机(主器件) 74HC595(受控器件)

2.写程序(595驱动)

  • 驱动源文件

    #include "TI74HC595.h"
    
    void TI74HC595_SendByte(uint8_t dat)
    {
    	uint8_t mid;
    	HAL_GPIO_WritePin(HC595_SCK_PORT, HC595_SCK_PIN, GPIO_PIN_SET);
    	HAL_GPIO_WritePin(HC595_RCK_PORT, HC595_RCK_PIN, GPIO_PIN_SET);
    	for(mid=0;mid<8;mid++) //发送 8 位数
    	{
    		if((dat >> 7) == 0x01){
    			HAL_GPIO_WritePin(HC595_SER_PORT, HC595_SER_PIN, GPIO_PIN_SET);
    		}else{
    			HAL_GPIO_WritePin(HC595_SER_PORT, HC595_SER_PIN, GPIO_PIN_RESET);
    		}
    		dat <<= 1;
    		HAL_GPIO_WritePin(HC595_SCK_PORT, HC595_SCK_PIN, GPIO_PIN_RESET);
    		HAL_Delay(1);
    		HAL_GPIO_WritePin(HC595_SCK_PORT, HC595_SCK_PIN, GPIO_PIN_SET);
    	}
    	HAL_GPIO_WritePin(HC595_RCK_PORT, HC595_RCK_PIN, GPIO_PIN_RESET);
    	HAL_Delay(1);
    	HAL_GPIO_WritePin(HC595_RCK_PORT, HC595_RCK_PIN, GPIO_PIN_SET);
    }
    
  • 驱动头文件

    #ifndef TI74HC595_H_
    #define TI74HC595_H_
    /* ------------------------------------------------------------------*/
    #include "main.h"
    #include "gpio.h"
    /* ------------------------------------------------------------------*/
    #define HC595_SER_PORT  GPIOA
    #define HC595_SER_PIN   GPIO_PIN_0
    
    #define HC595_SCK_PORT  GPIOA
    #define HC595_SCK_PIN   GPIO_PIN_8
    
    #define HC595_RCK_PORT  GPIOB
    #define HC595_RCK_PIN   GPIO_PIN_1
    /* ------------------------------------------------------------------*/
    void TI74HC595_SendByte(uint8_t dat);
    /* ------------------------------------------------------------------*/
    #endif 
    

3.流水灯程序的实现

3.1 任务要求

在这里插入图片描述

3.2 实现逻辑

单片机给74HC595发:

  • 1000 0000 0x80

  • 1100 0000 0xC0

  • 1110 0000

  • 1111 1111

  • 0000 0000

3.3 代码实现逻辑

uint8_t a = 0x00,i = 0;

while(1)
{
    for(i = 0;i<8;i++){
        a = (a>>1) + 0x80;   // 1000 0000 | 1100 0000 | 1110 0000 | 1111 0000 | 1111 1000 | 1111 1100 |
                             // 1111 1110 | 1111 1111
        TI74HC595_SendByte(a);
        HAL_Delay(300);
    }
    a = 0x00;
    TI74HC595_SendByte(a);
    HAL_Delay(300);
}

四 总结

  • 串口转并口芯片74HC595D
    • 以后单片机引脚不够的时候,使用这个芯片进行扩展
  • 我们要学会以后看芯片数据手册
  • 在实现功能之前,首先要把问题分析清除
    300);
    }
    a = 0x00;
    TI74HC595_SendByte(a);
    HAL_Delay(300);
    }

# 四 总结

+ 串口转并口芯片74HC595D
  + 以后单片机引脚不够的时候,使用这个芯片进行扩展
+ 我们要学会以后看芯片数据手册
+ 在实现功能之前,首先要把问题分析清除
+ 实现了模拟奥迪车灯

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是基于STM32单片机74HC595驱动8个LED灯的代码: ```c #include "stm32f10x.h" #define HC595_PORT GPIOA #define HC595_DS_PIN GPIO_Pin_0 #define HC595_SHCP_PIN GPIO_Pin_1 #define HC595_STCP_PIN GPIO_Pin_2 void HC595_Init(void); void HC595_Write(uint8_t dat); int main(void) { HC595_Init(); uint8_t led_data = 0x01; while (1) { HC595_Write(led_data); led_data = (led_data << 1) | (led_data >> 7); //循环移位 for (uint16_t i = 0; i < 10000; i++); //延时 } } void HC595_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = HC595_DS_PIN | HC595_SHCP_PIN | HC595_STCP_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HC595_PORT, &GPIO_InitStructure); GPIO_ResetBits(HC595_PORT, HC595_DS_PIN | HC595_SHCP_PIN | HC595_STCP_PIN); } void HC595_Write(uint8_t dat) { for (uint8_t i = 0; i < 8; i++) { if (dat & 0x80) GPIO_SetBits(HC595_PORT, HC595_DS_PIN); else GPIO_ResetBits(HC595_PORT, HC595_DS_PIN); GPIO_SetBits(HC595_PORT, HC595_SHCP_PIN); GPIO_ResetBits(HC595_PORT, HC595_SHCP_PIN); dat <<= 1; } GPIO_SetBits(HC595_PORT, HC595_STCP_PIN); GPIO_ResetBits(HC595_PORT, HC595_STCP_PIN); } ``` 在此代码中,我们使用STM32的GPIO模块控制74HC595芯片,来实现控制8个LED灯的功能。具体实现方式为,通过循环移位来得到要显示的数据,并将数据写入到74HC595芯片中,然后通过锁存时钟信号(STCP)将数据传给输出寄存器,最后通过移位时钟信号(SHCP)将输出寄存器中的数据传给移位寄存器,然后通过数据信号(DS)将数据传入到移位寄存器中,完成LED灯的控制

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工控小机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值