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

📄 main.c

📁 此程序是基于c8051f020单片机的c语言程序
💻 C
字号:
#include<c8051f020.h>
#include "initial.h"
#define sysclk         22118400        // SYSCLK frequency in Hz   	    
xdata long uint value,value1;	 
xdata long uint i=0;
uchar t,stop0;
uint AD_num,AD_num2;
uint relay_A;
uchar pga_A;
uchar keynum;
xdata long uint I_I,Y;
bit  isnewdata,flag_f; 	
sbit relay0=P0^0;
sbit relay1=P0^1;
sbit relay2=P0^2;
sbit relay3=P0^3;
/*sbit A0=P3^4;
sbit A1=P3^5;
sbit A2=P3^6;
sbit A3=P3^7;*/
uchar code table2[]={'0','1','2','3',
				'4','5','6','7',
				'8','9'};
uchar data0,data1,data2,data3;
uchar code str1[]="welcome to ADC0 test!";//8
uchar code str2[]="test key V:";//12
uchar code str3[]="test key I:";
uchar code str4[]="V true RMS is:";//9
uchar code str5[]="I true RMS is:";

void main( )
{     
   	SYSTEM_Init();		                  //系统初始化
	PORT_Init();		                  //端口初始化
	Lcd1602_Initial( );	                  //Lcd初始化 ]
	delay(10);
	AD9851_Init(); 
	Lcd1602_Write_String(1,1,"DDS Begin-> 'F' ");

	while(1)  
	{						  	   	
/*	   keynum=KeyEn();
	   if(keynum==12)	  //dds	  C
	   {  
		  f_add();
	   }	
	   if(keynum==13)
	   {
	      flag_f=0;
		  select_f();
	   }

	   if(keynum==14)	  //ad
	   {
	       relay_begin();
	//	   pga_begin();
           process_ADC00();
		   process_ADC00();
		   change_relay();

         //  process_ADC00();
		  // change_pga();

           process_ADC00();	//测电流变电压的电压
           process_ADC01(); //测导纳网络本身的电压
		   measure_Y();
		   Y_display();
	   }
	  if(keynum==15)
	  {									   */
		   angle_measure();
//	  }
	} 
	}  	                 



void display_f(long fre)
{	
     Lcd1602_Clear_All( );
	 delay(10);
     if(fre<1000)
	 {
	    Lcd1602_Write_String(1,0,"Fre:   Hz   ");		
		Lcd1602_Write_Data(1,4,fre/100+0x30);
		Lcd1602_Write_Data(1,5,fre%100/10+0x30);
		Lcd1602_Write_Data(1,6,fre%10+0x30);
	 }
	 if(fre>999)
	 {
	    Lcd1602_Write_String(1,0,"Fre:   . kHz"); 		
		Lcd1602_Write_Data(1,4,fre/100000+0x30);
		Lcd1602_Write_Data(1,5,fre%100000/10000+0x30);	   
		Lcd1602_Write_Data(1,6,fre%10000/1000+0x30); 
		Lcd1602_Write_Data(1,8,fre%1000/100+0x30);
	 } 
}

void process_ADC00()
{
  uchar DataH,DataL;
  Lcd1602_Clear_Line(1);
  Lcd1602_Write_String(1,0,str2);
  ADC00Initial();
  ADC0begin();
  DataH=ADC0H;
  DataL=ADC0L;
  AD_num=DataH*256+DataL;
  AD0INT=0;
  onshow_data(AD_num);
}

void process_ADC01()
{
 uchar DataH,DataL;
 Lcd1602_Clear_Line(1);
 Lcd1602_Write_String(1,0,str3);
 ADC01Initial();
 ADC0begin();
 DataH=ADC0H;
 DataL=ADC0L;
 AD_num2=DataH*256+DataL;
 AD0INT=0;
 onshow_data(AD_num2);
 } 


void onshow_data(uint AD_x)
{
  long uint V_RMS;
  V_RMS=AD_x*0.59326171875;
  data2=V_RMS%1000/100;
  data3=V_RMS/1000; 
  data1=V_RMS%1000%100/10; 
  data0=V_RMS%1000%100%10;
  Lcd1602_Write_Data(2,10,table2[data3]);
  Lcd1602_Write_Data(2,11,'.');
  Lcd1602_Write_Data(2,12,table2[data2]);
  Lcd1602_Write_Data(2,13,table2[data1]);
  Lcd1602_Write_Data(2,14,table2[data0]);
}

