基于51单片机的寻迹小车
智能車剛?cè)腴T,前段時(shí)間制作了一個(gè)51尋跡小車,就是網(wǎng)上那種尋跡是用四個(gè)紅外傳感器,驅(qū)動(dòng)是L298N,主板是自己焊接的51最小系統(tǒng)加了一個(gè)7805將電池的7.2v穩(wěn)壓成5v(雖然我直接用的電池電壓),原題圖網(wǎng)上滿天飛我就不放了,廢話少說(shuō),直接上代碼:
#include<reg52.h>sbit Left_led=P1^0; //最左邊的傳感器 sbit Left_mid_led=P1^1; //左邊中間的傳感器 sbit Right_mid_led=P1^2;//右邊中間的傳感器 sbit Right_led=P1^3; //最右邊的傳感器 sbit yf=P3^1; sbit yz=P3^2; sbit zz=P2^5; sbit zf=P2^6; /*yf=1;yz=0;右輪往后 yf=0;yz=1;右輪往前 zf=1;zz=0;左輪往后 zf=0;zz=1;左輪往前 */sbit ENA=P1^6;// sbit ENB=P1^7;unsigned char pwm_value_left = 0; unsigned char pwm_value_right = 0; unsigned char push_value_left = 0; unsigned char push_value_right = 0;void delay_ms(unsigned int ms)// 延時(shí)子程序 { unsigned int a,b; for(a=ms;a>0;a--)for(b=110;b>0;b--); }void init() {EA = 1;TMOD |= 0x01;TH0 =(65536 - 100) / 256;TL0 = (65536 - 100)% 256; ET0 = 1;TR0 = 1; } void pwm_left()//利用pwm控制左電機(jī)速度{if(push_value_left!=0){if(pwm_value_left<push_value_left)ENB=1; elseENB=0;if(pwm_value_left>50)pwm_value_left=0;} }void pwm_right()//利用pwm控制右電機(jī)速度{if(pwm_value_right!=0){if(pwm_value_right<push_value_right)ENA=1;elseENA=0;if(pwm_value_right>50)pwm_value_right=0;} } void timer0() interrupt 1 using 2{TH0 =(65536 - 100) / 256;TL0 = (65536 - 100)% 256; pwm_value_left++;pwm_value_right++;pwm_left();pwm_right(); } void turn_right1() { push_value_left = 40;push_value_right = 0;zf=0;zz=1;yf=0;yz=0; }void turn_right2() {push_value_left = 45;push_value_right= 0;zz=1;zf=0;yf=0;yz=0; }void turn_left1() {push_value_left= 0;push_value_right= 40;zf=0;yz=1;yf=0;zz=0; }void turn_left2() {push_value_left = 0;push_value_right= 45;zf=0;yz=1;yf=0;zz=0; }void qianjin() { push_value_left = 50;push_value_right = 45;//兩個(gè)電機(jī)轉(zhuǎn)速不一樣,下方會(huì)講yf=0;yz=1; zz=1;zf=0;}void xunji() {if((Left_led == 0)&&(Left_mid_led==1)&&(Right_mid_led== 0)&&(Right_led == 0)){turn_left1(); delay_ms(10);if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return; }if((Left_led == 0)&&(Left_mid_led == 0)&&(Right_mid_led == 1)&&(Right_led == 0)){turn_right1();delay_ms(10);if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;}if((Left_led == 0)&&(Left_mid_led== 0)&&(Right_mid_led == 0)&&(Right_led == 1)){turn_right2();delay_ms(10);if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;}if((Left_led== 1)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)){turn_left2();delay_ms(10);if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;} } void main() {init();while(1){qianjin();xunji();}}代碼注釋寫的不多,說(shuō)一下思路吧:
1.電機(jī)控速:利用定時(shí)器以及中斷控制兩個(gè)電機(jī)pwm脈寬信號(hào)中的占空比達(dá)到控制電機(jī)兩端電壓以達(dá)到控速的效果(不懂的同學(xué)b站大學(xué)學(xué)習(xí)一下51單片機(jī)pwm那一塊就好了,正所謂b站魂,b站人,b站都是人上人,哈哈哈哈)。
2.尋跡:這一塊就是判斷傳感器的四種情況,控制電機(jī)的速度,為了讓他更精確,你可以在判斷過后再判斷是否走了直線,如果是,就直接返回。
再說(shuō)一下制作過程中遇到的問題吧:
1.主板硬件焊接問題就不多說(shuō)了(最好別用一面錫的洞洞板,實(shí)測(cè)有效),最主要的是四路紅外傳感器的位置擺放,還真就是位置定好事半功倍,中間兩路的傳感器不宜過近(如果你尋跡夠精確當(dāng)我沒說(shuō)),因?yàn)槿绻话闱闆r下他會(huì)瘋狂檢測(cè)傳感器 ,出現(xiàn)小車“蹦迪搖頭”現(xiàn)象。
2.我的電機(jī)直線時(shí)轉(zhuǎn)速居然不一樣!!!!不知道有沒有童鞋跟我一樣,也算個(gè)提示吧。
emmmm,大概就這么多吧,第一次寫博客,大佬勿噴,各位老爺,點(diǎn)點(diǎn)關(guān)注一起學(xué)習(xí)吧!!!
總結(jié)
以上是生活随笔為你收集整理的基于51单片机的寻迹小车的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个函数叫random.sample
- 下一篇: ovftool工具的使用