⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc_1.c

📁 源程序要求: 1、能实时采集24路电池电压并显示 2、能采集总电压值、总电流值 3、当单体电池电压值超出1.8-2.3V时告警 4、当总电压值超出43-55V时告警 5、4种显示方
💻 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 + -