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

標(biāo)題: 51單片機(jī)為什么定時(shí)器計(jì)時(shí)會(huì)差這么多? [打印本頁(yè)]

作者: 3038838599    時(shí)間: 2024-1-18 09:55
標(biāo)題: 51單片機(jī)為什么定時(shí)器計(jì)時(shí)會(huì)差這么多?
我用手機(jī)秒表和它對(duì)比,手機(jī)60秒跑完了,仿真軟件還剩下12秒沒跑,差這么多嗎?


單片機(jī)源程序如下:
  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. //定時(shí)10微秒
  10. void delay_10us(unsigned int ten_us)
  11. {
  12.         while(ten_us--);        
  13. }

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

  19.         ET0=1;//打開定時(shí)器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];//顯示個(gè)位
  37.                 smg1=0;
  38.                 smg2=1;
  39.                 delay_10us(500);
  40.                 if(flag)
  41.                                 TR0=1;//打開定時(shí)器        
  42.                 else
  43.                 {
  44.                         num=60;
  45.                         TR0=0;//關(guān)掉定時(shí)器
  46.                 }
  47.                 if(num==0)  //判斷是否到達(dá)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;        //給定時(shí)器賦初值,定時(shí)50ms
  62.         TL0=0Xb0;
  63.         count++;

  64. }

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

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


作者: ppcbug    時(shí)間: 2024-1-18 10:06
是何原因我不清楚, 但是 在0級(jí)中斷中 使用延時(shí)循環(huán) 出問題那是必須的。
作者: joyb    時(shí)間: 2024-1-18 10:06
手機(jī)秒表和仿真軟件,都不是準(zhǔn)確時(shí)間,沒什么可比性
作者: Graves    時(shí)間: 2024-1-18 10:35
1,外部中斷0是上升沿中斷還是下降沿中斷?引腳也沒初始化,有沒有可能一直進(jìn)入外部中斷0
2,運(yùn)行主頻不知道,定時(shí)50ms是準(zhǔn)的嗎
作者: 3038838599    時(shí)間: 2024-1-18 10:48
ppcbug 發(fā)表于 2024-1-18 10:06
是何原因我不清楚, 但是 在0級(jí)中斷中 使用延時(shí)循環(huán) 出問題那是必須的。

為什么這么說呢?
如果外部中斷的服務(wù)函數(shù)里面沒有對(duì)按鍵進(jìn)行消抖處理,那么flag值是不確定。
大家都是這么用得啊
作者: 3038838599    時(shí)間: 2024-1-18 10:51
qq475878026 發(fā)表于 2024-1-18 10:35
1,外部中斷0是上升沿中斷還是下降沿中斷?引腳也沒初始化,有沒有可能一直進(jìn)入外部中斷0
2,運(yùn)行主頻不知 ...

這個(gè)是51單片機(jī),沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個(gè)晶振的。
作者: 人中狼    時(shí)間: 2024-1-18 10:56
代碼編寫方式問題
作者: AiChiTang    時(shí)間: 2024-1-18 11:05
3038838599 發(fā)表于 2024-1-18 10:51
這個(gè)是51單片機(jī),沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個(gè)晶振的。

你知道你選擇的晶振頻率嗎?延時(shí)長(zhǎng)度根據(jù)晶振頻率來計(jì)算出來的。程序運(yùn)行一行需要時(shí)間,遞減循環(huán)需要一定的時(shí)間
作者: AiChiTang    時(shí)間: 2024-1-18 11:08
3038838599 發(fā)表于 2024-1-18 10:51
這個(gè)是51單片機(jī),沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個(gè)晶振的。

IT0=1 這個(gè)應(yīng)該是下降沿觸發(fā)
作者: chxelc    時(shí)間: 2024-1-18 11:14
仿真不準(zhǔn)確的。
作者: wulin    時(shí)間: 2024-1-18 11:28
仿真計(jì)時(shí)本來就不準(zhǔn)確,主函數(shù)里有延時(shí),如果恰巧錯(cuò)過 if(count==20),就要等下一輪。
作者: Graves    時(shí)間: 2024-1-18 11:34
3038838599 發(fā)表于 2024-1-18 10:51
這個(gè)是51單片機(jī),沒有引腳模式選擇的,也沒有什么主頻副頻。
它就用一個(gè)晶振的。

