超声波模块
电路连接
超声波HCSR04模块有四个引脚,VCC,GND,TRIG和ECHO。
VCC接5V即可。
TRIG引脚负责发射超声波信号的信号引脚。这个引脚需要用超过10us的高电平来启动,所以写了一个20us的函数。每一点HCSR04会发射8个40khz的方波。方波发射后,ECHO引脚会输出高电平。
ECHO引脚是用来测量距离的数据引脚。当一个超声波信号发射后,ECHO引脚会输出高电平。当ECHO引脚直到检测到超声波信号回来的时,ECHO引脚输出低电平。
//以定时器0和定时器1为例
#define uint unsigned int
uint PWM=0; //定义PWM值,控制电机转速
uint pwm=0;
sbit IN11 = P1^0; //定义逻辑口
sbit IN21 = P1^1;
sbit IN31 = P1^2;
sbit IN41 = P1^3;
sbit a1=P2^1; //定义驱动使能口a1
sbit b1=P2^2; //定义驱动使能口b1
sbit RX=P1^6;//定义超声波接收端Echo
sbit TX=P1^7;//定义超声波控制端Trig
uint i=0,j=0;
void Time() //定时器0和1初始函数
{
TMOD |= 0x11; //设置定时器0方式为1 定时器1为方式1
// TMOD |= Ox01; //设置定时器0方式为1
EA=1; //打开总中断
TH0 = 0xfc; //设置定时器处置为高四位,定时1ms
TL0 = 0x18; //设置定时器设置为低四位
ET0 = 1; //打开定时器0中断允许
TR0 = 1; //打开定时器0
TH1 = 0xfc; //设置定时器处置为高四位,定时1ms
TL1 = 0x18; //设置定时器设置为低四位
ET1 = 1; //打开定时器1中断允许
TR1 = 1; //打开定时器1
}
void Timer0() interrupt 1
{
TH0=0xfc;
TL0=0x18;
if(i>PWM)a1=1;else a1=0;
i++;
if(i>=100)i=0;
}
void Timer1() interrupt 3
{
TH1=0xfc;
TL1=0x18;
if(j>pwm)b1=1;else b1=0;
j++;
if(j>=100)j=0;
}
void delay_20us() //超声波延时20微秒
{
TX=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();
TX=0;
}
void forward_move() //电机正转函数,速度50,最大速度100
{
PWM = 50;
pwm = 50;
IN11 = 0;
IN21 = 1;
IN31 = 0;
IN41 = 1;
}
void stop() //电机停止
{
PWM = 0;
pwm = 0;
IN11 = 0;
IN21 = 0;
IN31 = 0;
IN41 = 0;
}
void count_distence() //定义超声波测距函数
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
//s = 340m/s * time us /2 = 170*time *10^-6 m = 0.17*time mm
S= (long)(time*0.17);
if(S<100)
{
stop();
}
if(S>=100)
{
forward_move();
}
}
void main()
{
Timer();
while(1)
{
delay_20us();
while(!RX);//等待TX发出
TR0=1; //开始计时
while(RX); //当TX发出时,RX为高电平
TR0=0; //终止计时
count_distence();
}
}