/
//
//2.2引脚坏的
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN11=P2^0;//左轮
sbit IN12=P2^1;
sbit IN21=P2^7;//右轮
sbit IN22=P2^6;
sbit ENA=P2^4;//left使能
sbit ENB=P2^5; //right使能
sbit P15 = P1^5; //金属传感器检测器 //左
sbit P16 = P1^6; // 中
sbit P17 = P1^7; //右
#define Left_moto_go {IN11=0,IN12=1;} // 左电机前进
#define Left_moto_back {IN11=1,IN12=0;} // 左电机后退
#define Right_moto_go {IN21=0,IN22=1;} //右电机前进
#define Right_moto_back {IN21=1,IN22=0;} //右电机后退
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/100 推动 //计算占空比时N的值(人工改变值)
unsigned char pwm_val_right =0; //通过它来实现PWM的改变(通过FOR循环)
unsigned char push_val_right=0;// 右电机占空比N/100
enum Status
{
turn_left,
turn_right,
straight }
st ;
void pwm_out_left_moto(void) // 左电机调速
{
pwm_val_left%=100;
if(pwm_val_left<push_val_left)
ENA=1;
else { ENA=0; }
}
void pwm_out_right_moto(void) // 右电机调速
{
pwm_val_right%=100;
if(pwm_val_right<push_val_right)
ENB=1;
else {ENB=0;}
}
void timer0() interrupt 1 using 2 //TIMER0中断服务子函数产生PWM信号
{
TH0=0XFe; //0.1Ms定时
TL0=0Xa3;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void main(void)
{
TMOD =0X01; //定时器T0,方式1
TL0=0Xa3;//初值
TH0=0XFe;
TF0=0;
TR0=1;//定时器0开始计时
EA=1;//定时器总开关
ET0=1;
PT0=0;//中断优先级
st=straight;
while(1)
{
switch (st)
{
case turn_left:
{push_val_left =10;push_val_right =10;Right_moto_go;Left_moto_back;} break;
case turn_right:
{push_val_left =10; push_val_right =10;Right_moto_back;Left_moto_go;}break;
case straight:
{push_val_left =23; push_val_right =23;Right_moto_go;Left_moto_go;} break;//17
}
if(P15==0&&P17==1&&P16==1) st=turn_left;
else if(P15==1&&P17==0&&P16==1)st=turn_right;
else if(P15==1&&P17==1&&P16==0)
{
if(st==turn_left||st==turn_right)st=straight;
}
}
}
转弯状态到直线状态的转变,三个传感器会有些乏力,可以用四个传感器,左大转,左小转,右大转,右小转,转弯时候是大转,直线时候是小转,可能会循迹寻得更快。