?本程序硬件使用:
- MCU:STC12系列单片机
- 驱动:LM298模块
- 传感器:四组光电对管传感器,使用数字输出端
- 电机:直流减速电机。采用两侧驱动方式
#include "STC12C5A60S2.H"
// 该小车使用LM298模块驱动两侧直流电机
// LM298控制端 端口映射
sbit ENA=P0^0; //使能端A
sbit ENB=P0^1; //使能端B
sbit IN1=P1^0; //四个控制端
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
// 寻迹光电对管数字输出端 端口映射
// 车头部 共计4个光电对管
sbit LeftOutside=P2^0; //左外侧
sbit LeftInside=P2^1; //左内测
sbit RightINside=P2^2; //右内测
sbit RightOutside=P2^3; //右外侧
// 两侧电机工作状态宏定义
#define LeftWork {ENA=1;IN1=1;IN2=0;} //左侧前进
#define RightWork {ENB=1;IN3=3;IN4=0;} //右侧前进
#define LeftStop {ENA=0;IN1=0;IN2=0;} //左侧停止
#define RightStop {ENB=0;IN3=0;IN4=0;} //右侧停止
#define LeftBack {ENA=1;IN1=0;IN2=1;} //左侧后腿
#define RightBack {ENB=1;IN1=0;IN2=1;} //右侧停止
//整车工作状态函数
void Forward(){ //前进
LeftWork;
RightWork;
}
void Stop(){ //停止
LeftStop;
RightStop;
}
void LeftTurnHigh(){ //左转弯 大弯,
LeftStop;
RightWork;
}
void RightTurnHigh(){ //右转弯 大弯
LeftWork;
RightStop;
}
void LeftTurnLow(){ //左转弯 小弯
LeftBack;
RightWork;
}
void RightTurnLow(){ //右转弯 小弯
LeftWork;
RightBack;
}
// 主函数
void main(){
unsigned char StateFlag=0; //工作状态标志位
unsigned char SensorFlag=0; //传感器状态标志位
// StateFlag 0 没有飞出风险
// 1 右飞出风险
// 2 左飞出风险
while(1){
SensorFlag=P2 & 0x0f; //读取传感器状态
switch (SensorFlag){
// 全白
case 0x00: {
if (StateFlag==1) LeftTurnLow();
else if(StateFlag==2) RightTurnLow();
else if(StateFlag==0) Forward();
break;}
// 左外压黑线
case 0x01: {LeftTurnLow();StateFlag=1;break;}
// 左内压黑线
case 0x02: {LeftTurnHigh();StateFlag=0;break;}
// 左内外都压黑线
case 0x03: {LeftTurnHigh();StateFlag=0;break;}
// 右内压黑线
case 0x04: {RightTurnHigh();StateFlag=0;break;}
// 右内外都压黑线
case 0x0c: {RightTurnHigh();StateFlag=0;break;}
// 右外压黑线
case 0x08: {RightTurnLow();StateFlag=2;break;}
// 其余状态停车
case 0x0f: {Stop();break;}
}
}
}
|