原理图:
程序运行图:
部分程序:
/*******************************************************************************
* 文件名称:main.c
* 说明:本文件为小车控制的主函数
* 功能:1.看门狗定时器初始化
2.调用函数,进行小车直流电机的开环控制
*******************************************************************************/
#include
#include
/********************************************************
*函数名称:void main()
*函数功能:调用函数
*函数入口:无
*函数出口:无
********************************************************/
void main()
{
WDT_CONTR=0x3b;
timer_init(); //初始化
while(1)
{
keyboard(); //键盘扫描
// jieshou(); //遥控信号检测,要与传感器实物连接才能正常使用.
xunji(); //循迹检测
bizhang(); //避碍物检测
stop(); //目标站点检测
WDT_CONTR=0x3b; //喂狗
}
}
/*******************************************************************************
* 文件名称:kongzhi.c
* 说明:本文件为小车控制的c文件
* 功能:1.检测障碍物传感器查询
2.小车的状态控制
*******************************************************************************/
#include
#define kongzhi_GLOBAL 1
#include
uchar PWM_t,PWM_t0; //PWM_t为脉冲宽度(0~100)时间为0~10ms
uchar time_count; //定时计数
uint number,number1;
uchar flag; //flag为小车状态标志,0:停止,1:前进,2:后退
uchar flag2; //flag2为小车状态恢复寄存区,当小车遇到障碍物停止,等到障碍物排除之后,小车在停止之前的状态就寄存在flag2中
uchar flag3; //flag3为小车避障停止延时标志,初始化为0,等待障碍排除之后赋值为1,开始计时,数秒之后恢复停止前的行进状态
uchar flag4; //--flag4为看门狗复位后状态恢复寄存区
uchar kind = 0; //传感器的种类
/********************************************************
*函数名称:void bizhang()
*函数功能:遇到障碍物时的处理函数
*函数入口:无
*函数出口:无
********************************************************/
void bizhang()
{
zhang_ai = 1;
if(zhang_ai == 0)
{
flag2=flag;
flag=0;
while(zhang_ai == 0)
{
keyboard();
xunji();
stop();
WDT_CONTR=0x3b;
}
flag3=1;
}
}
/********************************************************
*函数名称:void stop()
*函数功能:到达目标点的控制函数
*函数入口:无
*函数出口:无
********************************************************/
void stop()
{
stop_1=1; //目标站点1
if(stop_1==0)flag=0;
stop_2=1; //目标站点2
if(stop_2==0)flag=0;
stop_3=1; //目标站点3
if(stop_3==0)flag=0;
}
/*******************************************************
*函数名称:void timer_init()
*函数功能:定时器初始化设置
*函数入口:无
*函数出口:无
********************************************************/
void timer_init()
{
flag=0;flag3=0;
key = 0xFF;
TMOD = 0x20; //定时器1为模式2(8位自动重装)
TF1 = 0; //清中断标志
TH1 = timer_data; //保证定时时长为0.1ms
TL1 = TH1;
ET1 = 1; //允许T0中断
TR1 = 1; //开始计数
EA = 1; //中断允许
ENA = 0; //电机禁止
PWM_t = PWM_t0; //看门狗复位后速度恢复
flag = flag4; //看门狗复位后小车状态恢复
}
/*******************************************************
*函数名称:void IntTime1() interrupt 3 using 2
*函数功能:定时器中断处理,小车行走控制
*函数入口:无
*函数出口:无
********************************************************/
void IntTime1()interrupt 3 using 2
{
time_count++;
if(flag3)number++;
if(number==6000){number=0;number1++;}
if(number1==8){flag3=0;number1=0;flag=flag2;}
if(flag==0)ENA=0; //小车停止,flag=0,小车停止标志
if(flag==1) //小车前进,flag=1,小车前进标志
{
ENA=1; //PWM波输出使能
DR=0; //直流电机一端接低电平
DR2=0; //直流电机一端接低电平
if(kind==0) //没有传感器检测到黑线,走直线
{ if(time_count {PWM=1;PWM2=1;} else {PWM=0;PWM2=0;} } if(kind==1) //左边第一个传感器检测到黑线 { if(time_count<(PWM_t-20)) {PWM=1;} else {PWM=0;} if(time_count {PWM2=1;} else {PWM2=0;} } if(kind==2) //左边第二个传感器检测到黑线 { if(time_count<3) {PWM=1;} else {PWM=0;} if(time_count {PWM2=1;} else {PWM2=0;} } if(kind==3) //右边第一个传感器检测到黑线 { if(time_count<(PWM_t-20)) {PWM2=1;} else {PWM2=0;} if(time_count {PWM=1;} else {PWM=0;} } if(kind==4) //右边第二个传感器检测到黑线 { if(time_count<3) {PWM2=1;} else {PWM2=0;} if(time_count {PWM=1;} else {PWM=0;} } } if(flag==2) //小车倒退,flag=2,小车倒退标志 { ENA=1; PWM=0; PWM2=0; if(kind==0) //没有传感器检测到黑线,走直线 { if(time_count {DR=1;DR2=1;} else {DR=0;DR2=0;} } if(kind==1) //左边第一个传感器检测到黑线 { if(time_count<(PWM_t-20)) {DR=1;} else {DR=0;} if(time_count {DR2=1;} else {DR2=0;} } if(kind==2) //左边第二个传感器检测到黑线 { } if(time_count >= PWM_T) //每输出一个PWM波计数器清一次零,也即PWM波周期长度 { time_count=0; } } 资料包括: 需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。 纷传点击用微信打开即可,过程有点繁琐请见谅。