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

📄 tyngz.c

📁 通过光敏电阻实现的太阳能跟踪的程序
💻 C
字号:
#include"AT89x51.h"

char tp=0;
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;

void get_ad_result();
char delay(char t);


/*void init()
{
	
} */



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



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

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

////////////////////////////////////////////////////////////
//取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;
}


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

 
                   P1口AD转换程序


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


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


///////////////////////////
void P11()
{
   P1M0|=0x02;
 P1M1|=0x02;
 ADC_CONTR=0xe1;
  delay(2);
   get_ad_result();
  r_5=ad_average_result;
  send_ad_result(r_5);
}


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


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

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



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




/******************     云台水平转动    *****************************/

								 

void qxzhuan_L()				 //强行左转
{
	  P10();
      P12();	
	while((r_6-7)>r_4)			 //如果右大于左
	{
		P1_4=1;                  //强行左转
		P1_5=0;
	} 			    	
}



void qxzhuan_R()				 //强行右转
{
	  P10();
      P12();	
	while((r_4-7)>r_6)			 //如果左大于右
	{
		P1_4=0;                  //强行右转
		P1_5=1;
	} 			    	
}



void zhuan_L()					 //左转
{  	 
	  P10();
      P12();	
	while((r_4-7)>r_6)			 //如果左大于右
	{
		if(P2_2==1)				 //如果触动了左限位开关,则强行向右回转
		{qxzhuan_R();}
		else
		P1_4=1;                  //左转
		P1_5=0; 			     //右不转
	}						   

}



void zhuan_R()					 //右转
{  	 
	  P10();
      P12();	
	while((r_6-7)>r_4)			 //如果右大于左
	{
		if(P2_3==1)				 //如果触动了右限位开关,则强行向左回转
		{qxzhuan_L();}
		else
		P1_4=0;                  //左不转
		P1_5=1; 			     //右转
	}						   

}



void shuiping()
{								 
	P10();						 //水平光强的采样
	P12();
	 if((r_4-7)>r_6)			 //如果左大于右
	 {
	 	zhuan_L();
	 }
	 else if((r_6-7)>r_4)			 //如果右大于左
	 {
	 	zhuan_R();
	 }
	 else
	 P1_4=0;                     //左不转
	 P1_5=0; 			         //右不转
}
	






/*************************云台垂直转动***************************/


void zhuan_U()					 //上转
{  	 
	  P11();
      P13();	
	while((r_5-7)>r_7)			 //如果上大于下
	{
		else
		P1_6=1;                  //上转
		P1_7=0; 			     //下不转
	}						   

}



void zhuan_D()					 //下转
{  	 
	  P11();
      P13();	
	while((r_7-7)>r_5)			 //如果下大于上
	{
		P1_6=0;                  //上不转
		P1_7=1; 			     //下转
	}						   

}


void chuizhi()
{								 
	P11();						 //垂直方向光强的采样
	P13();
	 if((r_5-7)>r_7)			 //如果上大于下
	 {
	 	zhuan_U();
	 }
	 else if((r_7-7)>r_5)			 //如果下大于上
	 {
	 	zhuan_D();
	 }
	 else
	 P1_6=0;                     //上不转
	 P1_7=0; 			         //下不转
}


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

 
                      主程序


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


main()
{ 	
//     AD_initiate();
	 ADC_Power_On();
	 P1_4=0;      //电机控制端口初始化
	 P1_5=0;
	 P1_6=0;
	 P1_7=0;
	 while(1)
	  {

	       shuiping();
	       chuizhi();

	   }	   //向上旋转
	  
 }

⌨️ 快捷键说明

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