51智能循迹小车

要做一个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


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   //把头文件包含进来
#include


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 {
en1=1;
}
else
{
en1=0;
}
if(timer1 {
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
#include


void initt0_duoji();


void duojikongzhi();
void huizheng();
void you();
void zuo();


sbit PWM=P2^0;

 

#endif/*_DUOJICESHI_H*/

控制舵机的C文件

#include
#include
#include


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 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
#include
#include


extern unsigned int count;
extern unsigned char jd;




void main()
{
  initt0_duoji();
  initt1_dianji();
  huizheng();


  while(1)
{
 duojikongzhi();
 bizhang();
}
}

 

 

 

 

你可能感兴趣的:(51单片机,循迹小车)