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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17142|回復: 20
打印 上一主題 下一主題
收起左側

關于紅外發射的問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:20083 發表于 2010-9-4 16:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

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

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

 

這里寫發送9ms起始碼,設置endcountwei 223

 

想請教下,223是怎么算出來的,我自己老是算不出這個數,謝謝!

 

 

 

 

 

 

以下是完整程序


#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; //設定時器0和1為16位模式1 
  ET0 = 1; //定時器0中斷允許 

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:20083 發表于 2010-9-4 16:41 | 只看該作者
以上是51hei自帶的一個完整程序 以下是程序一部分 //發送9ms的起始碼 endcount="223; " flag="1; " count="0; " do{}while(count
回復

使用道具 舉報

板凳
ID:1 發表于 2010-9-4 17:12 | 只看該作者

稍等 馬上回復

回復

使用道具 舉報

地板
ID:20083 發表于 2010-9-4 17:15 | 只看該作者
真是太感謝了,呵呵
回復

使用道具 舉報

5#
ID:1 發表于 2010-9-4 21:21 | 只看該作者
  定時器0中斷,每隔26us中斷一次,  而這個223*26us 就是38k方波發射時間,
但是由于是c語言寫的代碼,效率有點低,我們沒有辦法直接計算出代碼執行所需要的時間,所以還需要少算一點這時間值,因為其他的代碼運行也需要時間。取223這樣大約是發射9ms的的38k方波,這是個經驗值,當然最好是要對著示波器驗證一下,以保證剛好為9ms
回復

使用道具 舉報

6#
ID:20083 發表于 2010-9-4 21:32 | 只看該作者

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

 

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

 

endcount=10; 代表0.56ms

 

這些都是靠經驗啊?有點郁悶,呵呵

回復

使用道具 舉報

7#
ID:1 發表于 2010-9-4 21:54 | 只看該作者

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

 

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

 

在這2個個地方設置斷點

其實這2個斷點中間的代碼就是在發射38k方波

記錄程序運行到第一個斷點的時間為1.49654400

程序運行到第二個斷點的時間為1.50511800

 

所花的時間為1.50511800秒 -1.49654400秒=0.008574秒 ,和9ms已經差不遠了 

 

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

 

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

[此貼子已經被作者于2010-9-5 0:51:01編輯過]
回復

使用道具 舉報

8#
ID:20083 發表于 2010-9-4 22:31 | 只看該作者
哈哈,實在感謝!
回復

使用道具 舉報

9#
ID:44179 發表于 2013-1-30 13:37 | 只看該作者

這個代碼是NEC 發射的程式,各位大俠是否有RC5 發射的代碼呢?

回復

使用道具 舉報

10#
ID:65464 發表于 2014-8-26 09:44 | 只看該作者
不錯下來看看!!
回復

使用道具 舉報

11#
ID:66367 發表于 2014-9-18 22:33 | 只看該作者
為了 m比 回一個
回復

使用道具 舉報

12#
ID:67796 發表于 2014-11-29 13:23 | 只看該作者
admin 發表于 2010-9-4 21:54
那我告訴你一招軟件調試的方法吧,可把誤差減到最小
&nbsp;
首先在工程里把晶振設置為12.0M&nbsp; debug ...

這個方法確實是能解決一時問題。

代碼的其中一個價值在于復用,如果寫作函數調用,稍微改變下調用的結構,整個就得重算一遍。

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

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

使用道具 舉報

13#
ID:58581 發表于 2014-12-18 09:27 | 只看該作者
學習了!!!
回復

使用道具 舉報

14#
ID:37147 發表于 2015-1-12 21:57 | 只看該作者
程序看起來好累 雖然看不懂  但堅持學習!!!!
回復

使用道具 舉報

15#
ID:92665 發表于 2015-11-1 15:04 | 只看該作者
現在還是菜鳥,紅外的程序只能慢慢看了
回復

使用道具 舉報

16#
ID:68356 發表于 2017-1-26 17:07 | 只看該作者
好動西,收藏了
回復

使用道具 舉報

17#
ID:152917 發表于 2017-3-29 11:26 | 只看該作者
棒棒棒
回復

使用道具 舉報

18#
ID:185661 發表于 2017-5-15 19:22 | 只看該作者
好東西,
回復

使用道具 舉報

19#
ID:276399 發表于 2018-1-21 19:12 | 只看該作者
好資料,51黑有你更精彩
回復

使用道具 舉報

20#
ID:272080 發表于 2018-2-5 13:19 | 只看該作者
if(irdata-(irdata/2)*2)  //判斷二進制數個位為1還是0   樓主可以解釋一下這個代碼嗎  這里不是很看得懂了
回復

使用道具 舉報

21#
ID:282408 發表于 2018-2-5 17:17 | 只看該作者
0.5秒內檢測到兩個24v脈沖不動作,繼續檢測   當0.5秒只檢測到一個為脈沖信號為異常  并報警,人工復位,有意向聯系 微信tfktfk
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产综合精品 | 日韩av成人 | 91精品国产综合久久久亚洲 | 超碰97人人人人人蜜桃 | 久久欧美高清二区三区 | 看特级黄色片 | 亚洲精品电影在线观看 | 99免费在线视频 | 成人午夜网站 | 久久久精品一区二区三区 | 欧美在线a | 福利国产 | 日韩伦理一区二区 | 久久久久久久一级 | 91精品国产91久久久久久吃药 | 亚洲精品成人在线 | 亚洲免费在线视频 | 国内精品久久久久 | 资源首页二三区 | 国产麻豆乱码精品一区二区三区 | 日本福利视频 | 国产美女精品视频 | 成人av电影免费在线观看 | 老头搡老女人毛片视频在线看 | 婷婷在线免费 | 在线国产一区二区 | 日韩小视频| 一级a性色生活片久久毛片 午夜精品在线观看 | 国产一区二区自拍 | 97久久精品午夜一区二区 | 最新国产精品视频 | 国产av毛片 | 精品日韩一区 | 久久综合久 | 中文字幕免费 | 国内精品久久精品 | 成人伊人 | 欧美激情一区二区 | 97精品超碰一区二区三区 | 成人区精品一区二区婷婷 | 国产一区二区在线播放 |