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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9337|回復: 20
收起左側

關于用51單片機做時鐘顯示準確度的問題

  [復制鏈接]
ID:301968 發表于 2018-7-28 11:35 | 顯示全部樓層 |閱讀模式
一直看到好多人說,用單片機做時間顯示不準確.
其實我認為用單片機做時間顯示,可以達到非常 精確的地步,比如三天誤差小于1S.不知大家認為這種誤差是大還是小.
當然要用外部晶體嘍.
用定時器1MS中斷,計算1000MS,累進一秒.
以互聯網北京時間實時時間比對.
先測試24小時誤差,一般初次會誤差較大,幾秒到十秒都有可能.誤差大了,就先修改定時值.
誤差小了,我們就用另外一種方法來消除誤差.
比如,10小時,誤差慢1秒鐘,36000秒,慢一秒,就是36000MS慢1MS
定時器,1000MS,計時36次時,將MS計時數強行加1,依此原理.
如3天慢一秒,259200秒,慢1秒.
在定時器中斷函數中
計算259次累進一秒時,MS強行加1
利用這種方式,可以做出非常精確的時間顯示功能
謝謝大家,有好的方法,請分享給大家,互相學習!!!



評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:357194 發表于 2018-7-28 19:56 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:380012 發表于 2018-7-28 21:24 | 顯示全部樓層
晶振會產生溫漂,軟件上的初嘗只能解決特定環境下的時鐘精度,不能解決所有的環境。
回復

使用道具 舉報

ID:111634 發表于 2018-7-29 16:44 | 顯示全部樓層
單片機用定時器產生秒基準做的時鐘不精確,必須用外部時鐘芯片。
回復

使用道具 舉報

ID:619208 發表于 2019-10-4 13:52 | 顯示全部樓層
我為啥一分鐘差了十多秒#include<reg51.h>
#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
uint count=0;
uint counter=0;
uint b=0;
uchar i=0;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         //共陰極段碼。
/*void Time1_Init()
{
        TMOD = 0x60;
        TL1 = 0xFE;
        TH1 = 0xFE;
        ET1 = 1;
        EA=1;
        TR1=1;
}  */

void Time1_Int() interrupt 3  //計數器的中斷。
{
          counter++;          //記錄脈沖數。
}
void Time0_Init()           //定時計數器的初始化
{
        TMOD = 0x61;   //T1計數器工作方式2(自動重裝初值),T0計時器工作方式1。
        TH0 = 0xD8;           //T0初值為55536,計時10ms。
        TL0 = 0xF0;
        TL1 = 0xFF;           //T1初值為FF,記錄脈搏脈沖,每次都中斷。
        TH1 = 0xFF;
        ET0 = 1;           //開啟T0中斷使能;
        ET1 = 1;           //開啟T1中斷使能;
        EA = 1;                   //總中斷是能開關開啟;
        TR0 = 1;           //T0開始計時;
        TR1=1;                   //T1可以開始計數;
}
void Time0_Int() interrupt 1          //定時器的中斷。
{
        TH0=0xD8;                //重裝初值。
        TL0=0xF0;
        count++;                //記錄10ms個數;
}
void DelayMS(uchar x)                //普通延時;
{
        while(x--)
        {
                uint i;
                for(i=0;i<10;i++)
                {
                        ;
                }
        }
}
void Int0_Int() interrupt 0                 //外部中斷0中斷程序:初始化定時計數器0、1;
{               
        b++;                                                 //b自加
        if(b==1)                                         //如果b等于1,說明按鈕只按了一次,開始測試。
                 Time0_Init();                         //初始化T0,T1,開始計時計數。
        if(b>1)                                                 //如果b>1,說明一次測試已完成第二次按下按鈕,重新測試。
        {
                counter=0;                                 //清零示數。
                i=0;
                Time0_Init();                         //初始化T0,T1,開始計時計數。
        }
}
void main()                         //主程序
{         
        //uchar i=0;
        //Time0_Init();                  //初始化定時計數器;
        //Time1_Init();
        EA = 1;                                  //中斷總使能開關開
        EX0 = 1;                          //外部中斷0是能開關開
        while(1)                          //循環;
        {
                if(count==100)          //如果10ms個數為100個,即經過1s時,i自加一,count清零;
                {
                        i++;
                        count=0;
                }
        /*        P2=table[i % 10];
                P1=0x02;*/
                        P2=table[i % 10];        //P2輸出顯示i秒的個位數;
                        P1=table[counter % 10];
                        LED1=0;                                //P0^0點位低電平;
                        DelayMS(1);                        //延時一會;
                        LED1=1;                                //P0^0電位高電平
                        P2=table[(i / 10)%10];                                //輸出顯示i秒的十位;
                        P1=table[(counter / 10)%10];
                        LED2=0;                                //P0^1電位低電平;
                        DelayMS(1);                        //延時一會;
                        LED2=1;
                        P1=table[(counter/100)%10];
                        LED3=0;
                        DelayMS(1);
                        LED3 = 1;
                                                 //P0^1電位高電平;
                if(i==60)                                //當i達到60秒時,停止中斷使能,計數和計時停止;
                {
                        ET0=0;
                        ET1=0;                               
                }
               
        }

}
回復

