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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8446|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)定時(shí)器計(jì)時(shí)不準(zhǔn)確問題分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
請(qǐng)教下大神們:
      我用STC89C52RC單片機(jī)的定時(shí)器0來計(jì)時(shí)NEC(紅外)脈沖時(shí)出現(xiàn)過這種現(xiàn)象準(zhǔn)確的問題。
描述:
我在外部中斷0中來計(jì)算兩個(gè)下降沿之間的時(shí)間,在計(jì)時(shí)1.125ms的脈沖時(shí),定時(shí)器中的TL0、TH0中的數(shù)據(jù)小于理論計(jì)算值,而且還相差比較大(200~300個(gè)定時(shí)器周期)。但當(dāng)計(jì)時(shí)13.5ms的脈沖時(shí),定時(shí)器TL0、TH0中的數(shù)據(jù)與理論計(jì)算值接近。不知道是什么原因,有測(cè)試過晶振波形,平均是11.079MHZ與計(jì)算時(shí)用的11.0592MHZ接近。同時(shí)我還測(cè)試了NEC紅外脈沖與理論脈沖寬度接近。

  1. volatile uint8_t plus_nums = 0;//記錄下降沿?cái)?shù)量
  2. volatile uint8_t nec_code[4] = {0};//保存NEC協(xié)議數(shù)據(jù)
  3. volatile uint8_t received_flag = 0;//接收完成標(biāo)志
