专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机智能循迹小车制作[程序+视频]

作者:佚名   来源:本站原创   点击数:  更新时间:2013年06月02日   【字体:

这里是视频 传到土豆网了:
 

电路图和制作详情请从这里下载附件: http://www.51hei.com/bbs/dpj-18970-1.html ,下面是程序源代码

/****
**********************************
*程序说明:
*此ATmega128单片机程序
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系统主程序
*注意:系统时钟8MHZ
*编译环境:Code VisionAVR
**********************************
*版本:智能循迹小车v1.0
*作者:吾ARM1
*修改时间?012年4月19日
*完成时间:2012年4月16日
**********************************/

#include<mega128.h>
#include "delay.h"
#define left1   PORTC.0 
#define left2   PORTC.1
#define min     PORTC.2
#define right1  PORTC.3
#define right2  PORTC.4 
#define Turn_Left       PORTC.5
#define Turn_Right      PORTC.6
#define u8      unsigned char
#define u16     unsigned int 

void  Init_IO(void)
{
    DDRC = DDRC&0xe0; //将C端口低5位定义为输入,浮空
    PORTC = 0xe0;//
    DDRB = 0xff; //将B端口设为输出模式
    PORTB = 0xff;
    PORTA = 0xff;
    DDRA = 0xff;
}  

void Adjust_Speed(u8 Left_Speed,u8 Right_Speed)
{
      OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,为右电机占空比
      OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,为左电机的占空比   
}
 
void    Init_Timer1(void)
{       u16     i,j;
        i = 300; //实际测试发现1600时电机速度还是很快的。
        j = 300;
        TCCR1A = 0xa0;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1
        TCCR1B = 0x12;//系统时钟8分频,A,B同时输出PWM  
        OCR1A = i; //右电机
        OCR1B = j;  //在电机
        ICR1 = 1000;
}

void main(void)
{   
        Init_IO();
        Init_Timer1();
        while(1)
        {
           if(PINC==0xfb)//只有中间循迹管检测到黑线11011
           {
               Adjust_Speed(90,90);//前进(35,35):一圈循迹时间16.3S  (38,38)一圈循迹时间15.5s (40,40)一圈循迹时间16.34s (50,50)15.34s(60,60)14.21s
               PORTA = 0xfe;        //(80,80)13.68s
           }
          
         if(PINC==0xf9)//中间和左边第二个循迹管检测到黑线10011
         {
               Adjust_Speed(20,60);//左转
              //  delay_ms(5);
               PORTA = 0xfd;
          }
            
           if(PINC==0xfd)//左边第二个循迹管检测到黑线10111
           {
                Adjust_Speed(15,65);//左转
               //delay_ms(5);
                 PORTA = 0xfb;
           }
           
           if(PINC==0xfc)//左边两个同时检测到黑线00111
           {
          
                Adjust_Speed(10,70);//左转
                 PORTA = 0xf7;
           }
          
          if(PINC==0xfe)//左边第一个循迹管检测到黑线01111
          {
             
               Adjust_Speed(7,85);//左转
             //   delay_ms(5);
                PORTA = 0xef;
          }
          
            if(PINC==0xf3)//中间和右边第二个循迹管检测到黑线11001
          {
             
               Adjust_Speed(35,15);//右转
                PORTA = 0xdf;
           }
          if(PINC==0xf7)//右边第二个循迹管检测到黑线11101
          {
               Adjust_Speed(70,13);//右转 
                PORTA = 0xbf;
           } 
           if(PINC==0xe7)//右边两个检测到黑线11100
           {
               Adjust_Speed(80,10);//右转 
               PORTA = 0x7f;
           } 
           if(PINC==0xef)//右边第一个检测到黑线11110
           {
               Adjust_Speed(100,10);//右转  
               PORTA = 0xfc;
           }  
           if(PINC==0xe3)//右侧三个循迹管同时检测到黑线(直角)11000
           {
               Adjust_Speed(40,0);//右转
               PORTA = 0xf8;   
           }
           if(PINC==0xe7)//左侧三个循迹管同时检测到黑线(直角)00011左转
          {
               Adjust_Speed(0,40);//左转
                PORTA = 0xf0;
           }
           if(PINC==0xe0)//5个循迹管同时检测到交叉00000直走
           {
             Adjust_Speed(25,25);//直走
              PORTA = 0xe0;
           }
       //    if(PINC==0xff)
         //  {
           //    Adjust_Speed(0,100);//直走
             // PORTA = 0xc0;  
           //}
          
        }
       
}

关闭窗口

相关文章