使用道具 舉報

ID:67199 發表于 2019-10-4 19:46 | 顯示全部樓層
imanoob 發表于 2019-10-4 13:52
我為啥一分鐘差了十多秒#include
#include "DS1302.h"
#define uchar unsigned char

先調整重裝初值  TH0=0xD8;   TL0=0xF0;   再根據實測誤差,加上修正值。  
        
回復

使用道具 舉報

ID:491577 發表于 2019-10-5 23:41 | 顯示全部樓層
時鐘精準度只是與計時用的晶振的精度有關,與時鐘芯片無關,同樣一個晶振,不管用什么時鐘芯片或者用單片機都是一樣的精度,高精度鐘芯片都是自帶晶振的而且帶有溫度補償,所以精度高,如果單片機使用高精度晶振并且檢測晶振的溫度做溫度補償,一樣可以做到很高的精度。樓主還缺一個溫度檢測,要標定晶振在不同的溫度下的偏差,在程序中做補償還可以提高精度。沒有溫度補償,夏天和冬天誤差不一樣的。
回復

使用道具 舉報

ID:612180 發表于 2019-10-7 14:39 | 顯示全部樓層
其實51單片機的內部電路會對時鐘電路有一定的影響,而晶振的頻率也會有影響,所以要做時間顯示的話可以用STM32單片機,更精確一點。
回復

使用道具 舉報

ID:158375 發表于 2019-10-7 15:08 | 顯示全部樓層
樓主想的有點簡單嘍,實際過程要復雜多多.
回復

使用道具 舉報

ID:620317 發表于 2019-10-8 10:20 | 顯示全部樓層
如果想要更準確的時間,建議用時鐘芯片。比如microchip的MCP7940,Resolution 1 ppm.
回復

使用道具 舉報

ID:301968 發表于 2021-6-12 13:52 | 顯示全部樓層
我用了一個幾毛錢的片子做了一個鬧鐘,幾個月都沒調時間,誤差也沒過1分鐘。
回復

使用道具 舉報

ID:47286 發表于 2021-6-12 14:30 | 顯示全部樓層
時鐘這東西 說白了就是對精度要求有多高 如果1年允許誤差1個月 什么方法都沒問題 要求1年差1s還得以內 我覺得 你的方法沒戲

以下是我對時間模塊的理解而已 今天放假 多寫了點 有喜歡的就看看 不喜歡掠過即可

我認為時鐘準確不準確主要是時鐘源的問題 和用什么做關系不是特別大 綜合精度 消耗精力 成本三者評比

GPS最好 精度高 消耗精力小 成本高

GPS時鐘源精度和世界鐘精度一樣 但GPS經過的節點少 衛星的時鐘完全不是普通設備可以比的 那東西要給軍用提供授時 GPS接收模塊可以提供1ms級別的通訊授時 高手可以根據收到的時間 每次提前若干ms開始處理 這樣若干年下來也不會有誤差 除非斷電了 而且電波傳輸速度接近光速 節點就是衛星到模塊 中間經過的節點少 物理延遲很小

網絡授時 精度較高 消耗精力小 成本高

網絡授時是從世界鐘或者叫RTC服務器發出的數據包獲得時間 理論上也很準 問題是 你并不是用一根網線直接連到RTC服務器上 以太網的結構全球有無數個節點 一個時間數據別說全球 僅國內就要經過若干個網關 而TCP/IP協議的效率是很低的 一個數據包有7層 包括各種數據 而且以太網是分時復用傳輸數據 并不是連貫的 每一個網關 直到本地接收后 都要重新打包 解包 還原數據 所以延遲比GPS要大 GPS需要專用模塊 以太網獲取時間也需要 成本上并沒多大區別

單片機+芯片 精度一般 消耗精力多 成本較低

這個方法就是片子讀片子 精度問題由時鐘芯片控制 好芯片 好調試 精度還行 到不了1s/年以下 考慮到要獲得較高京精度 需要從軟件或者硬件做誤差補償 消耗精力比較多 成本方面 如果用好片子 成本嘛 呵呵 也不比上面兩種方式低 用便宜片子嘛 那就多花精力唄

純單片機 精度不好說 消耗精力大 成本低

