標(biāo)題: 紅外發(fā)送失敗 [打印本頁]

作者: 51stm    時(shí)間: 2018-7-7 22:23
標(biāo)題: 紅外發(fā)送失敗
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
static u16 count;       //延時(shí)計(jì)數(shù)器
static u16 endcount; //終止延時(shí)計(jì)數(shù)
static u8 flag;      //紅外發(fā)送標(biāo)志
sbit  P1_0=P1^0;//紅外發(fā)射管的亮滅控制位
u8 iraddr;  //地址碼
void SendIRdata(u8 p_irdata);//發(fā)送子函數(shù)
void delay();
void main(void)
{
  count = 0;
  flag = 0;       //無載波
  P1_0 = 1;       //不亮
  EA = 1; //允許CPU中斷
  TMOD = 0x10; //設(shè)定時(shí)器0和1為16位模式1
  ET1 = 1; //定時(shí)器0中斷允許
  TH1 = 0xFF;
  TL1 = 0xE6; //設(shè)定時(shí)值0為38K 也就是每隔26us中斷一次
  TR1 = 1;//開始計(jì)數(shù)
  iraddr=0;//自定義的一個(gè)地址
  do{
      delay();
      SendIRdata(0x45);
  }while(1);
}

void timeint(void) interrupt 3//定時(shí)器1中斷處理
{
  TH1=0xFF;//載入初值
  TL1=0xE6; //設(shè)定時(shí)值為38K 也就是每隔26us中斷一次
  count++;
  if (flag==1)//如果是待發(fā)送的有效數(shù)據(jù)flag=1,就在此產(chǎn)生載波(亮滅交變)
  {
                P1_0=!P1_0;
        }
  else
  {
                P1_0 = 0
        }
}
void SendIRdata(u8 p_irdata)   
{
  u8 i;                                                                                               
  u8 irdata=p_irdata;
  //發(fā)送9ms的起始碼,并是載波模式有效
  endcount=223;
  flag=1;
  count=0;
  while(count<endcount);//等待中斷,控制亮滅交變的總時(shí)間為9ms
  //發(fā)送4.5ms的結(jié)果碼,并是載波模式無效
  endcount=117;
  flag=0;
  count=0;
  do
        {
               
        }while(count<endcount);

  //發(fā)送十六位地址的前八位
  irdata=~iraddr;
  for(i=0;i<8;i++)
  {//一個(gè)周期里規(guī)定先以高電平開始,在以低電平結(jié)束。先發(fā)送0.56ms的38KHZ“1”的紅外波(即編碼中0.56ms的高電平)
     endcount=10;
     flag=1;
     count=0;
     do{}while(count<endcount);
//停止發(fā)送紅外信號(hào)(即編碼中的低電平)
   if(irdata&0x01)  //判斷二進(jìn)制數(shù)個(gè)位為1還是0
   {
                endcount=41;
         }  //1為寬的高電平1.68ms
   else
         {
                endcount=15;
         }  //0為窄的高電平0.56ms
    flag=0;
    count=0;
    while(count<endcount);
    irdata=irdata>>1;//依次取位
  }
  //發(fā)送十六位地址的后八位
  irdata=iraddr;    //此處已經(jīng)是地址的反碼
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     while(count<endcount);
     if(irdata&0x01)
     {
                        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;
     while(count<endcount);
     if(irdata&0x01)
     {
                        endcount=41;
                 }
     else
     {
                        endcount=15;
                 }
     flag=0;
     count=0;
     do{}while(count<endcount);
     irdata=irdata>>1;
  }
  //發(fā)送八位數(shù)據(jù)的反碼
  irdata=p_irdata;      //要將數(shù)據(jù)位取反
  for(i=0;i<8;i++)
  {
     endcount=10;
     flag=1;
     count=0;
     while(count<endcount);
     if(irdata&0x01)
     {
                        endcount=41;
                 }
     else
     {
                        endcount=15;
                 }
     flag=0;
     count=0;
     while(count<endcount);
     irdata=irdata>>1;
  }
  endcount=10;
  flag=1;
  count=0;
  do{}while(count<endcount);
  flag=0;
}
void delay()
{
  u16 i;
  u8 j;
  for(i=0;i<400;i++)
    for(j=0;j<100;j++);
}

不知道·哪里出問題了


作者: xiaotianwang112    時(shí)間: 2018-7-8 10:06
看下你的 第四行,,是否邏輯有問題,
作者: ahahaha    時(shí)間: 2018-7-8 11:21
我有過經(jīng)驗(yàn)的,delay函數(shù)盡量少用,會(huì)與定時(shí)器有沖突
作者: dywup    時(shí)間: 2018-7-8 12:14
38K頻率不對(duì),時(shí)間長(zhǎng)度需耐心調(diào)整。
作者: lele1314    時(shí)間: 2018-7-8 13:39
應(yīng)該是頻率發(fā)送與接收不對(duì)應(yīng)
作者: 1774710428    時(shí)間: 2018-7-8 16:21
估計(jì)38kHz的頻率不合適




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