标题:
原创单片机红外反射开关源码,有详细注释,可以做小便池前面的开关
[打印本页]
作者:
lids
时间:
2018-3-8 08:43
标题:
原创单片机红外反射开关源码,有详细注释,可以做小便池前面的开关
51单片机源程序如下:
//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动
//第一次上电,灯亮1秒后熄灭,
//有人在开关前面,延时约1秒,灯亮,人离开后,延时X 秒后灯灭
//如果灯还没灭,人又来到开关前面,灯长亮,人离开后,延时X 秒后灯灭
//实验板测试正常
//哪位大神有更好的方法来实现这个功能,也希望发出来
#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;
bit flag,flag2;
uint cont,cont1;
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 载波 //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{ //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在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()
{
uint i;
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==0) //如果红外接收的输出端为0,表示前面有反射物体
{
i++; //这句起消抖的作用 ,i取大些,抗干扰能力强些
if((ir_in==0) && (i>15000)) //确认反射物体还在开关前面,这里i的延时灯点亮的速度
{ //i越小,灯点亮越快,i的数值如果设定20000,可以不要下面那句delay(2000);
i=0; //消抖计时变量清0
// delay(1000); //延时2秒后,这里不加延时也可以,看自己的喜好
led=0; //亮灯
f1=1; //延时计时标志置1
cont1=0; //延时计时变量清零
while(!ir_in); //判断反射物体是否离开,如果没离开,程序就停在这里,
//灯一直亮,相当于按键的松手检测
}
}
if(cont1==1000 && ir_in==1) //松手+延时时间到后,这里是设定延时10秒
{
f1=0; //延时计时标志清0
cont1=0; //延时关灯计时变量清0
led=1; //关灯
}
}
}
void timer0() interrupt 1
{
TH0 = (65536-10000)/256; //重装10ms初值
TL0 = (65536-10000)%256;
cont++;
if(cont==10)
{
cont=0;
flag=!flag; //发100ms 38K,停100ms
}
if(f1)
{
cont1++;
}
}
复制代码
作者:
liuhailan5757
时间:
2020-3-10 12:05
能不能不用红外接收头,用红外对管,程序能做到防太阳光。高手能不能搞
作者:
lids
时间:
2020-3-10 14:28
可以做的,红外对管的反射距离比较近,只能做到10几厘米
作者:
xhl-xy
时间:
2021-11-19 10:59
大神,能否发下红外对管的参考点代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1