分类
笔记

51单片机红外(HC-SR501)生命探测小车程序代码

适用于51单片机的生命探测小车程序代码
IR_Car

利用HC-SR501超声波模块实现小车超声避障

 

头文件 BoeBot.h

#ifndef __BOEBOT_H__
#define __BOEBOT_H__

#include <at89x52.h>

void delay_nms(int ms); 
void delay_nus(int us);
void Forward(void);
void Left(void);
void Right(void);
void Back(void);
void REst(void);
#endif

#include "BoeBot.h"

const unsigned char CONST_MILLISECONDCOUNT = 115;
const unsigned char CONST_MICROSECONDDIVISER = 12;

void delay_nms(int ms) {
  unsigned char i;
  while((--ms) >= 0) {
    for(i = 0;i < CONST_MILLISECONDCOUNT;i++);
  }
}

void delay_nus(int us) {
  us /= CONST_MICROSECONDDIVISER;
  while((--us) >= 0) {}
}
void Back(void) {
        P1_1=1;
        delay_nus(1700);
        P1_1=0;
        P1_0=1;
        delay_nus(1400);
        P1_0=0;
        delay_nms(20);
}
void Left(void) {
        P1_1=1;
        delay_nus(1300);
        P1_1=0;
        P1_0=1;
        delay_nus(1400);
        P1_0=0;
        delay_nms(20);
}
void Right(void) {
        P1_1=1;
        delay_nus(1700);
        P1_1=0;
        P1_0=1;
        delay_nus(1600);
        P1_0=0;
        delay_nms(20);
}
void Forward(void) {
        P1_1=1;
        delay_nus(1300);
        P1_1=0;
        P1_0=1;
        delay_nus(1600);
        P1_0=0;
        delay_nms(20);
}

void REst(void) {
    int n=0;
    for(n=1;n<=65;n++) {
        P1_4=0;
        delay_nus(1500);
        P1_4=1;
        delay_nus(1500);
    }
}

主程序 Main.c()

// 设置成可重复触发模块(下2个短接)
// 调节距离电位器逆时针旋转至最小感应距离
// 调节延时电位器逆时针旋转至最小感应延时
// 小车将根据巡逻路线行进,遇到红外信号会停止

#include "BoeBot.h"

sbit Led = P2^0; // 指示灯
sbit IR_out = P1^3;   // 红外模块

// 方向
typedef enum {
  Dirtion_Forward,
  Dirtion_Back,
  Dirtion_Left,
  Dirtion_Right
}Direction;

// 路线定义
typedef struct {
  Direction dir;
  int stepCount;
}RoadMap;

// 巡逻路线
#define MapSize 8
const RoadMap map[MapSize] = {
  {Dirtion_Forward,400}
  ,{Dirtion_Right,50}
  ,{Dirtion_Forward,400}
  ,{Dirtion_Right,50}
  ,{Dirtion_Forward,400}
  ,{Dirtion_Right,50}
  ,{Dirtion_Forward,400}
  ,{Dirtion_Right,50}
};
  
void main() {
  int i,j;

  IR_out = 1;
  delay_nms(500);
  while(1) {
    for(i = 0;i < MapSize;i++) {
      for(j = 0;j < map[i].stepCount;j++) {
        // 是否检测到红外物体,若检测到,则停止
        while(IR_out) {
          Led = 0;
          delay_nms(10);
        }
        Led = 1;
                
        // 运动
        switch(map[i].dir) {
          case Dirtion_Forward:
            Forward();
            break;
          case Dirtion_Back:
            Back();
            break;
          case Dirtion_Left:
            Left();
            break;
          case Dirtion_Right:
            Right();
            break;
        }
      }
    }
  }
}

 

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注