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

QQ登錄

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

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

51單片機(jī)寫(xiě)的一個(gè)秒表程序,但是發(fā)現(xiàn)單片機(jī)時(shí)間比手機(jī)秒表時(shí)間走得慢

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:510532 發(fā)表于 2019-12-5 23:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
完整代碼如下。還望各位知道的告知小弟一聲是什么原因。
普中的板子
#include <REGX52.H>
sbit L1=P3^1;
sbit L2=P3^0;
unsigned char t_005s;
unsigned char t_s;
unsigned char t_m;
//==============================


void delay(unsigned int j)
{
  while(j--);
}


unsigned char code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
unsigned char code smg_wei[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};
void display()
{
   P2=smg_wei[0];
   //delay(1000);
   P0=smg_duan[t_005s%10];
   delay(100);


   P2=smg_wei[1];
   //delay(1000);
   P0=smg_duan[t_005s/10];
   delay(100);


   P2=smg_wei[2];
   //delay(1000);
   P0=smg_duan[16];
   delay(100);


   P2=smg_wei[3];
   //delay(1000);
   P0=smg_duan[t_s%10];
   delay(100);


   P2=smg_wei[4];
   //delay(1000);
   P0=smg_duan[t_s/10];
   delay(100);


   P2=smg_wei[5];
   //delay(1000);
   P0=smg_duan[16];
   delay(100);


    P2=smg_wei[6];
   //delay(1000);
   P0=smg_duan[t_m%10];
   delay(100);


   P2=smg_wei[7];
   //delay(1000);
   P0=smg_duan[t_m/10];
   delay(100);

}


//=============================




void InitTimer0()
{
    TMOD=0x01;
    TH1=(65535-50000)/256;
    TH1=(65535-50000)%256;
    ET0=1;
    EA=1;
    TR0=1;
}


void ServiceTimer0() interrupt 1
{
          TH1=(65535-50000)/256;
    TH1=(65535-50000)%256;
        t_005s++;
        if(t_005s==20)
        {
           t_s++;
           t_005s=0;
           if(t_s==60)
           {  
             t_m++;
             t_s=0;
           }
           if(t_m==99)
           {
             t_m=0;
           }
        }
}


//=============================




void Scnkey()
{
  if (L1==0)
  {
     delay(500);
         if(L1==0)
         {
           TR0=~TR0;
         }
         while(L1==0)
         {
            display();
         }
  }


  if (L2==0)
  {
     InitTimer0();
     delay(500);
         if(L2==0)
         {
             t_005s=0;
                 t_s=0;
                 t_m=0;
         }
         while(L2==0)
         {
            display();
         }
  }
}




void main()
{
  while(1)
  {
     Scnkey();
     display();
  }
}


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

使用道具 舉報(bào)

沙發(fā)
ID:656419 發(fā)表于 2019-12-6 02:58 | 只看該作者
請(qǐng)參考一下這篇文章   http://www.torrancerestoration.com/mcu/696.html
一般如果是用循環(huán)延時(shí)使用12M的晶振要方便些,如果是定時(shí)器則是用11.0592的要方便和精確一些.
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2019-12-6 06:13 | 只看該作者
這是因?yàn)榫д耦l率精度不高或程序不合理引起的誤差。
回復(fù)

使用道具 舉報(bào)

地板
ID:584814 發(fā)表于 2019-12-6 07:58 | 只看該作者
你取的時(shí)基與單片機(jī)運(yùn)行速度有關(guān),可精確計(jì)算或用外部時(shí)鐘。
回復(fù)

使用道具 舉報(bào)

5#
ID:25310 發(fā)表于 2019-12-6 08:11 | 只看該作者

延時(shí)函數(shù)調(diào)整一下,延時(shí)太長(zhǎng)時(shí)間會(huì)影響視覺(jué)效果。
回復(fù)

使用道具 舉報(bào)

