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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4347|回復: 15
收起左側

單片機定時器程序 時間有誤差,不知差在哪里?

[復制鏈接]
ID:678280 發表于 2021-9-7 16:39 | 顯示全部樓層 |閱讀模式
本意是每分鐘響一聲,現在出了兩個菜鳥搞不明白的問題:
一是第一次響聲短暫,符合預期,之后的響聲延長了。
二是運行幾分鐘后時間誤差變大,它跑得快了。謝謝你的觀看和指正。

單片機源程序如下:
#include<reg52.h>  //GTX-1C學習板,單片機STC89C52RC,晶振11.0592MHz
#define uint unsigned int
sbit led0=P1^0;
sbit beep=P2^3;
uint num;
void delay(uint xms)
{
   uint i,j;
   for(i=xms; i>0; i--)
     for(j=110; j>0; j--); }

void main()
{
  TMOD=0x01;  //設置定時器0為工作方式1(M1M0為01)。
  TH0=(65536-45872)/256;  //裝初值。11.0592M晶振,定時50ms數為45872。
  TL0=(65536-45872)%256;
  EA=1;   //開總中斷。
  ET0=1;  //開定時器0中斷。
  TR0=1;  //啟動定時器0。
  while(1)
  {  if(num==1200) //1200X50ms=60000ms÷1000=60s=1分鐘。
     {
       num=0;
       beep=0;
       delay(250);
       beep=1;
     }

    led0=0;
} }

void T0_time()interrupt 1
{  TH0=(65536-45872)/256;  //重裝初值
   TL0=(65536-45872)%256;
   num++;
}

回復

使用道具 舉報

ID:213173 發表于 2021-9-7 18:47 | 顯示全部樓層
定時器中斷周期越短越容易調整精度
  1. #include<reg52.h>  //GTX-1C學習板,單片機STC89C52RC,晶振11.0592MHz
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define us_100 10000 //+/-us_100調整計時精度
  5. sbit led0=P1^0;
  6. sbit beep=P2^3;
  7. uint num;
  8. uchar sec;
  9. bit min;

  10. void delay(uint xms)
  11. {
  12.         uint i,j;
  13.         for(i=xms; i>0; i--)
  14.                 for(j=110; j>0; j--);
  15. }

  16. void Timer0Init()                //100微秒@11.0592MHz
  17. {
  18.         TMOD= 0x02;                //設置定時器8位自動重載模式
  19.         TL0 = 0xA4;                //設置定時初值
  20.         TH0 = 0xA4;                //設置定時重載值
  21.         TR0 = 1;                        //定時器0開始計時
  22.         EA=1;                           //開總中斷。
  23.         ET0=1;                          //開定時器0中斷。
  24. }

  25. void main()
  26. {
  27.         Timer0Init();
  28.         while(1)
  29.         {
  30.                 if(min)
  31.                 {
  32.                         min=0;
  33.                         beep=0;
  34.                         delay(250);
  35.                         beep=1;
  36.                 }
  37.         }
  38. }

  39. void T0_time()interrupt 1
  40. {
  41.         num++;
  42.         if(num>=us_100)
  43.         {
  44.                 num=0;
  45.                 led0=~led0;
  46.                 sec++;
  47.                 if(sec>=60)
  48.                 {
  49.                         sec=0;
  50.                         min=1;
  51.                 }
  52.         }
  53. }
復制代碼

評分

參與人數 1黑幣 +15 收起 理由
一片一城 + 15 很給力!

查看全部評分

回復

使用道具 舉報

ID:332444 發表于 2021-9-7 19:05 | 顯示全部樓層
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。
回復

使用道具 舉報

ID:624769 發表于 2021-9-7 19:25 | 顯示全部樓層
提幾個小建議,
1, STC89C52RC  是有 T2 定時器, 并且支持自動重載功能的。STCMCU點COM 上面有手冊可以下載。用那個會準的多。
2,STC89C52RC 的T2L, T2H  支持 SFR16 的定義, 可以直接接收 雙字節的賦值
3,不知道你用的什么編譯器,在51單片機很多編譯器中,unsigned int 是 單字節的 等同于 unsigned char, 如果你要確保是雙字節的 最好用 unsigned short num; 來聲明 num變量。
最后說一下,不要把C++的很多習慣帶到單片機里來, 最好用最保險的 CHAR SHORT LONG 來定義 單,雙,四字節,絕對不會有歧義。INT這種 可單可雙還可四的最好不要用。
回復

使用道具 舉報

ID:678280 發表于 2021-9-7 20:10 | 顯示全部樓層
wulin 發表于 2021-9-7 18:47
定時器中斷周期越短越容易調整精度

試過你改寫的代碼了,發光管隔1秒一亮,響聲始終是短暫的,符合預期。時間精度也高多了,估計是不使用時鐘模塊所能達到的最高精度。

謝謝。稍后我去理解你寫的代碼。
回復

使用道具 舉報

ID:678280 發表于 2021-9-7 20:12 | 顯示全部樓層
xianfajushi 發表于 2021-9-7 19:05
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。

感謝你的指導。
回復

使用道具 舉報

ID:678280 發表于 2021-9-7 20:19 | 顯示全部樓層
188610329 發表于 2021-9-7 19:25
提幾個小建議,
1, STC89C52RC  是有 T2 定時器, 并且支持自動重載功能的。STCMCU點COM 上面有手冊可以下 ...

