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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PIC單片機(jī)自帶RTCC制作誤差mS級時鐘 附源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
在網(wǎng)上淘了一個PIC18F85K90自帶RTCC功能的單片機(jī),寫了一段測試一下RTCC的精度,運(yùn)作了5天,還好_精度達(dá)到了誤差毫秒級.
隨手加了一個AHT15溫濕度,上傳賺點(diǎn)黑幣
注:32.768(5ppm)晶振需要加兩個30pF電容穩(wěn)定震蕩頻率, 每30分鐘與60分鐘進(jìn)位時秒顯示。

制作出來的實(shí)物圖如下:


單片機(jī)源程序如下:
  1. #include <htc.h>
  2. #include "Delay.h"
  3. #include "Driver.h"
  4. #include "TA6932.H"  
  5. #include "RTCC.H"
  6. #include "Selection.h"
  7. #include "AHT15.H"

  8. void main()
  9.   {
  10.                 initialization();                        //單片機(jī)寄存器初始化
  11.             Delay_mS(500);
  12.                 AHT15_iic_Init();          //AHT15_初始化        
  13.                   RTCC_WD_Init();
  14.                 while (1)
  15.            {
  16.         READ_RTCC();                    //讀時間寄存器操作
  17.         check_Data();                       //時間校準(zhǔn)【此函數(shù)一定要放在READ_RTCC()后面_因?yàn)榕袛嗝糠昼娬{(diào)整一次的判斷值是十進(jìn)制】
  18.               Function_Selection();    //功能選擇
  19.                 SMG_DisPlay_TIME(0x44, 0x06, LED);//數(shù)碼管顯示
  20.        }   
  21.     }

  22. void  interrupt TIMER0()     //TIMER0中斷函數(shù)【定時 50mS】
  23.   {
  24.         TMR0IF      =  0 ;                   //中斷標(biāo)志位清零
  25.         TMR0H      =  0x3C;                                // TMR0H只是緩沖寄存器,在寫 TMR0L寄存器同時,使用TMR0H的內(nèi)容更新Timer0的高字節(jié)內(nèi)容
  26.         TMR0L      =   0xB7  ;           //初值 15536_分頻器倍數(shù)少于16,所有不用需要校正值【15536+(14/(2_分頻值))】
  27.         if(  Key_Flag   ==  400)      Key_Flag  =  0;
  28.         if( Sec_Flag    ==  20)         Sec_Flag   =  0;
  29.         Key_Flag ++;
  30.         Sec_Flag++ ;
  31.     }
