//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动
//第一次上电,灯亮1秒后熄灭,
//手挡一次开,再挡一次关,如此循环
//实验板测试手挡一次开,再挡一次关 开关正常;
//但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭 -- 亮--灭
//请大神们看下,这样才能做到手挡在前面不移开,保持一种状态
//控制部分写在大循环里和写在中断里面一样锁不住
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P2^4; //红外发射
sbit ir_in=P3^2; //红外接收
sbit led=P1^7; //低电平LED亮
bit flag,flag2=1;
uint cont,cont1,s;
uchar clock;
//bit f1,f2;
void delay(uint z) //ms
{
uint x,y;
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; //停止发射
}
}
}
|