久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2232|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

求助,根據(jù)ds1302得出的時間進行太陽追蹤 單片機程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:710256 發(fā)表于 2020-4-6 12:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我想根據(jù)制作一個可以調(diào)節(jié)的ds1302時鐘,再根據(jù)時鐘計算出太陽高度角和方位角來進行太陽追蹤

可是我的程序卻不能用按鍵將改好的時間寫入ds1302
有高手能看下哪里不正確需要改嗎


單片機源程序如下:
  1. #include <REG52.h>
  2. #include <intrins.h>
  3. #include <math.h>

  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define PI 3.14159                        //圓周率
  7. #define LAT 30.57           //緯度


  8. sbit LCD_SCLK = P0^0;
  9. sbit LCD_STD = P0^1;
  10. sbit LCD_CS = P0^2;


  11. sbit DS1302_CE = P3^1;
  12. sbit DS1302_CK = P3^4;
  13. sbit DS1302_IO = P3^5;

  14. extern void _nop_(void);


  15. uchar        time[8] ;
  16. uchar        set_buf[12] = {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};
  17. uchar   angle[3];
  18. uchar        time_500ms;
  19. uchar        set_num = 0;
  20. uchar        key_num;
  21. uchar        count1,count2;
  22. bit         flag_js;

  23. /* 發(fā)送一個字節(jié)到DS1302通信總線上 */
  24. void DS1302ByteWrite(uchar dat)
  25. {
  26.     uchar mask;
  27.    
  28.     for (mask=0x01; mask!=0; mask<<=1)  //低位在前,逐位移出
  29.     {
  30.         if ((mask&dat) != 0) //首先輸出該位數(shù)據(jù)
  31.             DS1302_IO = 1;
  32.         else
  33.             DS1302_IO = 0;
  34.         DS1302_CK = 1;       //然后拉高時鐘
  35.         DS1302_CK = 0;       //再拉低時鐘,完成一個位的操作
  36.     }
  37.     DS1302_IO = 1;           //最后確保釋放IO引腳
  38. }
  39. /* 由DS1302通信總線上讀取一個字節(jié) */
  40. unsigned char DS1302ByteRead()
  41. {
  42.     uchar mask;
  43.     uchar dat = 0;
  44.    
  45.     for (mask=0x01; mask!=0; mask<<=1)  //低位在前,逐位讀取
  46.     {
  47.         if (DS1302_IO != 0)  //首先讀取此時的IO引腳,并設(shè)置dat中的對應(yīng)位
  48.         {
  49.             dat |= mask;
  50.         }
  51.         DS1302_CK = 1;       //然后拉高時鐘
  52.         DS1302_CK = 0;       //再拉低時鐘,完成一個位的操作
  53.     }
  54.     return dat;              //最后返回讀到的字節(jié)數(shù)據(jù)
  55. }
  56. /* 用單次寫操作向某一寄存器寫入一個字節(jié),reg-寄存器地址,dat-待寫入字節(jié) */
  57. void DS1302SingleWrite(uchar reg, uchar dat)
  58. {
  59.     DS1302_CE = 1;                   //使能片選信號
  60.     DS1302ByteWrite((reg<<1)|0x80);  //發(fā)送寫寄存器指令
  61.     DS1302ByteWrite(dat);            //寫入字節(jié)數(shù)據(jù)
  62.     DS1302_CE = 0;                   //除能片選信號
  63. }
  64. /* 用單次讀操作從某一寄存器讀取一個字節(jié),reg-寄存器地址,返回值-讀到的字節(jié) */
  65. unsigned char DS1302SingleRead(uchar reg)
  66. {
  67.     uchar dat;
  68.    
  69.     DS1302_CE = 1;                   //使能片選信號
  70.     DS1302ByteWrite((reg<<1)|0x81);  //發(fā)送讀寄存器指令
  71.     dat = DS1302ByteRead();          //讀取字節(jié)數(shù)據(jù)
  72.     DS1302_CE = 0;                   //除能片選信號
  73.    
  74.     return dat;
  75. }
  76. /* 用突發(fā)模式連續(xù)寫入8個寄存器數(shù)據(jù),dat-待寫入數(shù)據(jù)指針 */
  77. void DS1302BurstWrite(unsigned char *dat)
  78. {
  79.     uchar i;
  80.    
  81.     DS1302_CE = 1;
  82.     DS1302ByteWrite(0xBE);  //發(fā)送突發(fā)寫寄存器指令
  83.     for (i=0; i<8; i++)     //連續(xù)寫入8字節(jié)數(shù)據(jù)
  84.     {
  85.         DS1302ByteWrite(dat[i]);
  86.     }
  87.     DS1302_CE = 0;
  88. }
  89. /* 用突發(fā)模式連續(xù)讀取8個寄存器的數(shù)據(jù),dat-讀取數(shù)據(jù)的接收指針 */
  90. void DS1302BurstRead(uchar *dat)
  91. {
  92.     uchar i;
  93.    
  94.     DS1302_CE = 1;
  95.     DS1302ByteWrite(0xBF);  //發(fā)送突發(fā)讀寄存器指令
  96.     for (i=0; i<8; i++)     //連續(xù)讀取8個字節(jié)
  97.     {
  98.         dat[i] = DS1302ByteRead();
  99.     }
  100.     DS1302_CE = 0;
  101. }
  102. /* DS1302初始化,如發(fā)生掉電則重新設(shè)置初始時間 */
  103. void InitDS1302()
  104. {
  105.     uchar dat;
  106.     uchar code InitTime[] = {  //2020年4月1日 星期二 12:30:00
  107.         0x00,0x30,0x12, 0x01, 0x04, 0x02, 0x20
  108.     };
  109.    
  110.     DS1302_CE = 0;  //初始化DS1302通信引腳
  111.     DS1302_CK = 0;
  112.     dat = DS1302SingleRead(0);  //讀取秒寄存器
  113.     if ((dat & 0x80) != 0)      //由秒寄存器最高位CH的值判斷DS1302是否已停止
  114.     {
  115.         DS1302SingleWrite(7, 0x00);  //撤銷寫保護以允許寫入數(shù)據(jù)
  116.         DS1302BurstWrite(InitTime);  //設(shè)置DS1302為默認的初始時間
  117.     }
  118. }

  119. //***********************************************************
  120. //函數(shù):void key(void)
  121. //功能:鍵盤掃描、識別以及處理
  122. //***********************************************************
  123. void key(void)
  124. {
  125.         uchar        tmp,temp;
  126.     tmp=P1|0x07;
  127.         temp = tmp;
  128.         temp &= 0x07;
  129.         if(temp != key_num)
  130.         {
  131.                 key_num = temp;
  132.                 switch(key_num)
  133.                 {
  134.                         case 0x06: if(flag_js == 0)//設(shè)定/退出
  135.                         {
  136.                           flag_js = 1;
  137.                           count1  = 1;
  138.                                                    
  139.                         }
  140.                        else if(flag_js == 1)
  141.                         {
  142.                           time[6] = (set_buf[11]<<4)+(set_buf[10]&0x0f);//年
  143.                           
  144.                           time[4] = (set_buf[9]<<4)+(set_buf[8]&0x0f);//月
  145.                           time[3] = (set_buf[7]<<4)+(set_buf[6]&0x0f);//日
  146.                           time[2] = (set_buf[5]<<4)+(set_buf[4]&0x0f);//時
  147.                           time[1] = (set_buf[3]<<4)+(set_buf[2]&0x0f);//分
  148.                           time[0] = (set_buf[1]<<4)+(set_buf[0]&0x0f); //秒
  149.                           DS1302BurstWrite(time);
  150.                           flag_js = 0;
  151.                           count2  = 1;

  152.                          }
  153.                         break;
  154.                         case 0x05: if(flag_js == 1)//移位
  155.                                                 {
  156.                                                         set_num ++;
  157.                                                         if(set_num > 11)
  158.                                                         set_num = 0;
  159.                                                 }
  160.                                                 break;
  161.                         case 0x03: if(flag_js == 1)//數(shù)字加一
  162.                                                 {
  163.   switch(set_num)
  164.   {
  165.    case 0:  if(set_buf[0] > 0x38) set_buf[0] = 0x30; //秒的個位
  166.    else set_buf[0]++; break;
  167.    case 1:  if(set_buf[1] > 0x34) set_buf[1] = 0x30; //秒的十位
  168.    else set_buf[1]++; break;
  169.    case 2:  if(set_buf[2] > 0x38) set_buf[2] = 0x30;
  170.    else set_buf[2]++; break;
  171.    case 3:  if(set_buf[3] > 0x34) set_buf[3] = 0x30; //分
  172.    else set_buf[3]++; break;
  173.    case 4:  if(set_buf[4] > 0x38) set_buf[4] = 0x30;
  174.    else set_buf[4]++; break;
  175.    case 5:  if(set_buf[5] > 0x31) set_buf[5] = 0x30; //時
  176.    else set_buf[5]++; break;
  177.    case 6:  if(set_buf[6] > 0x38) set_buf[5] = 0x30;
  178.    else set_buf[6]++; break;
  179.    case 7:  if(set_buf[7] > 0x32) set_buf[5] = 0x30; //日
  180.   else set_buf[7]++; break;
  181.   case 8:  if(set_buf[8] > 0x38) set_buf[5] = 0x30;
  182.   else set_buf[8]++; break;
  183.   case 9:  if(set_buf[9] > 0x31) set_buf[5] = 0x30; //月
  184.   else set_buf[9]++; break;
  185.   case 10:  if(set_buf[10] > 0x38) set_buf[5] = 0x30;
  186.   else set_buf[10]++; break;
  187.   case 11:  if(set_buf[11] > 0x38) set_buf[5] = 0x30; //年
  188.   else set_buf[11]++; break;
  189.   default: break;
  190.                                                         }
  191.                                                 }
  192.                                                 break;

  193.                         default: break;
  194.                 }
  195.         }
  196. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:401564 發(fā)表于 2020-4-6 17:25 | 只看該作者
用4個光敏電阻通過實時采光跟蹤它不好嗎?
冬天下午3點和夏天的下午3點,這太陽的方向是不一樣的呀
回復(fù)

使用道具 舉報

板凳
ID:710256 發(fā)表于 2020-4-6 17:51 | 只看該作者
這是算太陽角度,和主程序,望大佬指正

  1. /*計算太陽角度*/
  2. void anglecalculate()
  3. {  
  4.    int     leap;
  5.    uint    year,mon,day;
  6.    uint    hour,min,sec;
  7.    uint    DayAdd;
  8.    uchar   DecAngle,HourAngle,DecAngle1;
  9.    uchar   EleAngle,AziAngle,AziAngle1;
  10.    year=(time[6]>>4)*10+(time[6]&0x0f)+2000;
  11.    mon=(time[4]>>4)*10+(time[4]&0x0f);
  12.    day=(time[3]>>4)*10+(time[3]&0x0f);
  13.    hour=(time[2]>>4)*10+(time[2]&0x0f);
  14.    min=(time[1]>>4)*10+(time[1]&0x0f);
  15.    sec=(time[0]>>4)*10+(time[0]&0x0f);
  16.    leap=(year%4==0&&year%100!=0)||(year%400==0);閏年計算
  17.    switch(mon)
  18.           {
  19.             case 1:
  20.                   DayAdd=(day);break;
  21.             case 2:
  22.                   DayAdd=31+day;break;
  23.             case 3:
  24.                           DayAdd=31+28+day;break;
  25.             case 4:
  26.                           DayAdd=31+28+31+day;break;
  27.             case 5:
  28.                           DayAdd=31+28+31+30+day;break;
  29.             case 6:
  30.                           DayAdd=31+28+31+30+31+day;break;
  31.             case 7:
  32.                           DayAdd=31+28+31+30+31+30+day;break;
  33.             case 8:
  34.                       DayAdd=31+28+31+30+31+30+31+day;break;
  35.             case 9:
  36.                           DayAdd=31+28+31+30+31+30+31+31+day;break;
  37.             case 10:
  38.                           DayAdd=31+28+31+30+31+30+31+31+30+day;break;
  39.             case 11:
  40.                           DayAdd=31+28+31+30+31+30+31+31+30+31+day;break;
  41.             case 12:
  42.                           DayAdd=31+28+31+30+31+30+31+31+30+31+30+day;break;
  43.                 default:
  44.                       break;         /*cout<<"月份輸入錯誤!*/
  45.           }
  46.   if(leap&&(mon>=3))
  47.   DayAdd=DayAdd+1; //當(dāng)前天數(shù)  
  48.   DecAngle=(23.45*sin(2*PI*(284+DayAdd)/365))*PI/180;//計算赤緯角
  49.   DecAngle1=(23.45*sin(2*PI*(284+DayAdd+1)/365))*PI/180;//計算第二天赤緯角
  50.   HourAngle=(12-(hour)-(min)/60.0-(sec)/3600.0)*PI/12;//計算時角
  51.   EleAngle=asin(sin(LAT)*sin(DecAngle)+cos(LAT )*cos(DecAngle)*cos(HourAngle));//計算高度角
  52.   AziAngle=acos((sin(EleAngle)*sin(LAT )-sin(DecAngle))/(cos(EleAngle)*cos(LAT )));//計算方位角
  53.   AziAngle1=acos((0-sin(DecAngle1))/cos(LAT ));//計算第二天的方位角
  54.   angle[0]=EleAngle;
  55.   angle[1]=AziAngle;
  56.   angle[2]=AziAngle1;
  57.   
  58.      
  59. }/*視日軌跡追蹤*/
  60. void trackgo()
  61. {
  62.     uchar h,f;
  63.     uchar y,z;
  64.     uchar p,q;
  65.     uchar c=0,d=0;

  66.    
  67.     h=angle[0];//得到高度角
  68.     f=angle[1];//得到方位角
  69.     y=(f-c)/5;//計算方位電機需旋轉(zhuǎn)圈數(shù)
  70.     z=(h-d)/1;//計算高度電機需旋轉(zhuǎn)圈數(shù)
  71.     c=f;
  72.     d=h;
  73.     if(y!=0)
  74.     {              
  75.       for(p=0;p<y;p++)
  76.        {
  77.         GoA1();
  78.        }
  79.      }
  80.     else
  81.      {  
  82.        if(z!=0)
  83.         {            
  84.          for(q=0;q<z;q++)
  85.           {
  86.             GoB1();
  87.            }
  88.          }
  89.       }            
  90.     P2=0x00;
  91. }
  92. //函數(shù):void main()功能:主函數(shù),初始化
  93. void main()
  94. {
  95.     uchar psec=0xaa;
  96.     uchar time_30s=0;
  97.     uint getdata;
  98.     float temp;
  99.    
  100.     P2=0x00;
  101.         time_500ms = 0;
  102.         flag_js = 0;
  103.         count1 = 1;
  104.         count2 = 1;

  105.     InitDS1302();
  106.     timer_init();
  107.     Out_Init();
  108.    LCD_init();
  109.        
  110.     delay_ms(50);

  111.     E_W_ANGLE=read2543(0x00);
  112.     S_N_ANGLE=read2543(0x10);
  113.     LIGHT_DETECTION=read2543(0x20);
  114.    
  115.         while(1)
  116.         {
  117.       
  118.        if(time_500ms == 50)
  119.        {
  120.             time_500ms=0;
  121.             DS1302BurstRead(time);//獲得時間
  122.             key();
  123.             anglecalculate();
  124.             if(psec!=time[0])
  125.              {                       
  126.                            disp(flag_js); //用液晶顯示時間
  127.                psec=time[0];
  128.               }
  129.             time_30s++;
  130.         
  131.             if(time_30s==6)//3s判定一次方位
  132.              {
  133.                  time_30s=0;
  134.                  getdata=read2543(0x20);
  135.                  getdata=read2543(0x20);
  136.                  getdata=read2543(0x20);
  137.                  temp=(float)getdata/4095*500;
  138.                  LIGHT_DETECTION=temp;//當(dāng)前光照強度
  139.                  temp=0;

  140.                  if(LIGHT_DETECTION<300&&LIGHT_DETECTION>100)//光強不足啟用視日軌跡追蹤
  141.                   {
  142.                      trackgo();           
  143.                    }            
  144.             }
  145.       
  146.             startgo();
  147.        }
  148.         }
  149. }
復(fù)制代碼
回復(fù)

使用道具 舉報

地板
ID:710256 發(fā)表于 2020-4-6 20:37 | 只看該作者
Y_G_G 發(fā)表于 2020-4-6 17:25
用4個光敏電阻通過實時采光跟蹤它不好嗎?
冬天下午3點和夏天的下午3點,這太陽的方向是不一樣的呀

用采光跟蹤只是其中一部分還要與軌跡跟蹤相配合,光強不夠,天氣不好就啟用軌跡跟蹤
回復(fù)

使用道具 舉報

5#
ID:401564 發(fā)表于 2020-4-7 09:36 | 只看該作者
astlaqwq 發(fā)表于 2020-4-6 20:37
用采光跟蹤只是其中一部分還要與軌跡跟蹤相配合,光強不夠,天氣不好就啟用軌跡跟蹤

你這估計是太陽能之類的,那天氣不好的話,太陽能還有什么用呢?沒有太陽,轉(zhuǎn)哪不都一樣的嗎?有了太陽,就調(diào)整一下不就得了
而且,這經(jīng)度時間什么的,你算過時區(qū)沒有呀?我們用的是北京時間,你家在北京嗎?大年三十的時候,新疆那邊可是晚上八九點才天黑的
冬天和夏天的太陽軌跡也是不一樣的
采光跟蹤已經(jīng)可以解決很多問題
回復(fù)

使用道具 舉報

6#
ID:710256 發(fā)表于 2020-4-7 12:49 | 只看該作者
Y_G_G 發(fā)表于 2020-4-7 09:36
你這估計是太陽能之類的,那天氣不好的話,太陽能還有什么用呢?沒有太陽,轉(zhuǎn)哪不都一樣的嗎?有了太陽,就調(diào)整 ...

我主要是實現(xiàn)在白天實現(xiàn)全天候的太陽追蹤所以需要兩種方式一起用,至于經(jīng)度的校正沒有進行,不需要太精確,能力有限,看了一堆資料被一大堆公式繞了進去
回復(fù)

使用道具 舉報

7#
ID:678200 發(fā)表于 2020-4-9 17:57 | 只看該作者
求仿真跟程序,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

8#
ID:671688 發(fā)表于 2023-3-9 14:01 | 只看該作者
求仿真跟程序,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 看av电影| 国产中文原创 | 九热在线 | 国产高清精品一区二区三区 | 国产精品免费视频一区 | 日韩一区二区在线视频 | 亚洲综合久久久 | 亚洲av毛片| 国产1区2区| 久久精品中文 | 欧美aⅴ在线观看 | 国产毛片毛片 | 日日夜夜天天综合 | 欧美亚洲国产日韩 | 亚洲国产二区 | 97精品久久| 欧美一区二区在线播放 | 国产亚洲高清视频 | 狠狠久久久 | www.99精品| 久久国产精品网站 | 97超碰人人草 | 国产无套一区二区三区久久 | 国产精品国产成人国产三级 | 欧美日韩大片 | 亚洲精品中文字幕av | 日本一区二区三区四区 | 亚洲综合伊人 | 日韩欧美大片在线观看 | 国产乱码精品一区二区三区五月婷 | 精品一区在线看 | 午夜视频一区二区三区 | 一区二区三区四区av | 希岛爱理在线 | 国产精品久久久久久吹潮日韩动画 | 黄网免费 | 国产在线第一页 | 国精日本亚洲欧州国产中文久久 | 国产精品免费在线 | 欧美一区二区三区在线观看 | 在线a视频网站 |