工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->传感器电路图->其他传感器电路图->精确快速的雷电测距仪

精确快速的雷电测距仪

作者:葱爆羊肉时间:2009-08-28

  根据雷电发生时产生的声光在大气中传播速度不同所产生的时间差,可精确快速计算出距雷电发生点的距离。电路如下图所示。

  声速在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;}

  



评论

技术专区