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

原理图:

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

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

        }

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值