復(fù)制代碼
  1. /**
  2. *功能:初始化外部中斷0、定時(shí)中斷0、定時(shí)器1
  3. *說明:定時(shí)器0不使能中斷
  4. **/
  5. void Init_all_interrupt(void)
  6. {
  7.         TMOD = 0x01;//16位計(jì)數(shù)值
  8.         ET0 = 1;
  9.         EX0 = 1;
  10.         IT0 = 1;
  11.         TR0 = 0;
  12.         EA = 1;
  13.         P1 = 0xff;
  14. }

  15. /**
  16. *功能:解碼NEC紅外編碼,外部中斷0.
  17. *共34個(gè)下降沿

  18. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  19. *經(jīng)測(cè)試?yán)碚撝蹬c實(shí)際值相差太大,且實(shí)際值偏小。猜測(cè)應(yīng)該是晶振頻率比11.0592MHZ更小
  20. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  21. **/
  22. void NEC_falldown_INT0(void) interrupt 0
  23. {
  24.         uint16_t temp_plus_time = 0;
  25.         #ifdef DEBUG
  26.         TEST = 0;
  27.         #endif
  28.         plus_nums++;
  29.         if(plus_nums == 1)//第一次下降沿
  30.                 {
  31.                         TH0 = 0;
  32.                         TL0 = 0;
  33.                         TR0 = 1;//開啟定時(shí)器
  34.                 }
  35.         else if(plus_nums == 2)//進(jìn)行“前導(dǎo)碼判斷”第一次下降沿,清零開始計(jì)時(shí)脈沖
  36.                 {
  37.                         temp_plus_time = TH0;
  38.                         temp_plus_time = temp_plus_time << 8;
  39.                         temp_plus_time = temp_plus_time | TL0;//保存脈沖數(shù)值
  40.                         TH0 = 0;
  41.                         TL0 = 0;
  42.                         if((temp_plus_time >= 0x2BB0) && (temp_plus_time <= 0x3576))//脈沖時(shí)間在(13.5ms)±10%
  43.                         {
  44.                                 #ifdef DEBUG
  45.                                 LED0 = 0;
  46.                                 #endif
  47.                         }
  48.                         else        //前導(dǎo)碼異常--重新檢測(cè)整個(gè)NEC協(xié)議序列
  49.                         {
  50.                                 //全部復(fù)位--重新開始
  51.                                 plus_nums = 0;
  52.                                 TR0 = 0;//關(guān)閉定時(shí)器0
  53.                         }
  54.                 }
  55.         else        //3-34
  56.                 {
  57.                         temp_plus_time = TH0;
  58.                         temp_plus_time = temp_plus_time << 8;
  59.                         temp_plus_time = temp_plus_time | TL0;//保存脈沖數(shù)值
  60.                         TH0 = 0;
  61.                         TL0 = 0;
  62.                         //933~1140;不知道理論計(jì)數(shù)得到的下限值會(huì)偏小很多?---!!!只有一種可能,晶振頻率有問題!!!
  63.                         //650~1140---測(cè)試可用
  64.                         if((temp_plus_time >= 933) && (temp_plus_time <= 1140))//判斷”邏輯0“.脈沖時(shí)間在(1.125ms)±10%
  65.                                 {
  66.                                         #ifdef DEBUG
  67.                                         LED1 = 0;
  68.                                         #endif
  69.                                 }
  70.                         //1866~2280;不知道理論計(jì)數(shù)得到的下限值會(huì)偏小很多?---!!!只有一種可能,晶振頻率有問題!!!
  71.                         //1566~2280---測(cè)試可用
  72.                         else if((temp_plus_time >= 1866) && (temp_plus_time <= 2280))//判斷”邏輯1“.脈沖時(shí)間在(2.25ms)±10%
  73.                                 {
  74.                                         temp_plus_time = plus_nums -3;//產(chǎn)生數(shù)組下標(biāo)
  75.                                         //nec_arr_index / 8可以使用位域代替這個(gè)運(yùn)算,提高執(zhí)行效率
  76.                                         nec_code[temp_plus_time / 8] = nec_code[temp_plus_time / 8] | (0x01 << (temp_plus_time % 8));
  77.                                         #ifdef DEBUG
  78.                                         LED2 = 0;
  79.                                         #endif
  80.                                 }
  81.                         else
  82.                                 {
  83.                                         //全部復(fù)位--重新開始
  84.                                         plus_nums = 0;
  85.                                         TH0 = 0;
  86.                                         TL0 = 0;
  87.                                         TR0 = 0;//關(guān)閉定時(shí)器0,重新開始
  88.                                         for(temp_plus_time = 0;temp_plus_time < 4;temp_plus_time++)
  89.                                                 {
  90.                                                         nec_code[temp_plus_time] = 0;
  91.                                                 }
  92.                                         #ifdef DEBUG
  93.                                         LED7 = ~LED7;
  94.                                         #endif
  95.                                 }        
  96.                          //接收到了結(jié)束標(biāo)志脈沖
  97.                         if(plus_nums == 34)
  98.                         {
  99.                                 plus_nums = 0;//結(jié)束了
  100.                                 received_flag = 1;//可以進(jìn)行解碼操作了
  101.                                 TR0 = 0;//關(guān)閉定時(shí)器0
  102.                                 #ifdef DEBUG
  103.                                 LED3 = ~LED3;
  104.                                 #endif
  105.                         }
  106.                 }
  107.         #ifdef DEBUG
  108.         TEST = 1;
  109.         #endif
  110. }

  111. /**
  112. *功能:當(dāng)71.111ms后都未檢測(cè)到第二個(gè)下降沿時(shí),關(guān)閉定時(shí)器
  113. */
  114. void NEC_Plus_TIMER0(void) interrupt 1
  115. {
  116.         uint8_t i;
  117.         TR0 = 0;//關(guān)閉定時(shí)器
  118.         TH0 = 0x00;
  119.         TL0 = 0x00;
  120.         //所有全局變量清零
  121.         plus_nums = 0;
  122.         for(i = 0;i < 4;i++)
  123.                 {
  124.                         nec_code[i] = 0;
  125.                 }
  126.         #ifdef DEBUG
  127.         LED4 = 0;
  128.         #endif
  129. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:451718 發(fā)表于 2019-4-9 16:58 | 只看該作者
TL和TH置零后開啟計(jì)數(shù)器, 可能存在一些我們不知道的過程, 最好還是TL=0xff  ,TH=0xff 試試。這個(gè)從0x00 到 0xff的過程,實(shí)際上可能并不是我們想象的就是一步之遙。 以上僅是一個(gè)猜想。
樓主,我會(huì)關(guān)注你的結(jié)果哦。 我也想弄不明白,  設(shè)置0xff為初值,和設(shè)置0x00為初值是不是一樣的效果。
回復(fù)

使用道具 舉報(bào)

板凳
ID:96682 發(fā)表于 2019-4-9 17:00 | 只看該作者
選用的器件精度不夠當(dāng)然會(huì)出現(xiàn)計(jì)時(shí)不準(zhǔn)確的問題了,玩玩就好別太較真
有的山寨手機(jī)一個(gè)月誤差十分鐘都有不奇怪
回復(fù)

使用道具 舉報(bào)

地板
ID:475776 發(fā)表于 2019-4-10 09:35 | 只看該作者
robinsonlin 發(fā)表于 2019-4-9 16:58
TL和TH置零后開啟計(jì)數(shù)器, 可能存在一些我們不知道的過程, 最好還是TL=0xff  ,TH=0xff 試試。這個(gè)從0x00  ...

51定時(shí)器是向上計(jì)數(shù)的,我用TL0=0x00,TH0=0x00是為了計(jì)時(shí)NEC紅外脈沖時(shí)間的。我也有測(cè)量晶振脈沖平均是11.079MHZ(5個(gè)12MHZ的脈沖、1個(gè)8MHZ脈沖)。關(guān)鍵點(diǎn):當(dāng)計(jì)時(shí)短脈沖時(shí),非常不準(zhǔn)確。而計(jì)時(shí)長(zhǎng)脈沖時(shí),很準(zhǔn)確。我沒有用定時(shí)器中斷來計(jì)時(shí),按照道理應(yīng)該不會(huì)因?yàn)檫M(jìn)入中斷而產(chǎn)生的誤差。
回復(fù)

