/****
**********************************
*程序说明:
*此ATmega128单片机程序
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系统主程序
*注意:系统时钟8MHZ
*编译环境:Code VisionAVR
**********************************
*版本:智能循迹小车v1.0
*作者:吾ARM1
*修改时间?012年4月19日
*完成时间:2012年4月16日
**********************************/
#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;
//}
}
}
上一篇:FFT算法在单片机中的使用&&LCD12864驱动
下一篇:关于ATmega16与NRF24L01通信
推荐阅读最新更新时间:2024-03-16 14:23