首页 > 代码库 > [51单片机] HC-SR04超声波测距仪 基础代码

[51单片机] HC-SR04超声波测距仪 基础代码

 

>_<:超声波测距仪模块:

>_<:51单片机,11.0592MHz晶振,将采集数据发送到串口的基础例子:

>_<:代码:

  1 /***********************************************************************************************************/  2 //HC-SR04 超声波测距模块 DEMO 程序  3 //晶振:11。0592  4 //接线:模块TRIG接 P1.2  ECH0 接P1.1  5 //串口波特率9600  6 /***********************************************************************************************************/        7 #include   <AT89X51.H>  8 #include   <intrins.h>  9 #include   <STDIO.H> 10  11 #define uchar unsigned  char 12 #define uint  unsigned   int   13 #define  RX  P1_1 14 #define  TX  P1_2 15  16  17 unsigned int  time=0; 18 unsigned int  timer=0; 19 float         S=0; 20 bit           flag =0; 21  22  23 /********************************************************/ 24 void Conut(void) 25 { 26     time=TH0*256+TL0; 27     TH0=0; 28     TL0=0; 29     S=(time*1.87)/100;     //算出来是CM 30     if(flag==1)               //超出测量 31     { 32         flag=0; 33         printf("-----\n");  34     }     35     printf("S=%f\n",S);  36 } 37 /********************************************************/  38 void delayms(unsigned int ms) 39 { 40     unsigned char i=100,j; 41     for(;ms;ms--) 42     { 43         while(--i) 44         { 45             j=10; 46             while(--j); 47         } 48     } 49 } 50 /********************************************************/ 51 void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围 52 { 53     flag=1;                     //中断溢出标志 54 } 55 /********************************************************/ 56 void  StartModule()          //T1中断用来扫描数码管和计800MS启动模块 57 { 58     TX=1;                     //800MS  启动一次模块 59     _nop_();  60     _nop_();  61     _nop_();  62     _nop_();  63     _nop_();  64     _nop_();  65     _nop_();  66     _nop_();  67     _nop_();  68     _nop_();  69     _nop_();  70     _nop_();  71     _nop_();  72     _nop_();  73     _nop_();  74     _nop_();  75     _nop_(); 76     _nop_();  77     _nop_();  78     _nop_();  79     _nop_(); 80     TX=0; 81 } 82 /********************************************************/ 83 void main(void) 84 {   85     TMOD=0x21;                   //设T0为方式1,GATE=1; 86     SCON=0x50; 87     TH1=0xFD; 88     TL1=0xFD; 89     TH0=0; 90     TL0=0;  91     TR0=1;   92     ET0=1;                     //允许T0中断 93     TR1=1;                       //开启定时器 94     TI=1; 95      96     EA=1;                       //开启总中断 97      98      99     while(1)100     {101         StartModule();102         while(!RX);            //当RX为零时等待103         TR0=1;                //开启计数104         while(RX);            //当RX为1计数并等待105         TR0=0;                //关闭计数106         Conut();            //计算107         delayms(10);        //100MS108     }109 }