📄 adc_1.c
字号:
/****************************************************************
源程序要求:
1、能实时采集24路电池电压并显示
2、能采集总电压值、总电流值
3、当单体电池电压值超出1.8-2.3V时告警
4、当总电压值超出43-55V时告警
5、4种显示方式:单体采集正确,单体采集错误,总电流,总电压
******************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>
#define A XBYTE[0xff01]
#define B XBYTE[0xff02]
#define COM XBYTE[0xff00]
sbit DOG=P1^0;
sbit b=P3^4; /*蜂鸣器*/
sbit P17=P1^7;
unsigned char ad_counts,w,n=0,t=1;
unsigned char code mat[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*显示字段码*/
float code tab[256]= {0,0.02,0.04,
0.06,0.08,0.1,0.12,0.14,
0.16,0.18,0.2,0.22,0.24,
0.25,0.27,0.29,0.31,0.33,
0.35,0.37,0.39,0.41,0.43,
0.45,0.47,0.49,0.51,0.53,
0.55,0.57,0.59,0.61,0.63,
0.65,0.67,0.69,0.71,0.73,0.74,
0.76,0.78,0.8,0.82,0.84,
0.86,0.88,0.9,0.92,0.94,
0.96,0.98,1.0,1.02,1.04,
1.06,1.08,1.1,1.12,1.14,
1.16,1.18,1.2,1.22,1.23,
1.25,1.27,1.29,1.31,1.33,
1.35,1.37,1.39,1.41,1.43,
1.45,1.47,1.49,1.51,1.53,
1.55,1.57,1.59,1.61,1.63,
1.65,1.67,1.69,1.71,1.72,1.74,
1.76,1.78,1.8,1.82,1.84,
1.86,1.88,1.9,1.92,1.94,
1.96,1.98,2.0,2.02,2.04,
2.06,2.08,2.1,2.12,2.14,
2.16,2.18,2.2,2.21,2.23,
2.25,2.27,2.29,2.31,2.33,
2.35,2.37,2.39,2.41,2.43,
2.45,2.47,2.49,2.51,2.53,
2.55,2.57,2.59,2.61,2.63,
2.65,2.67,2.69,2.70,2.72,2.74, //140
2.76,2.78,2.8,2.82,2.84,
2.86,2.88,2.9,2.92,2.94,
2.96,2.98,3.0,3.02,3.04,
3.06,3.08,3.1,3.12,3.14,
3.16,3.18,3.2,3.21,3.23,
3.25,3.27,3.29,3.31,3.33,
3.35,3.37,3.39,3.41,3.43,
3.45,3.47,3.49,3.51,3.53,
3.55,3.57,3.59,3.61,3.63,
3.65,3.67,3.69,3.70,3.72,3.74, //191
3.76,3.78,3.8,3.82,3.84,
3.86,3.88,3.9,3.92,3.94,
3.96,3.98,4.0,4.02,4.04,
4.06,4.08,4.1,4.12,4.14,
4.16,4.17,4.19,4.21,4.23,
4.25,4.27,4.29,4.31,4.33,
4.35,4.37,4.39,4.41,4.43,4.45, //227
4.47,4.49,4.51,4.53,4.55,
4.57,4.59,4.61,4.63,4.65,
4.67,4.69,4.71,4.73,4.75,
4.77,4.79,4.81,4.83,4.85,
4.87,4.89,4.91,4.93,4.95,
4.97,4.99,5.0};
delay()
{
unsigned int p;
for(p=0;p<46080;p++)
{
DOG=!DOG;
}
}
ms()
{ unsigned char j;
for(j=0;j<100;j++)
{_nop_();
DOG=!DOG;}
}
slt_w(unsigned char n) /*选择LED位段*/
{
unsigned char i,w;
w=0x01;
for(i=1;i<n;i++)
{
w=_irol_(w,1);}
B=w;
}
dc_disp() /*显示正确方式dc_*/
{
A=0x5e;
slt_w(1);
ms();
A=0x39;
slt_w(2);
ms();
A=0x40;
slt_w(3);
ms();
A=0x80;
B=0x08;
ms();
}
Er_disp() /*显示错误方式Er_*/
{
A=0x79;
slt_w(1);
ms();
A=0x70;
slt_w(2);
ms();
A=0x40;
slt_w(3);
ms();
A=0x80;
B=0x08;
ms();
}
AL_disp() /*总电压显示方式AL_*/
{
A=0x77;
slt_w(1);
ms();
A=0x38;
slt_w(2);
ms();
A=0x40;
slt_w(3);
ms();
A=0x80;
slt_w(5);
ms();
}
CU_disp() /*总电流显示方式CU_*/
{
A=0x39;
slt_w(1);
ms();
A=0x3e;
slt_w(2);
ms();
A=0x40;
slt_w(3);
ms();
}
disp(unsigned char type,float v) /*显示子程序,type代表四种显示类型*/
{
unsigned char first,second,third;
unsigned char i;
unsigned int val;
val=v*100;
first=val/100; /*电压值第一位,即LED的第四位的值*/
second=val%100/10;
third=val%100%10;
DOG=!DOG;
for(i=0;i<250;i++)
{
COM=0x03;
switch(type)
{
case 1:
dc_disp();break;
case 2:
Er_disp();break;
case 3:
AL_disp();break;
case 4:
CU_disp();break;
}
slt_w(4); /*显示第四位*/
A=mat[first];
ms();
slt_w(5);
A=mat[second];
ms();
slt_w(6);
A=mat[third];
ms();
if(i==20)
b=1;
}
}
count() /*记数,显示第几路采样值*/
{
unsigned char j,second,first;
first=t/10;
second=t%10;
for(j=0;j<250;j++)
{
slt_w(1);
A=mat[first];
ms();
slt_w(2);
A=mat[second];
ms();
if(j==60)
b=1;
}
}
main()
{
unsigned char i,m,k,first,second,sum;
unsigned char xdata *ad_adr;
int addr;
float V;
P17=0;
b=0;
COM=0x03;
A=0x7f;
B=0xff;
delay();
b=1;
for(;;)
{
ad_adr=0xee00; /*第四片0809地址*/
/*只采第二引脚。总电压、总电流的计算和显示在此修改*/
ad_adr++;
*ad_adr=0;
for(k=0;k<5;k++);
sum=*ad_adr;
V=tab[sum];
V=V*2.4; /*总电压算法*/
if(V<4.3||V>5.5) /*超出范围告警*/
{b=0;}
disp(3,V);
for(m=0;m<3;m++)
{
switch(m)
{
case 0:ad_adr=0xaf00;break;
case 1:ad_adr=0xcf00;break;
case 2:ad_adr=0xed00;break;
}
for(i=0;i<8;i++)
{
*ad_adr=0;
for(k=0;k<15;k++);
sum=*ad_adr;
ad_adr++;
V=tab[sum];
/************/
/* V=V-0.05;*/ /*此处修改修正值*/
/*************/
if(V<=0) /*电压小于等于0全部显示0*/
{
b=0;
count();
b=0;
disp(2,0.0);
}
else
{
if((V<1.8&&V>0)||V>2.3)
{
b=0;
count();
b=0;
disp(2,V);
}
else
{
count();
disp(1,V);
}
}
if(t<24)
{
t++;
}
else
{
t=1;
}
} //i
} //m
}//for
}//main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -