本项目设计了一款基于ATMEGA16单片机的寻迹小车,提供了详细的电路原理图和控制程序。该小车能够自动识别线路并沿路径行驶,适用于教育与研究领域。
```c
#include
#include
#define uchar unsigned char
#define uint unsigned int
void main()
{
DDRA = 0X00;
DDRB = 0XFF;
DDRD |= 0X30;
TCCR1A = 0x91; //8位相位修正PWM,频率为244.14Hz
TCCR1B = 0x03; //时钟因子64
OCR1A = 250; // 初值占空比100%
while(1)
{
if(PINA == 0xe7) // 加速前进,点亮第4、5灯
{
OCR1A = 202;
turn(); //居中
}
else if (PINA == 0xcf) //速度稍减前进,点亮第5、6灯
{
OCR1A = 202;
turnL(); //左转-15度
}
else if(PINA == 0x9f) //速度再减前进,点亮第6、7灯
{
OCR1A = 176;
turnLL(); // 左转-30度
}
else if (PINA == 0x3f) //速度进一步减小,点亮第7、8灯
{
OCR1A = 176;
turnLLL(); //左转-45度
}
else if(PINA == 0X7f) //速度稍减前进,只亮第8灯
{
OCR1A = 176;
turnLLL(); // 右转45度
}
else if (PINA == 0xf3) //加速前进,点亮第3、4灯
{
OCR1A = 202;
turnR(); //右转15度
}
else if(PINA == 0Xf9) //速度进一步减小,只亮第2、3灯
{
OCR1A = 176;
turnRR(); // 右转30度
}
else if (PINA == 0Xfc) //速度稍减前进,点亮第1、2灯
{
OCR1A = 176;
turnRRR(); //右转45度
}
else if(PINA == 0Xfe) //速度进一步减少,只亮第1灯
{
OCR1A = 176;
turnRRR(); // 右转45度
}
}
}
void turnLLL()
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);
delay(18);
PORTB |= BIT(0);
delay(4);
}
}
void turnLL()
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);
delay(18);
PORTB |= BIT(0);
delay(6);
}
}
void turnL()
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);
delay(18);
PORTB |= BIT(0);
delay(8);
}
}
void turn() //居中
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);
delay(18);
PORTB |= BIT(0);
delay(10);
}
}
void turnR()
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);
delay(18);
PORTB |= BIT(0);
delay(12);
}
}
void turnRR()
{
uchar i;
DDRB = 0XFF;
PORTB = 0XFF;
for(i=0;i<30;i++)
{
PORTB &= ~BIT(0);