2020-12-06

红外循迹小车的自主组装与程序烧录运行
上周通过对他人经验的借鉴与学习,对小车的组装与程序有了较为成熟的理解与体会 ,这次根据下文程序安装循迹模块等组件。
在安装过程中,有以下问题
1.会因不清单片机正级端而导致接线错误无法运行,就采用初中所学的检查方法试和排除,导出正确结果。
2.关于导线连接循迹模块与左右发动机,起初打算对公母线进行拆除改装为导线进行缠绕连接,但有接触不良与铜丝断裂现象频出,对连接后不能启动检查问题是造成很大麻烦 最后商议决定就仍采用焊接方式连接,锡形成氧化物膜会在一定程度上抵消环境湿度等对导线的不良影响。
在问题出现前,我们对整个电路设计进行自行规划与检验。将电源与单片机并联,单片机与循迹模块串联,以循迹模块为干路,其所控制的两个电机为支路进行简单连线,有了电路图与理论的研究在接线就显得清晰明了。
与此同时将以下程序导入stc89C516中进行测试
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit ENA = P2^0; //右点机使能
sbit IN1 = P2^1; //为0右轮反转
sbit IN2 = P2^2; //为0右轮正转
sbit IN3 = P2^3; //为0左轮正转
sbit IN4 = P2^4; //为0左轮反转
sbit ENB = P2^5; //左电机使能

sbit left1 = P1^3;
sbit left2 = P1^2;
sbit right1 = P1^1;
sbit right2 = P1^0;

u8 PWMCnt1 = 0;
u8 PWMCnt2 = 0;
u8 cntPWM1 = 0;
u8 cntPWM2 = 0;

void Timer0Init();
void XunJi();

void main()
{
Timer0Init();
while(1)
{
XunJi();

}	

}
// i = 1时, 大概延时10us
//void delay(u16 i)
//{
// while (i–);
//}

void Timer0Init()
{
TH0 = 0xFF;
TL0 = 0xA3;
TMOD &= 0xF0;
TMOD |= 0x01;
EA = 1;
ET0 = 1;
TR0 = 1;
}

void TurnRight1() //右转
{
IN1 = 0; //右轮反转
IN2 = 1;

IN3 = 0;	//左轮正转
IN4 = 1;
cntPWM1 = 70;
cntPWM2	= 55;

}

void TurnRight2() //右转
{
IN1 = 0; //右轮反转
IN2 = 1;

IN3 = 0;	//左轮正转
IN4 = 1;
cntPWM1 = 50;
cntPWM2	= 40;

}

void TurnLeft1() //左转
{
IN1 = 1;
IN2 = 0; //右轮正转

IN3 = 1;
IN4 = 0;   	//左轮反转
cntPWM1 = 55;
cntPWM2	= 70;

}

void TurnLeft2() //左转
{
IN1 = 1;
IN2 = 0; //右轮正转

IN3 = 1;
IN4 = 0;   	//左轮反转
cntPWM1 = 40;
cntPWM2	= 50;

}

void Forward() //前进
{
IN1 = 1;
IN2 = 0; //右轮正转

IN3 = 0;   	//左轮正转
IN4 = 1;

cntPWM1 = 40;
cntPWM2	= 40;

}

//void Backward() //后退
//{
// IN1 = 0; //右轮反转
// IN2 = 1;
//
// IN3 = 1;
// IN4 = 0; //左轮反转
// cntPWM1 = 30;
// cntPWM2 = 30;
//}

void Stop() //停止
{
IN1 = 0;
IN2 = 0;

IN3 = 0;
IN4 = 0;

}
void XunJi()

{
unsigned char flag = 0;

if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0))   //0 0 0 0
	flag = 0;

if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1))   //0 0 0 1
	flag = 1;

if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0))   //0 0 1 0
	flag = 0;

if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1))   //0 0 1 1
	flag = 1;

if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0))   //0 1 0 0
	flag = 0;

if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1))   //0 1 0 1
	flag = 4;

if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0))   //0 1 1 0
	flag = 0;

if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1))    //0 1 1 1
	flag = 1;

if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0))   //1 0 0 0
	flag = 3;

if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1))   //1 0 0 1
	flag = 0;

if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0))   //1 0 1 0
	flag = 2;
// ?
if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1))   //1 0 1 1
	flag = 0;

if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0))   //1 1 0 0
	flag = 3;
 //?
if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1))   //1 1 0 1
	flag = 0;

if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0))   //1 1 1 0
	flag = 3;

if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1))   //1 1 1 1
	flag = 5;

switch(flag)

{
case 0:Forward();break;

	case 1:TurnRight1();break;
	
	
	case 2:TurnRight2();break;
	
	
	case 3:TurnLeft1();break;
	
	
	case 4:TurnLeft2();break;


	default:Stop();break;
}

}

void InterruptTime0() interrupt 1
{
PWMCnt1++;
PWMCnt2++;

if(PWMCnt1  >= 200)
{
	PWMCnt1 = 0;
}
if(PWMCnt1 <= cntPWM1)
{
	ENA = 1;
}
else
{
	ENA = 0;
}

if(PWMCnt2 >= 200)
{
	PWMCnt2 = 0;
}
if(PWMCnt2 <= cntPWM2)
{
	ENB = 1;
}
else
{
	ENB = 0;
}

TH0 = (65536 - 50)/256;
TL0 = (65536 - 50)%256;

}
运行调试得到良好效果,但对与其循迹准确还有一些后觉问题,对本次学习成果较为满意,希望在调试完毕后进行更好的结果展示,随即开始多个配件的简单了解使用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值