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

📄 text1.c

📁 一个二维的太阳能跟踪平台的源代码
💻 C
字号:
#include"STC12C5410AD.H"



//AD程序定义
unsigned char ad_result_data[10];
unsigned char ad_result_low2[10];
unsigned char ad_result_total[10];
unsigned char ad_average_result;
unsigned char r_4,r_5,r_6,r_7;
char tp=0;
unsigned char m,n,s,b,t,en=1;
void get_ad_result();
void delay(char t);


unsigned int z=0;



/*********************************************************************


                  AD转换程序


***********************************************************************/
///////初始化函数
void AD_initiate()
{ 
  ES=0;
  TMOD=0x21;
  SCON=0x50;
  TH1=0xfd;
  TL1=0x0fd;
  TR1=1;
}


/////////////////////////

void ADC_Power_On()     
{
  ADC_CONTR|=0x80;
  delay(5);
}



    //取AD结果函数
void  send_ad_result(unsigned char R)
{  SBUF=R;
												
			
			  while(TI==0) ;

              TI=0;

 }



 
//取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据
void get_ad_result()
{ 	 int i,q=0;
	for(i=0;i<10;i++)
   {
       tp=0;
       ADC_DATA=0;    //高八位数据清零
	   ADC_LOW2=0;	   //低两位清零
       ADC_CONTR|=0x08;  //启动AD转换
       while(!tp)     //判断AD转换是否完成 
         {
           tp=0x10;
           tp&=ADC_CONTR;
         }    
      ADC_CONTR&=0xe7;
		ADC_DATA=ADC_DATA<<2;      //高八位左移两位
	   	ADC_LOW2 &=0x03;

		 ad_average_result=ADC_DATA+ADC_LOW2;
		  q=q+ad_average_result;

	  }
	ad_average_result=q/10;
}



//延时子程序
void delay(char t)	 //160微秒
{ 
  for(s=10;s>0;s--)
  {
   for(m=t;m>0;m--);
   for(n=2;n>0;n--);
  } 
}



void delay02s(char t) //延时子程序
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=t;j>0;j--)
for(k=248;k>0;k--);
}


void yanshi() //延时子程序,延时4分52秒
{
unsigned int i,j,k;
for(i=1000;i>0;i--)
for(j=1000;j>0;j--)
for(k=248;k>0;k--);		  //
}
 /************************************************************

 
                   P1口AD转换程序


*************************************************************/


void fP14()
{
  P1M0|=0x10;	   //设P1_4为开漏模式	如:  P1_1= #00000010B
  P1M1|=0x10;
  ADC_CONTR=0xe4;		//设置通道x,    格式如: P1_x= 0xeX
  delay(2);
  get_ad_result();
  r_4=ad_average_result;
  send_ad_result(r_4);
}


///////////////////////////
void fP15()
{
   P1M0|=0x20;
 P1M1|=0x20;
 ADC_CONTR=0xe5;
  delay(2);
   get_ad_result();
  r_5=ad_average_result;
  send_ad_result(r_5);
}


void fP16()
{
  P1M0|=0x40;
  P1M1|=0x40;		 //设为开漏模式
  ADC_CONTR=0xe6;
  delay(2);
  get_ad_result();
  r_6=ad_average_result;
  send_ad_result(r_6);
}


void fP17()
{
  P1M0|=0x80;
  P1M1|=0x80;		    //设为开漏
  ADC_CONTR=0xe7;	 //设置通道3 	  20--200微秒
  delay(1);
  get_ad_result();		  //取P13结果
  r_7=ad_average_result;
  send_ad_result(r_7);		   // 把结果送到串口
}






/********************************************************

                
				     电机控制程序


********************************************************/




/******************     电机—1    *****************************/

void zhuan_r4()
{  	 
	  fP14();
      fP16();
     while(r_4>r_6)       //
       {
		  P26=1;       
          P27=0;
          fP14();
          fP16();
		  if(P26==0)
		  {break;}	

        }
		  P26=0;       
          P27=0;		    
}


void zhuan_r6()
{

    fP14();
    fP16();
		while((r_6>r_4))
            {		
			  P26=0;
              P27=1;
              fP14();
              fP16();
			 if(P27==0)
			  {	break;}				  
			 }
 		  P26=0;       
          P27=0;
}
		  


void dianji_1()
{
  	   fP14();
	   fP16();
	  if((r_4-7)>r_6) {if(P34==0) {zhuan_r4();}}
	  if(r_4<(r_6-7)){if(P35==0)  {zhuan_r6();}}
}




/******************电机—2***************************/

void zhuan_r5()
{ 
    P10=1;
    P37=0;
	 fP15();         //采样
     fP17();
     while(r_5>r_7)       //比较采样值,如果P1.0大于P1.1,就向P1.0方向转,其余的同理
       { 	     

          P10=1;
          P37=0;		  
		  fP15();         //采样
          fP17();
		  if(P10==0)
			  {break;}
       }
             P10=0;
             P37=0;
   
}
 

void zhuan_r7()
{  
         P10=0;
          P37=1;
		    fP15();         //采样
           fP17();

		while(r_7>r_5)
            {															 
               P10=0;
               P37=1;		
		       fP15();         //采样
              fP17();
			  if(P37==0)
			  {break;}
             }
          P10=0;
          P37=0;
	
}


 void dianji_2()
{	 
     fP15();         //采样
     fP17(); 
	  if((r_5-7)>r_7) {if(P25==0){zhuan_r5();}}

	  if(r_5<(r_7-7)){if(P24==0){zhuan_r7();}}
}



/***************************************************


                定时器延时程序


*****************************************************/


//定时器0初始化
void	Timer0_ini()
{	TMOD=0x01;		//定时器0工作于方式1
	EA=1;			//总中断允许
	ET0=1;			//定时器0允许
	TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;

}


//定时器0中断子程序
 	Timer0() interrupt 1 using 1
{
   
  	TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
	z++;
   	if(z==400)
	{en=0;TR0=0;}
  	 
}

/**************************************************** 

 
                      主程序


****************************************************/


main()
{ 	
  unsigned char i;
     AD_initiate();
	 ADC_Power_On();
	 P27=0;      //电机控制端口初始化
	 P26=0;
	 P10=0;
	 P37=0;
	 P24=1;      //方向调整端口
	 P25=1;
	 while(1)
	  {
//	   for(i=2;i>0;i--)
//	     {
	       dianji_1();
	       dianji_2();
//	   	  }
//		 yanshi();
       while(P12==0)
	   { 
	   	   for(i=2;i>0;i--)         //
	     {
	       dianji_1();
	       dianji_2();
		   
	   	  }
		  yanshi();
	   //P10=0; P37=1;  
	   }	   //向上旋转
/*       while(P25==0)
	   { P10=1; P37=0;  }	   //向上旋转
	   	 P24=1;      //方向调整端口
	 P25=1;
*/	  
	  }

	
	 }

⌨️ 快捷键说明

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