摘要:基于單片機的智能小車控制就是其中的一個體現。本設計實現了一種基于單片機的自動避障智能模型車系統,通過紅外傳感器采集路況信息,通過對檢測信息的分析,自動控制轉向電機轉向,改變行駛路徑,繞過障礙物,從而實現車穩定避障。
Hi,大家好,這里是丹成學長,今天向大家介紹一個 單片機項目
基于單片機的智能小車
大家可用于 課程設計 或 畢業設計
技術解答、畢設幫助、開題指導print("Q 746876041")
智能化作為現代電子產品的新趨勢, 是今后的電子產業的發展方向。智能化設計的電子產品可以按照預先設定的模式在一個環境里自動運作, 不需要人為的管理, 可應用于科學勘探、 環境監測、 智能家居等方面。 基于單片機的智能小車控制就是其中的一個體現。 本設計實現了一種基于 51 單片機的自動避障智能模型車系統, 通過紅外傳感器采集路況信息, 通過對檢測信息的分析, 自動控制轉向電機轉向, 改變行駛路徑, 繞過障礙物, 從而實現車穩定避障。
本設計學長采用直流減速電機, 電機專用驅動芯片L298N進行電機驅動控制, 主控芯片為STC89C52, 測距部分采用超聲波模塊, 控制器采用24L01無線電通信模塊, 自動避障部分采用紅外收發模塊。
這個設計雖然只是學長的一個演示模型, 但是具有充分的科學性和實用性。 首先我們根據交通路面的復雜情況, 按照適當的比例制作出一個路況模型, 包括彎道、直道以及路面上設置的障礙物等。 在彎、 直道上, 小車沿著預定軌道自由行使,當小車遇到障礙物時, 脈沖調制的紅外線傳感器將檢測到的信號發送給單片機,單片機根據程序發出相應的控制信號控制小車自動避開障礙物。 由無線模塊控制小車進行倒車、 前進、 左轉、 右轉等動作。
小車的無線通信模塊采用紅外遙控, 紅外收發遙控是目前大部份遙控小車采用的遙控手段, 紅外遙控具有代碼簡單, 操作性強的特點。 如圖為紅外遙控模塊實物圖。
小車的通信模塊采用無線電 NRF24L01 模塊, NRF24L01 是一款工作在 2. 4~2. 5GHz, 世界通用 ISM 頻段的單片無線收發器芯片。 無線收發器包括:頻率發生器、 增強型 SchockburstTM 模式控制器、 功率放大器、 晶體振蕩器、 調制器、 解調器。 輸出功率、 頻道選擇和協議的設置可以通過 SPI 接口進行設置。如下圖為 NRF24L01 無線模塊實物圖。
小車的電機驅動部分采用自己搭建的 9012 三極管電路來實行小車的驅動, 9012 三極管電路具有電路簡單, 操作方便的等特點。
小車的電機驅動部分采用 L298N 芯片直流電機驅動模塊, 該模塊具有較大的驅動帶載能力, 驅動部分端子供電范圍 Vs: +5V~+35V, 并且另外自帶了 5V、 3V 的輸出端口。
方案論證
本設計為 4 輪驅動的小車, 對于小車驅動部分要求能夠有較大的帯載能力, 并且在小車的實際設計過程中, 需要不同的輸出電壓來提供給小車的各個模塊。 因此綜上所述采用方案二, 小車的電機驅動部分使用 L298N 芯片直流電機驅動模塊。
本設計主要分為兩部分: 遙控部分和小車部分。 遙控部分主要由電源電路,單片機最小系統, 無線電模塊組成, 遙控部分的系統框圖如圖所示。
小車部分由電源電路, 單片機最小系統, 顯示電路, 無線電木塊, 報警電路,超聲波電路等電路模塊組成, 小車部分的系統框圖如圖所示。
注意這里學長設計的是藍牙通信方式的小車
1.4wd小車一臺,包含馬達,兩個底盤,和螺絲等(要自己組裝)
L298N電機驅動模塊兩個,用來控制馬達的轉速,方向,停止與否。
51單片機最小系統板一個和STC89C52RC芯片一個
HC-05藍牙模塊一個(藍牙遙控)和usb轉TTL轉接模塊一個(用于設置和調試藍牙模塊)
路紅外循跡模塊(黑白循跡)
8650電池四個和18650電池盒和杜邦線若干。
1.先把四個馬達和車輪裝在一起,組裝成一個小車框架。
2.L298N電機的接線
一個L298N有四個輸出口(out1,out2,out3,out4)接馬達,每兩個輸出口控制一個馬達,因此可以控制兩個馬達,12v接口接電源正極,5v接口是給最小系統板供電,所以5v接系統板5v口。
四個IO輸入口(in1,in2,in3,in4)通過芯片控制輸出口。兩個使能端口(A,B),只有高電平時電機才有有效,低電平時電機不轉轉。因為有兩個電機只有一個供電源所以兩個電機要并聯連接在一起。
下面是電機的控制表,當使能端位低電平(0)時電機處于停止狀態,當輸出口為(00或11)時處于制動狀態,阻止電機轉動。
L298N無效,無法驅動馬達的原因(1.電壓不夠,起碼要7v以上。2.使能端沒有處于高電平狀態 。3.L298N或馬達壞了).
藍牙的接線
藍牙接在最小系統板,藍牙的TXD(發送口)口接系統板的RXD(接收口)口,RXD口接TXD口也就是交叉連接,發送口對接收口。
在接在系統板之前,要對藍牙進行一些設置(名稱,密碼,波特率),這時就要用到usb轉TTL模塊。
接在電腦上,打開串口調試助手(軟件在后面的鏈接),進入AT模式 (進入方法,藍牙模塊上面有個按鈕,在usb口插入電腦前,長按不放,插入電腦即可,如果看到藍牙模塊上的燈在快速閃爍,說明已經進入AT模式,慢閃是工作模式)。
紅外的接線
紅外模塊的接線很簡單,按照引腳上的說明,一一對應接在系統板上即可。
遙控部分主程序流程圖如圖所示。 程序從主函數開始執行, 無線藍牙模塊初始化, 同時在主函數中定義單片機口對應的按鍵按下時所發出的函數值。接下來判斷是否有按鍵按下, 如果有按鍵按下, 則發送相應的按鍵對應的函數值,接著判斷是否又有按鍵按下。 如果未發現按鍵按下則在主函數中循環判斷是否有按鍵按下。
小車部分主程序流程圖如圖所示。
程序從主函數開始執行, 藍牙無線模塊初始化, 液晶顯示模塊初始化, 藍牙無線電模塊初始化, 超聲波模塊初始化。
各個模塊初始化完畢后, 單片機判斷是否接受到了信號, 如果接收到信號,則判斷相應的按鍵值, 如果沒有接收到按鍵值則返回繼續判斷是否接受到信號。接收到信號后, 小車開始執行鍵值對應的相應的命令。 而超聲波測距, 并在液晶上顯示相應距離, 危險距離報警都是貫穿在整個 while(1) 的語句中的。
/************************************************ 作者:丹成學長,Q746876041************************************************/#include #include sbit LEA=P1^0;//左邊輪的使能端Asbit LEB=P1^1;//左邊輪的使能端B//左前輪sbit LIN1=P1^2;//sbit LIN2=P1^3;////左后輪sbit LIN3=P1^4;sbit LIN4=P1^5;sbit REA=P3^2;//右邊輪使能端Asbit REB=P3^3;//右邊輪使能端B//右前輪sbit RIN1=P3^4;sbit RIN2=P3^5;//右后輪sbit RIN3=P3^6;sbit RIN4=P3^7;//方向控制void delay(int time);//延時函數void forward();//前進void back();//后退void stop();//停止void start();//啟動void turnLeft();//左轉void turnRight();//右轉//藍牙模塊//定時器1用作串口發生器,用于與藍牙通信void time1Init();//定時器1的初始化void processMsg();//處理藍牙接收到的信息//紅外模塊//從右到左//in1是最右邊的紅外燈sbit in1=P2^0;sbit in2=P2^1;sbit in3=P2^2;sbit in4=P2^3;int isTrace=0;//是否開啟循跡功能void trace();//紅外循跡//PWM調速//通過控制使能端高低電平輸出的時間從而控制速度int count=0; //用于計數int pwm=20; //表示啟動的時間,20表示啟動20msvoid time0Init();//定時器0的初始化. //用于控制高低電平的時間 //定時器比較準確void go();//啟動 使能端為高電平 1void pause();//停止 使能端為低電平 0void time0Fun();//定時器0的中斷函數int main(){ EA=1;//打開總中斷 time1Init();//定時器1初始化 time0Init();//定時器0初始化 start();//使車的方向一開始向前 while(1) { if(isTrace) trace(); if(count>=100) //100ms一個周期 count=0; if(count<pwm) //pwm表示啟動的時間 //pwm越大 速度越快 go(); else if(count>=pwm) pause(); } return 0;}void delay(int time)//延時函數{ int i; for(i=0;i<time;i++) { _nop_();//在晶振12M下 //一個nop函數延時1us }}void forward()//前進{ //前進,所有輪正轉 LIN1=0; LIN2=1; LIN3=0; LIN4=1; RIN1=0; RIN2=1; RIN3=0; RIN4=1;}void back()//后退{ //前進,所有輪反轉 LIN1=1; LIN2=0; LIN3=1; LIN4=0; RIN1=1; RIN2=0; RIN3=1; RIN4=0;}void turnLeft()//左轉{ //左轉 左邊的輪正轉,右邊輪反轉 LIN1=0; LIN2=1; LIN3=0; LIN4=1; RIN1=1; RIN2=0; RIN3=1; RIN4=0; delay(5000);//延時5ms 控制轉彎的角度}void turnRight()//右轉{ //右轉,左邊輪反轉,右邊輪正轉 LIN1=1; LIN2=0; LIN3=1; LIN4=0; RIN1=1; RIN2=0; RIN3=1; RIN4=0; delay(5000);//延時5ms 控制轉彎的角度}void stop()//停止{ //停止,全部高電平或低電平 LIN1=0; LIN2=0; LIN3=0; LIN4=0; RIN1=0; RIN2=0; RIN3=0; RIN4=0;}void start(){ forward();//一開始,前進方向}//定時器1用作串口發生器,用于與藍牙通信void time1Init()//定時器1的初始化{ TMOD=0x20;//定時器1,工作模式2,8位自動重裝模式 TH1=0xfd;//9600波特率,要與藍牙的一致 TL1=0xfd; //串口通信方式1 SM0=0; SM1=1; PCON=0x00;//波特率不加倍 SCON=0x50;//工作方式一 REN=1;//允許接收 ES=1;//開啟串口中斷 TR1=1;//啟動定時1}void processMsg() interrupt 4 //中斷4//處理藍牙接收到的信息{ char ch; //等待接收完畢 while(!RI)//當RI為0時沒有接收完畢 ; //為1時接收完畢 //信息存存在sbuf中 ch=SBUF;//獲取接收的信息 switch(ch) { case "f": //前進 forward(); break; case "b": //后退 back(); break; case "l": //左轉 turnLeft(); break; case "r": //右轉 turnRight(); break; case "s": //停止 stop(); break; case "o": start(); break;//啟動 case "t": //開啟循跡功能 isTrace=1; break; case "1": //一檔 pwm=20; break; case "2": //二檔 pwm=60; break; case "3": //三檔 pwm=100; break; default: break; }}void trace()//紅外循跡{ //當紅外遇到黑線時吸收紅外光,輸出高電平 //遇到白線時反射紅外,輸出低電平 int dir=0;//0表示直走 //1 代表左轉 //2 代表右轉 //0 0 0 0 if(in1==0&&in2==0&&in3==0&&in4==0) dir=0; //1 0 0 0 else if (in1==1&&in2==0&&in3==0&&in4==0) dir=2; //1 1 0 0 else if (in1==1&&in2==1&&in3==0&&in4==0) dir=2; //1 1 1 0 else if (in1==1&&in2==1&&in3==1&&in4==0) dir=0; //1 1 1 1 else if (in1==1&&in2==1&&in3==1&&in4==1) dir=0; //0 1 0 0 else if (in1==0&&in2==1&&in3==0&&in4==0) dir=2; //0 1 1 0 else if (in1==0&&in2==1&&in3==1&&in4==0) dir=0; //0 1 1 1 else if (in1==0&&in2==1&&in3==1&&in4==1) dir=1; //0 0 1 0 else if (in1==0&&in2==0&&in3==1&&in4==0) dir=1; //0 0 1 1 else if (in1==0&&in2==0&&in3==1&&in4==1) dir=1; //1 0 1 0 else if (in1==1&&in2==0&&in3==1&&in4==0) dir=1; //1 1 1 0 else if (in1==1&&in2==1&&in3==1&&in4==0) dir=2; //1 0 1 1 else if (in1==1&&in2==0&&in3==1&&in4==1) dir=0; //1 0 0 1 else if (in1==1&&in2==0&&in3==0&&in4==1) dir=0; //0 0 0 1 else if (in1==0&&in2==0&&in3==0&&in4==1) dir=1; //1 1 0 1 else if (in1==1&&in2==1&&in3==0&&in4==1) dir=0; switch(dir) { case 0: forward(); break; case 1: turnLeft(); break; case 2: turnRight(); break; }}void time0Init()//定時器0的初始化. //用于控制高低電平的時間 //定時器比較準確{ TMOD|=0x01;//工作方式一 //用或運算是為了不改變 //定時器1對應位的值。 TH0=0xfc; TL0=0x66; //定時1ms ET0=1;//開啟定時器0的中斷 TR0=1;//啟動定時器0}void go()//啟動 使能端為高電平 1{ LEA=1; LEB=1; REA=1; REB=1;}void pause()//停止 使能端為低電平 0{ LEA=0; LEB=0; REA=0; REB=0;}void time0Fun() interrupt 1{ TH0=0xfc; TL0=0x66; //1ms 中斷一次,count加一 count++;}/*******************************************************************篇幅有限,只展示部分代碼作者:丹成學長,Q746876041********************************************************************/
技術解答、畢設幫助、開題指導print("Q 746876041")
單片機畢設項目大全:
https://blog.csdn.net/huawei123444/article/details/119822845
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123692.html
摘要:本文在充分理解考勤系統原則和目標的基礎上,采用單片機對考勤進行硬件設計并采用面向對象的思想進行上位機管理系統的設計。該芯片共內置個中文漢字,個字符的碼字符庫及點陣顯示。單片機指紋考勤系統參數設定流程如圖所示。 ...
摘要:信息的安全性可控性已成為錄音系統的重要研究內容。系統設計系統架構通過單片機與語音功能集成芯片,以及液晶芯片進行設計,由單片機控制來實現語音的錄制存儲以及播放清除等功能。 ...
摘要:門禁系統可有效管理門的開啟關閉對出入人員進行監控管理。基于的門禁系統通過對射頻卡的識別,保證那些持有相應證件的人員能自由進出,阻止外來人員或無法提供證件的人員進入。 ...
閱讀 2648·2021-11-24 09:39
閱讀 1648·2021-11-24 09:38
閱讀 629·2021-11-22 14:44
閱讀 1888·2021-11-18 10:02
閱讀 2573·2021-11-18 10:02
閱讀 1158·2021-10-14 09:43
閱讀 4243·2021-09-29 09:35
閱讀 523·2021-07-30 15:30