HC-SR04超声波测距探讨
admin 于 2013年05月18日 发表在 嵌入式开发笔记
1. 测量原理:
利用两个端口分别作为发射及接收口,通过对电平高低变化的捕捉,计算出高电平持续时间。
2. 距离公式:
距离=(高电平持续时间*声速(340M/S)/2)
void StartModule_1() { TRIG_1=1; //启动一次模块 delay(5); TRIG_1=0; } void Conut(void) { time=0; time=TH0*256+TL0; TH0=0; TL0=0; S=0; S=(time*1.7)/100; //算出来是CM } void chaoshengbo_ceju1(void) { StartModule_1(); while(!ECHO_1); //当RX为零时等待 TR0=1; //开启计数 while(ECHO_1); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 S1=S; }
TRIG(控制端):电平由0 -> 1 TTL电平持续至少10Us,启动超声波模块;若启动,则模块自动发送8个40Khz的方波,并自动检测是否有信号返回。
ECHO(接收端):利用程序中: while(!ECHO_1); 等待回响信号发生跳变(遇到障碍物后反射)
ECHO_1从 0 -> 1 TTL电平时,打开计时器,直到电平由1 -> 0 ,记录高电平持续的时间,即:超声波从发射到返回的时间。
3. 模块电路图:
4. 时序图:
5. 源码:点击下载附件
/************************超声波传感器驱动函数*************************/ /***************使用液晶LCD1602显示测量距离,显示单位:厘米cm***********/ /*模块的四位引脚:TRIG/ECH0分别连普通IO口,VCC和GND接JPW电源扩展接口**/ #include<reg52.h> unsigned long S1,S2; unsigned long S; unsigned int time; bit flag=0; // 定义转弯指示灯 sbit rled = P0^4; sbit lled = P1^4; // 定义左边超声波传感器的变化 sbit lcsb1 = P0^0; sbit lcsb2 = P0^1; // 记录右边超声波传感器的变化 sbit rcsb1 = P0^2; sbit rcsb2 = P0^3; // 定义超声波模块1引脚 sbit ECHO_1 = P1^0; sbit TRIG_1 = P1^1; // 定义超声波模块2引脚 sbit ECHO_2 = P1^2; sbit TRIG_2 = P1^3; // 定义延迟函数 void delay(unsigned char t) { unsigned char i; unsigned int j; for (i = 0; i < 110; i++) for (j = 0; j < t; j++); } // 超声波传感器计数函数 void Conut(void) { time=0; time=TH0*256+TL0; TH0=0; TL0=0; S=0; S=(time*1.7)/100; //算出来是CM } // 定时器0中断服务函数 void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } // 启动超声波传感器模块函数 void StartModule_1() { TRIG_1=1; //启动一次模块 delay(5); TRIG_1=0; } void StartModule_2() { TRIG_2=1; //启动一次模块 delay(5); TRIG_2=0; } // 超声波传感器模块及中断初始化 void chaoshengbo_init(void) { TMOD=0x11; //设T0、T1为方式1 TH0=0; TL0=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; ET0=1; //允许T0、T1中断 ET1=1; TR1=1; EA=1; //开启总中断 } // 超声波传感器对外接口函数 void chaoshengbo_ceju1(void) { StartModule_1(); while(!ECHO_1); //当RX为零时等待 TR0=1; //开启计数 while(ECHO_1); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 S1=S; } void chaoshengbo_ceju2(void) { StartModule_2(); while(!ECHO_2); //当RX为零时等待 TR0=1; //开启计数 while(ECHO_2); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 S2=S; } void main(void) { chaoshengbo_init(); S1=S2=0; lled = 1; rled = 1; lcsb1 = lcsb2 = 1; rcsb1 = rcsb2 = 1; while(1) { if((S1>=1)&&(S1<=20)) { delay(10); if((S1>=1)&&(S1<=20)) { lcsb1 = 0; lcsb2 = 0; lled = 0; } } else { lcsb1 = 1; lcsb2 = 1; lled = 1; } if((S2>=1)&&(S2<=20)) { delay(10); if((S2>=1)&&(S2<=20)) { rcsb1 = 0; rcsb2 = 0; rled = 0; } } else { rcsb1 = 1;; rcsb2 = 1; rled = 1; } } } void T1_time() interrupt 3 //定时器1中断服务程序,没50ms调用一次超声波测距 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; chaoshengbo_ceju1(); chaoshengbo_ceju2(); }
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。
标签:HC-SR04超声波模块,keil4,电路开发,MCU使用