感謝你的指導

snap.jpg

這是我現在使用的編譯器。
回復

使用道具 舉報

ID:57657 發表于 2021-9-7 20:47 | 顯示全部樓層
盡量少用循環語句實現的軟件延時,時間會被中斷打亂。
回復

使用道具 舉報

ID:57657 發表于 2021-9-7 21:37 | 顯示全部樓層
  1. #include "STC89C5xRC.H"
  2. #define u8 unsigned char
  3. sbit led0 = P1 ^ 0;
  4. sbit beep = P2 ^ 3;
  5. void InitTimer0(){
  6.     TMOD = 0x01;
  7.     TH0 = 0x4C;
  8.     TL0 = 0x00;
  9.     EA = 1;
  10.     ET0 = 1;
  11.     TR0 = 1;
  12. }
  13. void main() {
  14.     InitTimer0();
  15.     WDT_CONTR = 0x27;        //開看門狗
  16.     while (1) {
  17.         WDT_CONTR |= 0x10;      //看門狗喂狗
  18.     }
  19. }

  20. void Timer0Interrupt() interrupt 1{     //11.0592Mhz 50ms定時器中斷
  21.     static u8 ms50 = 0, sec = 0;
  22.     TH0 = 0x4C;
  23.     TL0 = 0x00;
  24.     if (++ms50 >= 20) {
  25.         ms50 = 0;
  26.         if (++sec >= 60) {
  27.             sec = 0;
  28.         }
  29.     }
  30.     beep = !(sec == 0 && ms50 < 5);
  31.     if (ms50 == 0 || ms50 == 10) {
  32.         led0 = !led0;
  33.     }
  34. }
復制代碼

評分

參與人數 1黑幣 +15 收起 理由
一片一城 + 15 很給力!

查看全部評分

回復

使用道具 舉報

ID:401564 發表于 2021-9-7 23:12 | 顯示全部樓層
定時器可以這么用,但你的代碼本身就是錯誤的
if(num==1200); num是全局變量,而且是在中斷中增加的,隨時會變的
如果是在比較if(num==1200)的過程中num的值剛好增加
而且,你之后有代碼又有延時,不知道延時不多長,但定時器可是自動加載工作的,num的值是一直在變化的
錯過了if(num==1200),比如大于,那就是會一直加到65535然后,歸零之后再加....
你可以改成if(num>=1200)試一下
下面的延時改動一下,它會影響閃燈的時間
回復

使用道具 舉報

ID:678280 發表于 2021-9-8 11:52 | 顯示全部樓層

我下載了原本沒有的“STC89C5xRC.H”,之后試過你改寫的代碼,精度更高了,謝謝。
回復

使用道具 舉報

ID:678280 發表于 2021-9-8 13:44 | 顯示全部樓層
Y_G_G 發表于 2021-9-7 23:12
定時器可以這么用,但你的代碼本身就是錯誤的
if(num==1200); num是全局變量,而且是在中斷中增加的,隨時會 ...

謝謝!稍后我修改代碼再試。
回復

使用道具 舉報

ID:883242 發表于 2021-9-9 19:48 | 顯示全部樓層
delay(250);這句完全多余,if(num==1200)本身就是延遲的意思。
回復

使用道具 舉報

ID:853217 發表于 2021-9-9 20:27 | 顯示全部樓層
你這個同時用代碼延時和中斷延時肯定會有誤差的,因為當中斷到來時,delay語句必定會因為中斷停止自加的。每來一次中斷delay語句那里就會停止一次,久而久之,蜂鳴器響的時間會越來越長。
回復

使用道具 舉報

ID:965160 發表于 2021-9-9 20:42 | 顯示全部樓層
可能程序自身有延遲
回復

使用道具 舉報

ID:831736 發表于 2021-10-11 17:19 | 顯示全部樓層
50Ms初值50000*11.0592/12=46080你算錯了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利影院 | 精品一区二区三区不卡 | 中文字幕在线电影观看 | 国产精品久久影院 | 99国产精品99久久久久久 | 久久综合一区二区三区 | 欧美二区在线 | 日韩精品一区二区三区视频播放 | av一区二区三区四区 | 国产成人精品一区二区三区在线观看 | 日本大香伊一区二区三区 | 不卡视频在线 | 亚洲精品在线观 | 日韩av在线免费 | 国产精久久久久久久 | 亚洲成人精品一区 | www四虎影视 | 亚洲精品一区二区三区蜜桃久 | 福利视频三区 | 日韩在线一区二区 | 中文字幕亚洲精品 | av网站推荐| 福利视频一区二区三区 | 欧美日韩国产精品一区二区 | 一级片在线免费播放 | 精品综合久久久 | 亚洲精品国产精品国自产在线 | 97色在线观看免费视频 | 国产精品久久久久久久免费观看 | 久久久久国产一区二区三区四区 | 午夜网站视频 | 一级a爱片性色毛片免费 | av影片在线 | 福利一区在线观看 | 成人午夜高清 | 91精品在线播放 | 99精品在线免费观看 | 九九九视频在线观看 | 亚洲福利在线观看 | 欧美国产91 | 99免费在线|