|
小車循跡avr版
- #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;
- //}
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
小車循跡AVR版.rar
(65.89 KB, 下載次數: 9)
2017-4-25 20:37 上傳
點擊文件名下載附件
|
|