復(fù)制代碼
  1. #include "Delay.h"
  2. #include "RTCC.H"
  3. #include "Selection.h"

  4. RTC   _RTCVALH; //定義_共同體變量1
  5. RTC   _RTCVALL; //定義_共同體變量2

  6. void check_Data()  //校準(zhǔn)_【每秒鐘調(diào)整一次將其加到 RTCC 定時器中】
  7.         {
  8.                 //如2小時快1秒的話則為 1/(2小時*3600秒)= 1s / 7200 = 0.1389ms
  9.                 //也就是說明每秒快了0.139MS,由此可推算出真正的【XI】晶振頻率為:1.3472=XI/32768
  10.                 //XI=1.0001389*32768 =  32772.55HZ     32772.55-32768 = 4.55即晶振頻率為每秒鐘多了約5個脈沖
  11.                 //4.55*60= 每秒分鐘多了 273個脈沖   273 / 4 =  68.25 取 69 【可以認(rèn)為每秒分鐘減去69個脈沖】即69*4 = 276
  12.                 //- 69 = 0XBB;

  13.                 if (_RTCVALL.SECOND == 0 )//每秒鐘調(diào)整一次 !HALFSEC
  14.                              RTCCAL         =  RTCCAL_Temp ;   //時鐘校準(zhǔn)寄存器;    //RTCC 校準(zhǔn)寄存器   0x88【-120】; -120X4=-480 即在 RTCCAL“每分鐘減少480”個時鐘脈沖
  15. }               
  16.          


  17. void RTCC_WD_Init()  //*** RTCC預(yù)設(shè)初值* ****/    RTCC數(shù)據(jù)允許寫入
  18.    {
  19.                 uchar temp  ;
  20.                  /*********啟動數(shù)據(jù)初始化**************/
  21.                 _RTCVALH.YEAR            =    0x21; //11     年            YEAR  【自動返回RTCC 值寄存器_初始地址】
  22.                 _RTCVALH.MONTH       =    0x05;  //10    月             MONTH
  23.                 _RTCVALH.DAY              =    0x07;         //10   日             DAY
  24.                 _RTCVALH.WEEKDAY   =    0x05;         //01   星期         WEEKDAY
  25.                 _RTCVALH.HOUR          =     0x12;          //01  小時數(shù)     HOUR        
  26.                 _RTCVALH.MINUTE       =     0x01;  //00   分鐘數(shù)     MINUTE
  27.                 _RTCVALH.SECOND      =     0x58;          //00  秒數(shù)         SECOND
  28.         
  29.             EECON2    = 0X55;
  30.                 EECON2   = 0XAA;
  31.                 nop();   //在 55h/AA 解碼序列和 RTCWREN置 1 之間只允許一個指令周期的時間窗口
  32.                 RTCCFGbits.RTCWREN = 1;       // 允許RTCCFG寄存器進(jìn)行寫操作
  33.                 RTCCFG            |=  0x03;             //  RTCC 值寄存器窗口指針位_指向地址【1 1】
  34.         
  35.                   GIE  = 0;                                              //關(guān)閉全局中斷
  36. /***********************RTCVALL   ****************************/
  37.         /*通過讀 / 寫    RTCVALH 寄存器, RTCC 指針值(RTCPTR<1:0>)*/      
  38.         /*遞減 1,直到其達(dá)到 00。一旦達(dá)到00; MINUTES 和 SECONDS 值就可 */
  39.         /*通過 RTCVALH 和  RTCVALL 進(jìn)行訪問,直到手動更改指針值為止。
  40.                                                                         RTCVALH:
  41.                                                                         00 = 分鐘數(shù)
  42.                                                                         01 = 星期
  43.                                                                         10 = 月
  44.                                                                         11 = 保留
  45.                                                                         RTCVALL:
  46.                                                                         00 = 秒數(shù)
  47.                                                                         01 = 小時數(shù)
  48.                                                                         10 = 日
  49.                                                                         11 = 年
  50.         **************************************************************/   
  51.                 RTCCFGbits. RTCPTR = 3;
  52.            
  53.                 RTCVALL  =   _RTCVALH.YEAR  ;
  54.                 temp         =    RTCVALH;  //11 保留        
  55.                 RTCVALL  =   _RTCVALH.DAY;
  56.                 RTCVALH  =  _RTCVALH.MONTH ;
  57.                 RTCVALL  =  _RTCVALH.HOUR;
  58.                 RTCVALH =   _RTCVALH.WEEKDAY ;
  59.                 RTCVALL  =   _RTCVALH.SECOND  ;
  60.                 RTCVALH =  _RTCVALH.MINUTE;

  61.                 RTCEN = 1;   //  RTCC使能
  62.         RTCCFGbits. RTCWREN = 0;          //關(guān)閉RTCCFG寄存器寫操作
  63.                 /*******************************************************/
  64.        GIE  = 1;// 恢復(fù)全局中斷

  65. }

  66. void READ_RTCC()  //讀時間寄存器操作
  67.    {  
  68.                 uchar temp  ;
  69.                 RTCCFGbits. RTCPTR = 3;
  70.                 temp           =    RTCVALH;  //11 保留        
  71.                 Delay_uS(1); //延時10指令周期, 等待RTCC 值寄存器指針跳到【0 0】
  72.                
  73.                 /*        指針一旦達(dá)到【0 0】        【MINUTES 和 SECONDS 值就可通過 RTCVALH 和        RTCVALL 進(jìn)行訪問】*/
  74.                 while(RTCPTR1 &&  RTCPTR0);

  75.                         RTCCFGbits. RTCPTR = 3;
  76.                         temp           =    RTCVALH;  //11 保留-->【開始調(diào)用指針        】
  77.                         
  78.                         RTCCFGbits. RTCPTR = 2;
  79.                         _RTCVALH.MONTH        =   RTCVALH;  //10   月
  80.                         
  81.                         RTCCFGbits. RTCPTR = 1;  
  82.                         _RTCVALH.WEEKDAY          =   RTCVALH;  //01 星期   
  83.                         
  84.                         RTCCFGbits. RTCPTR = 0;
  85.                         _RTCVALH.MINUTE        =   RTCVALH;  //00 分鐘數(shù)
  86.                         
  87.                         RTCCFGbits. RTCPTR = 3;  
  88.                         _RTCVALL.YEAR                   =   RTCVALL;   //11   年         
  89.                         
  90.                         RTCCFGbits. RTCPTR = 2;                        
  91.                         _RTCVALL.DAY                     =   RTCVALL;   //10    日
  92.                         
  93.                         RTCCFGbits. RTCPTR = 1;        
  94.                         _RTCVALL.HOUR           =   RTCVALL;    //01   小時數(shù)
  95.                         
  96.                         RTCCFGbits. RTCPTR = 0;
  97.                         _RTCVALL.SECOND      =   RTCVALL;    //00   秒數(shù)


  98.                 _RTCVALL.YEAR                     =    Read_RTCC_Bin( _RTCVALL.YEAR);        // 年
  99.                 _RTCVALH.MONTH         =    Read_RTCC_Bin(  _RTCVALH.MONTH); // 月
  100.                 _RTCVALL.DAY                          =    Read_RTCC_Bin( _RTCVALL.DAY);          // 日
  101.                 _RTCVALH.WEEKDAY     =    _RTCVALH.WEEKDAY         & 0x07;                      // 星期
  102.                 _RTCVALL.HOUR                    =    Read_RTCC_Bin( _RTCVALL.HOUR);      // 小時
  103.                 _RTCVALH.MINUTE         =    Read_RTCC_Bin( _RTCVALH.MINUTE );  //分鐘數(shù)
  104.                 _RTCVALL.SECOND         =    Read_RTCC_Bin( _RTCVALL.SECOND); //  秒  
  105.   }
