新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機智能循跡小車制作

        單片機智能循跡小車制作

        作者: 時間:2016-11-30 來源:網絡 收藏
        電路圖和制作詳情請從這里下載附件: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日
        **********************************/

        本文引用地址:http://www.104case.com/article/201611/323709.htm

        #include
        #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;
        //}

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安陆市| 正镶白旗| 克山县| 昆明市| 静海县| 定日县| 潍坊市| 兰坪| 阳泉市| 潜江市| 武山县| 惠东县| 南宁市| 湄潭县| 乡城县| 佛冈县| 重庆市| 若尔盖县| 澄江县| 昭通市| 伊川县| 鄂托克前旗| 石阡县| 临海市| 甘孜| 竹溪县| 常山县| 瓮安县| 五河县| 韩城市| 如东县| 沙雅县| 金湖县| 开阳县| 莫力| 青浦区| 襄樊市| 景洪市| 旬邑县| 于田县| 囊谦县|