材料:
(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
暂无评论