專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

單片機智能循跡小車制作[程序+視頻]

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2013年06月02日   【字體:

這里是視頻 傳到土豆網(wǎng)了:
 

電路圖和制作詳情請從這里下載附件: http://www.torrancerestoration.com/bbs/dpj-18970-1.html ,下面是程序源代碼

/****
**********************************
*程序說明:
*此ATmega128單片機程序
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系統(tǒng)主程序
*注意:系統(tǒng)時鐘8MHZ
*編譯環(huán)境: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端口設(shè)為輸出模式
    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; //實際測試發(fā)現(xiàn)1600時電機速度還是很快的。
        j = 300;
        TCCR1A = 0xa0;//相位與頻率修正PWM,TOP值為ICR1,向上計數(shù)匹配清零,向下計數(shù)匹配時置1
        TCCR1B = 0x12;//系統(tǒng)時鐘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);//前進(jìn)(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);//左轉(zhuǎn)
              //  delay_ms(5);
               PORTA = 0xfd;
          }
            
           if(PINC==0xfd)//左邊第二個循跡管檢測到黑線10111
           {
                Adjust_Speed(15,65);//左轉(zhuǎn)
               //delay_ms(5);
                 PORTA = 0xfb;
           }
           
           if(PINC==0xfc)//左邊兩個同時檢測到黑線00111
           {
          
                Adjust_Speed(10,70);//左轉(zhuǎn)
                 PORTA = 0xf7;
           }
          
          if(PINC==0xfe)//左邊第一個循跡管檢測到黑線01111
          {
             
               Adjust_Speed(7,85);//左轉(zhuǎn)
             //   delay_ms(5);
                PORTA = 0xef;
          }
          
            if(PINC==0xf3)//中間和右邊第二個循跡管檢測到黑線11001
          {
             
               Adjust_Speed(35,15);//右轉(zhuǎn)
                PORTA = 0xdf;
           }
          if(PINC==0xf7)//右邊第二個循跡管檢測到黑線11101
          {
               Adjust_Speed(70,13);//右轉(zhuǎn) 
                PORTA = 0xbf;
           } 
           if(PINC==0xe7)//右邊兩個檢測到黑線11100
           {
               Adjust_Speed(80,10);//右轉(zhuǎn) 
               PORTA = 0x7f;
           } 
           if(PINC==0xef)//右邊第一個檢測到黑線11110
           {
               Adjust_Speed(100,10);//右轉(zhuǎn)  
               PORTA = 0xfc;
           }  
           if(PINC==0xe3)//右側(cè)三個循跡管同時檢測到黑線(直角)11000
           {
               Adjust_Speed(40,0);//右轉(zhuǎn)
               PORTA = 0xf8;   
           }
           if(PINC==0xe7)//左側(cè)三個循跡管同時檢測到黑線(直角)00011左轉(zhuǎn)
          {
               Adjust_Speed(0,40);//左轉(zhuǎn)
                PORTA = 0xf0;
           }
           if(PINC==0xe0)//5個循跡管同時檢測到交叉00000直走
           {
             Adjust_Speed(25,25);//直走
              PORTA = 0xe0;
           }
       //    if(PINC==0xff)
         //  {
           //    Adjust_Speed(0,100);//直走
             // PORTA = 0xc0;  
           //}
          
        }
       
}

關(guān)閉窗口

相關(guān)文章