钻石会员
主题
回帖0
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
本帖最后由 LBQ691477940 于 2013-1-27 11:58 编辑
谁做过多光束红外对射警报电路,要求4-5光束(或以上)红外对射检测距离1~100cm即可,每路光束间距在 2~3cm左右。
自已用单片做了一个但不太理想,问题出在检测距离不够只有20cm左右且很稳定,如将距离拉长会出现相邻的两光束干扰因为光束距离只离2.5cm左右很难将其分隔开,如果改用激光束则应该没问题,因为不会存有这么大的散射。
我这次的设计思路为:单片机以5ms扫描速度在P1.0~P1.4口分别输出高低电平来驱动红外发射管,发射5路红外光束,接收端用红外接收管经CD40106反相后输入到单片机的P3.0~P3.4口,每当P1口扫描输出一次,就读回P3口的值并判断是否与P1口送出的值相同,如果有故障物阻挡任一路则读回的值则一定会不同马上输出警报,没有故障物阻挡则相同继续下一轮扫描再判断。/*****************************************************************************函数名:1ms延时函数
全局变量:无
参数说明:无
返回说明:无
说明:a参数为1ms的倍数
/*****************************************************************************/
void delay (unsigned int a)
// 1ms延时程序
{
unsigned int i;
while( --a != 0)
{
for(i = 0; i < 300; i++);//STC单片机在外部晶振为12MHz时i值上限为600
//for(i = 0; i < 125; i++);//AT89C51单片机在外部晶振为12MHz时i值上限为125
}
}
/*****************************************************************************
函数名:main函数
全局变量:无
参数说明:无
返回说明:无
/*****************************************************************************/
void main(void)
{
uchar data outtemp = 0x01;
//定义输出临时变量data
P1M0 = 0x00;
//设置P1口全部都为推挽输出
P1M1 = 0xff;
//设置P1口全部都为推挽输出
P1 = 255;
out = 1;
//取消报警输出
while(1)
{
//0000 0001 //0000 0010 //0000 0100 //0000 1000 //0001 0000 //0010 0000
P1 = outtemp | 0xe0;
//高3位让其一直输出高电平
//outtemp <<= 1;
//左移一位
outtemp = _crol_(outtemp,1);
//左移一位
if(outtemp == 0x20)
//0010 0000
outtemp = 0x01;
//复位
delay(5);
//延时
if((P3 & 0x1f) != (P1 & 0x1f))
//屏蔽高3位不计
{
delay(5);
//延时后再作一次判断
if((P3 & 0x1f) != (P1 & 0x1f))
//屏蔽高3位不计
{
out = 0;
//报警输出
delay(500);
//延时
}
}
if((P3 & 0x1f) == (P1 & 0x1f))
//屏蔽高3位不计
{
P3 = 0xff;
//取消报警输出
}
}
}
/*****************************************************************************/
求助有好方案的友友请赐教,谢谢! |
|