基于51单片机的3路电压测量(3路,ADS1110)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的电压测量(3路,ADS1110)
3路电压测量
1、输入信号0-5V,显示精度为0.01V
2、通过按键切换显示各个通道电压值
3、使用按键设置各个通道报警值
4、超过报警值蜂鸣器响,同时显示当前通道号和电压
#include "reg51.h"
#include "ADS1110.h"
sbit beep=P1^7;//蜂鸣器
//====================================================
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 moshi=0;//模式
uint fazhi0=200,fazhi1=200,fazhi2=200;//每个通道阀值
uint read0=0,read1=0,read2=0;//每个通道电压值
uchar key=0;//按键临时存储,防止显示闪烁用
uchar sec=0;//定时
uchar lun_time=0;//轮流
//====================================================
void delay(uchar i)//延时
{
while(i--);
}
//====================================================
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P3=0x0f;
if(P3!=0x0f) //检测有无按下
{
switch(P3)//检测行
{
case 0x0e:i=1;break;
case 0x0d:i=4;break;
case 0x0b:i=7;
}
P3=0xf0;
switch(P3)//检测列
{
case 0xe0:j=0;break;
case 0xd0:j=1;break;
case 0xb0:j=2;
}
if((i+j)==key)
return 0;
}
key=i+j;
return i+j;
}
//====================================================
void main()
{
uchar i;
beep=0;//关闭蜂鸣器
TMOD|=0X01;//初始化定时器0
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
i=key_scan();//按键检测
switch(i)//按键设置功能
{
case 1://显示通道1模式
moshi=0;
break;
case 2://显示通道2模式
moshi=1;
break;
case 3://显示通道3模式
moshi=2;
break;
case 4://显示通道1阀值模式,阀值加
fazhi0+=10;
moshi=3;
break;
case 5://显示通道2阀值模式,阀值加
fazhi1+=10;
moshi=4;
break;
case 6://显示通道3阀值模式,阀值加
fazhi2+=10;
moshi=5;
break;
case 7://显示通道1阀值模式,阀值减
fazhi0-=10;
moshi=3;
break;
case 8://显示通道2阀值模式,阀值减
fazhi1-=10;
moshi=4;
break;
case 9://显示通道3阀值模式,阀值减
fazhi2-=10;
moshi=5;
}
//********************************************
if(read0>fazhi0)//判断报警
{
beep=1;
moshi=0;
}
if(read1>fazhi1)//判断报警
{
beep=1;
moshi=1;
}
if(read2>fazhi2)//判断报警
{
beep=1;
moshi=2;
}
if((read0>fazhi0)||(read1>fazhi1)||(read2>fazhi2))
{
P0=0; //显示减号
P2=(P2 &0XF0)+1;
P0=0x40;
delay(100);
}
else
beep=0;
switch(moshi)//显示
{
case 0://显示通道1电压
P0=0; //显示编号
P2=(P2 &0XF0)+0;
P0=smgduan0[1];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[read0/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[read0%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[read0%10];
delay(100);
break;
case 1://显示通道2电压
P0=0; //显示编号
P2=(P2 &0XF0)+0;
P0=smgduan0[2];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[read1/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[read1%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[read1%10];
delay(100);
break;
case 2://显示通道3电压
P0=0; //显示编号
P2=(P2 &0XF0)+0;
P0=smgduan0[3];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[read2/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[read2%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[read2%10];
delay(100);
break;
case 3://显示通道1阀值
P0=0; //显示编号
P2=(P2 &0XF0)+1;
P0=smgduan0[1];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[fazhi0/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[fazhi0%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[fazhi0%10];
delay(100);
break;
case 4://显示通道2阀值
P0=0; //显示编号
P2=(P2 &0XF0)+1;
P0=smgduan0[2];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[fazhi1/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[fazhi1%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[fazhi1%10];
delay(100);
break;
case 5://显示通道3阀值
P0=0; //显示编号
P2=(P2 &0XF0)+1;
P0=smgduan0[3];
delay(100);
P0=0; //显示最高位
P2=(P2 &0XF0)+3;
P0=smgduan1[fazhi2/100];
delay(100);
P0=0; //显示中间位
P2=(P2 &0XF0)+4;
P0=smgduan0[fazhi2%100/10];
delay(100);
P0=0; //显示最低位
P2=(P2 &0XF0)+5;
P0=smgduan0[fazhi2%10];
delay(100);
}
}
}
//====================================================
void Timer0() interrupt 1
{
sec++;
if(sec>19)
{
sec=0;
//测通道1
read0=Ads1110_volt1()/65;
//测通道2
read1=Ads1110_volt2()/65;
//测通道3
read2=Ads1110_volt3()/65;
if(lun_time<5)
lun_time++;
else
{
lun_time=0;
if(moshi<3)
{
if(moshi<2)
moshi++;
else
moshi=0;
}
}
}
TH0=0X3C;
TL0=0XB0;
}