头像-363863

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;  //停止发射                                        }        }}