打印

关于红外接收的程序问题?

[复制链接]
2128|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gudeng614|  楼主 | 2010-1-15 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下为中断定时部分程序,请问高手这个外部中断与定时的实现过程,谢谢啦!
#include <Gendef.h>
#include <Val.h>
#include <stdio.h>
#include<intrins.h>
void ErrRst(void)
{
EX0 = TRUE;
ET0 = FALSE;
TR0 = FALSE;
  
RecTem = 0;
RecBitCoun = 0;
RecBytCoun = 0;

RecStart = FALSE;
Recend = FALSE;
DatRecFlag = FALSE;
Status = RECRET0;
}
void Ex0Int(void) interrupt 0 using 1
{
// P1 = ~Status;
if(Status == RECRET0){
  
  EX0 = FALSE;
  ET0 = TRUE;
  
  Status = RECRET1;
  TR0 = FALSE;
  TH0 = TimRefTH[Status];
  TL0 = TimRefTL[Status];
  TR0 = TRUE;
}else if (Status == RECRET4){

  Status++;
  RecTem = 0x00;
  RecBitCoun = 0x00;
  RecBytCoun = 0x00;
  RecStart = TRUE;
  Recend = FALSE;
  DatRecFlag = FALSE;
  TR0 = FALSE;
  TH0 = TimRefTH[Status];
  TL0 = TimRefTL[Status];
  TR0 = TRUE;
  
}else if(RecStart == TRUE){
  {
   INT16U RecReg;
   RecReg = ((TH0<<8) & 0xFF00) | (TL0 & 0xFF);
   RecTem >>= 1;
   if((RecReg > ZERLOWLMT) && (RecReg < ZERHGHLMT)){   
    RecTem &= 0x7F;
   }else if((RecReg > ONELOWLMT) && (RecReg < ONEHGHLMT)){
    RecTem |= 0x80;
   }else{
    ErrRst();
    TI = 0;
    SBUF = 'A';
    while(TI == 0);
    TI = 1;
    TI = 0;
    SBUF = (RecReg >> 8) & 0xFF;
    while(TI == 0);
    TI = 1;
   
    TI = 0;
    SBUF = RecReg & 0xFF;
    while(TI == 0);
    TI = 1;
   }
     
   if(++RecBitCoun >= 8){
    RecBitCoun = 0;
    DatRecBuff[RecBytCoun++] = RecTem;
   }
   if(RecBytCoun >= 4){
//    EX0 = TRUE;
    TR0 = FALSE;
    ET0 = FALSE;
   
    RecTem = 0;
    RecBitCoun = 0;
    RecBytCoun = 0;
   
    RecStart = FALSE;
    Recend = TRUE;
    DatRecFlag = TRUE;
    Status = RECRET0;
//    P1 = 0x0F;
    {
     
     EX0 = FALSE;
     EA = FALSE;
     IrdaS = 1;
     while(IrdaS == 0);
     
     IrdaS = 1;
     while(IrdaS == 0);
     EX0 = TRUE;
     EA = TRUE;
     
    }
   
   }
  }
  if((Recend == FALSE)&&(Status == RECRET5)){
   TR0 = FALSE;
   TH0 = TimRefTH[Status];
   TL0 = TimRefTL[Status];
   TR0 = TRUE;
  }
}else{

  ErrRst();

}
}
void Tim0Int(void) interrupt 1 using 1
{
Status++;
// P1 = ~Status;
if(1 == Status)
{
//  P1 = ~0xAF;
  while(1);
}
if(RecStart == TRUE)
{

  ErrRst();
  
}else{
  if((Status == RECRET2)||(Status == RECRET3)){
   
   if(IrdaS == 1){
    ErrRst();
   }
  }
  if(Status == RECRET4){
   if(IrdaS == 0){
    ErrRst();
   }else{
    ET0 = TRUE;
    EX0 = TRUE;
   }
  }
  if(Status != RECRET0)
  {
   TR0 = FALSE;
   TH0 = TimRefTH[Status];
   TL0 = TimRefTL[Status];
   TR0 = TRUE;
  }
}
}

相关帖子

沙发
mohanwei| | 2010-1-19 19:41 | 只看该作者
把这段代码拷贝到Ultraedit里,重新缩进一下,再加点注释就很容易明白了。

使用特权

评论回复
板凳
imwangyi| | 2010-1-19 21:24 | 只看该作者
基本是用外不中断去数高与低所占的时间宽度而已. 定时中断只是个时钟加个数而已,比如100 us加1.

使用特权

评论回复
地板
gudeng614|  楼主 | 2010-1-21 11:46 | 只看该作者
谢谢啦,我已经看明白了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:QQ:847991464

49

主题

188

帖子

0

粉丝