51單片機(jī) 初學(xué)入門 24小時(shí)必答區(qū) STM32/8 ARM M3 AVR PIC MSP430 DSP Proteus仿真 Arduino 綜合區(qū)
單片機(jī)DIY制作 智能小車/機(jī)器人 智能家居 飛行器diy/多軸/航模 程序設(shè)計(jì) 資料共享
模擬數(shù)字 電子制作DIY 拆機(jī)樂(lè)園 PCB 電源 音響/功放 無(wú)線/紅外 儀器儀表 PLC Labview 業(yè)界動(dòng)態(tài)
Protel Altium Designer Allegro orcad Pads/PowerPCB FPGA/CPLD Multisim仿真
Windows/CE 安卓 uCOS uCLinux
這里是視頻 傳到土豆網(wǎng)了:
電路圖和制作詳情請(qǐng)從這里下載附件: http://m.zg4o1577.cn/bbs/dpj-18970-1.html ,下面是程序源代碼
/**** ********************************** *程序說(shuō)明: *此ATmega128單片機(jī)程序 *包含功能: *1、 *2、 *3、 *4、 *5、 ********************************** *文件:main.c *用途:系統(tǒng)主程序 *注意:系統(tǒng)時(shí)鐘8MHZ *編譯環(huán)境:Code VisionAVR ********************************** *版本:智能循跡小車v1.0 *作者:吾ARM1 *修改時(shí)間?012年4月19日 *完成時(shí)間:2012年4月16日 **********************************/
#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端口設(shè)為輸出模式 PORTB = 0xff; PORTA = 0xff; DDRA = 0xff; }
void Adjust_Speed(u8 Left_Speed,u8 Right_Speed) { OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,為右電機(jī)占空比 OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,為左電機(jī)的占空比 } void Init_Timer1(void) { u16 i,j; i = 300; //實(shí)際測(cè)試發(fā)現(xiàn)1600時(shí)電機(jī)速度還是很快的。 j = 300; TCCR1A = 0xa0;//相位與頻率修正PWM,TOP值為ICR1,向上計(jì)數(shù)匹配清零,向下計(jì)數(shù)匹配時(shí)置1 TCCR1B = 0x12;//系統(tǒng)時(shí)鐘8分頻,A,B同時(shí)輸出PWM OCR1A = i; //右電機(jī) OCR1B = j; //在電機(jī) ICR1 = 1000; }
void main(void) { Init_IO(); Init_Timer1(); while(1) { if(PINC==0xfb)//只有中間循跡管檢測(cè)到黑線11011 { Adjust_Speed(90,90);//前進(jìn)(35,35):一圈循跡時(shí)間16.3S (38,38)一圈循跡時(shí)間15.5s (40,40)一圈循跡時(shí)間16.34s (50,50)15.34s(60,60)14.21s PORTA = 0xfe; //(80,80)13.68s } if(PINC==0xf9)//中間和左邊第二個(gè)循跡管檢測(cè)到黑線10011 { Adjust_Speed(20,60);//左轉(zhuǎn) // delay_ms(5); PORTA = 0xfd; } if(PINC==0xfd)//左邊第二個(gè)循跡管檢測(cè)到黑線10111 { Adjust_Speed(15,65);//左轉(zhuǎn) //delay_ms(5); PORTA = 0xfb; } if(PINC==0xfc)//左邊兩個(gè)同時(shí)檢測(cè)到黑線00111 { Adjust_Speed(10,70);//左轉(zhuǎn) PORTA = 0xf7; } if(PINC==0xfe)//左邊第一個(gè)循跡管檢測(cè)到黑線01111 { Adjust_Speed(7,85);//左轉(zhuǎn) // delay_ms(5); PORTA = 0xef; } if(PINC==0xf3)//中間和右邊第二個(gè)循跡管檢測(cè)到黑線11001 { Adjust_Speed(35,15);//右轉(zhuǎn) PORTA = 0xdf; } if(PINC==0xf7)//右邊第二個(gè)循跡管檢測(cè)到黑線11101 { Adjust_Speed(70,13);//右轉(zhuǎn) PORTA = 0xbf; } if(PINC==0xe7)//右邊兩個(gè)檢測(cè)到黑線11100 { Adjust_Speed(80,10);//右轉(zhuǎn) PORTA = 0x7f; } if(PINC==0xef)//右邊第一個(gè)檢測(cè)到黑線11110 { Adjust_Speed(100,10);//右轉(zhuǎn) PORTA = 0xfc; } if(PINC==0xe3)//右側(cè)三個(gè)循跡管同時(shí)檢測(cè)到黑線(直角)11000 { Adjust_Speed(40,0);//右轉(zhuǎn) PORTA = 0xf8; } if(PINC==0xe7)//左側(cè)三個(gè)循跡管同時(shí)檢測(cè)到黑線(直角)00011左轉(zhuǎn) { Adjust_Speed(0,40);//左轉(zhuǎn) PORTA = 0xf0; } if(PINC==0xe0)//5個(gè)循跡管同時(shí)檢測(cè)到交叉00000直走 { Adjust_Speed(25,25);//直走 PORTA = 0xe0; } // if(PINC==0xff) // { // Adjust_Speed(0,100);//直走 // PORTA = 0xc0; //} } }