日期:2025-07-16 19:49:55 人气:1

    A+
热门评论

基于51单片机的红外遥控开关的C 程序

这个简单就是一个解码函灵敏而已! int jiema() { unsigned int data,temp; RESET: for( i=0;i<8;i++ ) //**9ms { delay_nms(1); if((PIND&0B00000100)==0B00000100 ) goto RESET; //是检测在8毫秒内如果出现高电平就退出解码程序 } temp = 8000; while( ( (PIND&0B00000100)==0B00000000 ) && (temp!=0) ) {temp--;} // 等待4.5ms高电平的到来,避开9毫秒低电平引导脉冲 // temp--需0.25us, temp=8000可实现2ms延时,防止干扰脉冲造成的死机。 delay_nus(1804); //**4.5ms for( j=0;j<4;j++) { for( i=0;i<8;i++ ) { temp = 4000; while( ((PIND&0B00000100)==0B00000000 ) && (temp!=0) ) {temp--;} delay_nus(334); if((PIND&0B00000100)==0B00000100 ) // 检测到高电平1的话说明该位为1,延时1毫秒等待脉冲高电平结束 { data |= (1<<i); // dataH= ~data dataL= data delay_nus(379); } else data &= ~(1<<i); // 检测到低电平0的话,说明该位为0,继续检测下一位 } IR_BUF[j]=data; } if(IR_BUF[2] = ~IR_BUF[3]) //校验 { PORTA=IR_BUF[2]; delay_nms(500); }

阅读全文

基于51单片机红外遥控代码(C语言)

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。 ;******************************************************************************** ;* 描述: * ;* 遥控键值读取器 * ;* 数码管显示, P0口为数码管的数据口 * ;* * ;******************************************************************************** ;遥控键值解码-数码管显示 * ;********************************************************************************/ #include #include void IR_SHOW(); void delay(unsigned char x);//x*0.14MS void delay1(unsigned char ms); void beep(); sbit IRIN = P3^2; sbit BEEP = P3^7; sbit RELAY= P1^3; sbit GEWEI= P2^7; sbit SHIWEI= P2^6; unsigned char IRCOM[8]; unsigned char code table[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; main() { IE = 0x81; //允许总中断中断,使能 INT0 外部中断 TCON = 0x1; //触发方式为脉冲负边沿触发 delay(1); IRIN=1; BEEP=1; RELAY=1; for(;;) { IR_SHOW(); } } //end main void IR_IN() interrupt 0 using 0 { unsigned char i,j,k,N=0; EA = 0; I1: for (i=0;i<4;i++) { if (IRIN==0) break; if (i==3) {EA =1;return;} } delay(20); if (IRIN==1) goto I1; //确认IR信号出现 while (!IRIN) //等 IR 变为高电平 {delay(1);} for (j=0;j<4;j++) { for (k=0;k<8;k++) { while (IRIN) //等 IR 变为低电平 {delay(1);} while (!IRIN) //等 IR 变为高电平 {delay(1);} while (IRIN) //计算IR高电平时长 { delay(1); N++; if (N>=30) {EA=1;return;} } IRCOM[j]=IRCOM[j] >> 1; if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} N=0; }//end for k }//end for j if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;} IRCOM[5]=IRCOM[2] & 0x0F; IRCOM[6]=IRCOM[2] & 0xF0; IRCOM[6]=IRCOM[6] >> 4; beep(); EA = 1; } void IR_SHOW() { P0 = table[IRCOM[5]]; GEWEI = 0; SHIWEI = 1; delay1(4); P0 = table[IRCOM[6]]; SHIWEI = 0; GEWEI = 1; delay1(4); } void beep() { unsigned char i; for (i=0;i<100;i++) { delay(5); BEEP=!BEEP; } BEEP=1; } void delay(unsigned char x)//x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } void delay1(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i<120; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } }

阅读全文