|
小车循迹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, 下载次数: 8)
|
|