liaozr 发表于 2008-11-2 23:42:11

智能往返小车的控制【恢复】

        智能往返小车的控制,这是2003年全国电子设计大赛的题目,我用51单片机来实现控制,现在拿出来跟大家分享:

  实现任务

小车能在起跑线与终点线自动往返。

   (1)车辆从起跑线出发,到达终点线后停留10S,然后自动返回起跑线。

   (2)中间300CM的限速区,车辆往返均要求以低速通过,通过时间8S。

 

跑道宽度0.5m,表面为瓷砖地板,两侧有2cm的黑线作为跑道分界线,终点有黑带提示‘,跑道如下图所示

 

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_479881.jpg

 (原文件名:000.jpg) 



2.系统方案选择 

根据题目要求,电动车系统应具有:起点加速前进、减速, 限速区减速,加速,终点停留,后退、限速区减速、加速,起点停留等功能,为此按功能,系统可划分若干基本模块:黑白、检测模块,控制器模块,电机驱动模块。 



2.  主要硬件设计

(1)控制电路电路的设计,如下图所示:

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_479902.jpg

 (原文件名:红外检测和光藕隔离.jpg) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_479903.jpg

 (原文件名:H桥.jpg) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_480561.jpg

单片机 (原文件名:4.jpg) 







程序:

#include <reg52.h>                 // 

        #define uchar unsigned char        //  开头定义,方便下面使用

        #define uint unsigned int

        #define ulong unsigned long

        sbit P32=P3^2;         // 红外检测口

        sbit P12=P1^2;        //  直流电机I/O口1

        sbit P13=P1^3;        //  直流电机IO口2

    void delly(ulong y); //  

        void unit();

 

        uint code data_table[]={250,250,250,150,250,0,250,150,250};//用数组,调制每个期间的PWM

        uchar i,timeh,timel;                                                                                                                                                 

        uint pwm_data,time_counter,counter1;

        main()

        {                                                        

          unit();

          while(1)

          {

            if(i<5)//开始前进

                {

                  P12=1; 

                  P13=0;

                  delly(pwm_data);

                  P12=0;

          delly(1000-pwm_data);//占空比

                }

                else if(i==5)//到打终点后,停止



                {

                  P13=0;

                  P12=0;

                  delly(333333);

                  P13=1;

                   while(i==5);                }

                else if(i>5&i<9)//到达终点之后返回

        {

                 P12=0;           

                 P13=1;

                 delly(pwm_data);                                                                                                   

                 P13=0;

         delly(1000-pwm_data);//返回到起跑线上停止

            }                

        else

                  {

                  P13=0;

                  P12=0;

                  while(1);

                }

                       // 

          }

        }

 

void unit()

{

  i=0;

   P3=0xff;//  

   P1=0xff;

  time_counter=0;                                                                                                

  pwm_data=data_table;

  TMOD=0x11;//  

  TH0=0x00;//    

  TL0=0x00;

  EA=1;//  

  ET0=1;

  EX0=1; //  

  IT0=1;//′ 

}

        //// óê±′|àí/////

void delly(ulong y) //延时

{

  while(y)

    y--;

}

        //////////// D  ′|àí2 · ////////////

void int0() interrupt 0 using 0//中断0

{  

  



  //timel=TL0;

  if(i>=1)

  {

    if((time_counter-counter1)>20)

      i++;    

  } 

  else 

  {

    i++;

    TR0=1;

  }

  pwm_data=data_table;

  counter1=time_counter;

   //timeh=TH0; 

}

void timer0() interrupt 1 using 1 //定时器0中断, 

{      

       TR0=0;

           if(time_counter<10000)

         time_counter++;

           else

             time_counter=0;

       //ET0=0;

       TH0=0x00;

       TL0=0x00;

       TR0=1;

          // t1_flag=1;

}

sspwm 发表于 2008-11-6 22:07:42

呵呵,很有创意嘛,看上去很不错啊,谢谢分享

choulong 发表于 2008-11-5 20:52:16

下面是程序,代码为汇编,在KEIL下编写。

程序ourdev_485125.rar(文件大小:8K) (原文件名:线控小车.rar) 

liaozr 发表于 2008-11-10 23:43:06

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_493032.jpg

这是我以前做的小车图片 (原文件名:小车.jpg) 

liaozr 发表于 2008-11-10 23:42:22

  谢谢  choulong 丑龙 的分享

sspwm 发表于 2008-11-7 11:46:24

真的很感谢你,因为刚接触单片机,只是做些像LCD时钟显示,矩阵键盘等简单的东西。



本贴被 Joyce 编辑过,最后修改时间:2008-11-07,16:40:07.

choulong 发表于 2008-11-6 22:37:19

时间久了,原理图已经没有了,如果有需要我给你话一个。这个系统不复杂的

sspwm 发表于 2008-11-6 22:09:58

方便的话,能不能分享一下原理图?对新手帮助很大

choulong 发表于 2008-11-5 20:42:02

呵呵,在两年前(那时候读大三)我帮助大四哥们做了一个毕业设计,功能与你的基本一样。使用AT89S51做的。你可以看下对你有没有帮助哈!!!!!

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_485087.jpg

侧面 (原文件名:照片 004.jpg) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_485088.JPG

由于时间较紧,做工有点粗糙 (原文件名:照片 006.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_485089.JPG

图中的电位器使用来调节红外传感器在不同光照下的灵敏度的 (原文件名:照片 024.JPG) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_485090.JPG

车体是玩具汽车改装 (原文件名:照片 027.JPG) 

armok 发表于 2008-11-3 13:34:48

armok 发表于 2008-11-3 13:34:08

liaozr 发表于 2008-11-3 13:23:54

   我是自动化专业的,这是我大二时候做的项目,里面必很存在些问题,敬请各位高手能够指点迷津

liaozr 发表于 2008-11-3 00:07:54

--

liaozr 发表于 2008-11-2 23:53:57

----

weihonglang 发表于 2009-5-8 12:42:34

感谢!学习学习!

congright 发表于 2009-5-14 11:41:57

很感谢!我也正在做小车!很有用.

yujian12365 发表于 2009-5-18 03:17:17

看起来都很不错呀,我也正在做智能小车的毕业设计,用ATMEGA16控制的.马上就要和大家见面了.

oldfang 发表于 2009-7-11 21:34:32

MARK

wangqi509 发表于 2009-7-13 23:32:44

谢谢!

z7926573 发表于 2009-7-14 11:42:46

xuexi

weifeng99 发表于 2009-7-28 14:44:40

那个电位器是干什么用的?

seckuola 发表于 2009-8-14 10:39:43

我要研究~~~

ad001 发表于 2009-8-14 10:57:37

好东西,留名

nathan0816 发表于 2009-8-15 20:47:34

好东西啊 正在做这个东西,希望有机会得到楼主的指点啊,我也才大二,对这个都是刚刚上手呢

sanbinabu 发表于 2010-3-25 20:43:43

mark

Ubuntu_Redhat 发表于 2010-11-5 01:54:53

学习了

wangma 发表于 2010-11-5 22:05:23

看起来蛮酷的嘛

LegendSong 发表于 2011-6-25 20:14:08

m
页: [1]
查看完整版本: 智能往返小车的控制【恢复】