新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機智能循跡小車制作

單片機智能循跡小車制作

作者: 時間:2016-11-30 來源:網(wǎng)絡 收藏
電路圖和制作詳情請從這里下載附件:http://www.51hei.com/bbs/dpj-18970-1.html,下面是程序源代碼

/****
**********************************
*程序說明:
*此ATmega128單片機程序
*包含功能:
*1、
*2、
*3、
*4、
*5、
**********************************
*文件:main.c
*用途:系統(tǒng)主程序
*注意:系統(tǒng)時鐘8MHZ
*編譯環(huán)境:Code VisionAVR
**********************************
*版本:智能循跡小車v1.0
*作者:吾ARM1
*修改時間?012年4月19日
*完成時間:2012年4月16日
**********************************/

本文引用地址:http://butianyuan.cn/article/201611/323709.htm

#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; //實際測試發(fā)現(xiàn)1600時電機速度還是很快的。
j = 300;
TCCR1A = 0xa0;//相位與頻率修正PWM,TOP值為ICR1,向上計數(shù)匹配清零,向下計數(shù)匹配時置1
TCCR1B = 0x12;//系統(tǒng)時鐘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;
//}

}

}



評論


技術專區(qū)

關閉