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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

52單片機定時器定時程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1002906 發表于 2022-2-17 14:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛學定時器,想寫一個程序,讓單片機數碼管每秒顯示的數字加1,用的定時器定時,但是現在發現這個速度比較慢,我用手機一起計數發現手機每經過10s,單片機就會慢2s,就是手機秒表顯示10的時候,單片機數碼管顯示8,有沒有人幫我看一下是哪里的問題?單片機機器周期是1.085us。數碼管顯示數字全對,感覺只有定時器那里有問題。

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit WE=P2^7;
  6. sbit DU=P2^6;

  7. uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  8. void delay(uchar x)                //@11.0592MHz
  9. {
  10.         unsigned char i, j;
  11.         while(x>0)
  12.                 {
  13.                 _nop_();
  14.                 i = 2;
  15.                 j = 199;
  16.                 do
  17.                 {
  18.                         while (--j);
  19.                 } while (--i);
  20.                 x--;
  21.         }
  22. }

  23. void display(uchar z)
  24. {
  25.         uchar ge,shi,bai;
  26.         ge=z%10;
  27.         shi=z%100/10;
  28.         bai=z/100;

  29.         P0=0XFF;
  30.         WE=1;
  31.         P0=0XFB;
  32.         WE=0;

  33.         DU=1;
  34.         P0=table[ge];
  35.         DU=0;
  36.         delay(5);        

  37.         P0=0XFF;
  38.         WE=1;
  39.         P0=0XFD;
  40.         WE=0;

  41.         DU=1;
  42.         P0=table[shi];
  43.         DU=0;
  44.         delay(5);

  45.         P0=0XFF;
  46.         WE=1;
  47.         P0=0XFE;
  48.         WE=0;

  49.         DU=1;
  50.         P0=table[bai];
  51.         DU=0;
  52.         delay(5);
  53. }

  54. void timer0Init()//50ms
  55. {
  56.         TR0=1;
  57.         TMOD=0x01;
  58.         TH0=(65535-46082)/256;
  59.         TL0=(65535-46082)%256;        
  60. }

  61. void main()
  62. {
  63.         uchar msec,sec;
  64.         timer0Init();
  65.         while(1)
  66.     {
  67.                 if(TF0==1)
  68.                 {
  69.                         msec++;
  70.                         TF0=0;
  71.                         TH0=(65536-46080)/256;
  72.                         TL0=(65536-46080)%256;
  73.                         
  74.                 }
  75.                 if(msec==20)
  76.                 {
  77.                         sec++;
  78.                         msec=0;
  79.                 }        
  80.                 display(sec);
  81.         }
  82. }
復制代碼


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

使用道具 舉報

沙發
ID:625730 發表于 2022-2-17 16:49 | 只看該作者
你這個放在主函數里面,順序執行,定時器起不到想要的效果。比如剛開始執行display函數的時候,計數器記滿,TF0=1,那么要等display執行結束,回到while(1)的開頭,去判斷TF0的值,才會進入if語句里執行指令,如果TF0是0,那就不會進入if條件語句中執行指令,這樣又得等執行完display,再回來判斷TF0,
一般用定時器中斷操作,打開ET0,EA,然后寫一個定時器0的中斷函數。
回復

使用道具 舉報

板凳
ID:313048 發表于 2022-2-17 18:26 | 只看該作者
在中斷里做計數值的累加,不要在while中做累加,while只做顯示就好了,定時器中斷產生后,里馬重新寫計數值,然后做計數就可以了。前提是定時器預裝值計算正確。
回復

使用道具 舉報