void relay_begin()
{
   relay0=0;
   relay1=1;	  //10倍  R=10
   relay2=0; 
   relay3=0;         
}

/*void pga_begin()
{
   A0=0;   //选择放大倍数为1
   A0=0;
   A0=0;
   A0=0;
} */

void change_relay()
{
   if(AD_num>=0&&AD_num<1012)
   {
       relay0=0;
       relay1=0;	  //10倍  R=1000
       relay2=0; 
       relay3=1;
	   relay_A=1000;
   }
   if(AD_num>=1013&&AD_num<2022)
   {
       relay0=0;
       relay1=0;	  //10倍  R=100
       relay2=1; 
       relay3=0;
	   relay_A=100;
   }
   if(AD_num>=2023&&AD_num<3034)
   {
       relay0=0;
       relay1=1;	  //10倍  R=10
       relay2=0; 
       relay3=0;
	   relay_A=10;
   }
   if(AD_num>=3035)
   {
       relay0=1;
       relay1=0;	  //10倍  R=1
       relay2=0; 
       relay3=0;
	   relay_A=1;
   }
}

/*void change_pga()
{
	if(AD_num>0&&AD_num<400)
	 {
		A0=1;	 //放大10倍
		A1=0;
		A2=0;
		A3=0;
		pga_A=10;
	 }
	  if(AD_num>400)
	  {
		A0=0;	 //放大1倍
		A1=0;
		A2=0;
		A3=0;
		pga_A=1;
	  }
}  */

void measure_Y()
{
     //I=AD_num*0.59326171875/10/relay_A/pga_A;
	 //Y=I/(AD_num*0.59326171875);
    // I_I=100000*AD_num/relay_A/pga_A; //仪表放大十倍
	 I_I=100000*AD_num/relay_A; //仪表放大十倍
	 Y=I_I/(AD_num2*1.00);
}

void Y_display()
{
     uchar y5,y4,y3,y2,y1,y0;
     y5=Y/100000;
	 y4=Y%100000/10000;
	 y3=Y%100000%10000/1000;
	 y2=Y%100000%10000%1000/100; 
	 y1=Y%100000%10000%1000%100/10;
	 y0=Y%100000%10000%1000%100%10;
}

void select_f()
{
   Lcd1602_Clear_All( );
   delay(10);
   display_selection();     
   while(!flag_f)
  {
	 keynum=KeyEn();
	 if(keynum==1)
	 {
		display_f(100); 
		AD9851_DDS_Control(100,0); 	     
	 }
	 if(keynum==2)
	 {
		display_f(300); 
		AD9851_DDS_Control(300,0); 	     
	 }
	 if(keynum==3)
	 {
		display_f(1000); 
		AD9851_DDS_Control(1000,0); 	     
	 }
	 if(keynum==4)
	 {
		display_f(3000); 
		AD9851_DDS_Control(3000,0); 	     
	 }
	 if(keynum==5)
	 {
		display_f(10000); 
		AD9851_DDS_Control(10000,0); 	     
	 }
	 if(keynum==6)
	 {
	     flag_f=1;
	 }
   }
}

void f_add()
{
	      Lcd1602_Clear_All( );		   
	      stop0=0;		  
	      while(!stop0)
		  {	 
		     for(i=0;i<20;i++)
			 {   
			     keynum=KeyEn(); //i=2;
			     display_f(100*i+100); 
				 AD9851_DDS_Control(100*i+100,0); 
				 delay(2000); //while(1);   		
				    if(keynum==2) 
				    {
				       stop0=1;
					   break;
					}
	 	  	 } 
		   }
			  Lcd1602_Write_String(1,12,"stop");  
}

void display_selection()
{
    Lcd1602_Write_String(1,0,"1-100"); 
	Lcd1602_Write_String(1,6,"2-300");
	Lcd1602_Write_String(1,12,"3-1K");
	Lcd1602_Write_String(2,0,"4-3K");
	Lcd1602_Write_String(2,5,"5-10K");
} 



⌨️ 快捷键说明

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