微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 帮忙检查这段红外控制代码怎么不能用?

帮忙检查这段红外控制代码怎么不能用?

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
sbit wela=P2^7;
sbit dula=P2^6;
uchar irtime,irok,irpro_ok;
uchar irdata[4];
uchar irvalue[33];
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,
                                        0x39,0x5e,0x79,0x71,0};
/*void delay(uint z)
{
        uchar x,y;
        for(x=110;x>0;x--)
                for(y=z;y>0;y--);
}
*/
void init()
{
        TMOD=0x02;
        TH0=0X00;
        TL0=0X00;
        EA=1;
        ET0=1;
        TR0=1;
        EX0=1;
        IT0=1;
}
void irpro()
{
        uchar temp,i,j,k;
        k=1;
        for(i=0;i<4;i++)      //一共有4个字节
        {       
                for(j=1;j<=8;j++)  //每个字节的8位处理
                {
                        if(irdata[k]>7)
                        temp=temp|0x80;
                        if(j<8)
                        {
                                temp=temp>>1;
                        }
                        k++;
                }
                irvalue=temp;
                temp=0;       
        }
        irpro_ok=1;
}
void irwork()
{
        switch(irvalue[2])
        {
                case 0x16:P0=0x3f;break;  //0
                case 0x0c:P0=table[1];break;  //1
                case 0x18:P0=table[2];break;  //2
                case 0x5e:P0=table[3];break;  //3
                case 0x08:P0=table[4];break;  //4
                case 0x1c:P0=table[5];break;  //5
                case 0x5a:P0=table[6];break;  //6
                case 0x42:P0=table[7];break;  //7
                case 0x52:P0=table[8];break;  //8
                case 0x4a:P0=table[9];break;  //9
                default:break;
        }
}
void main()
{
        init();
        P0=0xfe;
        wela=1;
        wela=0;
        while(1)
        {
                if(irok==1)
                {
                        irpro();                //接收完毕,进行红外处理
                        irok=0;
                }
                if(irpro_ok==1)
                {
                        irwork();
                        irpro_ok=0;
                }
        }       
}
void timer0() interrupt 1 using 1
{
        irtime++;                        //两个下降沿之间的时间
}
void int0() interrupt 0
{
        uchar i;
        static bit startflag;                //开始处理标志位
        if(startflag)
        {
                if(irtime<63&&irtime>=33)
                        i=0;
                        irdata=irtime;  //根据时间来区分"0"和"1"
                        i++;
                        irtime=0;
                        if(i==33)
                        {
                                irok=1;
                                i=0;
                        }
        }
        else
        {
                irtime=0;
                startflag=1;
        }
}
按红外遥控器,数码管不动啊,求解释。

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit IR=P3^2;
  5. sbit wela=P2^7;
  6. sbit dula=P2^6;
  7. uchar irtime,irok,irpro_ok;
  8. uchar irdata[4];
  9. uchar irvalue[33];
  10. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  11.                                         0x66,0x6d,0x7d,0x07,
  12.                                         0x7f,0x6f,0x77,0x7c,
  13.                                         0x39,0x5e,0x79,0x71,0};
  14. /*void delay(uint z)
  15. {
  16.         uchar x,y;
  17.         for(x=110;x>0;x--)
  18.                 for(y=z;y>0;y--);
  19. }
  20. */
  21. void init()
  22. {
  23.         TMOD=0x02;
  24.         TH0=0X00;
  25.         TL0=0X00;
  26.         EA=1;
  27.         ET0=1;
  28.         TR0=1;
  29.         EX0=1;
  30.         IT0=1;
  31. }
  32. void irpro()
  33. {
  34.         uchar temp,i,j,k;
  35.         k=1;
  36.         for(i=0;i<4;i++)      //一共有4个字节
  37.         {       
  38.                 for(j=1;j<=8;j++)  //每个字节的8位处理
  39.                 {
  40.                         if(irdata[k]>7)
  41.                         temp=temp|0x80;
  42.                         if(j<8)
  43.                         {
  44.                                 temp=temp>>1;
  45.                         }
  46.                         k++;
  47.                 }
  48.                 irvalue[i]=temp;
  49.                 temp=0;       
  50.         }
  51.         irpro_ok=1;
  52. }
  53. void irwork()
  54. {
  55.         switch(irvalue[2])
  56.         {
  57.                 case 0x16:P0=0x3f;break;  //0
  58.                 case 0x0c:P0=table[1];break;  //1
  59.                 case 0x18:P0=table[2];break;  //2
  60.                 case 0x5e:P0=table[3];break;  //3
  61.                 case 0x08:P0=table[4];break;  //4
  62.                 case 0x1c:P0=table[5];break;  //5
  63.                 case 0x5a:P0=table[6];break;  //6
  64.                 case 0x42:P0=table[7];break;  //7
  65.                 case 0x52:P0=table[8];break;  //8
  66.                 case 0x4a:P0=table[9];break;  //9
  67.                 default:break;
  68.         }

  69. }
  70. void main()
  71. {
  72.         init();
  73.         P0=0xfe;
  74.         wela=1;
  75.         wela=0;
  76.         while(1)
  77.         {
  78.                 if(irok==1)
  79.                 {
  80.                         irpro();                //接收完毕,进行红外处理
  81.                         irok=0;
  82.                 }
  83.                 if(irpro_ok==1)
  84.                 {
  85.                         irwork();
  86.                         irpro_ok=0;
  87.                 }
  88.         }       
  89. }

  90. void timer0() interrupt 1 using 1
  91. {
  92.         irtime++;                        //两个下降沿之间的时间
  93. }

  94. void int0() interrupt 0
  95. {
  96.         uchar i;
  97.         static bit startflag;                //开始处理标志位
  98.         if(startflag)
  99.         {
  100.                 if(irtime<63&&irtime>=33)
  101.                         i=0;
  102.                         irdata[i]=irtime;  //根据时间来区分"0"和"1"
  103.                         i++;
  104.                         irtime=0;
  105.                         if(i==33)
  106.                         {
  107.                                 irok=1;
  108.                                 i=0;
  109.                         }
  110.         }
  111.         else
  112.         {
  113.                 irtime=0;
  114.                 startflag=1;
  115.         }
  116. }

复制代码

代码

哎,我自己找出来了。
求人不如求己啊
大家注意啦,
void int0() interrupt 0
{
uchar i;
面的i 应该设置为static(静态变量),就这个小问题,我查了3个多小时啊

谢谢支持啦

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top