abyssirides

51单片机----超声波模块51单片机程序

最近在造小车 需要用到超声波模块 现将调试时用到的代码分享出来。

所用超声波模块为HC-SR04 单片机开发板是吴鉴鹰的

先理解超声波模块的原理,它有四个接口 Vcc Trig Echo Gnd 。
Vcc接正极 Gnd接地
Trig和Echo随便接两个IO口
然后给Trig口高电平10us以上,超声波模块会自动发出8个40khz的方波,并检测是否有信号返回,有信号返回时就在Echo口输出高电平,持续的时间就是发出信号到接受信号所用的时间。所以计算从发出到接收信号所用的时间,就可以得知声音传播一个来回所花费的时间,在结合声速就可以算出距离了。(这里只是简单的估算,声速还和温度等因素有关)
然后开始写程序。
这里我为了能更好的看到超声波模块是否起作用,加入了单片机上的蜂鸣器,并设置了一个报警距离。

 1 #include<reg52.h>
 2 #include<stdio.h>
 3 #include<intrins.h>
 4 sbit Trig=P2^5;        //控制端 
 5 sbit Echo=P2^4;      //接收端
 6 sbit Beep=P3^4;      //单片机开发板上的蜂鸣器
 7 unsigned char T0RH=0;
 8 unsigned char T0RL=0;
 9 void Start_Buzz(unsigned int frequ)        
10 {
11     unsigned int reload;
12     reload = 65536 - (11059200/12)/(frequ*2); 
13     T0RH = (unsigned char)(reload >>8);      //蜂鸣器定时用 产生方波
14     T0RL = (unsigned char)reload;          //蜂鸣器定时用 产生方波
15 
16     TH1 = 0xFF;//蜂鸣器定时器
17     TL1 = 0xFE;//蜂鸣器定时器
18 
19     ET1 = 1;
20     TR1 = 1;
21 } //启动蜂鸣器 并设置音高
22 void Stop_Buzz()
23 {
24     Beep= 1;
25     ET1 = 0;
26     TR1 = 0;
27 } //关闭蜂鸣器
28 void InterruptTimer0() interrupt 3
29 {
30     TH1 = T0RH;
31     TL1 = T0RL;
32     Beep = ~Beep;
33 } //蜂鸣器中断程序
34 void time_init()
35 {
36     EA=1;
37     TMOD=0x11;
38     TH0 = 0;
39     TL0 = 0; 
40 } //初始化定时器
41 void Delay_us(unsigned char t)
42 {
43     while(--t);
44 }     //大约延时t*2+5us     超声波模块用
45 
46 
47 void timer0()interrupt 1
48 {
49 TH0 = 0;
50 TL0 = 0; 
51 } //中断程序 初始化赋值 重新计数 超声波模块用 计算时间
52  void main()
53  {
54      unsigned int time,distance;
55     Trig=0;
56     Echo=0;
57     time_init();
58      while(1)
59     {
60         Trig=1;
61         Delay_us(5);
62         Trig=0;
63         while(Echo==0);
64         TR0=1;
65         while(Echo);
66         TR0=0;
67         time=TH0*256+TL0;
68         distance=(int)(time*0.017);               //计算路程 单位为cm
69         TH0=0;
70         TL0=0;
71         if(distance<30)                    //如果距离小于30cm 蜂鸣器响
72         {
73             Start_Buzz(4000);             //用于控制蜂鸣器的音高
74         }
75         else 
76         {
77             Stop_Buzz();
78         }
79      }
80  }

才学疏浅 如有不妥欢迎指教 谢谢!

 

分类:

技术点:

相关文章: