YmY68560 2024-05-16 13:56 采纳率: 0%
浏览 4

输入24位二进制代码控制并行输出的24个led

我想在串口调试助手输入24位二进制代码给esp32,通过三个级联的74HC595控制并行输出的24个led,为什么结果不对呢求指教,下面是代码

import machine
import uasyncio as asyncio

# 设置串口引脚
UART_TX_PIN = 17
UART_RX_PIN = 16

# 初始化串口
uart = machine.UART(1, baudrate=115200, tx=UART_TX_PIN, rx=UART_RX_PIN)

# 设置74HC595引脚
# 74HC595引脚定义
DATA_PIN = 18
CLOCK_PIN = 19
LATCH_PIN = 21

# 初始化74HC595引脚
data_pin = machine.Pin(DATA_PIN, machine.Pin.OUT)
clock_pin = machine.Pin(CLOCK_PIN, machine.Pin.OUT)
latch_pin = machine.Pin(LATCH_PIN, machine.Pin.OUT)

async def control_led(data):
    # 将数据传送给74HC595芯片并控制LED
    for segment_data in data:
        for byte in segment_data:
            for i in range(8):
                # 依次发送每一位数据到74HC595
                if byte & (1 << i):
                    data_pin.on()
                else:
                    data_pin.off()

                # 上升沿触发时钟
                clock_pin.on()
                await asyncio.sleep_ms(1)
                clock_pin.off()

            # 上升沿触发锁存
            latch_pin.on()
            await asyncio.sleep_ms(1)
            latch_pin.off()

            # 等待一段时间,控制LED保持稳定状态
            await asyncio.sleep_ms(10)  # 降低等待时间,以便快速刷新LED状态
        while True:
           pass  # 无限循环,保持输出端口状态不变
# 异步函数,用于接收PC端发送的二进制数据并控制LED
async def receive_and_control_led():
    while True:
        if uart.any():  # 检查是否有数据到达
            data = uart.read(3)  # 读取24位二进制数据
            segments = [data[:8], data[8:16], data[16:]]  # 分割数据为三个8位段
            await control_led(segments)  # 控制LED
        await asyncio.sleep_ms(10)  # 延迟以确保正确时序

# 创建事件循环
loop = asyncio.get_event_loop()

# 启动异步任务
loop.create_task(receive_and_control_led())

# 保持微控制器处于空闲状态
try:
    loop.run_forever()
except KeyboardInterrupt:
    loop.close()


```

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-16 13:56
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您的目的在于通过串口从PC端接收24位的二进制数据,然后使用ESP32控制三个级联的74HC595来并行驱动24个LED,但当前实现的结果不符合预期。

    问题出现原因

    1. 数据接收问题:代码中使用uart.read(3)尝试读取24位数据,但实际上可能无法保证一次读取到完整的24位数据。
    2. 数据分割问题:即使读取到了24位数据,将其分割为三个8位段的方式可能存在问题。
    3. 控制逻辑问题:控制LED的逻辑可能存在问题,特别是在位操作和时序控制上。
    4. 锁存信号问题:在控制LED的函数中,锁存信号的触发方式可能不正确。

    问题解决方案

    1. 确保数据完整性:需要保证从串口读取的数据是完整的24位。
    2. 正确分割数据:读取到的数据应该正确分割成三个8位的数据段。
    3. 修正控制逻辑:调整控制LED的逻辑,确保每一位都能正确地被处理。
    4. 优化锁存信号触发:确保锁存信号能够在正确的时刻触发。

    提供代码

    以下是修改后的代码示例,解决了上述问题:

    import machine
    import uasyncio as asyncio
    
    # 设置串口引脚
    UART_TX_PIN = 17
    UART_RX_PIN = 16
    
    # 初始化串口
    uart = machine.UART(1, baudrate=115200, tx=UART_TX_PIN, rx=UART_RX_PIN)
    
    # 设置74HC595引脚
    DATA_PIN = 18
    CLOCK_PIN = 19
    LATCH_PIN = 21
    
    # 初始化74HC595引脚
    data_pin = machine.Pin(DATA_PIN, machine.Pin.OUT)
    clock_pin = machine.Pin(CLOCK_PIN, machine.Pin.OUT)
    latch_pin = machine.Pin(LATCH_PIN, machine.Pin.OUT)
    
    async def control_led(data):
        # 将数据传送给74HC595芯片并控制LED
        for byte in data:
            for i in range(8):
                data_pin.value = (byte & (1 << i)) >> i
                clock_pin.value = 1
                await asyncio.sleep_ms(1)
                clock_pin.value = 0
            latch_pin.value = 1
            await asyncio.sleep_ms(1)
            latch_pin.value = 0
    
    async def receive_and_control_led():
        while True:
            data = uart.read(3)  # 尝试读取3字节数据
            if len(data) == 3:  # 确保读取到的数据长度正确
                data = int.from_bytes(data, 'big')  # 将字节数据转换为整数
                segment_data = [(data >> (8 * i)) & 0xFF for i in range(3)]  # 分割数据为三个8位段
                await control_led(segment_data)  # 控制LED
            await asyncio.sleep_ms(10)  # 延迟以确保正确时序
    
    # 创建事件循环
    loop = asyncio.get_event_loop()
    
    # 启动异步任务
    loop.create_task(receive_and_control_led())
    
    # 保持微控制器处于空闲状态
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        loop.close()
    

    代码运行方式

    • 确保ESP32开发板连接到电脑,并且已经安装了相应的驱动程序。
    • 将上述代码上传到ESP32开发板上。
    • 使用串口调试助手或其他串口通信工具发送24位的二进制数据。
    • 观察LED的响应是否与发送的数据一致。

    代码预期运行结果

    如果代码正确运行,那么当串口调试助手发送24位二进制数据时,ESP32将通过级联的74HC595控制24个LED的亮灭状态,以反映发送的数据。

    推荐相关链接

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月16日

悬赏问题

  • ¥15 gojs 点击按钮node的position位置进行改变,再次点击回到原来的位置
  • ¥15 计算决策面并仿真附上结果
  • ¥20 halcon 图像拼接
  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么