要做一个51单片机循迹智能小车,首先你要会单片机编程,会使用keil软件,有单片机编程的经验,因为这样你才能用程序去控制小车。
硬件部分:(1)在淘宝上买一个小车架子,包括:车轮、电机。
(2)电机驱动:L298N,有现成的模块,可以驱动两个电机
(3)电源:买12V的锂电池,可以直接给电机供电,再买一个LM7805稳压芯片,得到的5V可以给单片机供电,当然Lm7805的5V端口也能提供输出5V,但是,一本用稳压的。
(4)转向舵机:舵机控制用PWM波形,就是脉冲,高低电平的不同时间,产生用单片机的管脚模拟输出pwm波形,控制舵机转向。
(5)循迹模块:TRCT5000集成模块,将输出接到单片机管脚上即可,用查询方式检测,编程控制电机、舵机。
软件部分:
(建议各位用模块化编程的形式,建立多个c文件以及对应的头文件,主函数中直接调用函数即可,不要把所有的程序写在主函数中。)
避障的头文件:
#ifndef _BIZHANG1_H
#define _BIZHANG1_H
#include<reg52.h>
sbit bizhangzuo=P0^0;
sbit bizhangyou=P0^1;
sbit en1=P3^2;
sbit IN1=P3^3;
sbit IN2=P3^4;
sbit en2=P3^5;
sbit IN3=P3^6;
sbit IN4=P3^7;
void tingzhi();
void qianjin();
void zuozhuan();
void youzhuan();
void houtui();
void bizhang();
void initt1_dianji();
#endif/*_BIZHANG1_H*/
避障的C文件(注意:有C文件,就有一个对应的头文件)
#include<bizhang1.h> //把头文件包含进来
#include<reg52.h>
extern unsigned int count;
extern unsigned char jd;
unsigned char zkb1=0;
unsigned char zkb2=0;
unsigned char timer1=0;
/*******为了产生PWM波来控制电机的速度***********/
void initt1_dianji()
{
TMOD= 0x10;
TH1 =(65536-800)/256; //--定时器赋初始值,12MHZ下定时0.8ms--//
TL1 =(65536-800)%256;
ET1 = 1;
EA = 1;
TR1 = 1;
}
void Time1(void) interrupt 3
{
TH1 =(65536-800)/256; //重新赋值
TL1 =(65536-800)%256;
timer1++;
// 0.8ms次数加1
while(timer1>100) //PWM周期为100*0.8ms=80ms
{
timer1=0;
}
if(timer1 <zkb1) //改变zkb1值可以改变直流电机的速度
{
en1=1;
}
else
{
en1=0;
}
if(timer1 <zkb2) //改变zkb2这个值可以改变直流电机的速度
{
en2=1;
}
else
{
en2=0;
}
}
void qianjin()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
zkb1=30;
zkb2=30;
}
void zuozhuan() //左转函数
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
zkb1=30;
zkb2=30;
}
void youzhuan()//右转函数
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
zkb1=30;
zkb2=30;
}
void houtui()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
zkb1=30;
zkb2=30;
}
void bizhang()
{
if(bizhangzuo==0&&bizhangyou==1) //遇到障碍物,接收到返回光为低电平
{
youzhuan();
}
if(bizhangzuo==1&&bizhangyou==0)
{
zuozhuan();
}
if(bizhangzuo==0&&bizhangyou==0)
{
houtui();
}
if(bizhangzuo==1&&bizhangyou==1)
{
qianjin();
}
}
控制舵机的头文件:
#ifndef _DUOJICESHI_H
#define _DUOJICESHI_H
#include<reg52.h>
#include<duojiceshi.h>
void initt0_duoji();
void duojikongzhi();
void huizheng();
void you();
void zuo();
sbit PWM=P2^0;
#endif/*_DUOJICESHI_H*/
控制舵机的C文件
#include<duojiceshi.h>
#include<bizhang1.h>
#include<reg52.h>
unsigned int count;
unsigned char jd; //角度表示,1对应于-90度,2~-45度,3~90度(回正)。
void initt0_duoji()
{
TMOD=0x01;
TH0=0xfe; //11.0592mhz,对应定时0.5ms
TL0=0x33;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 1
{
TH0=0xfe; //11.0592mhz,对应定时0.5ms
TL0=0x33;
count++;
if(count<jd)
PWM=1;
else
PWM=0;
if(count==40) //40*0.5ms=20ms
count=0; //20ms周期重新开始
}
void duojikongzhi()
{
if(bizhangzuo==0&&bizhangyou==1) //接收到返回光,为低电平
{
you();
while(bizhangzuo==0&&bizhangyou==1); //等待改变
}
if(bizhangzuo==1&&bizhangyou==1)
{
huizheng();
while(bizhangzuo==1&&bizhangyou==1);
}
if(bizhangzuo==1&&bizhangyou==0)
{
zuo();
while(bizhangzuo==1&&bizhangyou==0);
}
}
void huizheng()
{
jd=3;
count=0;
}
void zuo()
{
jd=4;
count=0;
}
void you()
{
jd=2;
count=0;
}
主函数:
#include<reg52.h>
#include<bizhang1.h>
#include<duojiceshi.h>
extern unsigned int count;
extern unsigned char jd;
void main()
{
initt0_duoji();
initt1_dianji();
huizheng();
while(1)
{
duojikongzhi();
bizhang();
}
}