这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 定时器外部中断红外通讯问题

共10条 1/1 1 跳转至

定时器外部中断红外通讯问题

助工
2012-09-18 21:35:52     打赏
用定时器做通讯时钟,外部触发中断做接收引脚,请教下列几个问题,第一是校验位,偶校验,但不清楚确认1个数的方法;第二是不知道发送时数值从哪里来;第三是觉得发送和接收的波特率和时钟频率不大对,不知怎么确认;第四是不知道0和1怎么判断的?请指导!



关键词: 定时器     外部     中断     红外     通讯     问题    

助工
2012-09-19 09:58:36     打赏
2楼
要看你红外编码方式,还有红外接收用的是什么?

高工
2012-09-19 10:00:20     打赏
3楼
楼主用什么通讯协议呢?红外通讯怎么有波特率吗?

工程师
2012-09-19 10:20:53     打赏
4楼
都不说清楚 谁知道你想知道什么?

助工
2012-09-19 10:25:17     打赏
5楼

是645—1997通讯协议!


助工
2012-09-19 10:29:37     打赏
6楼
我是用连接一个电脑的接收头,这个连接电脑接收头有个板,这个板会有解析的吗?还有我的单片机设备是电表,我就是一个接收头,然后就是单片机啦。

助工
2012-09-19 10:35:44     打赏
7楼

void UartIRInit(void)

 /*----set INTP3-----------------------------------------------------------*/
 PIF3 = 0;
 PM3.1 = 1;
 EGP = 0x00; //EGP3=0
 EGN = 0x08; //EPN3=1
 PMK3 = 0;  //enable interrupt
 PPR3 = 1;  //low priority
 /*---set TMH1-------------------------------------------------------------*/
 TMHMD1 = 0;
 TMHMD1 = 0x30;//00110000
 CMP01 = 103; //8000000/64/104=1201.92
 TMMKH1 = 0; //enble interrupt
 TMPRH1 = 0; //high priority
 /*---set TMH0-------------------------------------------------------------*/
 TMHMD0 = 0;
 PM3.2 = 0;
 P3.2 = 0;

 CMP00 = 104;//8000000/(104+1) = 76.190K
 
 TMHMD0 = 0x01;//enable output
 TMMKH0 = 1; //disable interrupt
 /*--------byte set--------------------------------------------------------*/ 
 //RXIR=0;
 //TXIR
 UartIR.Monit500ms = 0;
 UartIR.Monit5s = 0;
 UartIR.Lapse30ms = 0;
 FUartIR_RStart = 0;
 FUartIR_REnd = 0;
 FUartIR_Treat = 0;
 FUartIR_Ting = 0;
}

__interrupt void IntP3(void)

 CMP01 = 51;
 TMHE1 = 1;
 PMK3 = 1;
 IRB = 0;//infrade buf
 IRBits = 0;
 IRParity = 0;
}

__interrupt void IntTMH1(void)
{
 TMHE1 = 0;
 CMP01 = 103;
 TMHE1 = 1;
 if (FUartIR_Ting == 1)
 {
  if (IRBits < 9)  //data bit
  { 
   if ((IRB&0x01) == 0x0)
    TMHE0 = 1;
   else
   { 
    IRParity++;  //even parity
    TMHE0 = 0;
    P3.2 = 0;
   }
   IRB >>= 1;
   IRBits++;
  }
  else if (IRBits == 9)  //parity bit
  {
   if (IRParity.0 == 0)
   {
    TMHE0 = 1;//even 1 bits,even parity is 0
   }
   else
   {
    TMHE0 = 0;
    P3.2 = 0;
   }
   IRBits++;
  }
  else if (IRBits == 10)//stop bit
  {
   TMHE0 = 0;
   P3.2 = 0;
   IRBits++;
  }
  else if (IRBits == 11)
  {
   TMHE1 = 0;//end the transmit
   
#ifndef __IR30MS
   
   if (UartIR.FENum != 0)
   {
    UartIR.FENum--;
    IRB = 0xfe;
    IRBits = 1; //start bit
    IRParity = 0;
    CMP01 = 103;
    TMHE1 = 1;
    TMHE0 = 1;
   }
   else if (UartIR.DataNum < (UartIR.Buf[9]+12))
   {
    IRB = UartIR.Buf[UartIR.DataNum++];
    IRBits = 1;//start bit
    IRParity = 0;
    CMP01 = 103;
    TMHE1 = 1;
    TMHE0 = 1;//start bit
   }
   else
   {
    FUartIR_Ting = 0;
    FUartIR_RStart = 0;
    PIF3 = 0;
    PMK3 = 0;//enable P5 interrupt
    TMHE1 = 0;//stop TMH1
   }
#endif
  }
 }
 
 /*-----receive state------------------------------------------------------*/
 else
 { 
  if (IRBits == 0) //the first judge is 0.416ms
  {
   
   if (P3.1 == 1)//start bit is error
   {
    PMK3 = 0;
    TMHE1 = 0;//end the receive
   }
   else
   {
    IRBits = 1;//++;
   }
  }
  else if (IRBits < 9)//data bits
  {
   IRB >>= 1;
   if (P3.1 == 1)
   { 
    IRB |= 0x80;
    IRParity++;
   }
   IRBits++;
  }
  else if (IRBits == 9) //parity bit
  {
   if (((P3.1==0)&&(IRParity.0==0)) ||
      ((P3.1==1)&&(IRParity.0==1))) //even check right
   {
    IRBits++;
   }
   else
   {
    PMK3 = 0;
    TMHE1 = 0; //stop receive
    IRBits = 0;
   }
  }
  else//end bit
  {
   PMK3 = 0;//enable receive last byte
   TMHE1 = 0;//because priority of TMH1 higher than P5

   if (P3.1 == 1)//stop bit
   {
    UartIR.Monit500ms = 0;
    UartIR.Monit5s = 0;
    
    if (FUartIR_RStart == 0)
    {
     if (IRB == 0x68)
     {
      FUartCom = 1;
      UartIR.Buf[0] = 0x68;
      UartIR.DataNum = 1;
      FUartIR_RStart = 1;
     }
    }
    else
    {
     if (UartIR.DataNum < MAXNUM_UART)
     {
      UartIR.Buf[UartIR.DataNum] = IRB;
      if (UartIR.DataNum == 7)
      {
       if (IRB != 0x68)
        FUartIR_RStart = 0;
      }     
      else if (UartIR.DataNum >= (UartIR.Buf[9]+11))
      {
       if (IRB == 0x16)
       {
        PMK3 = 1;   //end the receive
        FUartIR_REnd = 1;
       }
       FUartIR_RStart = 0;
      }
      UartIR.DataNum++;
     }
     else
      FUartIR_RStart = 0;
    }
   }
  }
 }
}这个是源代码,问题从这里来,有空请帮看看,红外确实没有做过。


助工
2012-09-19 10:37:21     打赏
8楼

我知道我的是电表,需要红外波特率是1200bps。这个是接收波特率,对于单片机。


高工
2012-09-21 10:11:06     打赏
9楼

这程序也没有一点注释,,,怎能这样,,


助工
2012-09-21 13:05:00     打赏
10楼
是的,程序是从别人那弄来的,所以没有注释。

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]