精确快速的雷电测距仪
根据雷电发生时产生的声光在大气中传播速度不同所产生的时间差,可精确快速计算出距雷电发生点的距离。电路如下图所示。
声速在0℃时为331.36m/s,温度每升高1℃,声速增加0.6m/s。在26℃时,声速为347m/s。假若从接收到光开始计时,到收到雷声信息的时间为T,那么与雷电发生处的距离为S=347T(光的传播时间忽略)。
电路中LED1为光敏二极管,接收闪电光信号。通过调整P3改变接收灵敏度,并克服环境光的干扰。NE5532的⑦脚接与80C2051的INT1端,当电平由高变为低时,产生中断,置记数标志位为1,开始脉冲记数。HD为接收雷声信号,P4是灵敏度调整,NE5532的①脚接入INT2脚,当电平由高变低时产生中断,置记数标志位为0,停止脉冲计数。定时中断设计为1ms,用作计时单位。依脉冲计数计算出与雷电相距的距离,并通过LED数码管显示出来。当距雷电发生点距离小于500米时,从P3.0脚发出告警信号,引起人们注意。程序用Franklin C51 Ver3.2编译,清单如下:
#include
#include
#include
#define PI 347
bit ST;/*计时启停控制位于*/
sbit p3_1=P3 1;sbit p3_4=P^3 4;sbit p3_5=P 3 5;sbit p3_7=P3 7;/*定义位*/
unsigned int te,tp;sbit p3_0=P3 0;
ch_ar[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};/*0-9*/
void time_s(unsigned int k)/*时间延时*/
{unsigned int ky;
for(ky=0;ky<=k;ky++){;}
}
void boot(void) /*初始化子程序*/
{
p3_0=0;
EA=1;/*开所有中断*/
TL0=0x0b;/*计数器初始值 1MSk中断一次*/
TH0=0xfe;
ET0=1;/*开定时器0中断*/
EX1=1;/*开外部中断1*/
EX0=1;
IT1=1;/*设定为低电平触发*/
IT0=1;
void zd() interrupt 1using 3/*定时中断,T0,1ms*/
{
if(ST==1){te++;}
TL0=0x0b;/*计数器初始值1MSk中断一次*/
TH0=0xfe;
ET0=1;/*开定时器0中断*/
}
zd1() interrupt 2 using 1/*INT1,下降沿中断*/
{
ST=1;/*计数标志位置1,开始计时*/
EX0=1;/*开外部中断1*/ IT0=1;/*设定为低电平触发*/
}
void zd2() interrupt 0 using 3 /*用于操作按键控制INT0,下降沿中断*/
{
ST=0;/*计时标志位置0,停止计时*/
tp=te;te=0;EX1=1;/*开外部中断1*/ IT1=1;/*设定为低电平触发*/}
void display(unsigned int i)/*显示驱动单元*/
{
int x,i1,i2,i3,i4;
i1=i%10; /*个位数*/
i2=((i-i1)/10)%10;/*十位数*/
i3=((i-i1-10*i2)/100)%10;/*百位数*/
i4=((i-i1-10*i2-100*3)1000)%10;/*千位数*/
for(x=0;x<=3;x++)
{
switch(x){
case 0:P1=ch_ar[i4];p3_7=time_s(1000);break;
case 1:P1=ch_ar[i3];p3_5=time_s(1000);break;
case 2:P1=ch_ar[i2];p3_4=time_s(1000);break;
case 3:P1=ch_ar[i1];p3_1=time_s(1000);break;
default:break;
}}}
void main()
{ unsigned long int z1;
unsigned int z2;
boot();
star:if(ST==0)
{z1=tp*PI;
z1=z1/1000;
z2=(unsigned int)z1;
if(z2<=500){p3_0=1;/*声音报警*/time_s(50000);/*延时*/p3_0=0;/*清除*/}
display(z2);}
goto star;}

评论