//紅外反射開關,接收頭HS0038B,發(fā)射管用pnp三極管驅動
//第一次上電,燈亮1秒后熄滅,
//手擋一次開,再擋一次關,如此循環(huán)
//實驗板測試手擋一次開,再擋一次關 開關正常;
//但是有一個問題,如果手一直擋在前面,LED會不停的亮--滅 -- 亮--滅
//請大神們看下,怎樣才能做到手擋在前面不移開,保持一種狀態(tài)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ir=P2^4; //紅外發(fā)射
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 載波 //接收頭前面有濾光片,發(fā)射管要用黑色熱縮套管套起來
{ //不是很準,沒有邏輯分析儀,搞不準,現(xiàn)在的反射距離在60厘米左右(發(fā)射管串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位計數(shù)
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(); //發(fā)38K
}
else ir=1; //停止發(fā)射
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; //發(fā)100ms 38K,停100ms
}
}
|