学习型红外遥控器,发射部分代码疑问

2019-07-16 20:42发布

/*********************************************************************/   
//                     remote.c   
//                    学习型遥控器   
//                    LRM 2004.10.12         
/*********************************************************************/   
//使用AT89C52单片机,12MHZ晶振,   
//   
//#pragma src(E: emote.asm)   
#include "reg51.h"   
#include "intrins.h"     //_nop_();延时函数用   
//   
#define char unsigned char   
#define int unsigned int   
//   
sbit  studylamp=P1^6;        //学习状态指示灯   
sbit  lamp=P1^7;             //发射指示灯   
sbit  studykey=P3^2;         //学习键(中断口)   
sbit  remotein=P3^4;         //遥控信号输入口     
sbit  remoteout=P3^5;         // 遥控输出口   
sbit  txkey=P1^0   ;           //发射键   
//   
//   
int i,j,m=255,n,k,s;   
char idata  remotedata[206];//存脉冲宽度数据用   
int   head;           //存起始位用   
int   remdata;   
//   
//   
////   
/*********1毫秒延时程序**********/   
delay1ms(int t)   
{   
  for(i=0;i<t;i++)   
     for(j=0;j<120;j++)    //120个机器指令
        ;
}   
//   
//   
/***********初始化函数**********/   
cleARMen()   
{   
  studylamp=0;           //关学习灯   
  lamp=0;                //关发射指示   
  remoteout=0;           //关遥控输出   
  remotein=1;            //遥控信号输入口 置高电平?
  for(i=0;i<206;i++)     //清内存   
     {remotedata=0x00;}  

  IE=0x00;   
  IP=0x01;   
  TMOD=0x22;             //8位自动重装模式   
  PCON=0X00;   
  TH1=0xf3;              //40KHZ初值   
  TL1=0xf3;   
  IT0=1;   
  EX0=1;                //外中断允许   
  EA=1;                 //开总中断   
}   
//   
//   
/**********发射函数************/   
//=========================================================================
//======================================================================   
//========问题:为什么接收的时候是15个nop,发射的时候才9个nop,而且偶数不延时??===============  
//=========================================================================  
//===========================================================================
keywork()   
{   
   if(txkey==0)            //发射键被按下
   {   
      while(txkey==0);     //等待键释放   
      ET1=1;TR1=1;         //发起始位     
      for(i=head;i>0;i--){;}    //起始位head
      remoteout=0;         // 遥控输出口
      ET1=0;TR1=0;   
      n=0;   
      while(1)   
      {   
        if(remotedata[n]==0x00)
            {delay1ms(10);break;}     //数据为0结束   

        for(i=remotedata[n];i>0;i--)
            {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}   //9个nop_(),一个脉冲周期
        
        lamp=~lamp;          //发射灯指示闪烁
        n++;                 //偶地址不发脉冲   
        ET1=1;TR1=1;         //奇地址发调制脉冲   
        for(i=remotedata[n];i>0;i--){;}   
        remoteout=0;   // 遥控输出口
        ET1=0;TR1=0;  
        n++;   
      }   
    }   
}   
//   
//   
/***********主函数***************/   
main()   
{   
clearmen();          //初始化     
while(1)   
{   
  keywork();       //按键扫描   
  }   
}   
//   
//   
/*********40KHZ发生器***********/   
//定时中断T1   
void time_intt1(void) interrupt 3   
{   
    remoteout=~remoteout;   // 遥控输出口
}   
//   
//   
/***********学习函数 ***********/   
//外中断0   
void intt0(void) interrupt 0       //studykey学习键(中断口)    P3^2
{   
    ET1=0;TR1=0;
    EX0=0;EA=0;
    head=0;               //初始位初始化
    studylamp=1;          //开学习指示灯
    lamp=0;               //关发射指示
    while(studykey==0);           //等待键释放   
    while(remotein==1);           //等待遥控码输入    //遥控信号输入口   出现低电平往下进行remotein==0
    head=0;                       //读入起始位   

//=========================================================================
//======================================================================   
//========问题:为什么接收的时候是15个nop,发射的时候才9个nop,而且偶数不延时??===============  
//=========================================================================  
//===========================================================================

    while(remotein==0)
      {
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
        head++;
      }                  
                          //remotein==1;
    n=0;
    remdata=0x0000;
     
    while(1)   
       {   
         while(remotein==1)
           {
              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    //15个nop
              remdata++;   //remdata高电平脉宽数据
           }
            
         if(remdata>m)                  //高电平>5毫秒退出    m=255
            {
              remotedata[n]=0x00;
              EX0=1;EA=1;
              goto end;
            }   
            
         remotedata[n]=remdata;            //存高电平脉宽数据           
         n++;         
         remdata=0x0000;                  //脉宽计数器清零     
         while(remotein==0)
           {
              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
              remdata++;        //低电平计数   
           }
          remotedata[n]=remdata;      //存低电平脉宽数据
          n++;                        
          remdata=0x00;
            
      }   
    end: lamp=1;        
         studylamp=0;   //学习指示灯灭
}   
//   
//*********************结束**************************//
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。