红外

来源:互联网 发布:可编程键盘软件 编辑:程序博客网 时间:2024/04/28 10:37
#include <reg52.h>  #include "1602.h"  #include "delay.h"    sbit IR = P3^2;  unsigned int irtime;  bit startflag;  bit irok,irpro_ok;  bit irhandleok = 0;    sbit LED0 = P1^0;  sbit LED1 = P1^1;  sbit LED2 = P1^2;  sbit LED3 = P1^3;  sbit LED4 = P1^4;  sbit LED5 = P1^5;  sbit LED6 = P1^6;  sbit LED7 = P1^7;    void uart_init();  void int0_init();  void timer0_init();    void uart_send_byte(unsigned char byte);  void uart_send_str(unsigned char *str);  void data_handle(void);  unsigned char ircode[4];  unsigned    void int0_init()  {      IT0 = 1;//下降沿触发      EA = 1;      EX0 = 1;  }    void timer0_init()  {      EA = 1;      TMOD |= 0x02;      TH0 = 0;      ET0 = 1;      TR0 = 1;  }    void timer0_isr() interrupt 1  {      irtime++;//0.256ms   13.5 /0.256 = 53; 2.245/0.256 = 9 ;1.12/0.256 = 4  }    unsigned char irdata[33];  unsigned char bitnum = 0;      void int0_isr() interrupt 0  {      if(startflag)      {          if((irtime > 40) && (irtime < 60))          {              bitnum = 0;          }             irdata[bitnum] = irtime ;          bitnum++;          irtime = 0;          if (bitnum == 33)          {              bitnum = 0;              irok = 1;              startflag = 0;          }      }      else      {          irtime = 0;          startflag = 1;      }  }    void uart_init()  {      SCON = 0x50;//串口用作  //SM0  = 0; SM1 = 1; REN = 1;      TMOD |= 0x20;//设置定时器1为工作方式2      TH1 = 0xfd;//   ET1 = 1;//打开定时器中断允许      TR1 = 1;//打开定时器  }    void uart_send_byte(unsigned char byte)  {      SBUF = byte;    //TI位自动置1,手动清0      while(!TI);//while(TI != 1);      TI = 0;    }    void uart_send_str(unsigned char *str)  {      while( *str != '\0')      {          uart_send_byte(*str);          str++;      }  }    unsigned char putbuf[35];  void main()  {      unsigned char i ;      int0_init();      uart_init();      timer0_init();      LCD_Init();      LCD_Clear();         while(1)      {          /*if(irok == 1)          {              putbuf[0] = irdata[0] / 10 + 0x30;              putbuf[1] = irdata[0] % 10 +0x30;               for(i = 0; i < 32 ;i++)              {                  putbuf[i+2] = irdata[i+1] + 0x30;              }                   for(i = 2 ;i < 35;i++)              {                  if(putbuf[i] > (6 + '0'))                  {                      putbuf[i] = 1 + '0';                  }                  else                  {                      putbuf[i] = 0 + '0';                  }              }                putbuf[34] = '\0';              uart_send_str(putbuf);              uart_send_str("\r\n");              irok = 0;          }*/          data_handle();          if(irok)          {                 if(irhandleok)              {                                       /*if(ircode[2])                  {                      switch(ircode[2])                      {                      case 0x45 :LED0 = ~LED0;break;                      case 0x46 :LED1 = ~LED1;break;                      case 0x47 :LED2 = ~LED2;break;                      case 0x44 :LED3 = ~LED3;break;                      case 0x40 :LED4 = ~LED4;break;                      case 0x43 :LED5 = ~LED5;break;                      case 0x07 :LED6 = ~LED6;break;                      case 0x15 :LED7 = ~LED7;break;                      }                  }*/                /*  if(ircode[2])                  {                                            switch(ircode[2])                      {                      case 0x45 :LCD_Write_Char(0,0,'1');break;                      case 0x46 :LCD_Write_Char(0,0,'2');break;                      case 0x47 :LCD_Write_Char(0,0,'3');break;                      case 0x44 :LCD_Write_Char(0,0,'4');break;                      case 0x40 :LCD_Write_Char(0,0,'1');break;                      case 0x43 :LED5 = ~LED5;break;                      case 0x07 :LED6 = ~LED6;break;                      case 0x15 :LED7 = ~LED7;break;                      }                  }*/                  putbuf[0] = (ircode[0] / 16) > 9 ? (ircode[0] / 16 +0x37) :(ircode[0] / 16 +0x30);                  putbuf[1] = (ircode[0] % 16) > 9 ? (ircode[0] % 16 +0x37) :(ircode[0] % 16 +0x30);                    putbuf[2] = (ircode[1] / 16) > 9 ? (ircode[1] / 16 +0x37) :(ircode[1] / 16 +0x30);                  putbuf[3] = (ircode[1] % 16) > 9 ? (ircode[1] % 16 +0x37) :(ircode[1] % 16 +0x30);                    putbuf[4] = (ircode[2] / 16) > 9 ? (ircode[2] / 16 +0x37) :(ircode[2] / 16 +0x30);                  putbuf[5] = (ircode[2] % 16) > 9 ? (ircode[2] % 16 +0x37) :(ircode[2] % 16 +0x30);                    putbuf[6] = (ircode[3] / 16) > 9 ? (ircode[3] / 16 +0x37) :(ircode[3] / 16 +0x30);                  putbuf[7] = (ircode[3] % 16) > 9 ? (ircode[3] % 16 +0x37) :(ircode[3] % 16 +0x30);                    putbuf[8] = '\r';                  putbuf[9] = '\n';                  uart_send_str(putbuf);                  irhandleok = 0;              }                        irok = 0;          }      }   }    /*unsigned char irnum[4];  void change_16(void)  {      unsigned char i,j,k;      unsigned code = 0;        k = 1;      for(i = 0;i < 4;i++)      {          for(j = 0;j < 8;j++)          {            code = irdata[k];            if(code > 6)            {              code |= 0x80;            }            if(j < 8)            {              code >>= 1;            }          }      }    }*/      void data_handle(void)  {      unsigned char i ,j,k;      unsigned char temp = 0;        k = 1;      if(irok)      {          for(i = 0;i < 4;i++)          {              for(j = 0;j < 8;j++)              {                  temp >>= 1;                  if(irdata[k] > 6)                  {                      temp |= 0x80;                   }                  k++;                  ircode[i] = temp;              }          }          if( (ircode[0]+ ircode[1] == 0xff) && (ircode[2] + ircode[3] == 0xff))          irhandleok = 1;          irok = 0;         }        }  

0 0
原创粉丝点击