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

📄 adc.c

📁 ADC转换
💻 C
字号:
#include "C8051F330.h"
#include"math.h"
  
  sbit TX=P0^4;
  sbit RX=P0^5;
  void   Port_IO_Init();
  void   Oscillator_Init();
  void   Interrupts_Init();
  void Init_Device(void);
  void ADC_Init();
  void PCA_Init();
  void Interrupts_Init();
  void Voltage_Reference_Init();
  unsigned int disbuf[4];
  unsigned char M[5];
  unsigned int minute=1;
  void delay(unsigned int m);
  void key(void);
  void display(void);
  void sx (void);
  double  s;
   bit b=0;
  unsigned char a=5;        //P0.7标志
   unsigned char b1=0;       //闪烁的标志
   unsigned char M[5]={0,0,0,0,1};
  long v;
  double v1;
  double vlue;
  double vlue1;
  unsigned char c=0;
void main( )
 { 
   unsigned  char i;
	 Init_Device();
	 //AD0BUSY=1;
    
     for(i=0;i<4;i++)
    {
        disbuf[i]=i;
     }
   do{ 
    
	key();   
        
  if(a==5)
  {
   
   if(b==1)
    {
	s=(((ADC0H*0x0100+ADC0L)*25*1000L)/1024);
   
	 v=s*s;
	 c++;
	  v1=v1+v;
	 if(c==100)
	  { 
     vlue=sqrt(v1/10000);
	// vlue=v1/100000;
    	c=0;
	    v1=0;
	  vlue1= minute*vlue/1000;
	  // } 
	// vlue1= 12.31;
	 if(vlue1>=0&&vlue1<10)
	 { 
	    vlue1=vlue1*1000;

    disbuf[0]=(int)vlue1/1000+10;
	disbuf[1]=((int)vlue1%1000)/100;
	disbuf[2]=((int)vlue1%100)/10;
	disbuf[3]=(int)vlue1%10;
	vlue1=0;

	}
 if(vlue1>=10&&vlue1<100)
	 { 
	    vlue1=vlue1*100;
     
    disbuf[0]=(int)vlue1/1000;
	disbuf[1]=((int)vlue1%1000)/100+10;
	disbuf[2]=((int)vlue1%100)/10;
	disbuf[3]=(int)vlue1%10;
	vlue1=0;
	}
	if(vlue1>=100&&vlue1<1000)
	 { 
	    vlue1=vlue1*10;
      
    disbuf[0]=(int)vlue1/1000;
	disbuf[1]=((int)vlue1%1000)/100;
	disbuf[2]=((int)vlue1%100)/10+10;
	disbuf[3]=(int)vlue1%10;
		vlue1=0;

	}
	if(vlue1>=1000)
	 { 
	    //vlue1=vlue1*100;

    disbuf[0]=(int)vlue1/1000;
	disbuf[1]=((int)vlue1%1000)/100;
	disbuf[2]=((int)vlue1%100)/10;
	disbuf[3]=(int)vlue1%10;
		vlue1=0;
	}
//	}
	
   b=0;
	
	display();
   //delay(10);   
     }
	 }
  //display();
 //  delay(10);
   }
//	AD0BUSY=1;
  else 
   { 
  // for(i=0;i<10;i++)
   //  {
	 sx ();
	 display();
	 delay(10);
//	 }
	 }

		}while(1);
  }
  void key(void)
{
	unsigned char keycode,k1;
	k1=~(P0)&0x0C0;	
	delay (10);					//读键
	if ( k1 != 0) 					//有键按下
		{
			IE=0x00;					//关中断
			delay (10);				//延时
			keycode=~(P0)&0x0C0;	//读键码
			do							//等待键释放 
			{
			k1=~(P0)&0x0C0;
			}
			while (k1!=0);
	
			switch (keycode)		
			{
				case 0x40:			//P0.6键,分加一
				{
			//	minute++;
			//	if (minute==60) minute=0;
                M[a]++;
				if(M[1]==6)
				   M[1]=0;
				if(M[2]==10)
				   M[2]=0; 
  				   if(M[3]==10)
				   M[3]=0;
				  if(M[4]==10)
				   M[4]=0;
                minute=M[1]*1000+M[2]*100+M[3]*10+M[4];
                 
				 
                if (minute>6000)
                  { minute=0;
				    M[1]=0;
					M[2]=0;
					M[3]=0;
					M[4]=0;}
				};
				break;
				case 0x80:			//P0.7键,时加一
				{
				  //minute=0;
				 a=a-1;
                 if(a==0)
                   a=5;
				   c=0;
				   
			//	hour++;
			/*	if (hour==24) 
                    hour=0;
                if (minute==60)
                   minute=0;*/
				};
			}
		//	sx();						//送显示
			IE=0xA0;			
					//开中断
       //minute=M[1]*1000+M[2]*100+M[3]*10+M[4];

		 }
}
void sx (void)						//送显示函数
{       
		disbuf[0]=minute/1000;	//分个位
		disbuf[1]=minute%1000/100;	//分十位
		disbuf[2]=minute%100/10;		//时个位
		disbuf[3]=minute%10; 	//时十位
		b1++;
		if(b1<5)
		disbuf[a-1]=20 ;
		if(b1==10)
	   	b1=0;

}

 void delay(unsigned int m)
     { 
     unsigned  int k,i;
     
    for(k=0;k<m;k++)
       { 
	   
	       for(k=0;k<m;)

	   { 
	    i++;
	   if(i==300)
          {k++;
		  i=0;}
		  }
       }
  
        }

  void display(void )
     { 
    unsigned char i;

	code unsigned char disptab[21]={/*0x11,0x7d,0x23,0x29,0x4d,
                                	0x89,0x81,0x3d,0x01,0x09//共阴*/
					                0x88,0x0eb,0x04c,0x049,0x2b,0x19,
                                	0x18,0x0cb,0x08,0x09,0x80,0x0e3,0x44,0x41,
                                    0x23,0x11,0x10,0x0c3,0x00,0x01,0xff
									 //小板子上的
								/*	0x11,0x7d,0x23,0x29,0x4d,
                                	0x89,0x81,0x3d,0x01,0x09*/	};
	unsigned char n,m;
       
	for(n=0;n<4;n++)
		{
         TX=1;
		m=disptab[disbuf[3-n]];
     for(i=0;i<8;i++)
	   { 
	    RX=m/128;
	   
         TX=0;
	   
	     TX=1;
        
	     
	   	m=m*2;
	
		 }
		
                         
			}
       
      } 
 void time2(void)interrupt  5
 { 
 

  TF2H=0; 
  
      
  }
   
 void ADC(void)  interrupt 10
{

    
   
  /* s=((ADC0H*0x0100+ADC0L)*33*100L)/1024;
    disbuf[0]=(int)s/1000+10;
	disbuf[1]=((int)s%1000)/100;
	disbuf[2]=((int)s%100)/10;
	disbuf[3]=(int)s%10;*/
	/* v=(((ADC0H*0x0100+ADC0L)*3.3)/1024)*(((ADC0H*0x0100+ADC0L)*3.3)/1024);
	 c++;
	  s=s+v;
	 if(c==100)
	  { 
     vlue=sqrt(s/100)*1000;
	 s=0;
	   } 
	 c=0;
    disbuf[0]=(int)vlue/1000+10;
	disbuf[1]=((int)vlue%1000)/100;
	disbuf[2]=((int)vlue%100)/10;
	disbuf[3]=(int)vlue%10;*/
	b=1;
	
	AD0INT=0;
//	AD0BUSY=1;

}
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
}

void Timer_Init()
{
   CKCON     = 0x50;
    TMR2CN    = 0x04;
    TMR2RLL   = 0xdf;
    TMR2RLH   = 0xfc;
    TMR2L     = 0xdf;
    TMR2H     = 0xfc;

//TMR2H     = 0x00;
//TMR2RLH   = 0x00;
}

void ADC_Init()
{
    AMX0P     = 0x0C;
    AMX0N     = 0x11;
    ADC0CN    = 0x82;

}

void Port_IO_Init()
{
    // P0.0  -  Unassigned,  Open-Drain, Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Skipped,     Open-Drain, Analog
    // P0.3  -  Skipped,     Open-Drain, Analog
    // P0.4  -  Unassigned,  Push-Pull,  Digital
    // P0.5  -  Unassigned,  Push-Pull,  Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Analog
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    P0MDIN    = 0xF3;
    P1MDIN    = 0xEF;
    P0MDOUT   = 0x30;
    P0SKIP    = 0x0C;
    XBR1      = 0x40;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x65;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    CLKSEL    = 0x01;
}

void Interrupts_Init()
{
    IE        = 0xA0;
    EIE1      = 0x08;
    EIP1      = 0x08;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Timer_Init();
    ADC_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -