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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
本意是每分鐘響一聲,現在出了兩個菜鳥搞不明白的問題:
一是第一次響聲短暫,符合預期,之后的響聲延長了。
二是運行幾分鐘后時間誤差變大,它跑得快了。謝謝你的觀看和指正。

單片機源程序如下:
#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++;
}

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

使用道具 舉報

沙發
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這種 可單可雙還可四的最好不要用。
回復

使用道具 舉報

5#
ID:678280 發表于 2021-9-7 20:10 | 只看該作者
wulin 發表于 2021-9-7 18:47
定時器中斷周期越短越容易調整精度

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

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

使用道具 舉報

6#
ID:678280 發表于 2021-9-7 20:12 | 只看該作者
xianfajushi 發表于 2021-9-7 19:05
受中斷響應速度影響,合理的程序可能影響小些也是有影響的,因此才有時鐘芯片。

感謝你的指導。
回復

使用道具 舉報

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

感謝你的指導



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

使用道具 舉報

8#
ID:57657 發表于 2021-9-7 20:47 | 只看該作者
盡量少用循環語句實現的軟件延時,時間會被中斷打亂。
回復

使用道具 舉報

9#
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 很給力!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

11#
ID:678280 發表于 2021-9-8 11:52 | 只看該作者

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

使用道具 舉報

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

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

使用道具 舉報

13#
ID:883242 發表于 2021-9-9 19:48 | 只看該作者
delay(250);這句完全多余,if(num==1200)本身就是延遲的意思。
回復

使用道具 舉報

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

使用道具 舉報

15#
ID:965160 發表于 2021-9-9 20:42 | 只看該作者
可能程序自身有延遲
回復

使用道具 舉報

16#
ID:831736 發表于 2021-10-11 17:19 | 只看該作者
50Ms初值50000*11.0592/12=46080你算錯了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品电影在线观看 | a毛片| 久草免费在线 | www97影院| 久久精品毛片 | 欧美日韩中文字幕在线 | 日韩国产一区二区三区 | 一区在线播放 | 日韩中文一区二区三区 | 欧美日韩在线一区二区三区 | 久久人操 | 亚洲免费在线观看视频 | 成人在线视频一区 | av影音资源 | 日本精品视频一区二区 | 国产91丝袜在线熟 | 在线黄av| 亚洲97 | 麻豆久久久9性大片 | 91婷婷韩国欧美一区二区 | 久久精品av麻豆的观看方式 | 玖玖爱365| 伊人久操 | 免费能直接在线观看黄的视频 | 福利电影在线 | 国产超碰人人爽人人做人人爱 | 午夜精品一区二区三区三上悠亚 | 久久视频免费看 | 亚洲一区二区三 | 亚洲精品在线视频 | 日韩一区二区三区在线 | 精品久久一区二区 | 亚洲在线中文字幕 | av一区二区三区四区 | 精品一区av| 国产精品美女久久久免费 | 一区免费观看 | 欧美v在线 | 99久久婷婷国产综合精品电影 | 亚洲视频一区 | 日本不卡一区二区三区 |