//红外反射开关,接收头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^1; //
uint cont,cont1;
bit flag_key; //按键按下标志
bit key_lock=0;
void delay(uint z) //ms
{
uint x,y;
for(x=z; x>0; x--)
for(y=114; y>0; y--);
}
void fa_38k() //38k 载波 //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{ //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串100欧电阻)
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_();
}
void main()
{
TMOD |= 0X01; //T0定时器,模式1, 16位计数
TH0 = (65536-1000)/256; //1ms初值 @12MHz晶振
TL0 = (65536-1000)%256;
ET0=1;
TR0=1;
led=0;
delay(500);
led=1;
while(1)
{
if(flag==0 )
{
fa_38k(); //发38K
}
else ir=1; //停止发射
if(ir_in==0) //手挡住
{
flag_key=1;
cont1++;
key_lock=1;
}
else flag_key=0; //手移开
if(flag_key==1 && cont1==100)
{
ir=1;
cont1=0;
led = !led;
delay(1000);
}
if(ir_in==1) cont1=0; //这句抗干扰很好,遥控器对着按,都没反应
}
}
void timer0() interrupt 1
{
TH0 = (65536-1000)/256; //重装1ms初值
TL0 = (65536-1000)%256;
cont++;
if(cont==100)
{
cont=0;
flag=!flag; //发100ms 38K,停100ms
}
}
|