在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

  • <dfn id="79stg"></dfn>
    <object id="79stg"><div id="79stg"><label id="79stg"></label></div></object>
    <ruby id="79stg"><dl id="79stg"><noscript id="79stg"></noscript></dl></ruby>

      新聞中心

      EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于8952單片機(jī)的紅外解碼(TC9012F編碼)

      基于8952單片機(jī)的紅外解碼(TC9012F編碼)

      作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

      irpro_ok=0;//處理完成標(biāo)志清零

      }


      void ircordpro(void)//紅外碼值處理函數(shù)
      {
      unsigned char i, j, k;
      unsigned char cord,value;

      k=1;//從1開始,是引導(dǎo)碼以后的一幀所有數(shù)據(jù)
      for(i=0;i<4;i++)//處理4個(gè)字節(jié)
      {
      for(j=0;j<8;j++) //處理1個(gè)字節(jié)8位
      {
      cord=irdata[k];
      if(cord>7)//電平寬度大于某個(gè)值,可以判斷為1(2.25ms) 時(shí)間范圍要大點(diǎn),否則重復(fù)按鍵出現(xiàn)混亂
      {
      value|=0x80;//若為1則賦值
      }
      //其余情況可以判斷為0(是不是證明了,irdata接收的是引導(dǎo)碼之后的一幀所有電平?)
      else
      {
      value=value;//若判斷為0則不變(移位后自然為0)
      }
      if(j<7)
      {
      value>>=1;//為什么|0X01 與<<1配合,不行。因?yàn)樽詈笸瓿芍狄笞钕葘懭氲淖畹臀?,用這個(gè)想法會(huì)反過(guò)來(lái)。
      }
      k++;
      }
      ircord[i]=value;
      value=0;
      } irpro_ok=1;//處理完畢標(biāo)志位置1

      }

      /////////////////////////////////////////////////////////////////

      void main(void)
      {
      EX0init(); // 初始化中斷

      TIM0init();//初始化定時(shí)器0
      while(1)//主循環(huán)
      {
      if(irok)
      {
      ircordpro();//碼值處理
      irok=0;
      }

      if(irpro_ok)//step press key
      {
      ir_work();//碼值識(shí)別散轉(zhuǎn)
      }
      }
      }
      程序基礎(chǔ)來(lái)自已有程序,在看完下面的說(shuō)明后,就可以移植了,畢竟同一個(gè)解碼標(biāo)準(zhǔn),都是大同小異,甚至就算不同解碼標(biāo)準(zhǔn)也僅僅是判斷編碼的時(shí)間要求上長(zhǎng)短不同。但為什么這是經(jīng)過(guò)我自己消化的呢,這里有個(gè)非常有趣的問(wèn)題。

      在我單獨(dú)實(shí)驗(yàn)紅外模塊的時(shí)候(也就是上面的源程序),能夠正常運(yùn)行。但是移植入開啟了T2中斷的大程序里之后,紅外部分一點(diǎn)反應(yīng)也沒(méi)有。在接下來(lái)的調(diào)試過(guò)程中,因?yàn)椴粫?huì)使用DEBUG進(jìn)入外部中斷,在不斷地比對(duì)程序中浪費(fèi)了許多時(shí)間。當(dāng)我使用LED調(diào)試法時(shí)(把P1=0x55;插入任意想要檢驗(yàn)的程序行,亮了就證明程序走到了這里),亮與不亮在這里分界了(紅色標(biāo)記):

      void ex0_isr (void) interrupt 0 using 0//外部中斷0服務(wù)函數(shù)
      {
      unsigned char i;
      bit startflag;

      if(startflag)
      {
      TR0=0;
      if(irtime<38&&irtime>=34)

      i=0;
      TR0=1;
      irdata[i]=irtime;

      irtime=0;
      i++;
      if(i==33)
      {
      irok=1;
      i=0;
      }

      }

      恰好最近有重溫static定義變量的特點(diǎn),不然可能死得不明不白。因?yàn)楸е鴨为?dú)運(yùn)行正常,移植整合之后也正常的想法,源程序的static unsigned char i;被我改為了uchar i;(我在自己程序里已做#define uchar unsigned char)。

      答案清楚了:因?yàn)槲也辉试S任何配角程序打擾T2時(shí)鐘工作,所以設(shè)置了最高優(yōu)先級(jí)(PT2=1;),這樣每次外部中斷0里面局部變量i的累加會(huì)被打斷,如果不能保值,就每次都被撤銷和重新構(gòu)建,或許永遠(yuǎn)達(dá)不到(i==33)要求。static按我的理解,最大的作用就是能夠保持上一次的值,至于其他作用印象就不大深刻了。

      哈哈,有意思,記住 中斷里的局部變量定義 unsigned char i;要改為static unsigned char i;


      上一頁(yè) 1 2 下一頁(yè)

      評(píng)論


      技術(shù)專區(qū)

      關(guān)閉