第一次接触实训,很多东西的工作原理掌握不是特别好,因此我写的就稍微浅显易懂些。所以也在此希望各位读者纠正。
刚才开始接触的小车是想用一路跟随小车,所以就开始了解这些要用到的模块。
**硬件电路:**L298N, 直流电机一对,51/52单片机最小系统板。电源,降压模块,车架,导线若干。
**遇到的问题:** 中 刚开始用 的电源是干电池,4节干电池电压达到5.8-6.2V左右,不是特别理想。因为在后面驱动电机转动后,其他硬件根本无法运转。建议在网上买一些稍贵一些的可充电电池,可充电电池电压在12V左右,因此需要一个**降压模块**,使用 降压模块一定要用万用表测量,调节旋钮,使输出电压为5V。因为后面还可以用于其他的新项目。可充电电流稍大一些,在电机转动时可以向其他模块继续供电。电压稳定性好。
在后面的驱动电路上要注意的是,要将驱动模块的负极连接到电源的负极,将单片机的负极也要连接到电源的**负极**。如果不这么做的话,即使有信号,也无法驱动电机转动。究竟为什么,就不太清楚了,也希望读者可以深究一下。
对于硬件超声波选用型号是HCSR-04,具体工作原理去论坛里了解一下,有很多资料,一定要亲自查一下会更加熟悉一些,在这里我就不过多赘述了。
下面我们放上代码:
#include<reg52.h>//添加头文件
#include<intrins.h>//调用库函数
#define uchar unsigned char
#define uint unsigned int
#define Moto P1//定义电机的输出端口
sbit trig = P2^0; //定义超声波1发,对应正前方
sbit echo = P2^1;
sbit trig1 = P2^2; //定义超声波2发,收,对应左前方
sbit echo1 = P2^3;
sbit trig2 = P2^4; //定义超声波3发,收,对应右前方
sbit echo2 = P2^5;
void check();//声明检测函数 对应超声波1
void Delay1ms(uint c);//延时误差 0us
void count();//计算距离
void check1();//声明检测函数 对应超声波2
void count1();//计算距离
void check2();//声明检测函数 对应超声波3
void count2();//计算距离
uint time,time1,time2,S,S1,S2; //定义全局变量时间,time time1,time2对应测距所用时间,对应距离
void main()
{
TMOD=0x01;//设置工作方式
EA=1; //开总中断
ET0=1; //开定时器允许中断
TH0=0;//赋初值
TL0=0;
while(1)
{
check(); //超声波1测距
count(); //计算距离
Delay1ms(100) ;
if(S<15){ //kongzhidianji 小于15就后退
Moto=0x0a;
}
else if(S>15&&S<40) //xiaoyu 15-40停止
{
Moto=0x00; //0000 0000
}
else if(S>=40&&S<100) //40-100cm就前进跟随
{
Moto=0x05; //0000 01 01前进
}
else if(S>=100){ //超过100就停止跟随
Moto=0x0f;
}
check1(); //超声波2测距
count1(); //计算距离
Delay1ms(100) ;
if(S1<30){ //左面有人右轮转
Moto=0x0d; //0000 1101
}
check2(); //超声波3测距
count2(); //计算距离
Delay1ms(100) ;
if(S2<30) { //右面有人左轮转
Moto=0x07;
}
}
}
void check() //检测函数
{
trig=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=0;
}
void count() //计算函数
{
while(!echo);//当ECHO脚为1,开始记时
TR0=1;
while(echo);//当ECHO脚为0,关闭计时
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //单位厘米
}
void check1() //触发方式
{
trig1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig1=0;
}
void count1() //第二个超声波计算函数
{
while(!echo1);//当ECHO脚为1,开始记时
TR0=1;
while(echo1);//当ECHO脚为0,关闭计时
TR0=0;
time1=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(time1*1.7)/100; //单位厘米
}
void check2() //检测函数
{
trig2=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig2=0;
}
void count2() //计算函数
{
while(!echo2);//当ECHO脚为1,开始记时
TR0=1;
while(echo2);//当ECHO脚为0,关闭计时
TR0=0;
time2=TH0*256+TL0;
TH0=0;
TL0=0;
S2=(time2*1.7)/100; //单位厘米
}
void Delay1ms(uint c) //延时函数
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
代码是完整的,如果遇到那些问题的话可以直接私信我就可以了。
硬件连接:P2.0-P2.5接Trig Echo,Trig1 Echo1,Trig2 Echo2,单片机经过降压模块输出电压为5V,接到单片机最小系统板上。L298N的IN1-IN4要连接在P1.0-P1.3上。超声波模块建议采用4*3的洞洞板,焊接在洞洞板上,最好在洞洞板上将电路的正极负极连接在一起,这样就可以大大减少接线难度,3个超声波的Trig,Echo要分别接到上述的接口上。
在此过程中还遇到硬件的问题,比如输出前进信号,但是车走着就会跑偏,这可能是因为电机的摩擦系数有关。电机有的3V就可以驱动,有的1.5V就可以驱动,导致小车转动角度有问题。在选用直流电机的时候尽量选择驱动电压相同的,这样车在前进的时候就不会跑偏太多了。
如果可以的话可以加一个灯,可以包装一下。
特别强调一个开关问题,小车上开关一定先火线,然后出来后接到需要供电的模块上。切记,用红色杜邦线代表正极,黑色代表负极。不然电路可能会因为误操作被烧。
下面就是我们的小车 成品了