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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2860|回復: 18
收起左側

51單片機為什么定時器計時會差這么多?

  [復制鏈接]
ID:1091094 發表于 2024-1-18 09:55 | 顯示全部樓層 |閱讀模式
我用手機秒表和它對比,手機60秒跑完了,仿真軟件還剩下12秒沒跑,差這么多嗎?
屏幕截圖 2024-01-18 095149.png

單片機源程序如下:
  1. #include "reg52.h"

  2. #define smgled P0

  3. unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  4. int num=60,count=0;

  5. sbit smg1=P1^0;
  6. sbit smg2=P1^1;
  7. sbit KEY=P3^2;

  8. unsigned char flag=0;


  9. //定時10微秒
  10. void delay_10us(unsigned int ten_us)
  11. {
  12.         while(ten_us--);        
  13. }

  14. void main()
  15. {
  16.         TMOD|=0X01;//選擇為定時器0模式,工作方式1
  17.         TH0=0X3C;        //定時50ms
  18.         TL0=0XB0;        

  19.         ET0=1;//打開定時器0中斷允許
  20.         EA=1;//打開總中斷

  21.         //外部中斷0
  22.         IT0=1;
  23.         EX0=1;//打開INT0的中斷允許
  24.         
  25.   flag=0;
  26.         
  27.         num=60;

  28.         while(1)
  29.         {

  30.                 smgled=0XFF;//清屏
  31.                 smgled=table[num/10];//顯示十位
  32.                 smg1=1;
  33.                 smg2=0;
  34.                 delay_10us(500);
  35.                 smgled=0XFF;//清屏
  36.                 smgled=table[num%10];//顯示個位
  37.                 smg1=0;
  38.                 smg2=1;
  39.                 delay_10us(500);
  40.                 if(flag)
  41.                                 TR0=1;//打開定時器        
  42.                 else
  43.                 {
  44.                         num=60;
  45.                         TR0=0;//關掉定時器
  46.                 }
  47.                 if(num==0)  //判斷是否到達60秒
  48.                  {
  49.                          flag=0;
  50.                          num=60;
  51.                  }
  52.                 if(count==20)//判斷是否到1秒
  53.                 {
  54.                         num--;
  55.                         count=0;
  56.                 }

  57.         }
  58. }



  59. void timer() interrupt 1
  60. {
  61.         TH0=0X3c;        //給定時器賦初值,定時50ms
  62.         TL0=0Xb0;
  63.         count++;

  64. }

  65. void exti0() interrupt 0 //外部中斷0中斷函數
  66. {
  67.         delay_10us(1000);
  68.         if(KEY==0)
  69.                 flag=!flag;                        
  70. }
復制代碼

222、60秒倒計時秒表.rar (160.02 KB, 下載次數: 2)

回復

使用道具 舉報

ID:628113 發表于 2024-1-18 10:06 | 顯示全部樓層
是何原因我不清楚, 但是 在0級中斷中 使用延時循環 出問題那是必須的。
回復

使用道具 舉報

ID:1064915 發表于 2024-1-18 10:06 | 顯示全部樓層
手機秒表和仿真軟件,都不是準確時間,沒什么可比性
回復

使用道具 舉報

ID:192020 發表于 2024-1-18 10:35 | 顯示全部樓層
1,外部中斷0是上升沿中斷還是下降沿中斷?引腳也沒初始化,有沒有可能一直進入外部中斷0
2,運行主頻不知道,定時50ms是準的嗎

評分

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

查看全部評分

回復

使用道具 舉報

ID:1091094 發表于 2024-1-18 10:48 | 顯示全部樓層
ppcbug 發表于 2024-1-18 10:06
是何原因我不清楚, 但是 在0級中斷中 使用延時循環 出問題那是必須的。

為什么這么說呢?
如果外部中斷的服務函數里面沒有對按鍵進行消抖處理,那么flag值是不確定。
大家都是這么用得啊
回復

使用道具 舉報

ID:1091094 發表于 2024-1-18 10:51 | 顯示全部樓層
qq475878026 發表于 2024-1-18 10:35
1,外部中斷0是上升沿中斷還是下降沿中斷?引腳也沒初始化,有沒有可能一直進入外部中斷0
2,運行主頻不知 ...

這個是51單片機,沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個晶振的。
回復

使用道具 舉報

ID:384109 發表于 2024-1-18 10:56 | 顯示全部樓層
代碼編寫方式問題
回復

使用道具 舉報

ID:1090026 發表于 2024-1-18 11:05 | 顯示全部樓層
3038838599 發表于 2024-1-18 10:51
這個是51單片機,沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個晶振的。

