单片机数字电压表设计代码
时间: 2023-11-08 22:06:08 浏览: 100
以下是一个简单的单片机数字电压表设计代码,使用了AT89C52单片机和7段LED数码管显示器。
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P2^0; //定义7段LED数码管的引脚连接
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
sbit D5 = P2^4;
sbit D6 = P2^5;
sbit D7 = P2^6;
sbit D8 = P2^7;
void delay(uint i) //延时函数
{
uint j;
for(j=0; j<i; j++);
}
void main()
{
float voltage; //定义电压变量
uchar i, j, k, l; //定义计数器变量
uchar data[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //定义0~9数字的编码
while(1)
{
voltage = ADC_Read(0) * 5.0 / 1024; //读取ADC转换器的值,计算电压值
i = voltage / 1; //获取整数部分
j = (voltage - i) * 10; //获取小数部分
k = data[i / 10]; //获取百位数字的编码
l = data[i % 10]; //获取十位数字的编码
//分别在数码管的8个引脚上输出相应的数字编码
D1 = 1; D2 = 1; D3 = 1; D4 = 0; D5 = 0; D6 = 0; D7 = 0; D8 = 0;
P0 = k;
delay(5);
D1 = 0; D2 = 1; D3 = 1; D4 = 1; D5 = 0; D6 = 0; D7 = 0; D8 = 0;
P0 = l;
delay(5);
D1 = 0; D2 = 0; D3 = 1; D4 = 1; D5 = 1; D6 = 0; D7 = 0; D8 = 0;
P0 = data[j];
delay(5);
}
}
uint ADC_Read(uchar channel) //ADC转换函数
{
uint value;
ADC_CONTR = 0x80 | channel << 3; //开始ADC转换
delay(10); //等待转换完成
ADC_CONTR |= 0x10; //将转换结果右移4位,去掉无用的低4位
value = ADC_RES;
value = (value << 8) | ADC_RESL; //将高8位和低8位合并成一个16位的值
return value;
}
```
这份代码的原理是通过ADC转换器读取输入电压并计算出电压值,然后将电压值分解为整数部分和小数部分,再将它们分别显示在数码管的前两位和后一位上。注意,在这个例子中,我们假设输入电压不超过5V。如果输入电压超过5V,将会导致ADC转换器的输出超出范围,从而导致错误的计算结果。
阅读全文