用C51写(1)数字电压表设计 设计要求: 1、设计一简易数字电压表, 要求可以测量直流 0~50V 和交流 0~36V 电压 值, 最小测量电压误差 50mV. 2、电压值由 3 位 LED 数码管显示, 两位整数, 一位小数;
时间: 2024-03-27 22:36:54 浏览: 85
以下是一个基于C51的简易数字电压表设计示例代码:
```
#include <reg51.h> // 包含头文件
#include <stdio.h> // 包含头文件
#define VREF 5 // 参考电压为5V
#define MAX_VOLTAGE_DC 50 // 直流最大电压
#define MAX_VOLTAGE_AC 36 // 交流最大电压
#define MIN_VOLTAGE_ERROR 0.05 // 最小测量电压误差50mV
// 定义数码管显示端口
sbit DIG1 = P2^0;
sbit DIG2 = P2^1;
sbit DIG3 = P2^2;
// 定义数码管段选端口
sbit SEG_A = P1^0;
sbit SEG_B = P1^1;
sbit SEG_C = P1^2;
sbit SEG_D = P1^3;
sbit SEG_E = P1^4;
sbit SEG_F = P1^5;
sbit SEG_G = P1^6;
sbit SEG_DP = P1^7;
// 函数声明
void init();
float getVoltage();
void display(float voltage);
// 主函数
void main()
{
float voltage; // 定义电压变量
init(); // 初始化
while(1)
{
voltage = getVoltage(); // 获取电压值
display(voltage); // 数码管显示电压值
}
}
// 初始化函数
void init()
{
TMOD = 0x01; // 设置定时器0为16位工作模式
TH0 = 0xFC; // 设置定时器初值为0xFC67
TL0 = 0x67;
TR0 = 1; // 启动定时器0
}
// 获取电压值函数
float getVoltage()
{
unsigned int adcValue; // 定义ADC数值变量
float voltage; // 定义电压变量
ADC_CONTR = 0x80; // 启动ADC转换
while(!ADC_FLAG); // 等待转换完成
ADC_FLAG = 0; // 清除ADC转换标志
adcValue = ADC_RES * 256 + ADC_RESL; // 获取ADC转换结果
voltage = (float)adcValue * VREF / 1024; // 计算电压值
return voltage; // 返回电压值
}
// 数码管显示电压值函数
void display(float voltage)
{
unsigned int integerPart = voltage; // 获取整数部分
unsigned int decimalPart = (voltage - integerPart) * 10; // 获取小数部分
// 数码管显示整数部分
DIG1 = 1;
SEG_DP = 0;
P0 = integerPart / 100;
delay(1);
DIG1 = 0;
DIG2 = 1;
SEG_DP = 0;
P0 = (integerPart % 100) / 10;
delay(1);
DIG2 = 0;
DIG3 = 1;
SEG_DP = 0;
P0 = integerPart % 10;
delay(1);
DIG3 = 0;
// 数码管显示小数部分
DIG1 = 1;
SEG_DP = 1;
P0 = decimalPart;
delay(1);
DIG1 = 0;
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j, k;
for(j = i; j > 0; j--)
{
for(k = 125; k > 0; k--);
}
}
```
此代码使用了51单片机的ADC模块,将模拟信号转换为数字信号,并使用三位数码管显示电压值。函数`getVoltage()`用于获取电压值,函数`display()`用于数码管显示电压值,函数`delay()`用于延时。
阅读全文