void main(void)   // 主程序
{   uint distance_data,a,b;
    uchar CONT_1;
    CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
    P0M1 = 0;   //将io口设置为推挽输出
    P1M1 = 0;
    P2M1 = 0;
    P0M0 = 0XFF;
    P1M0 = 0XFF;
    P2M0 = 0XFF;
    i=0;
    flag=0;
    test =0;
    Trig=0;       //首先拉低脉冲输入引脚
    TMOD=0x11;    //定时器0,定时器1,16位工作方式
    TR0=1;	     //启动定时器0
    IT0=0;        //由高电平变低电平,触发外部中断
    ET0=1;        //打开定时器0中断
//ET1=1;        //打开定时器1中断
    EX0=0;        //关闭外部中断
    EA=1;         //打开总中断0


    while(1)         //程序循环
    {
        EA=0;
        Trig=1;
        delay_20us();
        Trig=0;         //产生一个20us的脉冲,在Trig引脚
        while(Echo==0); //等待Echo回波引脚变高电平
        succeed_flag=0; //清测量成功标志
        EX0=1;          //打开外部中断
        TH1=0;          //定时器1清零
        TL1=0;          //定时器1清零
        TF1=0;          //
        TR1=1;          //启动定时器1
        EA=1;

        while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
        TR1=0;          //关闭定时器1
        EX0=0;          //关闭外部中断

        if(succeed_flag==1)
        {
            distance_data=outcomeH;                //测量结果的高8位
            distance_data<<=8;                   //放入16位的高8位
            distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
            distance_data*=12;                  //因为定时器默认为12分频
            distance_data/=58;                   //微秒的单位除以58等于厘米
        }                                      //为什么除以58等于厘米,  Y米=(X秒*344)/2
        // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
        if(succeed_flag==0)
        {
            distance_data=0;                    //没有回波则清零
            test = !test;                       //测试灯变化
        }

        ///       distance[i]=distance_data; //将测量结果的数据放入缓冲区
        ///        i++;
        ///	 if(i==3)
        ///	     {
        ///	       distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
        ///        pai_xu();
        ///        distance_data=distance[1];


        a=distance_data;
        if(b==a) CONT_1=0;
        if(b!=a) CONT_1++;
        if(CONT_1>=3)
        {   CONT_1=0;
            b=a;
            conversion(b);
        }
        ///		 i=0;
        ///		}
    }
}
Пример #2
0
void main(void)   // 主程序
{  uint distance_data,a,b;
   uchar CONT_1;   
   i=0;
   flag=0;
	Tx=0;       //首先拉低脉冲输入引脚
	TMOD=0x11;    //定时器0,定时器1,16位工作方式
	TR0=1;	     //启动定时器0
   IT0=0;        //由高电平变低电平,触发外部中断
	ET0=1;        //打开定时器0中断
	EX0=0;        //关闭外部中断
	EA=1;         //打开总中断0	
  
	
while(1)         //程序循环
	{
  EA=0;
	     Tx=1;
        delay_20us();
        Tx=0;         //产生一个20us的脉冲,在Tx引脚  
        while(Rx==0); //等待Rx回波引脚变高电平
	     succeed_flag=0; //清测量成功标志
	     EX0=1;          //打开外部中断
	 	  TH1=0;          //定时器1清零
        TL1=0;          //定时器1清零
	     TF1=0;          //
        TR1=1;          //启动定时器1
   EA=1;

      while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)  
		  TR1=0;          //关闭定时器1
        EX0=0;          //关闭外部中断

    if(succeed_flag==1)
	     { 	
		   distance_data=outcomeH;                //测量结果的高8位
           distance_data<<=8;                   //放入16位的高8位
		     distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
            distance_data*=12;                  //因为定时器默认为12分频
           distance_data/=58;                   //微秒的单位除以58等于厘米
         }                                      //为什么除以58等于厘米,  Y米=(X秒*344)/2
			                                       // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 
    if(succeed_flag==0)
		   {
            distance_data=0;                    //没有回波则清零

           }

           distance[i]=distance_data; //将测量结果的数据放入缓冲区
            i++;
  	  	 if(i==3)
	  	     {
	  	       distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
               pai_xu();
             distance_data=distance[1];

      
	   a=distance_data;
       if(b==a) CONT_1=0;
       if(b!=a) CONT_1++;
       if(CONT_1>=3)
		   { CONT_1=0;
			  b=a;
			  conversion(b);
			}       
	  		 i=0;
 	  		}	     
	 }
}