红外解码

来源:互联网 发布:数据库安全策略 编辑:程序博客网 时间:2024/05/17 04:48
  1. #include <reg52.h>  
  2. #include "1602.h"  
  3. #include "delay.h"  
  4.   
  5. sbit IR = P3^2;  
  6. unsigned int irtime;  
  7. bit startflag;  
  8. bit irok,irpro_ok;  
  9. bit irhandleok = 0;  
  10.   
  11. sbit LED0 = P1^0;  
  12. sbit LED1 = P1^1;  
  13. sbit LED2 = P1^2;  
  14. sbit LED3 = P1^3;  
  15. sbit LED4 = P1^4;  
  16. sbit LED5 = P1^5;  
  17. sbit LED6 = P1^6;  
  18. sbit LED7 = P1^7;  
  19.   
  20. void uart_init();  
  21. void int0_init();  
  22. void timer0_init();  
  23.   
  24. void uart_send_byte(unsigned char byte);  
  25. void uart_send_str(unsigned char *str);  
  26. void data_handle(void);  
  27. unsigned char ircode[4];  
  28. unsigned  
  29.   
  30. void int0_init()  
  31. {  
  32.     IT0 = 1;//下降沿触发  
  33.     EA = 1;  
  34.     EX0 = 1;  
  35. }  
  36.   
  37. void timer0_init()  
  38. {  
  39.     EA = 1;  
  40.     TMOD |= 0x02;  
  41.     TH0 = 0;  
  42.     ET0 = 1;  
  43.     TR0 = 1;  
  44. }  
  45.   
  46. void timer0_isr() interrupt 1  
  47. {  
  48.     irtime++;//0.256ms   13.5 /0.256 = 53; 2.245/0.256 = 9 ;1.12/0.256 = 4  
  49. }  
  50.   
  51. unsigned char irdata[33];  
  52. unsigned char bitnum = 0;  
  53.   
  54.   
  55. void int0_isr() interrupt 0  
  56. {  
  57.     if(startflag)  
  58.     {  
  59.         if((irtime > 40) && (irtime < 60))  
  60.         {  
  61.             bitnum = 0;  
  62.         }     
  63.         irdata[bitnum] = irtime ;  
  64.         bitnum++;  
  65.         irtime = 0;  
  66.         if (bitnum == 33)  
  67.         {  
  68.             bitnum = 0;  
  69.             irok = 1;  
  70.             startflag = 0;  
  71.         }  
  72.     }  
  73.     else  
  74.     {  
  75.         irtime = 0;  
  76.         startflag = 1;  
  77.     }  
  78. }  
  79.   
  80. void uart_init()  
  81. {  
  82.     SCON = 0x50;//串口用作  //SM0  = 0SM1 = 1REN = 1;  
  83.     TMOD |= 0x20;//设置定时器1为工作方式2  
  84.     TH1 = 0xfd;//   ET1 = 1;//打开定时器中断允许  
  85.     TR1 = 1;//打开定时器  
  86. }  
  87.   
  88. void uart_send_byte(unsigned char byte)  
  89. {  
  90.     SBUF = byte;    //TI位自动置1,手动清0  
  91.     while(!TI);//while(TI != 1);  
  92.     TI = 0;  
  93.   
  94. }  
  95.   
  96. void uart_send_str(unsigned char *str)  
  97. {  
  98.     while( *str != '\0')  
  99.     {  
  100.         uart_send_byte(*str);  
  101.         str++;  
  102.     }  
  103. }  
  104.   
  105. unsigned char putbuf[35];  
  106. void main()  
  107. {  
  108.     unsigned char i ;  
  109.     int0_init();  
  110.     uart_init();  
  111.     timer0_init();  
  112.     LCD_Init();  
  113.     LCD_Clear();   
  114.   
  115.     while(1)  
  116.     {  
  117.         /*if(irok == 1)  
  118.         {  
  119.             putbuf[0] = irdata[0] / 10 + 0x30;  
  120.             putbuf[1] = irdata[0] % 10 +0x30;   
  121.             for(i = 0; i < 32 ;i++)  
  122.             {  
  123.                 putbuf[i+2] = irdata[i+1] + 0x30;  
  124.             }     
  125.   
  126.             for(i = 2 ;i < 35;i++)  
  127.             {  
  128.                 if(putbuf[i] > (6 + '0'))  
  129.                 {  
  130.                     putbuf[i] = 1 + '0';  
  131.                 }  
  132.                 else  
  133.                 {  
  134.                     putbuf[i] = 0 + '0';  
  135.                 }  
  136.             }  
  137.   
  138.             putbuf[34] = '\0';  
  139.             uart_send_str(putbuf);  
  140.             uart_send_str("\r\n");  
  141.             irok = 0;  
  142.         }*/  
  143.         data_handle();  
  144.         if(irok)  
  145.         {     
  146.             if(irhandleok)  
  147.             {     
  148.                   
  149.                 /*if(ircode[2])  
  150.                 {  
  151.                     switch(ircode[2])  
  152.                     {  
  153.                     case 0x45 :LED0 = ~LED0;break;  
  154.                     case 0x46 :LED1 = ~LED1;break;  
  155.                     case 0x47 :LED2 = ~LED2;break;  
  156.                     case 0x44 :LED3 = ~LED3;break;  
  157.                     case 0x40 :LED4 = ~LED4;break;  
  158.                     case 0x43 :LED5 = ~LED5;break;  
  159.                     case 0x07 :LED6 = ~LED6;break;  
  160.                     case 0x15 :LED7 = ~LED7;break;  
  161.                     }  
  162.                 }*/  
  163.   
  164.             /*  if(ircode[2])  
  165.                 {  
  166.                       
  167.                     switch(ircode[2])  
  168.                     {  
  169.                     case 0x45 :LCD_Write_Char(0,0,'1');break;  
  170.                     case 0x46 :LCD_Write_Char(0,0,'2');break;  
  171.                     case 0x47 :LCD_Write_Char(0,0,'3');break;  
  172.                     case 0x44 :LCD_Write_Char(0,0,'4');break;  
  173.                     case 0x40 :LCD_Write_Char(0,0,'1');break;  
  174.                     case 0x43 :LED5 = ~LED5;break;  
  175.                     case 0x07 :LED6 = ~LED6;break;  
  176.                     case 0x15 :LED7 = ~LED7;break;  
  177.                     }  
  178.                 }*/  
  179.                 putbuf[0] = (ircode[0] / 16) > 9 ? (ircode[0] / 16 +0x37) :(ircode[0] / 16 +0x30);  
  180.                 putbuf[1] = (ircode[0] % 16) > 9 ? (ircode[0] % 16 +0x37) :(ircode[0] % 16 +0x30);  
  181.   
  182.                 putbuf[2] = (ircode[1] / 16) > 9 ? (ircode[1] / 16 +0x37) :(ircode[1] / 16 +0x30);  
  183.                 putbuf[3] = (ircode[1] % 16) > 9 ? (ircode[1] % 16 +0x37) :(ircode[1] % 16 +0x30);  
  184.   
  185.                 putbuf[4] = (ircode[2] / 16) > 9 ? (ircode[2] / 16 +0x37) :(ircode[2] / 16 +0x30);  
  186.                 putbuf[5] = (ircode[2] % 16) > 9 ? (ircode[2] % 16 +0x37) :(ircode[2] % 16 +0x30);  
  187.   
  188.                 putbuf[6] = (ircode[3] / 16) > 9 ? (ircode[3] / 16 +0x37) :(ircode[3] / 16 +0x30);  
  189.                 putbuf[7] = (ircode[3] % 16) > 9 ? (ircode[3] % 16 +0x37) :(ircode[3] % 16 +0x30);  
  190.   
  191.                 putbuf[8] = '\r';  
  192.                 putbuf[9] = '\n';  
  193.                 uart_send_str(putbuf);  
  194.                 irhandleok = 0;  
  195.             }  
  196.           
  197.             irok = 0;  
  198.         }  
  199.     }   
  200. }  
  201.   
  202. /*unsigned char irnum[4];  
  203. void change_16(void)  
  204. {  
  205.     unsigned char i,j,k;  
  206.     unsigned code = 0;  
  207.   
  208.     k = 1;  
  209.     for(i = 0;i < 4;i++)  
  210.     {  
  211.         for(j = 0;j < 8;j++)  
  212.         {  
  213.           code = irdata[k];  
  214.           if(code > 6)  
  215.           {  
  216.             code |= 0x80;  
  217.           }  
  218.           if(j < 8)  
  219.           {  
  220.             code >>= 1;  
  221.           }  
  222.         }  
  223.     }  
  224.   
  225. }*/  
  226.   
  227.   
  228. void data_handle(void)  
  229. {  
  230.     unsigned char i ,j,k;  
  231.     unsigned char temp = 0;  
  232.   
  233.     k = 1;  
  234.     if(irok)  
  235.     {  
  236.         for(i = 0;i < 4;i++)  
  237.         {  
  238.             for(j = 0;j < 8;j++)  
  239.             {  
  240.                 temp >>= 1;  
  241.                 if(irdata[k] > 6)  
  242.                 {  
  243.                     temp |= 0x80;   
  244.                 }  
  245.                 k++;  
  246.                 ircode[i] = temp;  
  247.             }  
  248.         }  
  249.         if( (ircode[0]+ ircode[1] == 0xff) && (ircode[2] + ircode[3] == 0xff))  
  250.         irhandleok = 1;  
  251.         irok = 0;     
  252.     }  
  253.       
  254. }  
0 0
原创粉丝点击