基于51单片机的超声波红外避障捡拾小车

前言:

 

        这个小车是我大一实验室考核的时候做的,里面的内容较为浅显且有些代码有冲突(不过还是能跑),请各位大佬轻喷。接下来我会介绍实现这个小车的各个步骤。

一、选材:

                基于51单片机的超声波红外避障捡拾小车_第1张图片 

                1:3个光电开关、1个HC-SR04超声波模块

                2:一个stc89c52的最小系统板

                3:4个TT马达、一个sg90舵机、2个l298n

二、各个模块的认识和使用:

        1.光电开关:

                  接线:蓝色接gnd,黑色接你单片机定义过的io口,棕色接VCC(5v)

                  使用方法:当检测到障碍物时,与黑线连接的单片机I/O口被置低电平0,也就是说通过读取该I/O口的电平高低,就可以知道传感器前方有没有障碍物,

        2.超声波模块:

                  接线:Vcc:+5V电源供电Trig:输入触发信号(可以触发测距)Echo:传出信号回响(可以传回时间差)Gnd:接地

                  使用方法:直接给trig高电平,然后读取ECHO引脚是否为高电平,若为高电平,则开启定时器,然后继续检测等待其为低电平的时候,获取计数器值,然后进行计算

                   计算公式:测试距离=(高电平时间*声速(340M/S))/2。

        3.舵机pwm波:

                     接线:舵机上有三根线,分别是GND(棕色线)、VCC(红色线)和SIG(黄色线),也就是地线、电源线和信号线。VCC接5v,gnd接单片机的gnd,信号线接你定义的引脚就行了。

                     使用方法:  舵机的控制,需要一个20ms的时基脉冲,控制高电平时间为0.5ms~2.5ms范围内即可控制舵机在0 ~ 180°转动。(注:舵机的pwm在52上好像只能用定时器控制,用delay控制不准确)。

        4.l298n:                 

                      注意:此处驱动一定要和stc89c52共地!!!否则无法传输数据。还有通道A、B使能上的那块东西要拔掉然后A、B各接一条线到单片机上就能控制电机的使能了

                基于51单片机的超声波红外避障捡拾小车_第2张图片 

三:部分代码分享:

            1.超声波模块的代码:    

#include 

float  S=0;
extern bit  flag;
unsigned int  measure_time;
char M_sensor; 
 void  StartModule()     
  {
   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 Conut(void)
 {
	 measure_time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S=(measure_time*1.87)/100;
  if(flag==1||S>20||S<10)   
  {
   flag=0;
  LED=1;
  M_sensor=1;
  }
   else
   {
  LED=0;
  M_sensor=0;
   }
 } 

              2.主函数代码:

#define uint8	unsigned char    
#define uint16	unsigned short int
#define uint32	unsigned long 
#include "reg52.h"
#include 
sbit D_sensor=P2^2;
sbit SERVO0=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P23=P2^3; 
sbit P24=P2^4;
sbit LED=P0^0;
sbit L_sensor=P2^0;
sbit R_sensor=P2^1;
//电机L298N
void run(void)//前进
{
 P12=1;
 P13=0;
 P23=1;
 P24=0; 
}
void back(void)//后退
{
 P12=0;
 P13=1;
 P23=0;
 P24=1; 
}
void left(void)//左转
{
 P12=1;
 P13=0;
 P23=0;
 P24=0; 
}
void right(void)//右转
{
 P12=0;
 P13=0;
 P23=1;
 P24=0; 
}
void stop(void)//停止
{
 P12=0;
 P13=0;
 P23=0;
 P24=0; 
}
uint16 Servo0PwmDuty=1500;	//PWM脉冲宽度
void DelayMs(uint16 ms)
{
	uint16 i,j;
	for(i=0;i<85;i++)		//89单片机用85,12系列单片机用800
		for(j=0;j>8;			
	TR0 = 1;
}

void Timer0_isr(void) interrupt 1 using 1
{
	static uint16 i = 1;	//静态变量:每次调用函数时保持上一次所赋的值,
	switch(i)
	{
		case 1:
			SERVO0 = 1;	//PWM控制脚高电平
			Timer0Value(Servo0PwmDuty);	
			break;
		case 2:
			SERVO0 = 0;	//PWM控制脚低电平
			Timer0Value(20000-Servo0PwmDuty);
			i = 0;	
			break;	 
	}
	i++;
}
void main()
 {
	 	EA=1;
	 Timer0Init();
  LED=0;	 
 while(1)
  { 	
		if(D_sensor==0)//检测黑线的光电
		{run();    }
    else
		{  stop();

		Servo0PwmDuty = 1500;	
		DelayMs(500);
		Servo0PwmDuty = 500;		
		DelayMs(500);
	
		}	
	}
	}

有需要全部代码可以私信我(应该也不会有人问吧)

实机演示

你可能感兴趣的:(51单片机,单片机,c语言)