⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 红外线.c

📁 倒车雷达源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}

void ir_exit(void)         //红外接收恢复程序,恢复到红外接收前的状态
{
     TR2=0;               //停止计数以便修改计数器2寄存器
     TR0=0;
     ET2=0;               //禁止计数器2中断
     TL2=0xfb;            //重新设置波特率为115.2kbps
     TH2=0xff;
     RCAP2H=0xff;
     RCAP2L=0xfb;
     T2CON=0x34;
     ES=1;                 //允许串行中断
     EA=1;                 //开放全局中断
}


void ir_jiema(void){ //解码程序,放在ir_code中,高十六位表示接收频率
                          //如果解码失败则为,如果是重复码则为1
                          //低八位表示载波频率,以KHz为单位
                          //低十六位的高八位表示系统码,低八位为按键码
    p.p2[0]=IR;
    p.p2[1]=p.p2[0]+1;
    i.b[0]=*p.p2[0];
    i.b[1]=*p.p2[1];
    for(;i.b[1]!=0;){
         if(i.b[0]>i.b[1]){
               i.b[0]=0xffff-i.b[0];
               i.b[0]+=i.b[1];
               i.b[0]++;
          }
          else{
               i.b[0]=i.b[1]-i.b[0];
          }
          *p.p2[0]=i.b[0];
          p.p2[0]++;
          i.b[0]=*p.p2[0];
          p.p2[1]++;
          i.b[1]=*p.p2[1];
     }
     *p.p2[0]=0;
     p.p2[0]=IR;
     temp.b=*p.p2[0];
     ir_code.c=count.b;
     ir_code.b[0]=(ir_code.c*1536000)/temp.b;
     for(;temp.b!=0;){
            *p.p2[0]=temp.b/154;
            p.p2[0]++;
            temp.b=*p.p2[0];
        }
     ir_code.b[1]=0;
     if(p.p2[0]==IR+132){
            p.p2[0]=IR;
            p.p2[0]+=3;
            i.c=0;
            temp.b=*p.p2[0];
                    for(;temp.b!=0;){
                          i.c<<=1;
                          if(temp.b>=11){
                                 i.a[3]++;
                          }
                          p.p2[0]+=2;
                          temp.b=*p.p2[0];
                    }
                    if(i.a[0]==(~i.a[1])&&i.a[2]==(~i.a[3])){
                           ir_code.a[2]=i.a[0];
                           ir_code.a[3]=i.a[2];
                    }
                    else ir_code.b[0]=0;
     }
     else{
            if(p.p2[0]==IR+4){
                 p.p2[0]=IR;
                 p.p2[0]++;
                 temp.b=*p.p2[0];
                 if(temp.b<=30){
                          ir_code.b[0]=1;
                  }
                  else ir_code.b[0]=0;
            }
            else ir_code.b[0]=2;
     }
     //if(ir_flag==2)ir_code.b[0]=3;
}

void read_ir(void){
     buf1_flag=0;
     REN=1;
     buf2_length=4;
     while(buf2_flag);
     ir_init();
     while(!ir_flag);
     ir_exit();
     ir_jiema();
     buf2=SEND;
     *buf2++=ir_code.a[0];
     *buf2++=ir_code.a[1];
     *buf2++=ir_code.a[2];
     *buf2=ir_code.a[3];
     buf2=SEND;
     buf2_flag=1;
     SBUF=HEAD;
}
void delay(void){}

void start_iic(void){
      SCL=0;
      SDA=1;
      delay();
      delay();
      SCL=1;
      delay();
      SDA=0;
      delay();
      SCL=0;
      delay();
}
void stop_iic(void){
      SDA=0;
      delay();
      SCL=1;
      delay();
      SDA=1;
      delay();
      SCL=0;
      delay();
      delay();
      SCL=1;
      delay();
}

void send_ack_iic(void){
      SDA=0;
      delay();
      SCL=1;
      delay();
      delay();
      SCL=0;
      delay();
}

void send_nack_iic(void){
      SDA=1;
      delay();
      SCL=1;
      delay();
      delay();
      SCL=0;
      delay();
}

bit receive_ack_iic(void){
      bit a;
      SDA=1;
      delay();
      SCL=1;
      delay();
      if(SDA)  a=1;
      else    a=0;
      delay();
      SCL=0;
      delay();
      return a;
}

unsigned char read_byte_ack_iic(void){
      unsigned char a;
      SDA=1;
      for(p.a[0]=0;p.a[0]<8;p.a[0]++){
           a<<=1;
           delay();
           SCL=1;
           delay();
           if(SDA) a++;
           delay();
           SCL=0;
           delay();
       }
       send_ack_iic();
       return a;
}