復(fù)制代碼



所有代碼51hei提供下載:
PIC18F85K90.rar (623.24 KB, 下載次數(shù): 21)

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:454811 發(fā)表于 2021-5-24 19:52 | 只看該作者
aht15精度怎么樣,做水合了嗎?
回復(fù)

使用道具 舉報

板凳
ID:474417 發(fā)表于 2021-5-24 23:38 | 只看該作者
溫濕度的精度還很不錯,反應(yīng)也很快
回復(fù)

使用道具 舉報

地板
ID:107522 發(fā)表于 2021-8-9 17:17 | 只看該作者
請教一下,只有一個時鐘源,怎么做到頻率校準(zhǔn)的啊
回復(fù)

使用道具 舉報

5#
ID:474417 發(fā)表于 2021-9-29 23:37 | 只看該作者
cjs2004 發(fā)表于 2021-8-9 17:17
請教一下,只有一個時鐘源,怎么做到頻率校準(zhǔn)的啊

單片機(jī)時鐘與RTCC時鐘是各自獨(dú)立的晶振運(yùn)行,經(jīng)過幾個月的運(yùn)行,RTCC的精度還可以,誤差小于1秒。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线一级片 | 中文字幕亚洲欧美 | 国产精品一区二区视频 | 亚洲日本一区二区 | 色在线免费视频 | 亚洲 精品 综合 精品 自拍 | 99热热精品 | 欧美成人一区二区 | 日韩免费三级 | 九九综合九九 | 久久欧美高清二区三区 | 中文字幕第一页在线 | 日本成人中文字幕在线观看 | 一呦二呦三呦国产精品 | 国产一区二区三区在线看 | 久久久片 | 久久久精品视频免费看 | 久久精品免费一区二区三 | 久久国产精品一区 | 女同久久另类99精品国产 | 色性av| 欧美男人天堂 | 亚洲综合视频 | 毛片大全 | 91精品国产乱码久久久久久久久 | 久久国产精品免费一区二区三区 | 国产美女在线播放 | 午夜看片 | 一区二区精品视频 | 成人在线视频免费观看 | 中文字幕视频在线 | 精品一区二区三区四区五区 | 欧美日韩国产三级 | 国产福利一区二区 | 国产中文字幕在线 | 中文字幕亚洲精品 | 一级欧美日韩 | 午夜精品福利视频 | 嫩草视频入口 | 亚洲精品区 | 91资源在线 |