HC-SR04超声波模块基本工作原理:(1)采用IO口TRIG触发测距,当给它一个最少10us的高电平信号时启动。(2)模块自动发送8个40khz的方波自动检测是否有信号返回。(3)通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波发射到返回的时间。所以测算出距离即(高电平时间*声速(340m/s))/2.。注意此模块不宜带电连接
#include <stdio.h>
#include “reg52.h”
sbit Echo = P1^0; //定义引脚
sbit Trig = P1^1;
void initUart_9600()
{
//1.串口协议初始化
//1.1 数据格式:起始位,数据位,停止位,奇偶校验
//工作方式:1.1位起始位,8位数据位(低位在先)和1位停止位 SM0、SM1为“01
// 芯片手册:每个硬件都有一个开发手册,软件代码必须根据手册来写
SCON |=0x1<<6; //串行控制寄存器;方式1:波特率=(2的SMOD次方/32)x(定时器1的溢出率或···)
SCON&=~(0x1<<7);
SCON |=0x1<<4; //当T1x12=0或1时,定时器1的溢出率=SYSclk(晶振)/(12x(256-TH1))
TMOD |= 0x1<<5;//定时/计数器方式控制寄存器,方式1为常数自动重装入的8位定时/计数器 8位的效率和准确度更高
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;//启动定时器,让定时器工作,数节拍
TCON |=0x1<<6;
EA =1;
ES =1;
}
void delay20us(){ //延时10 微妙
TMOD |= 0x1; //定时16位计时模式
TH0=0xff;
TL0=0xf6;
TR0=1;
while(!TF0); //第一遍没做出,解释:
TF0 = 0;
}
void delay(){
int i;
int j;
for(i=0;i<100;i++)
for(j=0;j<500;j++);
}
void initCSB()
{ //让超声波开始工作,给他一个10us的高电平脉冲
Trig=0;
Trig=1;
delay20us();
Trig=0;
}
void startTime(){
// TMOD=0x01; 在之前delay10中已经做过
TH0=0;
TL0=0;//让计时器开始
TR0=1;//开始计时
}
void endTime(){
// TMOD=0x01;
TR0=0;
}
int getCSBtime(){
unsigned long time;
time=TH0*256+TL0;
return time;
}
float CSB_GetDistance(unsigned int time)
{
float distance;
distance=(float)time*0.017;
//TH0=0;
//TL0=0;//清空定时器
return distance;
}
void printfStr(char c)
{
SBUF =c;
while(!TI);
TI=0;
//delay();
}
void sendString(char *str)
{
while(*str!=’\0’)
{
printfStr(*str);
str++;
// delay();
}
}
void main()
{
unsigned int time=0;
char buf[24]={’\0’}; //数组
float dis;
initUart_9600(); //初始化串口
while(1){
initCSB();
while(Echo!=1);// 波出去,开始计时
startTime();
while(Echo!=0);// 波回来,结束计时
endTime();
time=getCSBtime(); //获得超声波发送的时间
dis=CSB_GetDistance(time); //计算出距离
delay();
sprintf(buf,"getDistance=%fcm\r\n",dis);
sendString(buf); //传出数组
delay();
}
}