(二)单片机类: ( 1)数字电压表设计 设计要求: 1、设计一简易数字电压表, 要求可以测量直流 0~50V 和交流 0~36V 电压 值, 最小测量电压误差 50mV. 2、电压值由 3 位 LED 数码管显示, 两位整数, 一位小数; 3、可实现两个档位电压的切换。
时间: 2024-03-22 20:40:13 浏览: 144
简易数字电压表的设计功能要求简易数字电压表可以测量
以下是一个基于单片机的数字电压表的示例代码,可以实现直流和交流电压的测量,并且具有两个档位电压的切换和3位LED数码管显示,最小测量误差为50mV:
```
#include <LiquidCrystal.h> // 引入LCD库
#define VOLTAGE_PIN A0 // 电压传感器连接的模拟输入引脚
#define LED_DIGIT1 2 // 三位数码管第一位连接的引脚
#define LED_DIGIT2 3 // 三位数码管第二位连接的引脚
#define LED_DIGIT3 4 // 三位数码管第三位连接的引脚
#define LED_SEG_A 5 // 数码管a段连接的引脚
#define LED_SEG_B 6 // 数码管b段连接的引脚
#define LED_SEG_C 7 // 数码管c段连接的引脚
#define LED_SEG_D 8 // 数码管d段连接的引脚
#define LED_SEG_E 9 // 数码管e段连接的引脚
#define LED_SEG_F 10 // 数码管f段连接的引脚
#define LED_SEG_G 11 // 数码管g段连接的引脚
#define LED_SEG_DP 12 // 数码管小数点连接的引脚
#define SWITCH_PIN 13 // 档位切换开关连接的引脚
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // 初始化LCD
int voltageRange = 0; // 电压档位选择标志,0表示测量0~36V,1表示测量0~50V
float voltage = 0; // 存储电压值
float vMax = 0; // 存储最大电压值
float vMin = 50; // 存储最小电压值
float vSum = 0; // 电压值总和
int count = 0; // 电压值计数器
void setup() {
pinMode(SWITCH_PIN, INPUT_PULLUP); // 将档位切换开关引脚设为上拉输入模式
lcd.begin(16, 2); // 初始化LCD显示屏
}
void loop() {
// 读取档位切换开关的状态,根据不同状态选择不同的电压档位
if (digitalRead(SWITCH_PIN) == LOW) {
voltageRange = 1;
} else {
voltageRange = 0;
}
// 读取电压传感器的模拟值并将其转换为电压值
float reading = analogRead(VOLTAGE_PIN);
voltage = reading * (5.0 / 1023.0) * (voltageRange ? 50.0 / 36.0 : 1.0);
// 计算平均电压值
vSum += voltage;
count++;
if (count == 10) {
float vAvg = vSum / count;
vMax = max(vMax, vAvg);
vMin = min(vMin, vAvg);
vSum = 0;
count = 0;
// 将电压值转换为整数和小数部分
int vInt = int(vAvg);
int vFrac = int((vAvg - vInt) * 10);
// 在LCD上显示电压值
lcd.setCursor(0, 0);
lcd.print("V: ");
lcd.print(vInt);
lcd.print(".");
lcd.print(vFrac);
// 在数码管上显示电压值
int vDisplay = int(vAvg * 100);
int vDigit1 = vDisplay / 100;
int vDigit2 = (vDisplay / 10) % 10;
int vDigit3 = vDisplay % 10;
digitalWrite(LED_DIGIT1, LOW);
digitalWrite(LED_DIGIT2, HIGH);
digitalWrite(LED_DIGIT3, HIGH);
digitalWrite(LED_SEG_A, vDigit1 == 1);
digitalWrite(LED_SEG_B, vDigit1 == 1 || vDigit1 == 4);
digitalWrite(LED_SEG_C, vDigit1 != 1 && vDigit1 != 7);
digitalWrite(LED_SEG_D, vDigit2 == 1 || vDigit2 == 2 || vDigit2 == 3 || vDigit2 == 7);
digitalWrite(LED_SEG_E, vDigit2 == 0 || vDigit2 == 1 || vDigit2 == 7);
digitalWrite(LED_SEG_F, vDigit2 == 1 || vDigit2 == 3 || vDigit2 == 4 || vDigit2 == 5 || vDigit2 == 7 || vDigit2 == 9);
digitalWrite(LED_SEG_G, vDigit2 != 2);
digitalWrite(LED_SEG_DP, 1);
delay(5);
digitalWrite(LED_DIGIT1, HIGH);
digitalWrite(LED_DIGIT2, LOW);
digitalWrite(LED_DIGIT3, HIGH);
digitalWrite(LED_SEG_A, vDigit2 != 1 && vDigit2 != 4);
digitalWrite(LED_SEG_B, vDigit2 != 1 && vDigit2 != 2 && vDigit2 != 3 && vDigit2 != 7);
digitalWrite(LED_SEG_C, vDigit2 != 5 && vDigit2 != 6);
digitalWrite(LED_SEG_D, vDigit3 == 2 || vDigit3 == 3 || vDigit3 == 4 || vDigit3 == 5 || vDigit3 == 6 || vDigit3 == 8 || vDigit3 == 9);
digitalWrite(LED_SEG_E, vDigit3 != 2 && vDigit3 != 6 && vDigit3 != 8 && vDigit3 != 0);
digitalWrite(LED_SEG_F, vDigit3 != 1 && vDigit3 != 2 && vDigit3 != 3 && vDigit3 != 7);
digitalWrite(LED_SEG_G, vDigit3 != 0 && vDigit3 != 1 && vDigit3 != 7);
digitalWrite(LED_SEG_DP, 0);
delay(5);
digitalWrite(LED_DIGIT1, HIGH);
digitalWrite(LED_DIGIT2, HIGH);
digitalWrite(LED_DIGIT3, LOW);
digitalWrite(LED_SEG_A, vDigit3 == 1 || vDigit3 == 4 || vDigit3 == 7);
digitalWrite(LED_SEG_B, vDigit3 != 1 && vDigit3 != 2 && vDigit3 != 3 && vDigit3 != 7);
digitalWrite(LED_SEG_C, vDigit3 != 1 && vDigit3 != 4);
digitalWrite(LED_SEG_D, vDigit3 == 0 || vDigit3 == 2 || vDigit3 == 6 || vDigit3 == 8);
digitalWrite(LED_SEG_E, vDigit3 != 2);
digitalWrite(LED_SEG_F, vDigit3 != 1 && vDigit3 != 2 && vDigit3 != 3 && vDigit3 != 7);
digitalWrite(LED_SEG_G, vDigit3 != 0 && vDigit3 != 1 && vDigit3 != 7);
digitalWrite(LED_SEG_DP, 0);
delay(5);
}
}
```
在上述代码中,我们使用了一个模拟输入引脚来读取电压传感器的值,并将其转换为电压值。然后,我们使用一个计数器和累加器来计算平均电压值,并记录最大和最小值。最后,我们使用LCD和3位LED数码管将电压值输出到显示屏上。同时,根据档位切换开关的状态选择不同的电压档位,并根据电压值在数码管上显示。注意,这只是一个简单的示例代码,实际的电压测量器需要更多的功能和精度来满足实际需求。
阅读全文