C51蓝牙串口&循迹小车代码实现

/***********************头文件**************************/
#include <regx52.h>



/************************位声明*************************/
/*红外信号位*/
sbit Inf_Headr	 = P0^5;
sbit Inf_Right_1 = P0^4;
sbit Inf_Right_2 = P0^3;
sbit Inf_Center  = P0^2;
sbit Inf_Left_1  = P0^1;
sbit Inf_Left_2  = P0^0;
/*寻路舵机*/
sbit Motor = P3^5;
/*测距模块信号源*/
sbit Trig  = P2^1;
sbit Echo  = P2^2;
/*µ电机驱动模块*/
sbit EN_Right  = P1^5;
sbit EN_Left   = P1^0;
sbit in_Right1 = P1^4;
sbit in_Right2 = P1^3;
sbit in_Left1  = P1^2;
sbit in_Left2  = P1^1;
/*LED*/
sbit LED       = P2^0;

/***********蓝牙模块串口*********/
void HC_06_Init();		                   		//串口初始化
void HC_06_SendData(unsigned char Data);		//发送
void HC_06_Interrupt();							//串口中断


/*************************************/
/***********Pwm调速**********/
void Turn_Right(unsigned char pwm);					//右转
void Turn_Left(unsigned char pwm);					//左转
void Go_Forword(unsigned char speed);				//前进
void Go_Back(unsigned char speed);					//后退
void Stop();										//停
void Timer0_PWM_init();								//PWM
void Timer0_Interrupt();							//


/**************************************/
/**************舵机偏转角度*************/
void Mot_Angle(unsigned char _angle);
/***************************************/
/**************LED**************/
void Control_LED(unsigned char led_switch);
/*************红外寻迹模式***************/
void Inf_mode();
/***************************************/
/*****************变量声明**************/
unsigned char PWM=10;
unsigned char pwm_count;			//PWM计时
unsigned char motor_count;			//舵机计时
unsigned char angle;
bit mode;
/*************************/

/********************************************************/
/*************************主程序*************************/
/********************************************************/

void main()
{

	//初始化
	HC_06_Init();
	Timer0_PWM_init();
	
	while(1)		//主循环判断红外状态
	{
		if(mode==1)
			Inf_mode();

	}
	
}


//函数定义

//蓝牙串口init
void HC_06_Init()
{
	PCON |= 0x80;
	SCON = 0x50;
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xFA;
	TH1 = 0xFA;
	ET1 = 0;
	TR1 = 1;
	
	ES=1;
	EA=1;
}

//发送
void HC_06_SendData(unsigned char Data)
{
	TI=1;
	SBUF=Data;
	while(TI==0);
	TI=0;
	
}

//接收---控制
void HC_06_Interrupt() interrupt 4
{
	if(RI==1)
	{

		if(SBUF==0x41)
			Go_Forword(PWM);	//前进
		else if(SBUF==0x42)
			Turn_Left(PWM);		//左转
		else if(SBUF==0x43)
			Stop();						//停
		else if(SBUF==0x44)
			Turn_Right(PWM);	//右转
		else if(SBUF==0x45)
			Go_Back(PWM);			//后退
		else if(SBUF==0x76)
			Control_LED(0);		//LED开
		else if(SBUF==0x2d)
		{
			PWM-=5;						//减速
			HC_06_SendData(PWM);
		}
		else if(SBUF==0x2b)
		{
			PWM+=5;						//加速
			HC_06_SendData(PWM);
		}
		else if(SBUF==0x51)	//红外模式
			mode=1;	
		else if(SBUF==0x57)	//蓝牙模式
			mode=0;	
		
		
		RI=0;
	}
}


void Turn_Right(unsigned char pwm)
{
	PWM=pwm;
	
	in_Right1=1;
	in_Right2=0;
	
	in_Left1=1;
	in_Left2=0;
}



void Turn_Left(unsigned char pwm)
{
	PWM=pwm;
	
	in_Right1=0;
	in_Right2=1;
	
	in_Left1=0;
	in_Left2=1;
	
}


void Go_Forword(unsigned char speed)
{
	PWM=speed;
	
	in_Right1=0;
	in_Right2=1;
	
	in_Left1=1;
	in_Left2=0;
	
}


void Go_Back(unsigned char speed)
{
	PWM=speed;
	
	in_Right1=1;
	in_Right2=0;
	
	in_Left1=0;
	in_Left2=1;
	
}


void Stop()
{
	in_Left1=0;
	in_Left2=0;
	
	in_Right1=0;
	in_Right2=0;
}



void Timer0_PWM_init()
{

	TMOD &= 0xF0;
	TL0 = 0xF5;
	TH0 = 0xF5;
	TF0 = 0;
	TR0 = 1;

	ET0=1;
	EA=1;
	PT0=0;
	
}


void Timer0_Interrupt() interrupt 1
{
	TL0 = 0xF5;
	TH0 = 0xF5;
	pwm_count++;
	if(pwm_count<PWM)
	{
		EN_Right=1;
		EN_Left=1;
	}
	else
	{
		EN_Right=0;
		EN_Left=0;
	}

	//
	if(pwm_count>=100)
		pwm_count=0;
		
}



