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

QQ登錄

只需一步,快速開始

搜索
查看: 17220|回復(fù): 20
收起左側(cè)

關(guān)于紅外發(fā)射的問題

  [復(fù)制鏈接]
ID:20083 發(fā)表于 2010-9-4 16:39 | 顯示全部樓層 |閱讀模式

以下是51hei板子自帶紅外發(fā)射程序一部分

//發(fā)送9ms的起始碼
  endcount=223;
  flag=1;
  count=0;
  do{}while(count<endcount);

 

這里寫發(fā)送9ms起始碼,設(shè)置endcountwei 223

 

想請(qǐng)教下,223是怎么算出來的,我自己老是算不出這個(gè)數(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í)器0和1為16位模式1 
  ET0 = 1; //定時(shí)器0中斷允許 

  TH0 = 0xFF; 
  TL0 = 0xE5; //設(shè)定時(shí)值0為38K 也就是每隔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;
  flag=1;
  count=0;
  do{}while(count<endcount);
  //發(fā)送4.5ms的結(jié)果碼
  endcount=117;
  flag=0;
  count=0;
  do{}while(count<endcount);
  //發(fā)送十六位地址的前八位
  irdata=iraddr1;
  for(i=0;i<8;i++)
  {
     //先發(fā)送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
//停止發(fā)送紅外信號(hào)(即編碼中的高電平)
     if(irdata-(irdata/2)*2)  //判斷二進(jìn)制數(shù)個(gè)位為1還是0
     {
       endcount=41;  //1為寬的高電平
     }
    else
     {
     endcount=15;   //0為窄的高電平
     }
    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++)
    {
    }
  }
}

回復(fù)

使用道具 舉報(bào)

ID:20083 發(fā)表于 2010-9-4 16:41 | 顯示全部樓層
以上是51hei自帶的一個(gè)完整程序 以下是程序一部分 //發(fā)送9ms的起始碼 endcount="223; " flag="1; " count="0; " do{}while(count
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2010-9-4 17:12 | 顯示全部樓層

稍等 馬上回復(fù)

回復(fù)

使用道具 舉報(bào)

ID:20083 發(fā)表于 2010-9-4 17:15 | 顯示全部樓層
真是太感謝了,呵呵
回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2010-9-4 21:21 | 顯示全部樓層
  定時(shí)器0中斷,每隔26us中斷一次,  而這個(gè)223*26us 就是38k方波發(fā)射時(shí)間,
但是由于是c語言寫的代碼,效率有點(diǎn)低,我們沒有辦法直接計(jì)算出代碼執(zhí)行所需要的時(shí)間,所以還需要少算一點(diǎn)這時(shí)間值,因?yàn)槠渌拇a運(yùn)行也需要時(shí)間。取223這樣大約是發(fā)射9ms的的38k方波,這是個(gè)經(jīng)驗(yàn)值,當(dāng)然最好是要對(duì)著示波器驗(yàn)證一下,以保證剛好為9ms
回復(fù)

使用道具 舉報(bào)

ID:20083 發(fā)表于 2010-9-4 21:32 | 顯示全部樓層

原來是這樣子啊。。我也是拿223X26,但覺得差好多,呵呵

 

 endcount=41;  //1為寬的高電平  代表1.685ms

 

endcount=10; 代表0.56ms

 

這些都是靠經(jīng)驗(yàn)啊?有點(diǎn)郁悶,呵呵

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2010-9-4 21:54 | 顯示全部樓層

那我告訴你一招軟件調(diào)試的方法吧,可把誤差減到最小

 

首先在工程里把晶振設(shè)置為12.0M  debug框里選擇 use simulator  并且要goto main打勾

 

在這2個(gè)個(gè)地方設(shè)置斷點(diǎn)

其實(shí)這2個(gè)斷點(diǎn)中間的代碼就是在發(fā)射38k方波

001.jpg

記錄程序運(yùn)行到第一個(gè)斷點(diǎn)的時(shí)間為1.49654400
002.jpg

程序運(yùn)行到第二個(gè)斷點(diǎn)的時(shí)間為1.50511800

 

所花的時(shí)間為1.50511800秒 -1.49654400秒=0.008574秒 ,和9ms已經(jīng)差不遠(yuǎn)了 

 