用晶振的話應(yīng)該外接12M跑的才對(duì),你應(yīng)該是接了11.0592M吧
作者: Graves    時(shí)間: 2024-1-18 11:44
qq475878026 發(fā)表于 2024-1-18 11:34
用晶振的話應(yīng)該外接12M跑的才對(duì),你應(yīng)該是接了11.0592M吧

算錯(cuò),你看看仿真里面設(shè)置的,估計(jì)你設(shè)成了10M晶振
作者: lkc8210    時(shí)間: 2024-1-18 11:46
電腦越快,仿真時(shí)間越貼進(jìn)現(xiàn)實(shí)
系統(tǒng)越復(fù)雜,仿真時(shí)間越慢
你要對(duì)比的應(yīng)該時(shí)仿真運(yùn)行時(shí),左下角那個(gè)時(shí)計(jì)


作者: yzw846562238    時(shí)間: 2024-1-18 14:35
3038838599 發(fā)表于 2024-1-18 10:48
為什么這么說呢?
如果外部中斷的服務(wù)函數(shù)里面沒有對(duì)按鍵進(jìn)行消抖處理,那么flag值是不確定。
大家都是 ...

消抖也可以不通過延時(shí)函數(shù)去消的噢,可以1ms執(zhí)行一次按鍵程序,進(jìn)行時(shí)間累計(jì),key按下累計(jì)10次也就是10ms,再輸出按鍵值的,你在中斷函數(shù)中用延時(shí)肯定是有問題的,這次還沒執(zhí)行完,下次中斷又來了,就嵌套了
作者: 3038838599    時(shí)間: 2024-1-18 19:35
wulin 發(fā)表于 2024-1-18 11:28
仿真計(jì)時(shí)本來就不準(zhǔn)確,主函數(shù)里有延時(shí),如果恰巧錯(cuò)過 if(count==20),就要等下一輪。

我把這些判斷放在定時(shí)器0的中斷服務(wù)函數(shù)里面也一樣的
作者: 3038838599    時(shí)間: 2024-1-18 23:50
lkc8210 發(fā)表于 2024-1-18 11:46
電腦越快,仿真時(shí)間越貼進(jìn)現(xiàn)實(shí)
系統(tǒng)越復(fù)雜,仿真時(shí)間越慢
你要對(duì)比的應(yīng)該時(shí)仿真運(yùn)行時(shí),左下角那個(gè)時(shí)計(jì)

很正確,我驗(yàn)證了,程序沒有問題,不能拿手機(jī)和proteus仿真的時(shí)間直接比較。
感謝感謝
作者: Hephaestus    時(shí)間: 2024-1-19 00:01
找到問題就好,也算是增長(zhǎng)了經(jīng)驗(yàn),什么東西是仿真可以仿真出來的,什么是仿真不出來的。
作者: xianfajushi    時(shí)間: 2024-1-19 09:50
仿真可以很準(zhǔn)確的,看已經(jīng)運(yùn)行2個(gè)多小時(shí)依然不差秒的準(zhǔn)確,不是讀取時(shí)鐘信息的,時(shí)鐘信息只在仿真運(yùn)行初期讀取用來初始化的,是用定時(shí)器計(jì)時(shí)的.







歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久久久久久久久久午夜片 | 欧美色综合天天久久综合精品 | 91中文字幕在线 | 四虎久久| 成年人免费在线视频 | 精品视频国产 | 国产精品久久一区 | 日韩高清精品免费观看 | 日韩一区二区三免费高清在线观看 | 在线日韩欧美 | 日韩av在线网站 | 男男成人高潮片免费网站 | 免费成人黄色网址 | 激情久久综合 | 青草国产 | 欧美视频在线观看免费 | 亚洲日本一区二区 | 国产精品成人国产乱一区 | 国产一区二区在线播放 | 亚洲一区免费视频 | 国产亚洲一区二区三区 | 日韩av一区二区在线观看 | 在线观看黄色片 | 日韩成人片 | 中文字幕永久在线 | 日韩国产在线播放 | 天天天天天干 | 男人添女人囗交图 | 91精品国产成人www | 婷婷精品 | 国产精品成人一区二区三区 | av高清不卡| 黄色一级大片在线免费看产 | 日韩中文字幕一区二区三区 | 欧美一级日韩一级 | 久草福利在线 | 91av在线免费观看 | 中文字幕一区二区在线播放 | 一区二区三区影视 | 欧美在线一区二区 | 国产精品自拍一区 |