stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头

1、实验目的:
利用stc8a8k的内置硬件PWM,这里用到P20,P21产生PWM,调节占空比,调小车速度;
熟悉按键和IO口的读取功能;
2、实现效果,
按下按键开始,两秒后,小车启动,然后循迹,到达2终点,达到以1为起点,2为终点,在2地方调头,然后继续循迹的功能。
在这里插入图片描述
3、接线:
(1)5个循迹模块
循迹模块不拘于其他型号,循迹就行。
从左边都右边,名字是L1S,意思是左边第一个传感器,left1sensor.
L1S–L0S–MS–R0S–R1S
分别接到
P10–P11–P12–P13–P14
在这里插入图片描述
(2)小车的电机接线
接驱动模块的输出端
1)左边轮子的两根线:接
AO2 AO1,
调速线用P20
P04----AIN2
P05----AIN1
在这里插入图片描述

,电路板原理图,看原理图,已连接;
2)右边轮子的两根线:接
BO2 BO1,调速用P21,
P06—BIN1
P07----BIN2
电路板原理图已连接,看原理图;
在这里插入图片描述

3)VM和VCC用跳线帽短接;给电机使用
(3)电源接线
外面电源大于5V。
电池正极----INPOWER
电池负极----GND
通过7805降压模块,降到5V,给单片机的电压。
(4)屏幕,直插到对应排母端口;
(5)下载器,插到对应的下载端口。
(6)按键,根据自己喜欢进行接线,这里用的是连接到P34的那个按键。

4、编程思路:
(1)测试PWM是不是正常,可以调节占空比;
(2)调试的时候,如果电机的正转、反转和我们的程序设定的不一样,那么可以对换两根电机的线,比如电机线A接到AO2,电机线B接到AO1,那么就对换一下,A接到AO1,B接到AO2。
(3)流程图:
在这里插入图片描述
在这里插入图片描述

(3)测试程序1

//*****************************************************************************************************下面是主函数
//*******************************************主函数
void main()
{
	//每个外设,比如按键,屏幕,PWM等内部资源的初始化,配置一下环境
	OLED_Init();
	HPWM_Init();
	OLED_ShowString(0,0,"Press Start,Please...");	
	
  delay_tms(100);
	//*********************************************正式执行程序
  while(1)
	{	
		//*****************************
		//检测按键是不是按下,开始启动
		if(key==0)
		{
			delay_tms(10);//延时去抖动
			if(key==0)
			{	
				startflag=1;
			  OLED_ShowString(0,0,"I am running,GO,GO...");	
				
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
		}	
	 }		
		//**********************如果开始标记等于1,说明按下启动键,这时候小车才开始跑
		if(startflag==1)
		{
			//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑	
			qianjin(vturnsmallM,vturnbigM);//左da转弯,转到碰到中线停止
			delay_tms(2000);
			
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
			
				qianjin(vturnsmall,vturnbig);//左da转弯,转到碰到中线停止
			delay_tms(2000);
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
			
				//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑	
			qianjin(vturnbigM,vturnsmallM);//左da转弯,转到碰到中线停止
			delay_tms(2000);
			
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
			
				qianjin(vturnbig,vturnsmall);//左da转弯,转到碰到中线停止
			delay_tms(2000);
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
		//	trackline0();	
		}
	
 }
}

测试是不是能够正常大转弯,小转弯,直接行走

最后程序2

#include<stc8a8k.h>
#include<oled.h>
#include<delay.h>
#include "hpwm.h"
//***************************************************************************下面是接线定义
//左电机
sbit LPWM=P2^0;//电机调节速度的信号
sbit LA2=P0^4;
sbit LA1=P0^5;
//右电机
sbit RPWM=P2^1;
sbit RA2=P0^6;
sbit RA1=P0^7;
//接传感器
sbit L1S=P1^0;
sbit L0S=P1^1;
sbit MS=P1^2;
sbit R0S=P1^3;
sbit R1S=P1^4;
//*************************************
sbit key=P3^4;//接按键
sbit beep=P0^3;//接蜂鸣器
sbit led=P0^0;//接LED报警灯

//****************************************************************************下面是全局变量的定义,每个函数都能使用
//定义黑白线的信号,根据实际模块定义,1是高电平,0是低电平,后面如果换模块,
//不同模块的情况不一样,有些是碰到黑线是1,有些是0,就很容易修改
unsigned char blackline=1;
unsigned char whiteline=0;
unsigned char startflag=0;
//这里定义变量,后面如果小车需要调节速度,比较方便修改,直接改这里就好了。
float vleftmove=0.4;
float vrightmove=0.4;//直线行走的速度

float vturnbig=0.55;
float vturnsmall=0.25;//转弯的速度差速度,一个是大,一个小,小转弯差速度

