微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 超声波传感器

超声波传感器

时间:10-02 整理:3721RD 点击:

#include <reg51.H>               
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RX=P0^0;
sbit TX=P0^1;
sbit BEEP=P0^2;
uint time=0;
uint timer=0;
uchar posit=0;
uint k;
bit flag_beep;
unsigned long S=0;
bit flag =0;
uchar const discode[]={0x05,0xDD,0x46,0x54,0x9C,0x34,0x24,0x5D,0x04,0x14,0xfe};    ?                     
uchar const positon[4]={0x04,0x10,0x40,0x80};?
uchar disbuff[4]={0,0,0,0,};?
void DIDI()
{
        if(S<1000)
         {
         BEEP=0;
         }
         else
         {
                  k++;
                //if(k>=500)
                //{       
                //         k=0;
                //  flag_beep=!flag_beep;
                //}
                if((S>=1000)&&(S<2000))//1 m~2 m
                {
                        if(k>=500)
                         {       
                                  k=0;
                                  flag_beep=!flag_beep;
                         }
                }
                if((S>=2000)&&(S<3000))//2 m~3 m
                {
                        if(k>=300)
                         {       
                                  k=0;
                                  flag_beep=!flag_beep;
                         }
                }
                if((S>=3000)&&(S<4000))//3 m~4 m
                {
                         if(k>=200)
                         {       
                                  k=0;
                                  flag_beep=!flag_beep;
                         }
                }
                if((S>=4000)&&(S<=5000))//4 m~5 m
                {
                         if(k>=100)
                         {       
                                 k=0;
                                  flag_beep=!flag_beep;
                         }
                }
                if(flag_beep)
                 BEEP=0;
                else
                  BEEP=1;
         }
}


void Display( )                                 //扫描数码管
{
         if(posit==0)
         {P2=(discode[disbuff[posit]])&0xfb;}
         else
         {P2=discode[disbuff[posit]];}
          P1=~positon[posit];
          if(++posit>=4)
          posit=0;
}

void Conut( )
{
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         //time=23529;
         S=(time*0.17);     //算出来是CM
         if((S>=7000)||flag==1) //超出测量范围显示"-"
         {         
            flag=0;
                flag_beep=0;
            disbuff[0]=10;           //"-"
            disbuff[1]=10;           //"-"
            disbuff[2]=10;           //"-"
                disbuff[3]=10;           //"-"
                BEEP=1;
         }
         else
         {
                disbuff[0]=S/1000;
                  disbuff[1]=S/100%10;
                  disbuff[2]=S/10%10;
                  disbuff[3]=S%10;
         }
}


void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
{
    flag=1;                                                         //中断溢出标志
}

void  zd1()  interrupt 3                  //T1中断用来扫描数码管和计800 ms启动模块
{
         TH1=0xf8;
         TL1=0x30;
         Display();
         DIDI();
         timer++;
         if(timer>=400)
         {
          timer=0;
          TX=1;                                        //800 ms  启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX=0;
         }
}

void  main(  void  )
{  
          TMOD=0x11;                   //设T0为方式1,GATE=1;
        TH0=0;      为什么都是0?
        TL0=0;
                
        TH1=0xf8;                   //2 MS定时
        TL1=0x30;
        EA=1;                           //开启总中断
        ET0=1;             //允许T0中断
        ET1=1;                           //允许T1中断
        TR1=1;                           //开启定时器
       
        while(1)
        {
                 while(!RX);                        //当RX为零时等待
                 TR0=1;                            //开启计数
                 while(RX);                        //当RX为1计数并等待
                 TR0=0;                                //关闭计数
                   Conut();                        //计算                                                                         
        }                 
}

正在找的东东,谢谢。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top