610e6133652d6eef
获得 0 次赞
帮助过0人
//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动//第一次上电,灯亮1秒后熄灭,//手挡一次开,再挡一次关,如此循环//实验板测试手挡一次开,再挡一次关 开关正常;//但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭 -- 亮--灭//请大神们看下,这样才能做到手挡在前面不移开,保持一种状态//控制部分写在大循环里和写在中断里面一样锁不住#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit ir=P2^4; //红外发射sbit ir_in=P3^2; //红外接收sbit led=P1^7; //低电平LED亮bit flagflag2=1;uint contcont1s;uchar clock;//bit f1f2;void delay(uint z) //ms{ uint xy; for(x=z; x>0; x--) for(y=114; y>0; y--);}void fa_38k() //38k 载波 //接收头前面有滤光片{ ir=0; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); ir=1; _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();// _nop_();//_nop_();_nop_();_nop_();}void main(){ uint i=0; ir_in=1; TMOD |= 0X01; //T0定时器,模式1 16位计数 TH0 = (65536-10000)/256; //10ms初值 @12MHz晶振 TL0 = (65536-10000)%256; EA=1; ET0=1; TR0=1; led=0; delay(1000); led=1; while(1) { if(flag) { fa_38k(); //发38K } else ir=1; //停止发射 // if(ir_in==1) //没有反射信号// {// s=0; //延时变量清零// clock=0; //自锁标志清零// // f2=0;// flag2=1; //恢复发射// }// else if(clock==0) //有反射信号// { // // s++; //消抖// if(s>2000) //这里值取大些,增强抗干扰// { // // s=0;// flag2=0; //停止发射//// clock=1;// led=!led; //// // while(!ir_in);// // // f2=1;// delay(1000); //延时1秒,等手移开后// // }// } }}void timer0() interrupt 1{ TH0 = (65536-10000)/256; //重装10ms初值 TL0 = (65536-10000)%256; if(flag2==1) { cont++; if(cont==10) { cont=0; flag=!flag; //发100ms 38K,停100ms } } flag2=0; //停止发射 if(ir_in==1) //没有反射信号 { s=0; //延时变量清零 clock=0; //自锁标志清零 flag2=1; //恢复发射 } else if(clock==0 && ir_in==0) //有反射信号 { s++; //消抖 这里值取大些,增强抗干扰 if(s>8 && ir_in==0) // { s=0; flag2=0; //停止发射 clock=1; led=!led; while(!ir_in); //加不加这句,手挡在前面不移开,LED都会不停 亮--灭 flag2=0; //停止发射 } }}