然后你可以采用改變那個(gè)數(shù)字或者加入減少代碼的方法把時(shí)間調(diào)試到1個(gè)微妙都不差,這也不是很難的事情

 

  我們用c語言編寫這類的時(shí)候  要做到精確  也不是很難的  你需要首先計(jì)算出一個(gè)大概的時(shí)間 然后慢慢修改調(diào)試至最精確的值

[此貼子已經(jīng)被作者于2010-9-5 0:51:01編輯過]
回復(fù)

使用道具 舉報(bào)

ID:20083 發(fā)表于 2010-9-4 22:31 | 顯示全部樓層
哈哈,實(shí)在感謝!
回復(fù)

使用道具 舉報(bào)

ID:44179 發(fā)表于 2013-1-30 13:37 | 顯示全部樓層

這個(gè)代碼是NEC 發(fā)射的程式,各位大俠是否有RC5 發(fā)射的代碼呢?

回復(fù)

使用道具 舉報(bào)

ID:65464 發(fā)表于 2014-8-26 09:44 | 顯示全部樓層
不錯(cuò)下來看看!
回復(fù)

使用道具 舉報(bào)

ID:66367 發(fā)表于 2014-9-18 22:33 | 顯示全部樓層
為了 m比 回一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:67796 發(fā)表于 2014-11-29 13:23 | 顯示全部樓層
admin 發(fā)表于 2010-9-4 21:54
那我告訴你一招軟件調(diào)試的方法吧,可把誤差減到最小
&nbsp;
首先在工程里把晶振設(shè)置為12.0M&nbsp; debug ...

這個(gè)方法確實(shí)是能解決一時(shí)問題。

代碼的其中一個(gè)價(jià)值在于復(fù)用,如果寫作函數(shù)調(diào)用,稍微改變下調(diào)用的結(jié)構(gòu),整個(gè)就得重算一遍。

看了您在 紅外萬能學(xué)習(xí)型遙控器_c  的代碼,用了_nop_()在一定程度上回避了這一算法的缺陷,倒是更有借鑒之處。

也難怪,可能真沒有比較完滿的解決辦法,不然宋老師的視頻不至于跳過這個(gè)不講。
回復(fù)

使用道具 舉報(bào)

ID:58581 發(fā)表于 2014-12-18 09:27 | 顯示全部樓層
學(xué)習(xí)了。!
回復(fù)

使用道具 舉報(bào)

ID:37147 發(fā)表于 2015-1-12 21:57 | 顯示全部樓層
程序看起來好累 雖然看不懂  但堅(jiān)持學(xué)習(xí)。。。
回復(fù)

使用道具 舉報(bào)

ID:92665 發(fā)表于 2015-11-1 15:04 | 顯示全部樓層
現(xiàn)在還是菜鳥,紅外的程序只能慢慢看了
回復(fù)

使用道具 舉報(bào)

ID:68356 發(fā)表于 2017-1-26 17:07 | 顯示全部樓層
好動(dòng)西,收藏了
回復(fù)

使用道具 舉報(bào)

ID:152917 發(fā)表于 2017-3-29 11:26 | 顯示全部樓層
棒棒棒
回復(fù)

使用道具 舉報(bào)

ID:185661 發(fā)表于 2017-5-15 19:22 | 顯示全部樓層
好東西,
回復(fù)

使用道具 舉報(bào)

ID:276399 發(fā)表于 2018-1-21 19:12 | 顯示全部樓層
好資料,51黑有你更精彩
回復(fù)

使用道具 舉報(bào)

ID:272080 發(fā)表于 2018-2-5 13:19 | 顯示全部樓層
if(irdata-(irdata/2)*2)  //判斷二進(jìn)制數(shù)個(gè)位為1還是0   樓主可以解釋一下這個(gè)代碼嗎  這里不是很看得懂了
回復(fù)

使用道具 舉報(bào)

ID:282408 發(fā)表于 2018-2-5 17:17 | 顯示全部樓層
0.5秒內(nèi)檢測到兩個(gè)24v脈沖不動(dòng)作,繼續(xù)檢測   當(dāng)0.5秒只檢測到一個(gè)為脈沖信號(hào)為異常  并報(bào)警,人工復(fù)位,有意向聯(lián)系 微信tfktfk
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表