6#
ID:164602 發(fā)表于 2019-12-6 08:32 | 只看該作者
很正常。單片機(jī)計(jì)時(shí)很準(zhǔn)的。但你沒(méi)有考慮到:當(dāng)計(jì)時(shí)達(dá)到后,還要執(zhí)行一些語(yǔ)句,也是要用時(shí)間的,一次沒(méi)有感覺(jué),累積多了,誤差就出來(lái)了。真的要走時(shí)準(zhǔn)確,還得用儀器測(cè)量整個(gè)程序的運(yùn)行時(shí)間,調(diào)整定時(shí)器才行。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:470332 發(fā)表于 2019-12-6 08:43 | 只看該作者
那么多delay能不慢嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:332444 發(fā)表于 2019-12-6 08:51 | 只看該作者
正常,用外部時(shí)鐘信號(hào)好點(diǎn),若獲取標(biāo)準(zhǔn)時(shí)鐘矯正最佳。
回復(fù)

使用道具 舉報(bào)

9#
ID:648281 發(fā)表于 2019-12-6 08:52 | 只看該作者
那就減少單片機(jī)延時(shí)
回復(fù)

使用道具 舉報(bào)

10#
ID:235200 發(fā)表于 2019-12-6 09:12 | 只看該作者
把中斷程序內(nèi) t_005s++;后面的語(yǔ)句移到主循環(huán),或者修改定時(shí)時(shí)間小于50ms達(dá)到比較精確的目的
回復(fù)

使用道具 舉報(bào)

11#
ID:94031 發(fā)表于 2019-12-6 09:22 | 只看該作者
如果誤差不大應(yīng)該調(diào)整定時(shí)器系數(shù)。
回復(fù)

使用道具 舉報(bào)

12#
ID:636435 發(fā)表于 2019-12-6 09:53 | 只看該作者
計(jì)算好延遲,有時(shí)候影響很大。晶振對(duì)好,不同晶振也會(huì)不同。計(jì)時(shí)器搞好
回復(fù)

使用道具 舉報(bào)

13#
ID:395176 發(fā)表于 2019-12-6 09:58 | 只看該作者
TH1=(65535-50000)/256;
TH1=(65535-50000)%256;
這兩個(gè)什么鬼
回復(fù)

使用道具 舉報(bào)

14#
ID:657323 發(fā)表于 2019-12-6 10:02 | 只看該作者
delay的時(shí)間沒(méi)算你機(jī)器周期,稍微調(diào)整一下就可以了
回復(fù)

使用道具 舉報(bào)

15#
ID:657325 發(fā)表于 2019-12-6 10:08 | 只看該作者
第一確認(rèn)晶振是否是外部晶振,即晶振是否準(zhǔn)確。
第二程序中使用了大量的延時(shí)函數(shù)會(huì)對(duì)你的時(shí)間造成非常大的影響,建議修改去掉試試。
回復(fù)

使用道具 舉報(bào)

16#
ID:646543 發(fā)表于 2019-12-6 10:35 | 只看該作者
因?yàn)閱纹瑱C(jī)執(zhí)行語(yǔ)句需要一定時(shí)間,尤其是循環(huán)語(yǔ)句,不同的嵌套方式,就像長(zhǎng)循環(huán)和短循環(huán)在內(nèi)和在外都會(huì)有很大影響,一般把長(zhǎng)循環(huán)放在內(nèi),短循環(huán)放在外,可以減少CPU跨切循環(huán)層的次數(shù),減小響應(yīng)延時(shí)。
回復(fù)

使用道具 舉報(bào)

17#
ID:123289 發(fā)表于 2019-12-6 17:03 | 只看該作者
本帖最后由 yzwzfyz 于 2019-12-14 01:13 編輯

普通晶振即使精度不夠,但穩(wěn)定度也還是相當(dāng)高的,時(shí)鐘做到日差1秒之內(nèi)沒(méi)有問(wèn)題。
關(guān)鍵看你的程序架構(gòu)是否合理。
回復(fù)

