51单片机智能小车——超声波

材料:

(1)51单片机开发板

(2)l298n电机驱动模块1个

(3)四个电机

(4)超声波模块

一、组装

(1)L298N电机驱动模块与开发板接线如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_17,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

 

(2)超声波模块接线:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16超声波的 TRIG端  插在了P2.5口

 

超声波的 ECHO端  插在了P2.6口    

超声波传感器的使用方法:
            控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出.
    一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,
    此时就为此次测距的时间,方可算出距离.如此不断的周期测,
    就可以达到你移动测量的值了,测距范围为2-400cm

main.c 

#include "reg52.h"
#include "mycaobo.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit MOTOA=P1^0;
sbit MOTOB=P1^1; //右侧电机
sbit MOTOC=P1^2;
sbit MOTOD=P1^3; //左侧电机

//定义超声波模块控制管脚
sbit TRIG = P2^5;//发送端 

sbit ECHO = P2^6;//接收端 

void delay(u16 us)
{
	while(us--);
}

void delay_10us(u16 us)
{
	while(us--);
}

//ms延时函数ms
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}

void Car_ForwardRun(void)//前进
{
	MOTOA=1;
	MOTOB=0;
	MOTOC=1;
	MOTOD=0;	
}
void Car_BackwardRun(void)//后退
{
	MOTOA=0;
	MOTOB=1;
	MOTOC=0;
	MOTOD=1;	
}
void Car_LeftRun(void)//左转
{
	MOTOA=1;
	MOTOB=0;
	MOTOC=0;
	MOTOD=1;	
}
void Car_RightRun(void)//右转
{
	MOTOA=0;
	MOTOB=1;
	MOTOC=1;
	MOTOD=0;	
}
void Car_StopRun(void)//停止
{
	MOTOA=0;
	MOTOB=0;
	MOTOC=0;
	MOTOD=0;	
}

u8 overflow_flag=0;	 //标志定时器是否溢出

void delay_20us(void) //延时20us
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); 
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void Timer0Init(void)
{
	TMOD|=0X01;//选择为定时器0模式

	TH0=0;	
	TL0=0;	
	ET0=1;//打开定时器1中断允许
	EA=1;//打开总中断
	TR0=0;			
}

void Timer0() interrupt 1
{
	overflow_flag=1;//溢出标志位置1	
	DigDisplay();	
}

u16 Get_Distance(void) 
{
		u16 time_data,out_TH0,out_TL0;

		TRIG = 0; // 先给控制端初始化为0

		Timer0Init(); //初始化定时器
		overflow_flag=0;//置溢出标志位为0
    TRIG = 1;    
    delay_20us();
    TRIG = 0;
    //等待接收端出现高电平
    while(!ECHO);
		TR0 = 1; //启动计时器 开始计时
    while(ECHO); //等待高电平结束
    TR0 = 0; //关闭低电平
	
	out_TH0 = TH0; //取定时器的值
    out_TL0 = TL0;
    out_TH0 <<= 8;  
    time_data = out_TH0 | out_TL0;
    time_data /= 58; // 微秒/58 = 厘米
	
	if(overflow_flag)time_data=999;
	
	return time_data;  
} 

//主函数
void main()
{
	u16 distane=0;
  	u8 i=0;

	while(1)
	{
		distane=Get_Distance();	
		DigDisplay();
		
		if(distane>=30)
		{
			Car_ForwardRun();
		}
		else if(distane>=20&&distane<30)
		{
			Car_StopRun();
			delay_ms(500);
			Car_RightRun();
			delay_ms(200);
			Car_StopRun();
			delay_ms(500);	
		}
		else if(distane>=10&&distane<20)
		{
			Car_StopRun();
			delay_ms(500);
			Car_BackwardRun();
			delay_ms(200);
			Car_RightRun();
			delay_ms(200);
			Car_StopRun();
			delay_ms(500);	
		}
		else if(distane>=0&&distane<10)
		{
			Car_StopRun();
			delay_ms(500);
			Car_BackwardRun();
			delay_ms(200);
			Car_RightRun();
			delay_ms(200);
			Car_StopRun();
			delay_ms(500);	
		}
	}	
}

 

 

 

 

 

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值