使用道具 舉報(bào)

5#
ID:475776 發(fā)表于 2019-4-10 09:37 | 只看該作者
wc86110 發(fā)表于 2019-4-9 17:00
選用的器件精度不夠當(dāng)然會(huì)出現(xiàn)計(jì)時(shí)不準(zhǔn)確的問題了,玩玩就好別太較真
有的山寨手機(jī)一個(gè)月誤差十分鐘都有不 ...

那你所說的精度,應(yīng)該是定時(shí)器計(jì)時(shí)過短時(shí)誤差大。計(jì)時(shí)長(zhǎng)時(shí)誤差小。但是我想知道的是這個(gè)誤差是怎么來的?因?yàn)槲叶〞r(shí)器計(jì)時(shí)不是通過定時(shí)器中斷計(jì)時(shí)的。而定時(shí)器計(jì)時(shí)是獨(dú)立于CPU運(yùn)行的,也就是說當(dāng)進(jìn)入外部中斷時(shí)定時(shí)器計(jì)數(shù)還在運(yùn)行
回復(fù)

使用道具 舉報(bào)

6#
ID:123289 發(fā)表于 2019-4-10 10:06 | 只看該作者
樓主:將的的測(cè)量原理畫成流程圖,你自己就會(huì)發(fā)現(xiàn)問題了。
會(huì)畫流程圖嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:475776 發(fā)表于 2019-4-10 11:08 | 只看該作者
yzwzfyz 發(fā)表于 2019-4-10 10:06
樓主:將的的測(cè)量原理畫成流程圖,你自己就會(huì)發(fā)現(xiàn)問題了。
會(huì)畫流程圖嗎?

好的。我試下,還有就是請(qǐng)問下你這里有流程圖繪制的工具嗎?有的話還請(qǐng)發(fā)下
回復(fù)

使用道具 舉報(bào)

8#
ID:475776 發(fā)表于 2019-4-11 17:13 | 只看該作者
yzwzfyz 發(fā)表于 2019-4-10 10:06
樓主:將的的測(cè)量原理畫成流程圖,你自己就會(huì)發(fā)現(xiàn)問題了。
會(huì)畫流程圖嗎?

我有重新整理測(cè)量原理,也做了流程圖。沒發(fā)現(xiàn)導(dǎo)致這樣結(jié)果的邏輯問題
回復(fù)

使用道具 舉報(bào)

9#
ID:696728 發(fā)表于 2020-4-4 08:18 | 只看該作者
我也遇到這個(gè)問題,100us以下定時(shí),相差幾十個(gè)us呢,不知原因?yàn)楹巍?/td>
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干天天干 | 成人国产网站 | 九九精品在线 | 精品一区二区三区四区视频 | 一区二区在线不卡 | 噜噜噜色网 | 全部免费毛片在线播放网站 | 久久涩涩 | 精品国产一区二区在线 | 91视频在线网站 | 成人做爰9片免费看网站 | 在线观看国产三级 | 911影院| 欧美国产视频 | 成人在线精品视频 | 国产免费拔擦拔擦8x高清 | 亚洲成人久久久 | 国产精品黄色 | 久久精品亚洲精品国产欧美 | 黄色免费观看网站 | 一区二区三区电影网 | 精产国产伦理一二三区 | 欧美综合久久 | 91精品国产91久久久久久最新 | 久久精品99久久 | 欧美视频三级 | 在线观看国产 | 精品久久久久久久人人人人传媒 | 日韩欧美国产精品 | 精品国产乱码久久久久久图片 | 一级黄在线观看 | 欧美一级片在线看 | 在线看av网址 | 紧缚调教一区二区三区视频 | 国产精品久久久久久久久久久久久 | 国产精品一区二区三区四区 | 91麻豆精品国产91久久久久久久久 | 欧美精品91 | 国产精品久久二区 | 成人在线播放 | 人人干人人艹 |