使用道具 舉報(bào)

18#
ID:657847 發(fā)表于 2019-12-6 21:43 | 只看該作者
程序有點(diǎn)問(wèn)題,delay太多了,占內(nèi)部空間
回復(fù)

使用道具 舉報(bào)

19#
ID:465554 發(fā)表于 2019-12-7 12:28 | 只看該作者
程序運(yùn)行也是需要時(shí)間的,一個(gè)循環(huán)下來(lái),肯定與計(jì)算的時(shí)間不同
回復(fù)

使用道具 舉報(bào)

20#
ID:658104 發(fā)表于 2019-12-7 12:32 | 只看該作者
主要是振蕩器的原因引起的,和手機(jī)的秒表沒(méi)有什么可比性,其實(shí)手機(jī)的秒表也不一定精確
回復(fù)

使用道具 舉報(bào)

21#
ID:658203 發(fā)表于 2019-12-7 14:43 | 只看該作者
你程序?qū)懙牟缓侠?nbsp; 有延時(shí)
回復(fù)

使用道具 舉報(bào)

22#
ID:426861 發(fā)表于 2019-12-7 15:28 | 只看該作者
選好晶振,用定時(shí)器處理。時(shí)序要求越高,越忌用延時(shí),尤其是長(zhǎng)延時(shí)
回復(fù)

使用道具 舉報(bào)

23#
ID:658332 發(fā)表于 2019-12-7 17:12 | 只看該作者
晶振的頻率以及單片機(jī)執(zhí)行指令的時(shí)間是有誤差的
回復(fù)

使用道具 舉報(bào)

24#
ID:658338 發(fā)表于 2019-12-7 17:45 | 只看該作者
建議:調(diào)整中斷定時(shí)器的時(shí)間,盡量長(zhǎng)些,例如500ms,這樣CPU響應(yīng)時(shí)間就可以忽略了。精度會(huì)很高。另外定時(shí)值要精準(zhǔn),不要有誤差。這個(gè)需要選擇晶振頻率,及定時(shí)值配合,使得定時(shí)時(shí)間沒(méi)有誤差。最后,運(yùn)行一小時(shí),一天看看有沒(méi)有誤差,如果有,在程序里面就一個(gè)小時(shí)后調(diào)整一邊。這樣長(zhǎng)期跑起來(lái)很小誤差。

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

25#
ID:307020 發(fā)表于 2019-12-8 22:54 | 只看該作者
還要考慮這一堆程序代碼運(yùn)行時(shí)需要的指令周期,會(huì)累積進(jìn)去,讓兩個(gè)不同的走得一樣(同步)很麻煩的,所以須“不二法門(mén)”。
回復(fù)

使用道具 舉報(bào)

26#
ID:640414 發(fā)表于 2019-12-9 09:21 | 只看該作者
一個(gè)是。。本身會(huì)有點(diǎn)誤差。。誤差累積起來(lái)就會(huì)有點(diǎn)差別了
還有一個(gè)就是 你的delay太多了。delay在調(diào)用的時(shí)候 實(shí)質(zhì)上會(huì)比你想象的還要多耗時(shí),(因?yàn)橛姓`差,所以和第一點(diǎn)一樣),誤差累積起來(lái),就會(huì)不準(zhǔn)了
回復(fù)

使用道具 舉報(bào)

27#
ID:656893 發(fā)表于 2019-12-9 15:14 | 只看該作者
跟硬件有關(guān)系,也就是跟一個(gè)機(jī)器周期的時(shí)間有關(guān)系,所以會(huì)有誤差
回復(fù)

使用道具 舉報(bào)

28#
ID:416239 發(fā)表于 2019-12-10 13:20 | 只看該作者
因?yàn)槟愠绦虻脑颍?/td>
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表