//紅外反射開關,接收頭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; //停止發射
}
}
}
|