基于51单片机的循迹小车(初学者必备!!!)
基于51單片機的循跡小車
文章目錄
- 基于51單片機的循跡小車
- 前言
- 一、系統概述
- 1.工作原理
- 2.控制系統結構框圖
- 二、循跡小車硬件
- 1.電機驅動模塊
- 2.循跡模塊
- 三、循跡小車軟件
- 四、源碼(僅供參考)
前言
該小車采用單片機STC89C52作為主控制核心,通過傳感器傳來的信號,對當前環境作出判斷,最后對電機做出相應的動作。單片機通過紅外傳感器檢測場地黑線,從而控制電機驅動模塊,改變電機轉速來控制小車方向,從而達到循跡的目的。
一、系統概述
整個系統包括51單片機控制模塊、電機驅動模塊、循跡模塊、電源和小車車體。
1.工作原理
·本系統采用簡單明了的設計方案。
·通過高發射功率紅外光電二極管和高靈敏光電晶體管組成的傳感器循跡模塊判斷黑線路徑。
·然后由STC89C52單片機通過IO口控制L298N驅動模板改變兩個直流電機的工作狀態。
·最后實現小車循跡
2.控制系統結構框圖
二、循跡小車硬件
1.電機驅動模塊
L298N實物接線圖及驅動原理圖:
(1) L298N是一個內部有兩個H橋的驅動芯片,這樣電機的運轉只需要用三個信號控制:兩個方向信號和一個使能信號。(輸入的電壓不可超過它的額定電壓)
(2)L298N芯片的工作電壓需要兩路:
第一路:輸出供給電機回路的工作電源
第二路:輸入邏輯控制回路電源5V(電源出/入)
L298N接入直流電機的端口接法:
2.循跡模塊
(1)循跡原理: 利用紅外線對于不同顏色具有不同的反射性質的特點。在小車行駛過程中傳感器的紅外發射二極管不斷發射紅外光,當紅外光遇到白色地面時發生漫反射,紅外對管接收管接收反射光;如果遇到黑線則紅外光被吸收,則紅外管接收不到信號。
紅外對管采集回來的信號通過2路循跡傳感器模塊里面的LM339比較器后輸出高或低電平,從而實現信號的檢測。
原先只用了兩個紅外傳感器,發現它并不能完成直角拐彎,需要四個傳感器配合才能完成。
(2)所謂的差速,是指左右兩車輪的速度差,假如左邊車輪比右邊快,則小車會偏向右。同時,左邊的車輪轉速比右的滿,那么小車會向左邊轉動。
目前主要有以下兩種方式:
①小車向左轉,可以左輪停止,左輪繼續轉動,這樣可實現左轉,這種方式實現小角度的轉彎,在角度不大時可采用此種方式。
②小車向左轉,可以是左輪反轉,右輪正轉,這樣可以實現大角度的左轉,甚至可以進行原地打轉。
同理可推出小車如何向右轉向。
三、循跡小車軟件
(1)主要采用C語言來編譯程序。模塊化結構程序的設計,可以使系統軟件便于調試與優化,也使其他人更好的理解和閱讀系統的程序設計。因此,軟件的設計上,運用了模塊化程序的結構對軟件進行設計,使得程序變得更加直觀易懂。程序的主要模塊有:主程序、定時溢出中斷服務程序、外部中斷服務程序。
(2) Keil C51單片機軟件開發系統可用于編譯C或匯編源文件。然后分別由C51編譯器編譯生成目標文件(.OBJ)。目標文件與庫文件一起經LIB51連接定位生成絕對目標文件(.ABS)。ABS文件由OH51轉換成標準的Hex文件。
(3) 在軟件調試中,使用功能強大的WAVE 6000軟件進行軟件編譯與調試,使用Microcontroller ISP Software及其配套的單片機對程序進行燒錄。
四、源碼(僅供參考)
#ifndef _LED_H_ #define _LED_H_//定義小車驅動模塊輸入IO口 sbit L293D_IN1=P1^2; sbit L293D_IN2=P1^3;sbit L293D_IN3=P1^4;sbit L293D_IN4=P1^5;sbit L293D_EN1=P1^6;sbit L293D_EN2=P1^7;/***蜂鳴器接線定義*****/sbit BUZZ=P2^3;#define Left_1_led P3_4 //左傳感器 #define Right_1_led P3_5 //右傳感器 #define Left_moto_pwm P1_6 //PWM信號端#define Right_moto_pwm P1_7 //PWM信號端#define Left_moto_go {P1_2=1,P1_3=0;} //左電機向前走#define Left_moto_back {P1_2=0,P1_3=1;} //左邊電機向后轉#define Left_moto_Stop {P1_2=0,P1_3=0;} //左邊電機停轉 #define Right_moto_go {P1_4=1,P1_5=0;} //右邊電機向前走#define Right_moto_back {P1_4=0,P1_5=1;} //右邊電機向后走#define Right_moto_Stop {P1_4=0,P1_5=0;} //右邊電機停轉 unsigned char pwm_val_left =0;//變量定義unsigned char push_val_left =0;// 左電機占空比N/20unsigned char pwm_val_right =0;unsigned char push_val_right=0;// 右電機占空比N/20bit Right_moto_stop=1;bit Left_moto_stop =1;unsigned int time=0;/************************************************************************/ //前速前進void run(void) {push_val_left=15; //速度調節變量 0-20。。。0最小,20最大push_val_right=15;Left_moto_go ; //左電機往前走Right_moto_go ; //右電機往前走 }//左轉void leftrun(void) { push_val_left=15;push_val_right=20;Right_moto_go ; //右電機往前走Left_moto_Stop ; //左電機不動 }//右轉void rightrun(void) { push_val_left=20;push_val_right=15;Left_moto_go ; //左電機往前走Right_moto_Stop ; //右電機不動 }//停止void stop(void) { Right_moto_Stop ; //右電機停止Left_moto_Stop ; //左電機停止 }/************************************************************************/ /* PWM調制電機轉速 */ /************************************************************************/ /* 左電機調速 */ /*調節push_val_left的值改變電機轉速,占空比 */void pwm_out_left_moto(void) { if(Left_moto_stop){if(pwm_val_left<=push_val_left){Left_moto_pwm=1; // Left_moto_pwm1=1; }else {Left_moto_pwm=0; // Left_moto_pwm1=0; }if(pwm_val_left>=20)pwm_val_left=0;}else {Left_moto_pwm=0; // Left_moto_pwm1=0; } } /******************************************************************/ /* 右電機調速 */ void pwm_out_right_moto(void) { if(Right_moto_stop){ if(pwm_val_right<=push_val_right){Right_moto_pwm=1; // Right_moto_pwm1=1; }else {Right_moto_pwm=0; // Right_moto_pwm1=0; }if(pwm_val_right>=20)pwm_val_right=0;}else {Right_moto_pwm=0; // Right_moto_pwm1=0; } }/***************************************************/ ///*TIMER0中斷服務子函數產生PWM信號*/void timer0()interrupt 1 using 2 {TH0=0XFc; //1Ms定時TL0=0X18;time++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();} #include<AT89X52.H> //包含51單片機頭文件,內部有各種寄存器定義#include<ZY-4WD_PWM.H> //包含HL-1藍牙智能小車驅動IO口定義等函數//主函數void main(void) { P1=0X00; //關電機 TMOD=0X01;TH0= 0XFc; //1ms定時TL0= 0X18;TR0= 1;ET0= 1;EA = 1; //開總中斷while(1) //無限循環{ //有信號為0 沒有信號為1if(Left_1_led==0&&Right_1_led==0)run(); //調用前進函數else{ if(Left_1_led==1&&Right_1_led==0) //左邊檢測到黑線{leftrun(); //調用小車左轉 函數}if(Right_1_led==1&&Left_1_led==0) //右邊檢測到黑線{ rightrun(); //調用小車右轉 函數}if(Right_1_led==1&&Left_1_led==1) //懸空狀態 避懸崖{ stop(); //調用小車停止}} } }```總結
以上是生活随笔為你收集整理的基于51单片机的循迹小车(初学者必备!!!)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文笔记】(FGSM公式推导)Expl
- 下一篇: 《游戏脚本高级编程》