float vturnbigM=0.75;
float vturnsmallM=0.1;//转弯的速度差速度,大转弯差速度
//**************************************************************************************************下面是子函数的定义、或者声明
//循迹函数声明,先声明后定义,不然main都不知道有这个函数,在main函数后面定义具体程序代码
//****************************************************************子函数0:函数声明;void trackline0();
void trackline0();
//****************************************************************子函数1:qianjin(float vleft,float vright)
//这个是定义,不声明,后面main函数可以直接用,
//小车前进,根据速度两个轮子速度差,进行前进,转弯等
void qianjin(float vleft,float vright)
{
  HPWM_Set(0,8000,vleft);
	LA2=1;
  LA1=0;
	
	HPWM_Set(1,8000,vright);
	RA2=1;
  RA1=0;
	
}
//****************************************************************子函数2:void back(float vleft,float vright)
//小车后退程序,一个轮子正转,一个反转
void back(float vleft,float vright)
{
  HPWM_Set(0,8000,vleft);
	LA2=0;
  LA1=1;
	
	HPWM_Set(1,8000,vright);
	RA2=1;
  RA1=0;
	
}
//****************************************************************子函数3:void stop()
//小车停止
void stop()
{ 
	LA2=0;
  LA1=0;
	
	RA2=0;
  RA1=0;
}
//*****************************************************************************************************下面是主函数
//*******************************************主函数
void main()
{
	//每个外设,比如按键,屏幕,PWM等内部资源的初始化,配置一下环境
	OLED_Init();
	HPWM_Init();
	OLED_ShowString(0,0,"Press Start,Please...");	
	
  delay_tms(100);
	//*********************************************正式执行程序
  while(1)
	{	
		//*****************************
		//检测按键是不是按下,开始启动
		if(key==0)
		{
			delay_tms(10);//延时去抖动
			if(key==0)
			{	
				startflag=1;
			  OLED_ShowString(0,0,"I am running,GO,GO...");	
				
				stop();
				delay_tms(2000);//延时,按下两秒之后,小车开始启动进行循迹
		}	
	 }		
		//**********************如果开始标记等于1,说明按下启动键,这时候小车才开始跑
		if(startflag==1)
		{
			//开始循迹,请看这部分代码,太长了,单独拉出来写,方便看主程序逻辑	
     	trackline0();	
		}
	
 }
}

//***********************************下面是前面声明的函数的定义
//**************************************************************//函数定义trackline0();
//**************************************************************功能:按键循迹;
void trackline0()
{
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第1种情况
	if(L1S==blackline &&L0S==whiteline  && MS==whiteline && R0S==whiteline&& R1S==whiteline)//1 0 0 0 0 
	{
		qianjin(vturnsmallM,vturnbigM);//左da转弯,转到碰到中线停止
		while(1)
		{
			if(MS==blackline)break;
		}
		
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第2种情况
	else if(L1S==whiteline &&L0S==blackline  && MS==whiteline && R0S==whiteline&& R1S==whiteline)//0 1 0 0 0 
	{
		qianjin(vturnsmall,vturnbig);//左xiao转弯
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第3种情况
	else if(L1S==whiteline &&L0S==whiteline  && MS==blackline && R0S==whiteline&& R1S==whiteline)//00 1 0 0 
	{
		qianjin(vleftmove,vleftmove);//直走
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第4种情况	
	else if(L1S==whiteline &&L0S==whiteline  && MS==whiteline && R0S==blackline&& R1S==whiteline)//0 0 0 1 0 
	{
		qianjin(vturnbig,vturnsmall);//左xiao转弯vturnbig vturnsmall
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第5种情况
		else	if(L1S==whiteline &&L0S==whiteline  && MS==whiteline && R0S==whiteline&& R1S==blackline)//1 0 0 0 0 
	{
		qianjin(vturnbigM ,vturnsmallM);//左da转弯vturnbigM  vturnsmallM,碰到黑线,不然一直大转弯
		while(1)
		{
			if(MS==blackline)break;
		}
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第6种情况	
	else 	if(L1S==blackline && L0S==blackline && R0S==whiteline )//11x00 判断是左转90度
	{
		 stop();
		 delay_tms(500);
		 qianjin(vturnsmall,vturnbig);//左转弯
		 delay_tms(100);
		 while(1)
			{		
				if(R0S==blackline)break;
			}	
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第7种情况
	else 	if( L1S==whiteline &&L0S==whiteline &&R0S==blackline && R1S==blackline)//00x11 判断是右转90度
	{
		stop();
		delay_tms(1000);
  	qianjin(vturnbig,vturnsmall);//
	  delay_tms(10);
		  while(1)		 
			{ 
				if(L0S==blackline)break;
			}
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第8种情况
		else 	if(L1S==blackline &&L0S==blackline&& MS==blackline && R0S==blackline)//1111x 判断是终点,调头
	{
		
		  qianjin(vleftmove,vleftmove);
		  delay_tms(500);
		
	  	stop();
		  delay_tms(1000);
	  	back(vleftmove,vleftmove);
			delay_tms(500);
			  while(1)//如果中间的传感器碰到黑线,就跳出循环
				{		 
					if(MS==blackline)break;		
				}
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++第9种情况	这是极端情况,放在最后面判断
	else 	if(L1S==whiteline &&L0S==whiteline && MS==whiteline && R0S==whiteline && R1S==whiteline)//000找不到直线,如如果前面是直走,就转360度,如果是之前右边,就左转,之前左偏,就右转
	{
    qianjin(vturnbig,vturnsmall);//
	}
				
}
  • 32
    点赞
  • 258
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
STC8A8K循迹小车是一种基于STC8A8K单片机的智能小车。它具有自动模式和手动模式,可以通过超声波避障、红外避障等传感器自动避障,也可以通过红外遥控、无线NRF24l01遥控、WIFI ESP8266遥控、蓝牙遥控等方式进行手动控制。该小车可以实现前进、后退、左转、右转、停止等基本动作,并且还具有可调的1-7挡速度。OLED屏幕被用来显示主界面和其他相关信息。 该小车使用的是STC8A8K系列单片机,可以使用内部晶振电路,无需外部晶振,并且一般上电即可复位,不需要使用RC复位电路。 STC8A8K单片机是STC89C52等51单片机的增强版本,具有更高的性能和更多的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [循迹小车讲解二:控制系统1--单片机基础知识。](https://blog.csdn.net/lmf666/article/details/109214202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Stc8A8K小车简化.zip](https://download.csdn.net/download/lengyuefeng212/12236713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值