void Mot_Angle(unsigned char _angle)
{
	angle=_angle;
}


void Control_LED(unsigned char led_switch)
{
	switch(led_switch)
	{
		case 0:
			LED=0;
		case 1:
			LED=1;
	}
}




void Inf_mode()
{

		if(Inf_Center==1&&Inf_Right_1==0&&Inf_Right_2==0&& Inf_Left_1==0&&Inf_Left_2==0)
			Go_Forword(16);
		else if(Inf_Center==0&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==0&&Inf_Left_2==0)
			Go_Forword(14);
		
		else if(Inf_Center==1&& Inf_Right_1==1&&Inf_Right_2==0&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(30);
		else if(Inf_Center==1&& Inf_Right_1==1&&Inf_Right_2==1&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(35);
		else if(Inf_Center==1&& Inf_Right_1==0&&Inf_Right_2==1&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(35);
		
		else if(Inf_Center==0&& Inf_Right_1==1&&Inf_Right_2==0&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(30);
		else if(Inf_Center==0&& Inf_Right_1==1&&Inf_Right_2==1&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(35);
		else if(Inf_Center==0&& Inf_Right_1==0&&Inf_Right_2==1&&Inf_Left_1==0&&Inf_Left_2==0)
			Turn_Right(35);
		
		
		
		else if(Inf_Center==1&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==1&&Inf_Left_2==0)
			Turn_Left(30);
		else if(Inf_Center==1&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==0&&Inf_Left_2==1)
			Turn_Left(35);
		else if(Inf_Center==1&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==1&&Inf_Left_2==1)
			Turn_Left(35);
		
		else if(Inf_Center==0&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==1&&Inf_Left_2==0)
			Turn_Left(30);
		else if(Inf_Center==0&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==0&&Inf_Left_2==1)
			Turn_Left(35);
		else if(Inf_Center==0&& Inf_Right_1==0&&Inf_Right_2==0&&Inf_Left_1==1&&Inf_Left_2==1)
			Turn_Left(35);
	
		else if(Inf_Center==1&& Inf_Right_1==1&&Inf_Right_2==1&&Inf_Left_1==1&&Inf_Left_2==1)
			Stop();
		
		if(Inf_Headr==0)
		{
			Turn_Left(35);
		}
}



  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!以下是一个简单的C51单片机三路循迹小车代码示例: ```c #include &lt;reg52.h&gt; sbit left_sensor = P2^0; // 左传感器引脚 sbit middle_sensor = P2^1; // 中间传感器引脚 sbit right_sensor = P2^2; // 右传感器引脚 sbit left_motor1 = P1^0; // 左电机引脚1 sbit left_motor2 = P1^1; // 左电机引脚2 sbit right_motor1 = P1^2; // 右电机引脚1 sbit right_motor2 = P1^3; // 右电机引脚2 void delay(unsigned int count) { unsigned int i, j; for (i = 0; i &lt; count; i++) { for (j = 0; j &lt; 120; j++) { } } } void main() { while (1) { if (left_sensor == 0 &amp;&amp; middle_sensor == 0 &amp;&amp; right_sensor == 0) { // 全黑,小车停止 left_motor1 = 0; left_motor2 = 0; right_motor1 = 0; right_motor2 = 0; } else if (left_sensor == 0 &amp;&amp; middle_sensor == 0 &amp;&amp; right_sensor == 1) { // 左黑,中黑,右白,小车左转 left_motor1 = 0; left_motor2 = 1; right_motor1 = 1; right_motor2 = 0; } else if (left_sensor == 1 &amp;&amp; middle_sensor == 0 &amp;&amp; right_sensor == 0) { // 左白,中黑,右黑,小车右转 left_motor1 = 1; left_motor2 = 0; right_motor1 = 0; right_motor2 = 1; } else if (left_sensor == 0 &amp;&amp; middle_sensor == 1 &amp;&amp; right_sensor == 0) { // 左黑,中白,右黑,小车直行 left_motor1 = 1; left_motor2 = 0; right_motor1 = 1; right_motor2 = 0; } else if (left_sensor == 0 &amp;&amp; middle_sensor == 1 &amp;&amp; right_sensor == 1) { // 左黑,中白,右白,小车直行 left_motor1 = 1; left_motor2 = 0; right_motor1 = 1; right_motor2 = 0; } else if (left_sensor == 1 &amp;&amp; middle_sensor == 1 &amp;&amp; right_sensor == 0) { // 左白,中白,右黑,小车直行 left_motor1 = 1; left_motor2 = 0; right_motor1 = 1; right_motor2 = 0; } else if (left_sensor == 1 &amp;&amp; middle_sensor == 0 &amp;&amp; right_sensor == 1) { // 左白,中黑,右白,小车直行 left_motor1 = 1; left_motor2 = 0; right_motor1 = 1; right_motor2 = 0; } else { // 其他情况,小车停止 left_motor1 = 0; left_motor2 = 0; right_motor1 = 0; right_motor2 = 0; } } } ``` 以上代码中,通过读取三个传感器的状态来判断循迹小车的位置,根据不同的情况控制电机的转动方向实现循迹功能。请注意,此代码示例仅供参考,具体电路连接和传感器响应方式可能会有所不同,请根据自己的实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱码士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值