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

📄 jiema.c

📁 本程序为红外遥控器的解码程序
💻 C
字号:
#include <pic.h>


/***********************/
//---fosc=4MHz---//
#define DLY_882US 110     //0.88ms
#define DLY_1000US 128
#define DLY_4740US 607
/***********************/

unsigned char BufferCount;
unsigned char Buffer[2];



#define INFRARED RB0//红外线接口定义
#define SPEAKER  RC1//蜂鸣器接口定义
char kg=0b11111111;
char i;
char j;
char k=0b11110000;




void guan()
{ INTE=1;INTF=0;GIE=0;
  PORTD=0b11110000;
}
void kai()
{
  INTE=1;INTF=0;GIE=0;
  for(i=0;;i++)
   {PORTD=k;
    
    for(j=0;j<8;j++)
       {
          TMR1H=(65536-20000)/256;
          TMR1L=(65536-20000)%256;  //0.904ms
          TMR1IF=0;
          TMR1ON=1;
          while(TMR1IF==0);
          TMR1ON=0;
          TMR1IF=0;           
       }
    k=~k;
    
   }
 return;
}

void jianyi()
{
 PORTD=0b11110000;
 INTE=1;INTF=0;GIE=0;
}
void main(void)
{
  TRISD=0;
  PORTD=0xFF;
  TRISC0=0;
  SPEAKER=1;
  TRISB0=1;
  RB0=1;
  
  T1OSCEN=0;//禁止自带振荡器功能
  TMR1CS=0;//选择内部时钟源(FOSC/4),工作于定时方式
  T1CKPS1=1;//预分频比为1:8
  T1CKPS0=1;
  TMR1IF=0;
  
  RBPU=0;//启RB内部若上拉功能
  INTEDG=0;//选择下降沿触发
  INTF=0;
  INTE=1;//允许INT开中断
  GIE=1;//允许CPU开中断

  
  
  
 while(1);
}


void interrupt Infrared_isr(void)
{
  unsigned char i,j;
  unsigned char temp;
  
  GIE=0;
  if(INTF==1)
    {      
      INTF=0;
      INTE=0;
      

     for(i=9;i>0;i--)
        {
          TMR1H=(65536-DLY_882US)/256;
          TMR1L=(65536-DLY_882US)%256;  //0.904ms
          TMR1IF=0;
          TMR1ON=1;
          while(TMR1IF==0);
          TMR1ON=0;
          TMR1IF=0;          
          if(INFRARED==1)goto Exit_Int0;
        }                              //4.52ms
     
 

     while(INFRARED==0);

     TMR1H=(65536-630)/256;  //5ms
     TMR1L=(65536-630)%256;
     TMR1IF=0;
     TMR1ON=1;
     while(TMR1IF==0);
     TMR1ON=0;
     TMR1IF=0;              //跳过将近5ms的低电平

     while(INFRARED==0);    //把用户吗的第一个低电平浪费掉
 
     TMR1H=(65536-12)/256;  //进入用户码的第一个高电平一点点
     TMR1L=(65536-12)%256;
     TMR1IF=0;
     TMR1ON=1;
     while(TMR1IF==0);
     TMR1ON=0;
     TMR1IF=0; 

     for(j=0;j<26;j++)       //跳过26位用户码
       {

        while(INFRARED==0);
        while(INFRARED==1);
       }
      

     TMR1H=(65536-12)/256;  //进入下一个高电平一点点
     TMR1L=(65536-12)%256;
     TMR1IF=0;
     TMR1ON=1;
     while(TMR1IF==0);
     TMR1ON=0;
     TMR1IF=0;  
    

    BufferCount=0;                      //解用户码控制码前八位
                              
          temp=0;
          for(i=0;i<8;i++)                   
            { 
              temp>>=1;
              while(INFRARED==0);
              TMR1H=(65536-DLY_882US)/256;
              TMR1L=(65536-DLY_882US)%256;
              TMR1IF=0;
              TMR1ON=1;
              while(TMR1IF==0);
              TMR1IF=0;
              TMR1ON=0;
              if(INFRARED==1)temp+=0x80;
              if(INFRARED==1)
                {

                  TMR1H=(65536-DLY_1000US)/256;
                  TMR1L=(65536-DLY_1000US)%256;
                  TMR1IF=0;
                  TMR1ON=1;
                  while(TMR1IF==0);
                  TMR1IF=0;
                  TMR1ON=0;
                }
            
       
           }
          
     
         

          
          if(temp==0b00000001)
            { 
             INTF=0;INTE=1;GIE=1;
             PORTD=0b11110000;
            } 
          
          if(temp==0b00000010)
             {
              INTF=0;INTE=1;GIE=1;
              PORTD=0b11110000;
             }
Exit_Int0:
      INTF=0;
      INTE=1;      
    }
  GIE=1;
}

⌨️ 快捷键说明

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