加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

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

16小时前
244
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

原理图

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

* 文件名称: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

相关推荐

电子产业图谱