你知道你選擇的晶振頻率嗎?延時長度根據晶振頻率來計算出來的。程序運行一行需要時間,遞減循環需要一定的時間
回復

使用道具 舉報

ID:1090026 發表于 2024-1-18 11:08 | 顯示全部樓層
3038838599 發表于 2024-1-18 10:51
這個是51單片機,沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個晶振的。

IT0=1 這個應該是下降沿觸發
回復

使用道具 舉報

ID:712097 發表于 2024-1-18 11:14 | 顯示全部樓層
仿真不準確的。
回復

使用道具 舉報

ID:213173 發表于 2024-1-18 11:28 | 顯示全部樓層
仿真計時本來就不準確,主函數里有延時,如果恰巧錯過 if(count==20),就要等下一輪。
回復

使用道具 舉報

ID:192020 發表于 2024-1-18 11:34 | 顯示全部樓層
3038838599 發表于 2024-1-18 10:51
這個是51單片機,沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個晶振的。

用晶振的話應該外接12M跑的才對,你應該是接了11.0592M吧
回復

使用道具 舉報

ID:192020 發表于 2024-1-18 11:44 | 顯示全部樓層
qq475878026 發表于 2024-1-18 11:34
用晶振的話應該外接12M跑的才對,你應該是接了11.0592M吧

算錯,你看看仿真里面設置的,估計你設成了10M晶振
回復

使用道具 舉報

ID:161164 發表于 2024-1-18 11:46 | 顯示全部樓層
電腦越快,仿真時間越貼進現實
系統越復雜,仿真時間越慢
你要對比的應該時仿真運行時,左下角那個時計 2024-01-18_114617.png

回復

使用道具 舉報

ID:458247 發表于 2024-1-18 14:35 | 顯示全部樓層
3038838599 發表于 2024-1-18 10:48
為什么這么說呢?
如果外部中斷的服務函數里面沒有對按鍵進行消抖處理,那么flag值是不確定。
大家都是 ...

消抖也可以不通過延時函數去消的噢,可以1ms執行一次按鍵程序,進行時間累計,key按下累計10次也就是10ms,再輸出按鍵值的,你在中斷函數中用延時肯定是有問題的,這次還沒執行完,下次中斷又來了,就嵌套了
回復

使用道具 舉報

ID:1091094 發表于 2024-1-18 19:35 | 顯示全部樓層
wulin 發表于 2024-1-18 11:28
仿真計時本來就不準確,主函數里有延時,如果恰巧錯過 if(count==20),就要等下一輪。

我把這些判斷放在定時器0的中斷服務函數里面也一樣的
回復

使用道具 舉報

ID:1091094 發表于 2024-1-18 23:50 | 顯示全部樓層
lkc8210 發表于 2024-1-18 11:46
電腦越快,仿真時間越貼進現實
系統越復雜,仿真時間越慢
你要對比的應該時仿真運行時,左下角那個時計

很正確,我驗證了,程序沒有問題,不能拿手機和proteus仿真的時間直接比較。
感謝感謝
回復

使用道具 舉報

ID:883242 發表于 2024-1-19 00:01 | 顯示全部樓層
找到問題就好,也算是增長了經驗,什么東西是仿真可以仿真出來的,什么是仿真不出來的。
回復

使用道具 舉報

ID:332444 發表于 2024-1-19 09:50 | 顯示全部樓層
仿真可以很準確的,看已經運行2個多小時依然不差秒的準確,不是讀取時鐘信息的,時鐘信息只在仿真運行初期讀取用來初始化的,是用定時器計時的.
無標題.png

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人第一页 | 91超碰在线 | 中文字幕在线二区 | 欧美精品综合在线 | 久久免费精品 | 国产精品性做久久久久久 | 在线免费视频一区 | 日本中文字幕一区 | 亚洲精品黄色 | 日本小视频网站 | 玖玖视频国产 | 人人干人人艹 | 中国大陆高清aⅴ毛片 | 精品日韩一区 | 国产亚洲第一页 | 国产精品免费看 | 男女网站在线观看 | 超碰成人在线观看 | 亚洲日本免费 | 亚洲精选一区 | 日韩成人在线电影 | 国产xxx在线观看 | 一区二区视频 | 国产精品不卡一区 | 精品欧美一区二区精品久久 | 成人免费观看视频 | 性xxxxx| 欧美精品一区在线发布 | 国产精品不卡 | 韩日精品在线观看 | 日本福利在线观看 | av先锋资源 | 成人久久久 | 亚洲成av人影片在线观看 | 日韩伦理一区二区 | 欧美黄 片免费观看 | 野狼在线社区2017入口 | 久久一视频 | 成人精品鲁一区一区二区 | 日韩中文字幕一区二区 | 一本色道精品久久一区二区三区 |