帮忙检查这段红外控制代码怎么不能用?
时间: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;
}
}
按红外遥控器,数码管不动啊,求解释。
#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;
}
}
按红外遥控器,数码管不动啊,求解释。
- #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[i]=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[i]=irtime; //根据时间来区分"0"和"1"
- i++;
- irtime=0;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
哎,我自己找出来了。
求人不如求己啊
大家注意啦,
void int0() interrupt 0
{
uchar i;
上面的i 应该设置为static(静态变量),就这个小问题,我查了3个多小时啊
谢谢支持啦