基于51单片机的3路电压测量(3路,ADS1110)原理图、流程图、物料清单、仿真图、源代码

基于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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值