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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5997|回復: 27
收起左側

51單片機寫的一個秒表程序,但是發現單片機時間比手機秒表時間走得慢

  [復制鏈接]
ID:510532 發表于 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();
  }
}


回復

使用道具 舉報

ID:656419 發表于 2019-12-6 02:58 | 顯示全部樓層
請參考一下這篇文章   http://www.zg4o1577.cn/mcu/696.html
一般如果是用循環延時使用12M的晶振要方便些,如果是定時器則是用11.0592的要方便和精確一些.
回復

使用道具 舉報

ID:213173 發表于 2019-12-6 06:13 | 顯示全部樓層
這是因為晶振頻率精度不高或程序不合理引起的誤差。
回復

使用道具 舉報

ID:584814 發表于 2019-12-6 07:58 | 顯示全部樓層
你取的時基與單片機運行速度有關,可精確計算或用外部時鐘。
回復

使用道具 舉報

ID:25310 發表于 2019-12-6 08:11 | 顯示全部樓層

延時函數調整一下,延時太長時間會影響視覺效果。
回復

使用道具 舉報

ID:164602 發表于 2019-12-6 08:32 | 顯示全部樓層
很正常。單片機計時很準的。但你沒有考慮到:當計時達到后,還要執行一些語句,也是要用時間的,一次沒有感覺,累積多了,誤差就出來了。真的要走時準確,還得用儀器測量整個程序的運行時間,調整定時器才行。

評分

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

查看全部評分

回復

使用道具 舉報

ID:470332 發表于 2019-12-6 08:43 | 顯示全部樓層
那么多delay能不慢嗎
回復

使用道具 舉報

ID:332444 發表于 2019-12-6 08:51 | 顯示全部樓層
正常,用外部時鐘信號好點,若獲取標準時鐘矯正最佳。
回復

使用道具 舉報

ID:648281 發表于 2019-12-6 08:52 | 顯示全部樓層
那就減少單片機延時
回復

使用道具 舉報

ID:235200 發表于 2019-12-6 09:12 | 顯示全部樓層
把中斷程序內 t_005s++;后面的語句移到主循環,或者修改定時時間小于50ms達到比較精確的目的
回復

使用道具 舉報

ID:94031 發表于 2019-12-6 09:22 | 顯示全部樓層
如果誤差不大應該調整定時器系數。
回復

使用道具 舉報

ID:636435 發表于 2019-12-6 09:53 | 顯示全部樓層
計算好延遲,有時候影響很大。晶振對好,不同晶振也會不同。計時器搞好
回復

使用道具 舉報

ID:395176 發表于 2019-12-6 09:58 | 顯示全部樓層
TH1=(65535-50000)/256;
TH1=(65535-50000)%256;
這兩個什么鬼
回復

使用道具 舉報

ID:657323 發表于 2019-12-6 10:02 | 顯示全部樓層
delay的時間沒算你機器周期,稍微調整一下就可以了
回復

使用道具 舉報

ID:657325 發表于 2019-12-6 10:08 | 顯示全部樓層
第一確認晶振是否是外部晶振,即晶振是否準確。
第二程序中使用了大量的延時函數會對你的時間造成非常大的影響,建議修改去掉試試。
回復

使用道具 舉報

ID:646543 發表于 2019-12-6 10:35 | 顯示全部樓層
因為單片機執行語句需要一定時間,尤其是循環語句,不同的嵌套方式,就像長循環和短循環在內和在外都會有很大影響,一般把長循環放在內,短循環放在外,可以減少CPU跨切循環層的次數,減小響應延時。
回復

使用道具 舉報

ID:123289 發表于 2019-12-6 17:03 | 顯示全部樓層
本帖最后由 yzwzfyz 于 2019-12-14 01:13 編輯

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

使用道具 舉報

ID:657847 發表于 2019-12-6 21:43 | 顯示全部樓層
程序有點問題,delay太多了,占內部空間
回復

使用道具 舉報

ID:465554 發表于 2019-12-7 12:28 | 顯示全部樓層
程序運行也是需要時間的,一個循環下來,肯定與計算的時間不同
回復

使用道具 舉報

ID:658104 發表于 2019-12-7 12:32 | 顯示全部樓層
主要是振蕩器的原因引起的,和手機的秒表沒有什么可比性,其實手機的秒表也不一定精確
回復

使用道具 舉報

ID:658203 發表于 2019-12-7 14:43 | 顯示全部樓層
你程序寫的不合理  有延時
回復

使用道具 舉報

ID:426861 發表于 2019-12-7 15:28 | 顯示全部樓層
選好晶振,用定時器處理。時序要求越高,越忌用延時,尤其是長延時
回復

使用道具 舉報

ID:658332 發表于 2019-12-7 17:12 | 顯示全部樓層
晶振的頻率以及單片機執行指令的時間是有誤差的
回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

ID:640414 發表于 2019-12-9 09:21 | 顯示全部樓層
一個是。。本身會有點誤差。。誤差累積起來就會有點差別了
還有一個就是 你的delay太多了。delay在調用的時候 實質上會比你想象的還要多耗時,(因為有誤差,所以和第一點一樣),誤差累積起來,就會不準了
回復

使用道具 舉報

ID:656893 發表于 2019-12-9 15:14 | 顯示全部樓層
跟硬件有關系,也就是跟一個機器周期的時間有關系,所以會有誤差
回復

使用道具 舉報

ID:416239 發表于 2019-12-10 13:20 | 顯示全部樓層
因為你程序的原因,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: aaaa网站 | 99精品观看 | 波多野结衣一区二区三区在线观看 | 色精品视频 | 国产在线不卡 | 亚洲精品v日韩精品 | 一本大道久久a久久精二百 国产成人免费在线 | 免费在线观看一区二区 | 国产精品一区二区三区久久 | 91亚洲精选 | 久久久久国产一区二区三区 | 在线观看日本网站 | 天天夜夜操 | 国产一区二 | 综合自拍| 国产精品视频一区二区三区 | 精品国产区 | 午夜影院黄| 欧美在线视频一区二区 | 一区二区不卡 | 男女视频在线观看网站 | 51ⅴ精品国产91久久久久久 | 久久亚洲一区 | 国产精品久久久乱弄 | 久久新| 久久久久国产 | 国产精品欧美一区二区三区 | 中文字幕 亚洲一区 | 国产99精品| 国产黄色大片网站 | 嫩草懂你的影院入口 | 久久夜夜| 三级av网址 | 日韩三级 | 男人天堂av网站 | 国产精品一区三区 | 羞羞视频免费在线观看 | 国产成人高清 | 久久的色 | 麻豆一区二区三区精品视频 | 国产精品mv在线观看 |