简易数字电压表:
①电路如图所示,要求在液晶屏
第一行按“U=1.23V”的格式实时显
示滑动头端的电压,请编程实现。
②调整滑动变阻器滑动头,查看
并记录当滑动头分别处于10%,50%
和100%位置时液晶屏上的显示值;
③*在以上任务成功的基础上,仿
照1602的驱动程序,把MAX1241驱动
程序做成单独一个文件,以便移植。
程序使用C语言?
可以参考这里的设计看看:https://zhuanlan.zhihu.com/p/635050882
我可以为您设计一份简易数字电压表程序框架。该电压表的电路如下图所示:
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
示例代码:
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毫秒
示例代码(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
以上就是一份简易数字电压表程序框架的具体实现方案,您可以根据您的具体要求进行修改和优化。