51单片机小项目--超声波避障小车

超声波模块

电路连接

51单片机小项目--超声波避障小车_第1张图片

超声波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();
    }
}

你可能感兴趣的:(STC89C51,51单片机,嵌入式硬件,单片机)