利用51单片机测量0到100mv的电压并通过7段数码管显示的电路图及程序
时间: 2023-05-31 19:05:02 浏览: 253
基于51单片机的电压计
5星 · 资源好评率100%
由于51单片机的ADC模块最大输入电压为5V,因此需要通过电阻分压将输入的0-100mV电压转换为0-5V的电压再进行测量。
电路图如下:
![image](https://cdn.luogu.com.cn/upload/image_hosting/ed4q9v9z.png)
程序如下:
```c
#include <regx51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit D5 = P1^4;
sbit D6 = P1^5;
sbit D7 = P1^6;
sbit D8 = P1^7;
uchar code tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示字符表
void delay(uint t) // 延时函数
{
uint i, j;
for (i=0; i<t; i++)
for (j=0; j<100; j++);
}
void main()
{
uchar i, j;
uint adc;
P2 = 0xff; // P2口为高阻态
while (1)
{
ADC_CONTR = 0x90; // 启动ADC转换
_nop_();
_nop_();
_nop_();
_nop_();
adc = ADC_RES*256 + ADC_RESL; // 读取ADC转换结果
adc = adc/2; // 电压分压系数为2,需要将ADC转换结果除以2
i = adc/1000; // 计算千位数
j = (adc%1000)/100; // 计算百位数
if (i == 0) // 如果千位数为0,则不显示
D1 = 1;
else
D1 = 0;
D2 = tab[i];
if (i == 0 && j == 0) // 如果千位数和百位数都为0,则不显示
D3 = 1;
else
D3 = 0;
D4 = tab[j];
D5 = tab[(adc%100)/10]; // 计算十位数
D6 = tab[adc%10]; // 计算个位数
delay(10); // 延时10ms
}
}
```
阅读全文