unsigned char read_byte_nack_iic(void){
      unsigned char a;
      SDA=1;
      for(p.a[0]=0;p.a[0]<8;p.a[0]++){
           a<<=1;
           delay();
           SCL=1;
           delay();
           if(SDA) a++;
           delay();
           SCL=0;
           delay();
       }
       send_nack_iic();
       return a;
}



void reset_iic(void){
      SDA=1;
      for(p.a[0]=0;p.a[0]<10;p.a[0]++){
            SCL=0;
            delay();
            delay();
            SCL=1;
            delay();
            delay();
       }
}

bit write_byte_iic(unsigned char a){
       for(p.a[0]=0;p.a[0]<8;p.a[0]++){
           if(a&0x80){
                SDA=1;
           }
           else{
                SDA=0;
           }
           delay();
           SCL=1;
           delay();
           delay();
           SCL=0;
           delay();
           a<<=1;
       }
       return receive_ack_iic();
}

unsigned int read_key_data(unsigned char a){
      union{
           unsigned char a[2];
           unsigned int b;
      }key_data;
      reset_iic();
      start_iic();
      write_byte_iic(0xa0);
      write_byte_iic(a);
      start_iic();
      write_byte_iic(0xa1);
      key_data.a[0]=read_byte_ack_iic();
      key_data.a[1]=read_byte_nack_iic();
      stop_iic();
      return key_data.b;
}

void write_key_data(unsigned char a){
      reset_iic();
      start_iic();
      write_byte_iic(0xa0);
      write_byte_iic(a);
      write_byte_iic(ir_code.a[2]);
      write_byte_iic(ir_code.a[3]);
      stop_iic();
}

void store_ir(void){
      buf1_flag=0;
      REN=1;
      buf1=RECEIVE+1;
      *buf1=(*buf1)<<1;
      write_key_data(*buf1);
}

unsigned char yima(void){
   unsigned char a;
   for(a=0;a<100;){
         if(ir_code.b[1]==read_key_data(a)){

             break;
          }
          a++;
          a++;
      }
      a>>=1;
    return a;
}

void read_key(){
      unsigned char a;
      buf1_flag=0;
      REN=1;
      ir_init();
      while(!ir_flag);
      ir_exit();
      ir_jiema();
      buf2=SEND;
      a=yima();
      if(a==50){
      *buf2=0xff;
      }
      else *buf2=a;
      buf2_length=1;
      buf2_flag=1;
      SBUF=HEAD;
}










main(){
    unsigned char ctr;
    delay1s();
    P0=0xff;
    P1=0xff;
    P2=0xff;
    P3=0xff;
    ctr=0;
    buf1=RECEIVE;
    buf2=SEND;
    buf1_length=0;
    buf2_length=0;
    buf1_flag=0;
    buf2_flag=0;
    state1=0;
    state2=0;
    SP=0xe0;          //将堆栈指针指向高端
    TL2=0xfb;
    TH2=0xff;         //溢出值为5,波特率为115.2Kbps;
    RCAP2H=0xff;
    RCAP2L=0xfb;
    SCON=0x50;        //方式1,8位方式,SM0=0,SM1=1,SM2=0,REN=1允许接收
    IE=0x10;          //串行中断允许,全局中断不允许
    T2CON=0x34;       //RCLK=1,TCLK=1,TR2=1  启动计数器
    EA=1;             //开放全局中断
    free();



    while(1){
              //ir_init();
              //while(!ir_flag);
              //ir_exit();
              //ir_jiema();
              //if(yima()==0) P1_0=1;
              //if(yima()==1) P1_0=0;


       if(buf1_flag){
           buf1=RECEIVE;
           ctr=*buf1;

           switch(ctr){
           case ACK:         ack();
                             break;
           case NACK:        nack();
                             break;
           case FREE:        free();
                             break;
           case BUSY:        busy();
                             break;
           case DOWNLOAD:    download();
                             break;
           case UPLOAD:      upload();
                             break;
           case RUN:         run();
                             break;
           case READ_IR:     read_ir();
                             break;
           case READ_KEY:    read_key();
                             break;
           case STORE_IR:    store_ir();
                             break;
           default:          buf1_flag=0;
                             REN=1;
                             break;
           }
         }


      }

}


void sub(void){
}

void ie_0(void){
}

void tf_0(void){
}

void ie_1(void){
}

void tf_1(void){
}

void tf_2(void){
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -