C51——跟随小车实现

红外跟随模块
1、模块原理:发射红外线,能反射回来就输出低电平0,反射不回来输出高电平1

2、接线,gnd接地,vcc接5v,out接信号线

3、原理:前边有物体时,红外线能被反射回来,输出低电平0,前边没有物体时,输出高电平1
向前:两个传感器都能返回信号,都输出低电平0,两个信号灯都亮
向左:左边传感器能反射回来输出低电平0,右边反射不回来输出高电平1(左信号灯亮,右信号灯不亮)
向右:左边传感器返回不了信号,输出高电平1,右边传感器能返回信号,输出低电平0(左信号灯不亮,右信号灯亮)

代码实现:

1.

main.c

#include "reg52.h"//代码里边没有,sbit i/o口,可以不要声明
//#include "intrins.h"//代码里边没有_nop_();可以不要该声明
#include "motor.h"
#include "dalay.h"
#include "uart.h"
#include "esp.h"
#include "pwm.h"
extern char speedleft;
extern char speedright;

//sbit xjleftsenser=P2^6;
//sbit xjrightsenser=P2^7;
sbit gsleftsenser=P2^4;
sbit gsrightsenser=P2^5;
void main()
{
//	Delay1000ms();
  time0init();
	time1init();
//	UartInit();

 // init_esp();
  while(1){
   /* if(xjleftsenser==0&&xjrightsenser==0){
      speedleft=40;
	  	speedright=40;
    }
	  if(xjleftsenser==1&&xjrightsenser==0){
      speedleft=10;
	  	speedright=40;
    }
  	if(xjleftsenser==0&&xjrightsenser==1){
      speedleft=40;
	  	speedright=10;
    }
    if(xjleftsenser==1&&xjrightsenser==1){
      speedleft=0;
		  speedright=0;
    }*/
    if(gsleftsenser==0&&gsrightsenser==0){
      speedleft=40;
	  	speedright=40;
    }
		 if(gsleftsenser==1&&gsrightsenser==1){
      speedleft=40;
	  	speedright=40;
    }
	  if(gsleftsenser==0&&gsrightsenser==1){
      speedleft=0;
	  	speedright=40;
    }
  	if(gsleftsenser==1&&gsrightsenser==0){
      speedleft=40;
	  	speedright=0;
    }
	/*	if(gsleftsenser==1&&gsrightsenser==1){
      speedleft=0;
	  	speedright=0;
  	}*/
  }
	  while(1);
}

 2.

motor.c

#include "reg52.h"

sbit right1=P3^2;
sbit right2=P3^3;
sbit left1=P3^4;
sbit left2=P3^5;


void goforwardleft()
{
  left1=0;
	left2=1;
}
void goforwardright()
{
	right1=0;
	right2=1;
}
void goforward()
{
  left1=0;
	left2=1;

	right1=0;
	right2=1;
}
void goback()
{
  left1=1;
	left2=0;
	right1=1;
	right2=0;
}
void goleft()
{
  left1=0;
	left2=0;
	right1=0;
	right2=1;
}
void goright()
{
  left1=0;
	left2=1;
	right1=0;
	right2=0;
}
void stop()
{
  left1=0;
	left2=0;
	right1=0;
	right2=0;
}
void stopleft()
{
  left1=0;
	left2=0;
;
}
void stopright()
{
	right1=0;
	right2=0;
}

motor.h

void goback();

void goforward();

void goleft();

void goright();

void stop();

void goforwardleft();

void goforwardright();

void stopleft();

void stopright();

 3.

pwm.c

#include "reg52.h"
#include "motor.h"
char time_left=0;
char time_right=0;
char speedleft;
char speedright;

void time0init()
{
  TMOD=0x01;//定义模式为16位寄存器
	TL0=0x33;//定义开始时间,赋初值
	TH0=0xFE;
	TR0=1;//计时开始,直到计时结束TF0才为1
	TF0=0;
	ET0=1;//打开定时器0中断
	EA=1;//打开总中断
}

void time0hander()interrupt 1//定时器寄存器溢出,此时TF0=1,中断发生,TF0置0,重新循环
{
	  time_left++;//用来计数
	  TL0=0x33;//重新赋初值
    TH0=0xFE;
	  if(time_left<speedleft){
        goforwardleft();
    }
		else{
        stopleft();
    }
	  if(time_left==40){
			 time_left=0;//循环100次为1s,重新循环

    }
}
void time1init()
{
  TMOD&=0x0F;//定义模式为16位寄存器
	TMOD|=0x1<<4;
	TL1=0x33;//定义开始时间,赋初值
	TH1=0xFE;
	TR1=1;//计时开始,直到计时结束TF0才为1
	TF1=0;
	ET1=1;//打开定时器0中断
	EA=1;//打开总中断
}
void time1hander()interrupt 3//定时器寄存器溢出,此时TF0=1,中断发生,TF0置0,重新循环
{
	  time_right++;//用来计数
	  TL1=0x33;//重新赋初值
    TH1=0xFE;
	  if(time_right<speedright){
        goforwardright();
    }
		else{
        stopright();
    }
	  if(time_right==40){
			 time_right=0;//循环100次为1s,重新循环

    }
}

pwm.h

void time0init();
void time1init();

 4.

uart.c

#include "reg52.h"
#include "motor.h"
#include "string.h"
#include "dalay.h"
#include "esp.h"

#define SIZE 12
sfr AUXR=0x8E;//不认识AUXR,报错需要声明
char buffer[SIZE];


extern char AT_ok_flag;

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR=0x01;
	SCON=0x50;//配置串口工作方式1,ren能接收01000000
	TMOD&=0x0F;
	TMOD|=0x20;//定时器1的工作方式8位自动重装配置
	TH1=0xFD;
	TL1=0xFD;//9600波特率的初值
	TR1=1;//启动定时器
	EA=1;//打开总中断
	ES=1;//允许串口中断
}



void uart_toutine()interrupt 4
{
  static int i = 0;
	char tmp;

	if(RI)
	{
  	RI = 0;
			tmp = SBUF;
			if(tmp=='M'||tmp=='W'||tmp=='O'||tmp=='L'){//WIFI GOT IP中既包含W、又包含F,底下条件满足FI,D5亮
				i = 0;
			}
			buffer[i++] = tmp;
			if(buffer[0] == 'O' && buffer[1] == 'K'){
				AT_ok_flag	= 1;
				memset(buffer, '\0', SIZE);
			}
			if(buffer[0] == 'L' && buffer[1] == '0'){
				D5	= 0;
				memset(buffer, '\0', SIZE);
			}
			if(buffer[0] == 'L' && buffer[1] == '1'){
				D5	= 1;
				memset(buffer, '\0', SIZE);
			}
      if(buffer[0] == 'M'){
        switch(buffer[1]){
          case '1':
					  goforward();
				  	Delay10ms();
					  break;
					case '2':
					  goleft();
					  Delay10ms();
					  break;
					case '3':
					  goright();
			  		Delay10ms();
					  break;
					case '4':
						goback();
					  Delay10ms();
					  break;
					default:
						stop();
					  break;
        }
      }
	}
	if(i == 12){
	memset(buffer, '\0', SIZE);
  i = 0;
  }

}

uart.h



void UartInit();		//9600bps@11.0592MHz

 5.

esp.c

#include "reg52.h"
#include "dalay.h"
#include "uart.h"

code char LJWL[]="AT+CWJAP=\"Xiaomi_7EC3\",\"xiaomi123\"\r\n";
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char KQTC[]="AT+CIPMODE=1\r\n";
char KQFS[]="AT+CIPSEND\r\n";
sbit D6=P3^6;
sbit D5=P3^7;
char AT_ok_flag;

void senddata(char c)
{
	SBUF=c;

  while(!TI);
  TI=0;
}
void sendstring(char*str)
{
  while(*str!='\0'){
    senddata(*str);
		str++;
  }
}

void init_esp()
{
Delay1000ms();
	sendstring(LJWL);

	while(!AT_ok_flag);
	D6=0;
	AT_ok_flag=0;
	D6=1;
  sendstring(LJFWQ);
	D5=1;
  while(!AT_ok_flag);
	AT_ok_flag=0;
	sendstring(KQTC);
	D6=0;
	while(!AT_ok_flag);
	AT_ok_flag=0;
  sendstring(KQFS);
	D6=1;
	while(!AT_ok_flag);
	

	if(AT_ok_flag){
    D6=0;
		D5=0;
  }

}

esp.h

sbit D6=P3^6;
sbit D5=P3^7;

void init_esp();

 6.

dalay.c

#include "intrins.h"

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}

dalay.h

	void Delay1000ms();
	void Delay10ms();
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C51单片机智能小车是一种基于C51单片机控制的智能小车,它可以通过接收传感器信号进行动作控制和决策。这种小车在现实生活中有着广泛的应用,比如自动导航、物流配送等。 关于C51单片机智能小车的焊接资料,一般包括以下几方面的内容: 1. 焊接指南:指导如何进行焊接工作,包括焊接时的注意事项、焊接温度、焊接时间等。 2. 焊接材料清单:列出所需焊接材料的名称、规格、数量等信息,包括焊接丝、焊锡膏、焊接枪等。 3. 焊接电路图:提供C51单片机智能小车的电路图,包括各个传感器、电机、驱动芯片等元器件的连接方式和接口定义。 4. 焊接工具清单:列出所需焊接工具的名称、规格、数量等信息,包括焊接枪、剥线钳、镊子等。 5. 焊接步骤:详细介绍焊接工作的步骤和要领,包括焊接顺序、焊接步骤、焊接位置等。 6. 焊接技巧:介绍一些常见的焊接技巧和注意事项,比如焊接时的手法、焊接温度控制、焊接接头的质量检查等。 在进行焊接工作时,需要注意安全操作,避免因操作不当造成危险。此外,建议提前阅读相关焊接指南和使用说明书,保证正确使用焊接材料和工具,避免对自身和设备造成损害。 总之,C51单片机智能小车焊接资料提供了有关焊接工作的指导和参考,帮助用户进行焊接工作,确保智能小车的稳定运行和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值