• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于51单片机的智能小车系统设计

2024/09/26
2478
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

有需要资料的可了解一下.docx

共1个文件

原理图

/*******************************************************************************

* 文件名称:main.c

* 说明:本文件为小车控制的主函数

* 功能:1.看门狗定时器初始化

2.调用函数,进行小车直流电机开环控制

*******************************************************************************/

#include? <AT89X52.h>

#include? <kongzhi.h>

/********************************************************

*函数名称: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? <AT89X52.h>

#define???? kongzhi_GLOBAL 1

#include? <kongzhi.h>

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_t)

{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<PWM_t)

{PWM2=1;}

else

{PWM2=0;}

}

if(kind==2)?????????????????????????????????????????????????? //左边第二个传感器检测到黑线

{

if(time_count<3)

{PWM=1;}

else

{PWM=0;}

if(time_count<PWM_t)

{PWM2=1;}

else

{PWM2=0;}

}

if(kind==3)?????????????????????????????????????????????????? //右边第一个传感器检测到黑线

{

if(time_count<(PWM_t-20))

{PWM2=1;}

else

{PWM2=0;}

if(time_count<PWM_t)

{PWM=1;}

else

{PWM=0;}

}

if(kind==4)?????????????????????????????????????????????????? //右边第二个传感器检测到黑线

{

if(time_count<3)

{PWM2=1;}

else

{PWM2=0;}

if(time_count<PWM_t)

{PWM=1;}

else

{PWM=0;}

}

}

if(flag==2)?????????????????????????????????????????????????? //小车倒退,flag=2,小车倒退标志

{

ENA=1;

PWM=0;

PWM2=0;

if(kind==0)?????????????????????????????????????????????????? //没有传感器检测到黑线,走直线

{?????? if(time_count<PWM_t)

{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<PWM_t)

{DR2=1;}

else

{DR2=0;}

}

if(kind==2)?????????????????????????????????????????????????? //左边第二个传感器检测到黑线

{

}

if(time_count >= PWM_T)????????? ? ??? //每输出一个PWM波计数器清一次零,也即PWM波周期长度

{

time_count=0;

}

}

 

  • 有需要资料的可了解一下.docx
    下载

相关推荐