標(biāo)題: [求助]關(guān)于一個(gè)程序的疑問?? [打印本頁]

作者: magicedward    時(shí)間: 2010-8-20 10:17
標(biāo)題: [求助]關(guān)于一個(gè)程序的疑問??

對以下程序,我有些不明白的地方?請教高手。

紅外發(fā)射 啟動(dòng) 9.12ms +4.5 ms     0.565+0.56為0  0.565+1.685 為1

下面程序中斷一次26us  好像算起來,時(shí)間間隔不對的???

可是,我用紅外測試儀測了一下,好像又相差不大????

到底是哪里的問題???謝謝

 

 

#include <AT89X51.h>

static bit OP;        //紅外發(fā)射管的亮滅

static unsigned int count;       //延時(shí)計(jì)數(shù)器

static unsigned int endcount; //終止延時(shí)計(jì)數(shù)

static unsigned char flag;      //紅外發(fā)送標(biāo)志

char iraddr1;  //十六位地址的第一個(gè)字節(jié)

char iraddr2;  //十六位地址的第二個(gè)字節(jié)

void SendIRdata(char p_irdata);

void delay();

void main(void)

{

  count = 0;

  flag = 0;

  OP = 0;

  P3_4 = 0;

  EA = 1; //允許CPU中斷

  TMOD = 0x11; //設(shè)定時(shí)器0116位模式1

  ET0 = 1; //定時(shí)器0中斷允許

 

  TH0 = 0xFF;

  TL0 = 0xE5; //設(shè)定時(shí)值038K 也就是每隔26us中斷一次 

  TR0 = 1;//開始計(jì)數(shù)

  iraddr1=3;

  iraddr2=252;

 

  do{

      delay();

      SendIRdata(0x55);// 在此填入發(fā)射數(shù)據(jù)

  }while(1);

}

//定時(shí)器0中斷處理

void timeint(void) interrupt 1

{

  TH0=0xFF;

  TL0=0xE5; //設(shè)定時(shí)值為38K 也就是每隔26us中斷一次

  count++;

  if (flag==1)

  {

    OP=~OP;

  }

  else

  {

    OP = 0;

  }

  P3_4 = OP;

}

 

void SendIRdata(char p_irdata)

{

  int i;

  char irdata=p_irdata;

  //發(fā)送9ms的起始碼

  endcount=223; // 26us中斷一次,不是5.7ms????

  flag=1;

  count=0;

  do{}while(count<endcount);

  //發(fā)送4.5ms的結(jié)果碼

  endcount=117;//   這里好像只有3ms

  flag=0;

  count=0;

  do{}while(count<endcount);

  //發(fā)送十六位地址的前八位

  irdata=iraddr1;

  for(i=0;i<8;i++)

  {

     //先發(fā)送0.56ms38KHZ紅外波(即編碼中0.56ms的低電平)

     endcount=10;  // 不是0.26ms嗎?哪有0.56ms???

flag=1;

     count=0;

     do{}while(count<endcount);

//停止發(fā)送紅外信號(即編碼中的高電平)

     if(irdata-(irdata/2)*2)  //判斷二進(jìn)制數(shù)個(gè)位為1還是0

     {

       endcount=41;  //1為寬的高電平 //算到1ms    

}

    else

     {

     endcount=15;   //0為窄的高電平 //只有0.39ms    

 }

    flag=0;

    count=0;

    do{}while(count<endcount);

    irdata=irdata>>1;

  }

  //發(fā)送十六位地址的后八位

  irdata=iraddr2;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

        endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  //發(fā)送八位數(shù)據(jù)

  irdata=p_irdata;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

         endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  //發(fā)送八位數(shù)據(jù)的反碼

  irdata=~p_irdata;

  for(i=0;i<8;i++)

  {

     endcount=10;

     flag=1;

     count=0;

     do{}while(count<endcount);

     if(irdata-(irdata/2)*2)

     {

         endcount=41;

     }

     else

     {

       endcount=15;

     }

     flag=0;

     count=0;

     do{}while(count<endcount);

     irdata=irdata>>1;

  }

  endcount=10;

  flag=1;

  count=0;

  do{}while(count<endcount);

  flag=0;

}

void delay()

{

  int i,j;

  for(i=0;i<400;i++)

  {

    for(j=0;j<100;j++)

    {

    }

  }

}

 


作者: admin    時(shí)間: 2010-8-25 14:01

是因?yàn)閏語言編譯的,時(shí)間要消耗的多一些所以要預(yù)留出一些時(shí)間來,才能剛好匹配紅外的那個(gè)脈寬,你反匯編看一下代碼就能算出準(zhǔn)確的時(shí)間了,用12兆的晶振,可精確到1微秒






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1