基于51单片机的电压检测(8路)
多路电压测量
1、测量8路电压,0-5V
2、数码管循环显示各通道电压
#include "reg51.h"
#include"ADC0809.h"
sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
uint press=0;//压力
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar time=0;
uint flag=0;
void delay_us(uint i)//延时us
{
uint k;
for(k=0;k<i;k++);
}
void Timer0Init()//T0初始化
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
Timer0Init(); //定时器0初始化
adc0809_init();
while(1)
{
P1=smgduan0[press/1000];//显示第一个
L4=0;
delay_us(50);
L4=1;
P1=smgduan1[press%100/10];//显示第三个
L2=0;
delay_us(50);
L2=1;
P1=smgduan0[press%10];//显示第四个
L1=0;
delay_us(50);
L1=1;
}
}
void Timer0() interrupt 1 //T0中断,读取ADC值
{
uint i=0;
if(time<20)
time++;
else
{
time=0;
i=adc0809_read();
i=i*50/255;
press=i+flag;
if(flag<7000)
flag+=1000;
else
flag=0;
switch(flag)
{
case 0: adc0809_A=0;adc0809_B=0;adc0809_C=0;break;
case 1000:adc0809_A=1;adc0809_B=0;adc0809_C=0;break;
case 2000:adc0809_A=0;adc0809_B=1;adc0809_C=0;break;
case 3000:adc0809_A=1;adc0809_B=1;adc0809_C=0;break;
case 4000:adc0809_A=0;adc0809_B=0;adc0809_C=1;break;
case 5000:adc0809_A=1;adc0809_B=0;adc0809_C=1;break;
case 6000:adc0809_A=0;adc0809_B=1;adc0809_C=1;break;
case 7000:adc0809_A=1;adc0809_B=1;adc0809_C=1;
}
}
TH0=0X3C;
TL0=0XB0;
}