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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3243|回復(fù): 4
收起左側(cè)

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

[復(fù)制鏈接]
ID:474417 發(fā)表于 2021-5-23 21:49 | 顯示全部樓層 |閱讀模式
在網(wǎng)上淘了一個(gè)PIC18F85K90自帶RTCC功能的單片機(jī),寫(xiě)了一段測(cè)試一下RTCC的精度,運(yùn)作了5天,還好_精度達(dá)到了誤差毫秒級(jí).
隨手加了一個(gè)AHT15溫濕度,上傳賺點(diǎn)黑幣
注:32.768(5ppm)晶振需要加兩個(gè)30pF電容穩(wěn)定震蕩頻率, 每30分鐘與60分鐘進(jìn)位時(shí)秒顯示。

制作出來(lái)的實(shí)物圖如下:
IMG_20210523_213954.jpg IMG_20210523_213908.jpg IMG_20210523_213901.jpg

單片機(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();                    //讀時(shí)間寄存器操作
  17.         check_Data();                       //時(shí)間校準(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ù)【定時(shí) 50mS】
  23.   {
  24.         TMR0IF      =  0 ;                   //中斷標(biāo)志位清零
  25.         TMR0H      =  0x3C;                                // TMR0H只是緩沖寄存器,在寫(xiě) TMR0L寄存器同時(shí),使用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 定時(shí)器中】
  7.         {
  8.                 //如2小時(shí)快1秒的話則為 1/(2小時(shí)*3600秒)= 1s / 7200 = 0.1389ms
  9.                 //也就是說(shuō)明每秒快了0.139MS,由此可推算出真正的【XI】晶振頻率為:1.3472=XI/32768
  10.                 //XI=1.0001389*32768 =  32772.55HZ     32772.55-32768 = 4.55即晶振頻率為每秒鐘多了約5個(gè)脈沖
  11.                 //4.55*60= 每秒分鐘多了 273個(gè)脈沖   273 / 4 =  68.25 取 69 【可以認(rèn)為每秒分鐘減去69個(gè)脈沖】即69*4 = 276
  12.                 //- 69 = 0XBB;

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


  17. void RTCC_WD_Init()  //*** RTCC預(yù)設(shè)初值* ****/    RTCC數(shù)據(jù)允許寫(xiě)入
  18.    {
  19.                 uchar temp  ;
  20.                  /*********啟動(dòng)數(shù)據(jù)初始化**************/
  21.                 _RTCVALH.YEAR            =    0x21; //11     年            YEAR  【自動(dòng)返回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í)數(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 之間只允許一個(gè)指令周期的時(shí)間窗口
  32.                 RTCCFGbits.RTCWREN = 1;       // 允許RTCCFG寄存器進(jìn)行寫(xiě)操作
  33.                 RTCCFG            |=  0x03;             //  RTCC 值寄存器窗口指針位_指向地址【1 1】
  34.         
  35.                   GIE  = 0;                                              //關(guān)閉全局中斷
  36. /***********************RTCVALL   ****************************/
  37.         /*通過(guò)讀 / 寫(xiě)    RTCVALH 寄存器, RTCC 指針值(RTCPTR<1:0>)*/      
  38.         /*遞減 1,直到其達(dá)到 00。一旦達(dá)到00; MINUTES 和 SECONDS 值就可 */
  39.         /*通過(guò) RTCVALH 和  RTCVALL 進(jìn)行訪問(wèn),直到手動(dòng)更改指針值為止。
  40.                                                                         RTCVALH:
  41.                                                                         00 = 分鐘數(shù)
  42.                                                                         01 = 星期
  43.                                                                         10 = 月
  44.                                                                         11 = 保留
  45.                                                                         RTCVALL:
  46.                                                                         00 = 秒數(shù)
  47.                                                                         01 = 小時(shí)數(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寄存器寫(xiě)操作
  63.                 /*******************************************************/
  64.        GIE  = 1;// 恢復(fù)全局中斷

  65. }

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

  75.                         RTCCFGbits. RTCPTR = 3;
  76.                         temp           =    RTCVALH;  //11 保留-->【開(kāi)始調(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í)數(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);      // 小時(shí)
  103.                 _RTCVALH.MINUTE         =    Read_RTCC_Bin( _RTCVALH.MINUTE );  //分鐘數(shù)
  104.                 _RTCVALL.SECOND         =    Read_RTCC_Bin( _RTCVALL.SECOND); //  秒  
  105.   }
復(fù)制代碼

51hei.png

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:454811 發(fā)表于 2021-5-24 19:52 | 顯示全部樓層
aht15精度怎么樣,做水合了嗎?
回復(fù)

使用道具 舉報(bào)

ID:474417 發(fā)表于 2021-5-24 23:38 | 顯示全部樓層
溫濕度的精度還很不錯(cuò),反應(yīng)也很快
回復(fù)

使用道具 舉報(bào)

ID:107522 發(fā)表于 2021-8-9 17:17 | 顯示全部樓層
請(qǐng)教一下,只有一個(gè)時(shí)鐘源,怎么做到頻率校準(zhǔn)的啊
回復(fù)

使用道具 舉報(bào)

ID:474417 發(fā)表于 2021-9-29 23:37 | 顯示全部樓層
cjs2004 發(fā)表于 2021-8-9 17:17
請(qǐng)教一下,只有一個(gè)時(shí)鐘源,怎么做到頻率校準(zhǔn)的啊

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线观看成人免费视频 | 一道本不卡视频 | 老外几下就让我高潮了 | 亚洲电影一区 | 日本在线你懂的 | 女人天堂av | 五月天婷婷综合 | 中文字幕成人 | 欧美视频在线看 | 精品福利在线 | 91久久精品日日躁夜夜躁欧美 | av片免费观看 | 日韩视频一区在线观看 | 欧美日韩国产一区二区三区不卡 | 中文字幕一区二区视频 | 91九色porny首页最多播放 | www午夜视频 | 久久99精品国产 | 蜜桃精品在线 | 免费骚视频| 男人的天堂中文字幕 | 操人网 | av资源中文在线天堂 | 亚洲天堂中文字幕 | 91精品一区二区 | 国产98色在线 | 日韩 | 中文字字幕一区二区三区四区五区 | 国产一区二区三区 | 欧美炮房 | 风间由美一区二区三区在线观看 | 久久艹免费视频 | 国产成人精品一区二区三区四区 | 国产区视频在线观看 | 亚洲第一区久久 | 中文字幕日本一区二区 | 九九精品在线 | 色就干 | 国产成人精品亚洲日本在线观看 | 91精品久久久久久久久中文字幕 | 黄色大片在线视频 | 精品亚洲一区二区 |