這個方案的精度實在不好控制 精度最高的應該算用有源晶振吧 那也得晶振夠好 有源晶振又怎么了 一樣有優劣區別 無源晶振次之 一樣受溫度影響 內部RC更是受溫度變化影響 這種變化讓人頭疼的是沒準 不一定差多少 通常能用的方法都是觀察累積誤差然后想辦法補償 但這種補償說白了都是開環的 一切補償都基于觀察規律 并沒有實時反饋的閉環修正 環境變化大也沒多大用 成本肯定是最低的 反正只要有振蕩源 也不過就是個片子 不需要其它東西

回復

使用道具 舉報

ID:883242 發表于 2021-6-12 17:00 | 顯示全部樓層
想準用TCXO好了。OCXO太費電。
回復

使用道具 舉報

ID:517951 發表于 2021-6-12 19:29 | 顯示全部樓層
用DS12887和51單片機搭配,精度可以做到一年1分鐘以內的誤差,51單片機IO8bit4個對應12887的8bit8080接口還有富裕。你們有興趣可以是試試。
回復

使用道具 舉報

ID:301968 發表于 2021-6-17 16:41 | 顯示全部樓層
用DS12887和單片機搭配,可能用的最多,精度這個問題嘛,看場合嘍。十天半個月差個幾S一般問題不大呵。生活中使用嘛,一般差個一兩分鐘我們都不會介意。
回復

使用道具 舉報

ID:401564 發表于 2021-6-18 13:30 | 顯示全部樓層
用單片機本身的晶振作為時鐘,那肯定是不怎么的
容易產生誤差,而且是差異化的,你所寫的程序只能在這個晶振上有用,換一個晶振就不一定行了
對于單片機晶振的要求太高了,掉電還不能保存
時鐘芯片估計是每個學單片機的人都會接觸到的,但時鐘芯片也有不同各類的,像DS1302這種外置晶振的,只適合批量生產,畢竟它才幾毛錢一片,但調試設備卻是幾千塊的.......
DS12887或者DS3231內置晶振是最好的選擇
當然,編程能力高一點的,WIFI授時是最有性價比也是一勞永逸的
我做過一個大鐘放老家,有一次打雷就復位了,結果老人在家不會調,竟然就那樣放了一整年
回復

使用道具 舉報

ID:97350 發表于 2021-6-18 14:28 | 顯示全部樓層
反正我覺得DS1302是最差勁的,畢竟價格低廉。
回復

使用道具 舉報

ID:272119 發表于 2021-6-18 14:48 | 顯示全部樓層
最近在做定時上傳數據到上位機,每秒一次,用的是STC15W內置IRC還沒有微調傳輸幾分鐘就多發一次數據. 下載燒錄就知道用IRC設置時就會有偏差.因為芯片設置22.1184Mhz都無法準確總會有個千分之幾的誤差.
回復

使用道具 舉報

ID:344848 發表于 2024-4-26 09:52 | 顯示全部樓層
單片機時鐘顯示的準確度,建議采用時鐘芯片。
回復

使用道具 舉報

ID:619259 發表于 2024-4-26 11:25 | 顯示全部樓層
用單片機定時器做時鐘,兩點建議:
1.定時器使用方式2(8位自動重裝);
2.初始值取100微秒,計數10000次為1秒,若時間有誤差,可微調這個計數值。
回復

使用道具 舉報

ID:883242 發表于 2024-4-26 19:51 | 顯示全部樓層
Y_G_G 發表于 2021-6-18 13:30
用單片機本身的晶振作為時鐘,那肯定是不怎么的
容易產生誤差,而且是差異化的,你所寫的程序只能在這個晶振 ...

說反了,單片機接的AT-cut晶體穩定性遠遠優于RTC用的fork crystal,只是耗電量大,不適合掉電運行。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品com | av一区在线观看 | 亚洲欧美激情精品一区二区 | 久久久久久美女 | 久久精品一 | 国产欧美精品区一区二区三区 | 国产成人综合在线 | 国产精品视频久久久久 | 97超在线视频 | 亚洲美女视频 | 91资源在线 | 亚洲欧美视频一区 | 99久久精品国产毛片 | 国产高清久久 | 日韩中文字幕在线 | 日本电影韩国电影免费观看 | av三级在线观看 | 色婷婷狠狠 | av电影手机版 | 亚洲一区综合 | 精品一区二区在线观看 | 久久久久久a | 精品一区二区三区在线观看 | 一区在线观看 | 国产精品精品视频一区二区三区 | 亚洲97| 日韩免费视频 | 午夜小影院 | 久久久久精 | 天堂中文在线观看 | 国产伦精品一区二区三区照片91 | 亚洲激情在线观看 | 成人视屏在线观看 | 国产成人精品一区二区在线 | 久久久国产一区二区三区 | 欧美淫 | 欧产日产国产精品视频 | 91精品麻豆日日躁夜夜躁 | 国产精品一卡二卡三卡 | 91国产在线视频在线 | 99久久日韩精品免费热麻豆美女 |