//51 单片机做的红外遥控实验(C 语言) #include #define u8 unsigned char #define u16 unsigned int #define ID 0x00 //本遥控器的 ID 号 sbit ir=P3^3; code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; //0-9 的段码 code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4]; bit ir_f=0; u8 nu; void delay(u16 x) { while(x--); } void show(u16 x) { u8 i=0,k=0; u8 s[4]; kk: s[i]=x%10; if((x/10)>=1) { x=x/10; i++; goto kk; } k=i+1; for(i=0;i>i); delay(300); P0=0XFF; P2=0XFF; } } void timer0_init() { TH0=0; TL0=0; TMOD|=0x01; TR0=0; } u16 low_test() { u16 t; TR0=1; while((ir==0)&&((TH0&0X80)!=0X80)); TR0=0; t=TH0; t<<=8; t|=TL0; TH0=0; TL0=0; //t=(TH*256+TL0);//机器周期数 return t; } u16 high_test() { u16 t; TR0=1; while((ir==1)&&((TH0&0X80)!=0X80)); TR0=0; t=TH0; t<<=8; t|=TL0; TH0=0; TL0=0; return t; } /* u16 time_test(bit x) { } */ u8 receive_8bit() { u8 d,i; u16 t; for(i=0;i<8;i++) { t=low_test(); t=high_test(); d>>=1; if((t>=2750)&&(t<=3100)) { d|=0x80; } } return d; } void ir_decode() { u16 t; u8 i; if(ir==0)//有遥控信号 { t=low_test();//8295-9000us,倍频的是16590-18000 if((t>=14500)&&(t<=18000))//检查引导码低电平时间 { t=high_test(); if((t>=8000)&&(t<=9000))//检查高电平 { for(i=0;i<4;i++) { buf[i]=receive_8bit(); } if(buf[0]==(~buf[1]))//检查系统码是否正确 { if(buf[0]==ID) { if(buf[2]==(~buf[3])) { //具体按键处理 ir_f=1; //遥控有效 } } } } } } } /* void key() { if(buf[2]==0x40) { P1^=(1<<0); } if(buf[2]==0x48) { P1^=(1<<1); } } */ void ir_execuse() { if(ir_f==1) { switch(buf[2]) { case 0x40:P1^=(1<<0);break; case 0x48:P1^=(1<<1);break; case 0x04:P1^=(1<<2);break; case 0x02:P1^=(1<<3);break; case 0x05:P1^=(1<<4);break; case 0x54:P1^=(1<<5);break; case 0x0A:P1^=(1<<6);break; case 0x1E:P1^=(1<<7);break; } ir_f=0; } } void show_d() { u8 j; for(j=0;j<10;j++) { if(s[j]==buf[2]) { nu=j; break; } } show(nu); } void isr_init() { EA=1; EX1=1;//外部中断,一直看3.3 有没有下降沿。或者 3.3 一直是低电平 IT1=1;//外部中断1 下降沿触发 } void ex1_isr() interrupt 2 { EA=0; ir_decode(); EA=1; } void main() { timer0_init(); isr_init(); while(1) { ir_execuse(); show_d(); //key(); } }