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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 4664 | 評論數: 15 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-9-7 16:39

正文摘要:

本意是每分鐘響一聲,現在出了兩個菜鳥搞不明白的問題: 一是第一次響聲短暫,符合預期,之后的響聲延長了。 二是運行幾分鐘后時間誤差變大,它跑得快了。謝謝你的觀看和指正。 單片機源程序如下: #include< ...

回復

ID:831736 發表于 2021-10-11 17:19
50Ms初值50000*11.0592/12=46080你算錯了
ID:965160 發表于 2021-9-9 20:42
可能程序自身有延遲
ID:853217 發表于 2021-9-9 20:27
你這個同時用代碼延時和中斷延時肯定會有誤差的,因為當中斷到來時,delay語句必定會因為中斷停止自加的。每來一次中斷delay語句那里就會停止一次,久而久之,蜂鳴器響的時間會越來越長。
ID:883242 發表于 2021-9-9 19:48
delay(250);這句完全多余,if(num==1200)本身就是延遲的意思。
ID:678280 發表于 2021-9-8 13:44
Y_G_G 發表于 2021-9-7 23:12
定時器可以這么用,但你的代碼本身就是錯誤的
if(num==1200); num是全局變量,而且是在中斷中增加的,隨時會 ...

謝謝!稍后我修改代碼再試。
ID:678280 發表于 2021-9-8 11:52

我下載了原本沒有的“STC89C5xRC.H”,之后試過你改寫的代碼,精度更高了,謝謝。
ID:401564 發表于 2021-9-7 23:12
定時器可以這么用,但你的代碼本身就是錯誤的
if(num==1200); num是全局變量,而且是在中斷中增加的,隨時會變的
如果是在比較if(num==1200)的過程中num的值剛好增加
而且,你之后有代碼又有延時,不知道延時不多長,但定時器可是自動加載工作的,num的值是一直在變化的
錯過了if(num==1200),比如大于,那就是會一直加到65535然后,歸零之后再加....
你可以改成if(num>=1200)試一下
下面的延時改動一下,它會影響閃燈的時間
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:57657 發表于 2021-9-7 20:47
盡量少用循環語句實現的軟件延時,時間會被中斷打亂。
ID:678280 發表于 2021-9-7 20:12
xianfajushi 發表于 2021-9-7 19:05
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。

感謝你的指導。
ID:678280 發表于 2021-9-7 20:10
wulin 發表于 2021-9-7 18:47
定時器中斷周期越短越容易調整精度

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

謝謝。稍后我去理解你寫的代碼。
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:332444 發表于 2021-9-7 19:05
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。
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 很給力!

查看全部評分

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频二区在线观看 | 成人亚洲性情网站www在线观看 | 特黄色毛片 | 91精品www| 一区二区三区免费网站 | 日韩在线中文字幕 | 午夜视频一区二区三区 | 91 视频网站 | 免费一区二区三区 | 日韩成人在线视频 | 91精品久久久久 | 色狠狠一区 | 国产亚洲欧美日韩精品一区二区三区 | 国户精品久久久久久久久久久不卡 | 日韩成人精品 | 亚洲综合第一页 | 亚洲一区二区久久久 | 男人午夜视频 | 在线视频日韩 | 天天玩天天操天天干 | 91麻豆蜜桃一区二区三区 | 成人免费一区二区三区牛牛 | 日韩在线精品强乱中文字幕 | 久草视频在线播放 | 国产精品欧美一区二区三区 | 91久久精品日日躁夜夜躁国产 | 蜜桃av一区二区三区 | 黄色片a级 | 欧美v在线| 免费a v网站 | 日本特黄特色aaa大片免费 | 一区二区成人 | 国产精品高潮呻吟久久久久 | 免费在线观看一级毛片 | 日日操操| 午夜爽爽爽男女免费观看 | 九九热免费观看 | 国产丝袜一区二区三区免费视频 | 日韩中文一区 | 99在线免费视频 | 欧美一区二区三区在线看 |