找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2868|回復: 1
打印 上一主題 下一主題
收起左側

小車循跡AVR單片機版程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:989011 發(fā)表于 2021-12-7 11:02 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


單片機源程序如下:
  1. /****
  2. **********************************
  3. *程序說明:
  4. *此ATmega128
  5. *包含功能:
  6. *1、
  7. *2、
  8. *3、
  9. *4、
  10. *5、
  11. **********************************
  12. *文件:main.c
  13. *用途:系統(tǒng)主程序
  14. *注意:系統(tǒng)時鐘8MHZ
  15. *編譯環(huán)境:Code VisionAVR
  16. **********************************
  17. *版本:循跡小車v1.0
  18. *作者:吾ARM1
  19. *完成時間:2012年4月16日
  20. **********************************/

  21. #include<mega128.h>
  22. #include "delay.h"
  23. #define left1   PORTC.0  
  24. #define left2   PORTC.1
  25. #define min     PORTC.2
  26. #define right1  PORTC.3
  27. #define right2  PORTC.4  
  28. #define Turn_Left       PORTC.5
  29. #define Turn_Right      PORTC.6
  30. #define u8      unsigned char
  31. #define u16     unsigned int  

  32. void  Init_IO(void)
  33. {
  34.     DDRC = DDRC&0xe0; //將C端口低5位定義為輸入,浮空
  35.     PORTC = 0xe0;//
  36.     DDRB = 0xff; //將B端口設為輸出模式
  37.     PORTB = 0xff;
  38.     PORTA = 0xff;
  39.     DDRA = 0xff;
  40. }   

  41. void Adjust_Speed(u8 Left_Speed,u8 Right_Speed)
  42. {
  43.       OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,為右電機占空比
  44.       OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,為左電機的占空比   
  45. }

  46. void    Init_Timer1(void)
  47. {       u16     i,j;
  48.         i = 300; //實際測試發(fā)現(xiàn)1600時電機速度還是很快的。
  49.         j = 300;
  50.         TCCR1A = 0xa0;//相位與頻率修正PWM,TOP值為ICR1,向上計數(shù)匹配清零,向下計數(shù)匹配時置1
  51.         TCCR1B = 0x12;//系統(tǒng)時鐘8分頻,A,B同時輸出PWM   
  52.         OCR1A = i; //右電機
  53.         OCR1B = j;  //在電機
  54.         ICR1 = 1000;
  55. }

  56. void main(void)
  57. {   
  58.         Init_IO();
  59.         Init_Timer1();
  60.         while(1)
  61.         {
  62.            if(PINC==0xfb)//只有中間循跡管檢測到黑線11011
  63.            {
  64.                Adjust_Speed(90,90);//前進(35,35):一圈循跡時間16.3S  (38,38)一圈循跡時間15.5s (40,40)一圈循跡時間16.34s (50,50)15.34s(60,60)14.21s
  65.                PORTA = 0xfe;        //(80,80)13.68s
  66.            }
  67.            
  68.          if(PINC==0xf9)//中間和左邊第二個循跡管檢測到黑線10011
  69.          {
  70.                Adjust_Speed(20,60);//左轉
  71.               //  delay_ms(5);
  72.                PORTA = 0xfd;
  73.           }
  74.             
  75.            if(PINC==0xfd)//左邊第二個循跡管檢測到黑線10111
  76.            {
  77.                 Adjust_Speed(15,65);//左轉
  78.                //delay_ms(5);
  79.                  PORTA = 0xfb;
  80.            }
  81.             
  82.            if(PINC==0xfc)//左邊兩個同時檢測到黑線00111
  83.            {
  84.            
  85.                 Adjust_Speed(10,70);//左轉
  86.                  PORTA = 0xf7;
  87.            }
  88.            
  89.           if(PINC==0xfe)//左邊第一個循跡管檢測到黑線01111
  90.           {
  91.               
  92.                Adjust_Speed(7,85);//左轉
  93.              //   delay_ms(5);
  94.                 PORTA = 0xef;
  95.           }
  96.            
  97.             if(PINC==0xf3)//中間和右邊第二個循跡管檢測到黑線11001
  98.           {
  99.               
  100.                Adjust_Speed(35,15);//右轉
  101.                 PORTA = 0xdf;
  102.            }
  103.           if(PINC==0xf7)//右邊第二個循跡管檢測到黑線11101
  104.           {
  105.                Adjust_Speed(70,13);//右轉  
  106.                 PORTA = 0xbf;
  107.            }  
  108.            if(PINC==0xe7)//右邊兩個檢測到黑線11100
  109.            {
  110.                Adjust_Speed(80,10);//右轉  
  111.                PORTA = 0x7f;
  112.            }  
  113.            if(PINC==0xef)//右邊第一個檢測到黑線11110
  114.            {
  115.                Adjust_Speed(100,10);//右轉   
  116.                PORTA = 0xfc;
  117.            }   
  118.            if(PINC==0xe3)//右側三個循跡管同時檢測到黑線(直角)11000
  119.            {
  120.                Adjust_Speed(40,0);//右轉
  121.                PORTA = 0xf8;   
  122.            }
  123.            if(PINC==0xe7)//左側三個循跡管同時檢測到黑線(直角)00011左轉
  124.           {
  125.                Adjust_Speed(0,40);//左轉
  126.                 PORTA = 0xf0;
  127.            }
  128.            if(PINC==0xe0)//5個循跡管同時檢測到交叉00000直走
  129.            {
  130.              Adjust_Speed(25,25);//直走
  131.               PORTA = 0xe0;
  132.            }
  133.        //    if(PINC==0xff)
  134.          //  {
  135.            //    Adjust_Speed(0,100);//直走
  136.              // PORTA = 0xc0;   
  137.            //}
  138.            
  139.         }
  140.         
  141. }
復制代碼

所有資料51hei附件下載:
小車循跡AVR版.7z (145.86 KB, 下載次數(shù): 16)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:974131 發(fā)表于 2022-3-30 09:20 | 只看該作者
thanks,收藏啦。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表