這是算太陽角度,和主程序,望大佬指正
- /*計算太陽角度*/
- void anglecalculate()
- {
- int leap;
- uint year,mon,day;
- uint hour,min,sec;
- uint DayAdd;
- uchar DecAngle,HourAngle,DecAngle1;
- uchar EleAngle,AziAngle,AziAngle1;
- year=(time[6]>>4)*10+(time[6]&0x0f)+2000;
- mon=(time[4]>>4)*10+(time[4]&0x0f);
- day=(time[3]>>4)*10+(time[3]&0x0f);
- hour=(time[2]>>4)*10+(time[2]&0x0f);
- min=(time[1]>>4)*10+(time[1]&0x0f);
- sec=(time[0]>>4)*10+(time[0]&0x0f);
- leap=(year%4==0&&year%100!=0)||(year%400==0);閏年計算
- switch(mon)
- {
- case 1:
- DayAdd=(day);break;
- case 2:
- DayAdd=31+day;break;
- case 3:
- DayAdd=31+28+day;break;
- case 4:
- DayAdd=31+28+31+day;break;
- case 5:
- DayAdd=31+28+31+30+day;break;
- case 6:
- DayAdd=31+28+31+30+31+day;break;
- case 7:
- DayAdd=31+28+31+30+31+30+day;break;
- case 8:
- DayAdd=31+28+31+30+31+30+31+day;break;
- case 9:
- DayAdd=31+28+31+30+31+30+31+31+day;break;
- case 10:
- DayAdd=31+28+31+30+31+30+31+31+30+day;break;
- case 11:
- DayAdd=31+28+31+30+31+30+31+31+30+31+day;break;
- case 12:
- DayAdd=31+28+31+30+31+30+31+31+30+31+30+day;break;
- default:
- break; /*cout<<"月份輸入錯誤!*/
- }
- if(leap&&(mon>=3))
- DayAdd=DayAdd+1; //當前天數
- DecAngle=(23.45*sin(2*PI*(284+DayAdd)/365))*PI/180;//計算赤緯角
- DecAngle1=(23.45*sin(2*PI*(284+DayAdd+1)/365))*PI/180;//計算第二天赤緯角
- HourAngle=(12-(hour)-(min)/60.0-(sec)/3600.0)*PI/12;//計算時角
- EleAngle=asin(sin(LAT)*sin(DecAngle)+cos(LAT )*cos(DecAngle)*cos(HourAngle));//計算高度角
- AziAngle=acos((sin(EleAngle)*sin(LAT )-sin(DecAngle))/(cos(EleAngle)*cos(LAT )));//計算方位角
- AziAngle1=acos((0-sin(DecAngle1))/cos(LAT ));//計算第二天的方位角
- angle[0]=EleAngle;
- angle[1]=AziAngle;
- angle[2]=AziAngle1;
-
-
- }/*視日軌跡追蹤*/
- void trackgo()
- {
- uchar h,f;
- uchar y,z;
- uchar p,q;
- uchar c=0,d=0;
-
- h=angle[0];//得到高度角
- f=angle[1];//得到方位角
- y=(f-c)/5;//計算方位電機需旋轉圈數
- z=(h-d)/1;//計算高度電機需旋轉圈數
- c=f;
- d=h;
- if(y!=0)
- {
- for(p=0;p<y;p++)
- {
- GoA1();
- }
- }
- else
- {
- if(z!=0)
- {
- for(q=0;q<z;q++)
- {
- GoB1();
- }
- }
- }
- P2=0x00;
- }
- //函數:void main()功能:主函數,初始化
- void main()
- {
- uchar psec=0xaa;
- uchar time_30s=0;
- uint getdata;
- float temp;
-
- P2=0x00;
- time_500ms = 0;
- flag_js = 0;
- count1 = 1;
- count2 = 1;
- InitDS1302();
- timer_init();
- Out_Init();
- LCD_init();
-
- delay_ms(50);
- E_W_ANGLE=read2543(0x00);
- S_N_ANGLE=read2543(0x10);
- LIGHT_DETECTION=read2543(0x20);
-
- while(1)
- {
-
- if(time_500ms == 50)
- {
- time_500ms=0;
- DS1302BurstRead(time);//獲得時間
- key();
- anglecalculate();
- if(psec!=time[0])
- {
- disp(flag_js); //用液晶顯示時間
- psec=time[0];
- }
- time_30s++;
-
- if(time_30s==6)//3s判定一次方位
- {
- time_30s=0;
- getdata=read2543(0x20);
- getdata=read2543(0x20);
- getdata=read2543(0x20);
- temp=(float)getdata/4095*500;
- LIGHT_DETECTION=temp;//當前光照強度
- temp=0;
- if(LIGHT_DETECTION<300&&LIGHT_DETECTION>100)//光強不足啟用視日軌跡追蹤
- {
- trackgo();
- }
- }
-
- startgo();
- }
- }
- }
復制代碼 |