地板
ID:213173 發表于 2022-2-17 20:00 | 只看該作者
如果用定時器查詢方式一定要保證主循環周期明顯小于定時周期,否則會發生計時信號丟失而走時變慢。修改如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit WE=P2^7;
  6. sbit DU=P2^6;

  7. uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  8. uchar i;

  9. void display(uchar z)
  10. {
  11.         uchar a[3];
  12.         a[0]=table[z/100%10];
  13.         a[1]=table[z/10%10];
  14.         a[2]=table[z%10];
  15.        
  16.         P0=0x00;
  17.         DU=1;
  18.         DU=0;
  19.        
  20.         P0=~(0x01<<i);
  21.         WE=1;
  22.         WE=0;
  23.        
  24.         P0=a[i];
  25.         DU=1;
  26.         DU=0;
  27.        
  28.         i=++i%3;
  29. }

  30. void timer0Init()        //5ms
  31. {
  32.         TMOD|= 0x01;        //設置定時器模式
  33.         TL0 = 0x00;                //設置定時初始值
  34.         TH0 = 0xEE;                //設置定時初始值
  35.         TF0 = 0;                //清除TF0標志
  36.         TR0 = 1;                //定時器0開始計時
  37. }

  38. void main()
  39. {
  40.         uchar msec,sec;
  41.         timer0Init();
  42.         while(1)
  43.         {
  44.                 if(TF0==1)
  45.                 {
  46.                         TF0=0;
  47.                         TL0 = 0x00;                //設置定時初始值
  48.                         TH0 = 0xEE;                //設置定時初始值
  49.                         msec++;
  50.                         if(msec==200)
  51.                         {
  52.                                 sec++;
  53.                                 msec=0;
  54.                         }        
  55.                         display(sec);
  56.                 }
  57.         }
  58. }
復制代碼
回復

使用道具 舉報

5#
ID:1002906 發表于 2022-2-18 08:27 | 只看該作者
TEC 發表于 2022-2-17 16:49
你這個放在主函數里面,順序執行,定時器起不到想要的效果。比如剛開始執行display函數的時候,計數器記滿 ...

謝謝,我再去看看
回復

使用道具 舉報

6#
ID:1002906 發表于 2022-2-18 08:28 | 只看該作者
wulin 發表于 2022-2-17 20:00
如果用定時器查詢方式一定要保證主循環周期明顯小于定時周期,否則會發生計時信號丟失而走時變慢。修改如下 ...

謝謝,我再去看看
回復

使用道具 舉報

7#
ID:1002906 發表于 2022-2-18 08:28 | 只看該作者
AUG 發表于 2022-2-17 18:26
在中斷里做計數值的累加,不要在while中做累加,while只做顯示就好了,定時器中斷產生后,里馬重新寫計數值 ...

謝謝,我再去看看
回復

使用道具 舉報

8#
ID:1005963 發表于 2022-2-21 12:11 | 只看該作者
wulin 發表于 2022-2-17 20:00
如果用定時器查詢方式一定要保證主循環周期明顯小于定時周期,否則會發生計時信號丟失而走時變慢。修改如下 ...

既然用了定時器,為什么不在中斷函數里,要在main函數里面
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九亚洲精品 | 欧美激情久久久 | 97成人在线 | 亚洲成人免费观看 | 四虎影院美女 | 精品视频一区二区在线观看 | 亚洲视频在线免费 | 日韩在线高清 | 日日骚视频 | 中文日韩在线 | 蜜月va乱码一区二区三区 | 亚洲大片 | 一区二区高清不卡 | 九九在线视频 | 中文字幕在线观看www | 国产乱码精品一区二区三区中文 | 久久久久国色av免费观看性色 | 中文字幕一区二区三区精彩视频 | 精品国产aⅴ| 免费视频一区 | 日韩欧美精品在线 | 亚洲精品日韩综合观看成人91 | 亚洲精品国产第一综合99久久 | 精品日韩一区二区三区 | 欧美在线综合 | 国产精品久久久久久久久久久久 | 韩国精品一区 | 久久亚洲国产精品日日av夜夜 | av一级久久| 亚洲精品视频一区 | 不卡的av一区 | 久久久精品一区 | www.一区二区 | 日韩在线播放一区 | 欧美精品中文字幕久久二区 | av永久免费| 日本又色又爽又黄的大片 | 欧美精品久久久久久久久久 | 免费在线h视频 | 欧美国产精品一区二区三区 | 精品久久久久久亚洲精品 |