/*
寻迹小车,由L298N驱动来控制车轮的转速和转动方向
由红外探测来控制L298N,四个红外探测,左边感应不到信号,就往左偏,右边感应不到信号,就往右偏
*/
#include <REGX52.H>
//#include "Delay.H"
#include "Timer0_Init.H"
#include "Timer1_Init.H"
//#include ".H"
//先声明一下,定义01为前轮,02为后轮,A(1、2)为左轮,B(3、4)为右轮
/*****************************01号L298N驱动IO口定义***************************/
sbit ENA_01=P0^0; //A端使能,PWM调速
sbit IN1_01=P0^1;
sbit IN2_01=P0^2;
sbit ENB_01=P0^3; //B端使能,PWM调速
sbit IN3_01=P0^4;
sbit IN4_01=P0^5;
/*****************************02号L298N驱动IO口定义***************************/
sbit ENA_02=P1^0; //A端使能,PWM调速
sbit IN1_02=P1^1;
sbit IN2_02=P1^2;
sbit ENB_02=P1^3; //B端使能,PWM调速
sbit IN3_02=P1^4;
sbit IN4_02=P1^5;
/*****************************红外检测IO口定义********************************/
sbit Infrared_Detection_01=P2^0;
sbit Infrared_Detection_02=P2^1;
sbit Infrared_Detection_03=P2^2;
sbit Infrared_Detection_04=P2^3;
unsigned long int Counter,Compare; //计数器,PWM比较值
void go() //全速前进,四驱,全正转
{
IN1_01=0; //前作轮正转
IN2_01=1;
IN3_01=0; //前右轮正转
IN4_01=1;
IN1_02=0; //后左轮正转
IN2_02=1;
IN3_02=0; //后右轮正转
IN4_02=1;
}
void stop() //停车,四驱,全制动
{
IN1_01=0; //前左轮制动
IN2_01=0;
IN3_01=0; //前右轮制动
IN4_01=0;
IN1_02=0; //后左轮制动
IN2_02=0;
IN3_02=0; //后右轮制动
IN4_02=0;
}
void turn_right() //右转弯
{
IN1_01=0; //前左轮正转
IN2_01=1;
IN3_01=1; //前右轮反转
IN4_01=0;
IN1_02=0; //后左轮正转
IN2_02=1;
IN3_02=1; //后右轮反转
IN4_02=0;
}
void turn_left() //左转弯
{
IN1_01=1; //前左轮反转
IN2_01=0;
IN3_01=0; //前右轮正转
IN4_01=1;
IN1_02=1; //后左轮反转
IN2_02=0;
IN3_02=0; //后右轮正转
IN4_02=1;
}
void Infrared_Detection_go() //红外探测全速直行
{
if(Infrared_Detection_01==0&&Infrared_Detection_02==0&&Infrared_Detection_03==0&&Infrared_Detection_04==0) go();
}
void Infrared_Detection_turn_right() //红外探测右转
{
if(Infrared_Detection_01==1&&Infrared_Detection_02==0) turn_right();
}
void Infrared_Detection_turn_left() //红外探测左转
{
if(Infrared_Detection_01==0&&Infrared_Detection_02==1) turn_left();
}
void Infrared_Detection_stop()
{
if(Infrared_Detection_01==1&&Infrared_Detection_02==1&&Infrared_Detection_03==1&&Infrared_Detection_04==1) stop();
}
void main() //主函数执行
{
Timer0_Init();
Timer1_Init();
Compare=30;
while(1)
{
Infrared_Detection_go();
Infrared_Detection_turn_right();
Infrared_Detection_turn_left();
Infrared_Detection_stop();
}
}
void Timer0_Routine() interrupt 1 //100us@12.000MHz
{
TL0 = 0x9C; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
Counter++;
Counter%=100; //如果Counter==100,Counter赋值为0 //%10
if(Counter>Compare)
{
ENA_01=1;
ENB_01=1;
ENA_02=1;
ENB_02=1;
}
else
{
ENA_01=0;
ENB_01=0;
ENA_02=0;
ENB_02=0;
}
}