简易数字电压表程序框架

简易数字电压表:
①电路如图所示,要求在液晶屏
第一行按“U=1.23V”的格式实时显
示滑动头端的电压,请编程实现。
②调整滑动变阻器滑动头,查看
并记录当滑动头分别处于10%,50%
和100%位置时液晶屏上的显示值;
③*在以上任务成功的基础上,仿
照1602的驱动程序,把MAX1241驱动
程序做成单独一个文件,以便移植。

img


程序不会设计了,请帮帮忙吧。

程序使用C语言?
可以参考这里的设计看看:https://zhuanlan.zhihu.com/p/635050882

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7637963
  • 你也可以参考下这篇文章:变频器等设备在工业控制系统中的“干扰”分析1:90%的电磁干扰问题是共模电流导致
  • 以下回答来自chatgpt:

    我可以为您设计一份简易数字电压表程序框架。该电压表的电路如下图所示:

    电路图

    1. 首先,我们需要使用MAX1241芯片来读取电压值。在代码中,我们应该先定义MAX1241的寄存器地址和命令格式,然后再写一个函数来读取MAX1241的输出电压值。在此之前,我们需要连接MAX1241芯片的控制线和数据线,这可以使用GPIO口和SPI协议来实现。
    MAX1241命令格式:(bit7)S/(bit6)D2/(bit5)D1/(bit4)D0/(bit3)C3/(bit2)C2/(bit1)C1/(bit0)C0
    S=0:Single ended input
    D2-D0:Channel Select(0~7)
    C3~C0:Input Range(0000=0~5V, 0001=0~10V, 0010=±5V, 0011=±10V)
    

    示例代码:

    import spidev
    
    spi = spidev.SpiDev()  # 创建SPI对象
    
    # 定义MAX1241寄存器地址和命令格式
    MAX1241_START_BIT = 0x60
    MAX1241_CH0 = 0x00
    MAX1241_CH1 = 0x10
    MAX1241_CH2 = 0x20
    MAX1241_CH3 = 0x30
    MAX1241_CH4 = 0x40
    MAX1241_CH5 = 0x50
    MAX1241_CH6 = 0x70
    MAX1241_CH7 = 0x80
    MAX1241_RANGE_0_5V = 0x00
    MAX1241_RANGE_0_10V = 0x01
    MAX1241_RANGE_P5V = 0x02
    MAX1241_RANGE_P10V = 0x03
    
    def read_voltage(channel, input_range):
        spi.open(0, 0)  # 打开SPI口,使用0号片选
        spi.max_speed_hz = 5000000  # 设置SPI速度
        spi.cshigh = False  # 片选信号为低电平
        spi.mode = 1  # CPOL=0, CPHA=1
        command = MAX1241_START_BIT | channel | input_range  # 组合指令
        tx_data = [command, 0x00]  # 发送指令
        rx_data = spi.xfer2(tx_data)  # 接收数据
        spi.close()  # 关闭SPI口
        voltage = ((rx_data[0] & 0x0F) << 8) + rx_data[1]  # 计算电压值
        voltage = voltage * 5.0 / 4096  # 转换为实际电压值(0~5V)
        return voltage
    
    1. 接下来,我们需要在代码中添加位于10%,50%和100%位置的滑动头读取电压值,并将其显示在液晶屏的第一行。为此,我们可以先定义滑动头位置的变量和液晶屏的接口,然后使用循环来实时读取和更新电压值和滑动头位置,并将其格式化为“U=1.23V”的形式显示在液晶屏上。

    示例代码:

    import RPi.GPIO as GPIO
    import time
    import MAX1241
    
    # 定义滑动头位置的变量和液晶屏的接口
    slider_pin = 18
    lcd_RS = 19
    lcd_E = 26
    lcd_D4 = 5
    lcd_D5 = 6
    lcd_D6 = 13
    lcd_D7 = 16
    
    GPIO.setmode(GPIO.BCM)  # 设置GPIO引脚模式为BCM
    GPIO.setup(slider_pin, GPIO.IN)  # 设置滑动头接口引脚为输入模式
    GPIO.setup(lcd_RS, GPIO.OUT)
    GPIO.setup(lcd_E, GPIO.OUT)
    GPIO.setup(lcd_D4, GPIO.OUT)
    GPIO.setup(lcd_D5, GPIO.OUT)
    GPIO.setup(lcd_D6, GPIO.OUT)
    GPIO.setup(lcd_D7, GPIO.OUT)
    
    while True:
        slider_position = GPIO.input(slider_pin)  # 读取滑动头位置
        if slider_position < 600:  # 滑动头在10%位置
            voltage = MAX1241.read_voltage(MAX1241_CH0, MAX1241_RANGE_0_5V)  # 读取在CHAN0的电压值
        elif slider_position < 1400:  # 滑动头在50%位置
            voltage = MAX1241.read_voltage(MAX1241_CH4, MAX1241_RANGE_0_5V)  # 读取在CHAN4的电压值
        else:  # 滑动头在100%位置
            voltage = MAX1241.read_voltage(MAX1241_CH7, MAX1241_RANGE_0_5V)  # 读取在CHAN7的电压值
        voltage_text = "U=%.2fV" % voltage  # 格式化电压值
        # 把电压值显示在液晶屏第一行
        GPIO.output(lcd_RS, GPIO.LOW)
        GPIO.output(lcd_E, GPIO.LOW)
        GPIO.output(lcd_D4, ord(voltage_text[0]) >> 4 & 1)
        GPIO.output(lcd_D5, ord(voltage_text[0]) >> 5 & 1)
        GPIO.output(lcd_D6, ord(voltage_text[0]) >> 6 & 1)
        GPIO.output(lcd_D7, ord(voltage_text[0]) >> 7 & 1)
        GPIO.output(lcd_E, GPIO.HIGH)
        time.sleep(0.001)
        GPIO.output(lcd_E, GPIO.LOW)
        GPIO.output(lcd_D4, ord(voltage_text[0]) >> 0 & 1)
        GPIO.output(lcd_D5, ord(voltage_text[1]) >> 1 & 1)
        GPIO.output(lcd_D6, ord(voltage_text[2]) >> 2 & 1)
        GPIO.output(lcd_D7, ord(voltage_text[3]) >> 3 & 1)
        GPIO.output(lcd_E, GPIO.HIGH)
        time.sleep(0.001)
        GPIO.output(lcd_E, GPIO.LOW)
        GPIO.output(lcd_D4, ord(voltage_text[2]) >> 0 & 1)
        GPIO.output(lcd_D5, ord(voltage_text[3]) >> 1 & 1)
        GPIO.output(lcd_D6, ord(voltage_text[4]) >> 2 & 1)
        GPIO.output(lcd_D7, ord(voltage_text[5]) >> 3 & 1)
        GPIO.output(lcd_E, GPIO.HIGH)
        time.sleep(0.001)
        GPIO.output(lcd_E, GPIO.LOW)
        time.sleep(0.1)  # 延时100毫秒
    
    1. 最后,我们需要为MAX1241编写一个单独的驱动程序,以方便移植到其他项目中。该驱动程序应该由MAX1241.py文件实现,并且应该包含MAX1241的寄存器地址和命令格式,以及读取电压值的函数read_voltage()。

    示例代码(MAX1241.py文件):

    import spidev
    
    spi = spidev.SpiDev()  # 创建SPI对象
    
    # 定义MAX1241寄存器地址和命令格式
    MAX1241_START_BIT = 0x60
    MAX1241_CH0 = 0x00
    MAX1241_CH1 = 0x10
    MAX1241_CH2 = 0x20
    MAX1241_CH3 = 0x30
    MAX1241_CH4 = 0x40
    MAX1241_CH5 = 0x50
    MAX1241_CH6 = 0x70
    MAX1241_CH7 = 0x80
    MAX1241_RANGE_0_5V = 0x00
    MAX1241_RANGE_0_10V = 0x01
    MAX1241_RANGE_P5V = 0x02
    MAX1241_RANGE_P10V = 0x03
    
    def read_voltage(channel, input_range):
        spi.open(0, 0)  # 打开SPI口,使用0号片选
        spi.max_speed_hz = 5000000  # 设置SPI速度
        spi.cshigh = False  # 片选信号为低电平
        spi.mode = 1  # CPOL=0, CPHA=1
        command = MAX1241_START_BIT | channel | input_range  # 组合指令
        tx_data = [command, 0x00]  # 发送指令
        rx_data = spi.xfer2(tx_data)  # 接收数据
        spi.close()  # 关闭SPI口
        voltage = ((rx_data[0] & 0x0F) << 8) + rx_data[1]  # 计算电压值
        voltage = voltage * 5.0 / 4096  # 转换为实际电压值(0~5V)
        return voltage
    

    以上就是一份简易数字电压表程序框架的具体实现方案,您可以根据您的具体要求进行修改和优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^