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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6074|回復: 1
收起左側

[求助]關于一個程序的疑問??

[復制鏈接]
ID:25357 發表于 2010-8-20 10:17 | 顯示全部樓層 |閱讀模式

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

紅外發射 啟動 9.12ms +4.5 ms     0.565+0.56為0  0.565+1.685 為1

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

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

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

 

 

#include <AT89X51.h>

static bit OP;        //紅外發射管的亮滅

static unsigned int count;       //延時計數器

static unsigned int endcount; //終止延時計數

static unsigned char flag;      //紅外發送標志

char iraddr1;  //十六位地址的第一個字節

char iraddr2;  //十六位地址的第二個字節

void SendIRdata(char p_irdata);

void delay();

void main(void)

{

  count = 0;

  flag = 0;

  OP = 0;

  P3_4 = 0;

  EA = 1; //允許CPU中斷

  TMOD = 0x11; //設定時器0116位模式1

  ET0 = 1; //定時器0中斷允許

 

  TH0 = 0xFF;

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

  TR0 = 1;//開始計數

  iraddr1=3;

  iraddr2=252;

 

  do{

      delay();

      SendIRdata(0x55);// 在此填入發射數據

  }while(1);

}

//定時器0中斷處理

void timeint(void) interrupt 1

{

  TH0=0xFF;

  TL0=0xE5; //設定時值為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;

  //發送9ms的起始碼

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

  flag=1;

  count=0;

  do{}while(count<endcount);

  //發送4.5ms的結果碼

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

  flag=0;

  count=0;

  do{}while(count<endcount);

  //發送十六位地址的前八位

  irdata=iraddr1;

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

  {

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

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

flag=1;

     count=0;

     do{}while(count<endcount);

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

     if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0

     {

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

}

    else

     {

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

 }

    flag=0;

    count=0;

    do{}while(count<endcount);

    irdata=irdata>>1;

  }

  //發送十六位地址的后八位

  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;

  }

  //發送八位數據

  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;

  }

  //發送八位數據的反碼

  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++)

    {

    }

  }

}

 

回復

使用道具 舉報

ID:1 發表于 2010-8-25 14:01 | 顯示全部樓層

是因為c語言編譯的,時間要消耗的多一些所以要預留出一些時間來,才能剛好匹配紅外的那個脈寬,你反匯編看一下代碼就能算出準確的時間了,用12兆的晶振,可精確到1微秒

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品-国产精品 | 九色 在线 | 色播久久 | 精品免费国产视频 | 成人自拍视频网站 | 国产精品久久欧美久久一区 | 成人一区二区三区在线 | 黄a网站 | av一区二区在线观看 | 日韩在线免费 | 天堂va在线 | www精品美女久久久tv | 日本综合在线观看 | 日韩av啪啪网站大全免费观看 | 久久久久网站 | av电影手机版| 视频一区在线观看 | 天天弄 | 网站黄色av | 97视频久久| 中文字幕在线视频一区二区三区 | 欧美在线成人影院 | 日韩一区二区三区在线播放 | 日韩av中文 | 国产一区二区三区四区三区四 | 美女张开腿露出尿口 | 国产精品一区二区福利视频 | 青青草在线播放 | 亚洲精品1区| 欧美日韩亚洲国产 | 成年网站在线观看 | 99福利网| 一区二区欧美在线 | 九九亚洲精品 | 亚洲第一网站 | 91在线播| 一级少妇女片 | 欧美黑人国产人伦爽爽爽 | 女人夜夜春 | 欧美视频在线看 | av网站免费观看 |