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

材料:

(1)51单片机开发板

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

(3)四个电机

(4)超声波模块

一、组装

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

 

(2)超声波模块接线:

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

版权声明:本文为CSDN博主「点灯代师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_65866701/article/details/122400257

生成海报
点赞 0

点灯代师

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

拉绳位移传感器在接线时需要注意哪几点?

拉绳位移传感器在接线时需要注意哪几点? 1、拉绳位移传感器在接线时务必确认在电源关闭的情况下进行接线,接线应采用锡焊工艺,各引脚应焊接牢固,避免虚焊情况发生。焊接各引脚时应严格按照传感器厂

实验一 stm32F407VETx点亮流水灯

二、设计指标 使电路板上的8个LED轮流点亮,并按键控制点亮速度。 三、操作 1、CubeMX操作 1.1依据开发板LED引脚设置CubeMX中8个LED的引脚为GPIO_Output模式, 2、按键设置

初试——串口传输文件

一、实验概述 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件&#xff