欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6931|回復: 27
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:510532 發(fā)表于 2019-12-5 23:42 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
完整代碼如下。還望各位知道的告知小弟一聲是什么原因。
普中的板子
#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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

29#
ID:416239 發(fā)表于 2019-12-10 13:20 | 只看該作者
因為你程序的原因,
回復

使用道具 舉報

28#
ID:656893 發(fā)表于 2019-12-9 15:14 | 只看該作者
跟硬件有關系,也就是跟一個機器周期的時間有關系,所以會有誤差
回復

使用道具 舉報

27#
ID:640414 發(fā)表于 2019-12-9 09:21 | 只看該作者
一個是。。本身會有點誤差。。誤差累積起來就會有點差別了
還有一個就是 你的delay太多了。delay在調(diào)用的時候 實質上會比你想象的還要多耗時,(因為有誤差,所以和第一點一樣),誤差累積起來,就會不準了
回復

使用道具 舉報

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

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

22#
無效樓層,該帖已經(jīng)被刪除
21#
ID:658203 發(fā)表于 2019-12-7 14:43 | 只看該作者
你程序寫的不合理  有延時
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

8#
ID:332444 發(fā)表于 2019-12-6 08:51 | 只看該作者
正常,用外部時鐘信號好點,若獲取標準時鐘矯正最佳。
回復

使用道具 舉報

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

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

延時函數(shù)調(diào)整一下,延時太長時間會影響視覺效果。
回復

使用道具 舉報

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

使用道具 舉報

板凳
ID:213173 發(fā)表于 2019-12-6 06:13 | 只看該作者
這是因為晶振頻率精度不高或程序不合理引起的誤差。
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表