我的數碼管位和斷碼都為低電平時才亮(有點兒特殊) 紅外接收的頭接到INT0引腳 #include<reg52.h> uchar irtime; uchar startflag; uchar irdata[33]; uchar bitnum; uchar irreceok; uchar ircode[4]; //uchar irprosok; uchar disp[8]; uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); }
void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } void timer0init(void) { TMOD=0x02; TH0=0; TL0=0; ET0=1; EA=1; TR0=1; } void int0init(void) { IT0=1; EX0=1; EA=1; } void irpros(void) //解碼 { uchar k,i,j,value; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; //相當于7次 if(irdata[k]>6) { //8次 value=value | 0x80; } k++; } ircode[j]=value; } //irprosok=1; } void irwork(void) { disp[0]=ircode[0]/16; disp[1]=ircode[0]%16; disp[2]=ircode[1]/16; disp[3]=ircode[1]%16; disp[4]=ircode[2]/16; disp[5]=ircode[2]%16; disp[6]=ircode[3]/16; disp[7]=ircode[4]%16; } void display(void) { uchar i; for(i=0;i<8;i++) { P1=duan[disp]; P2=wei; delay_50us(20); } } void main() { timer0init(); int0init(); while(1) { if(irreceok) { irpros(); irreceok=0; } //if(irprosok) //{ irwork(); // irprosok=0; //} display(); } } void timer0() interrupt 1 { irtime++; // 最大255,等自加到255,又變0 } void int0() interrupt 0 { startflag=0; if(startflag) { if(irtime>32) //檢測引導碼 { bitnum=0; } irdata[bitnum++]=irtime; irtime=0; if(bitnum==33) { bitnum=0; irreceok=1; } } else { startflag=1; irtime=0; } } |