利用51芯片制作智能循迹车子

来源:互联网 发布:水墨风手游 知乎 编辑:程序博客网 时间:2024/04/29 11:16

在学习单片机视频的同时,我结合开发板上写了一些基本的例程,这些例程都是用c语言写的,由于当时没有学过汇编,只是课外有时间的时候看了一下,个人觉得用汇编写代码有点麻烦,所以一直都是用c语言写。这些例程包括实现开发板上一些基本的功能,比如说跑马灯的实现,数码管的显示,蜂鸣器的鸣叫,马达的转动等等。在学习完之后想利用51单片机芯片做一个小型的项目,就是练练手,由于我主要是走liinux + arm路线的,所以51这一部分只是一个过渡期,没有花多大的时间研究。

在网上搜了一下,有人建议我做一个智能循迹小车,简单的说就是黑线白板,小车在白板上沿着黑线走。想到这个问题的时候有点不可思议,然后在网上看别人做的车子,在黑色的胶带上走动,说实话很羡慕,自己也想动手做做看。虽然说我会画pcb,也可以做板子,但是为了保证硬件不出问题,我就利用别人做的板子,直接在板子上焊接元器件,以及对车子进行组转,首先需要保证能够把程序下载到51芯片上,测试了一下没问题,哈哈……可以了。在看了车子实现功能介绍后,以前那一阵的迷惑的心终于开解了,原来是如此的简单,大体的说是利用红外接收和红外发射装置来接收和发送信号,在车子跑出黑线的时候,红外接收管接收到一个电平,既而传给芯片,最后对马达进行驱动,不过之前需要对马达进行一些简单的测试,比如前进,后退,左转,右转,左转的时候就是让左边的马达不转,右边的马达转动,就可以实现向左边转动,经过两个礼拜的时间,终于可以让车子在黑线上走了,在测试发射装置是否是好的,将车子上电,用摄像头照着它,在另一端看,有红光,代表是好的,反之,则坏了,需要换一个。还有一个,下载车子程序之前,写一段代码对红外发射和接收进行测试下,利用led进行测试,红外装置在黑色范围内,led呈现亮的状态,在外面则是暗的,这是一个很好的方法。

一下是我当初的一些代码,很短,但是需要对它们了解,我感觉在主函数里少用一些while比较好,否则会出现一些问题。

#include <reg52.h>               

sbit LeftLed = P0^7;                        //定义前方左侧指示灯端口

sbit RightLed = P2^0;                      

sbit RightIR = P3^6;                       

sbit LeftIR = P3^7;                         //定义前方左侧红外探头端口

sbit M1A= P0^0;                            //定义左侧电机驱动A端

sbit M1B = P0^1;                            //定义左侧电机驱动B端

sbit M2B = P0^2;                           

sbit M2A= P0^3;                         

void Delay()                                                       

{

       unsignedint i = 10000;          

       while(i--);       

}

void Delay1(unsigned int m)

{

       unsignedint i, j;

       for(i = 0; i < m; i++)

              for(j = 0; j < 60; j++);

}

void ControlCar(unsigned char ConType)   

{

       M1A = 0;

       M1B= 0;

       M2A = 0;

       M2B= 0;

       switch(ConType)                        

       {

              case1:  //前进                        

              {   

                     M1A = 1;                               

                     M2A = 1; 

                     LeftLed= 0;

                     RightLed= 0;                  

                     break;

              }

              case2: //后退                         

              {

                     LeftLed= 1;

                     RightLed= 1;

                     M1B= 1;                                

                     M2B= 1;                               

                     break;

              }

              case3: //左转                         

              {

                     M2A = 1;

                     M1A = 0;

                     LeftLed= 0;

                     RightLed= 1;                          

                     break;

              }

              case4: //右转                          

              {

                     M1A = 1;

                     M2A = 0;

                     LeftLed= 1;

                     RightLed= 0;                             

                     break;                                        

              }

              case5:

              {

                     LeftLed= 1;

                     RightLed= 1;

                     break;

              }

       }

}

 

void main()                               

{

       if(LeftIR == 0 && RightIR == 0)

       {

              Delay1(100000);

       }                                                    

       if(LeftIR == 0 && RightIR == 1)

       {    

             ControlCar(4);   

              Delay();                 

       }

       if(RightIR == 0 && LeftIR == 1 )                        

       {

              ControlCar(3);                                          

              Delay();

       }

       ControlCar(1); 

}

 

车子如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击