基于手機藍牙的遙控小車的設計與制作(完整資料)_第1頁
基于手機藍牙的遙控小車的設計與制作(完整資料)_第2頁
基于手機藍牙的遙控小車的設計與制作(完整資料)_第3頁
基于手機藍牙的遙控小車的設計與制作(完整資料)_第4頁
基于手機藍牙的遙控小車的設計與制作(完整資料)_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于手機藍牙的遙控小車的設計與制作(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)

南華大學電氣工程學院基于手機藍牙的遙控小車的設計與制作(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)《通信原理課程設計》任務書設計題目:基于手機藍牙的遙控小車的設計與制作專業(yè):電子信息工程學生姓名:陳鵬學號:20124470115學生姓名:唐愉晶學號:20124470107學生姓名:任凱學號:20124470122學生姓名:趙江哲學號:20124470125學生姓名:陳熙學號:20124470120學生姓名:陳方方學號:20124470105起迄日期:2015年5月5日指導教師:李圣副教授系主任:陳忠澤教授《通信原理課程設計》任務書1.課程設計的內容和要求(包括原始數(shù)據(jù)、技術要求、工作要求等):(1)技術要求:設計和制作基于手機藍牙遙控小車行走的系統(tǒng)。手機藍牙作為客戶端、制作小車的藍牙模塊,并將之作為服務端。客戶端采用Eclipse開發(fā)環(huán)境,J2ME編程,服務端采用單片機控制。雙方通過串口仿真協(xié)議進行通信,單片機驅動直流電機控制小車的前進、倒退,轉向和停止的動作。(2)工作要求:①查閱參考文獻,利用通信原理基本理論,分析系統(tǒng)工作原理,設計系統(tǒng)方框圖;②掌握計算機輔助設計方法,③熟悉通信系統(tǒng)的利用Multisim等EDA軟件進行仿真設計,具備獨立設計能力;調試和測量方法;④掌握電子電路安裝調試技術,選擇合適的元器件搭接實際電路,掌握電路的測試和故障排除方法,提高分析問題和解決問題的能力。2。對課程設計成果的要求〔包括圖表(或實物)等硬件要求〕:設計系統(tǒng)方框圖,對系統(tǒng)方框圖進行仿真,分析實驗結果.撰寫設計說明書,書寫格式規(guī)范,語言流暢簡潔,文字不得少于3000字。要求圖表清晰,分析通徹,有理有據(jù).3.主要參考文獻:[1]樊昌信.通信原理(第6版)[M]。北京:電子工業(yè)出版社,2012,12。[2]樊昌信,曹麗娜

。通信原理教程(第3版)[M].北京:國防工業(yè)出版社,2006,9.[3]劉學勇

.詳解MATLAB/Simulink通信系統(tǒng)建模與仿真[M]。北京:電子工業(yè)出版社,2011,11.[4]張水英

,徐偉強

。通信原理及MATLAB/Simulink仿真[M]。北京:人民郵電出版社,2012,9.[5]趙鴻圖,茅艷

.通信原理MATLAB仿真教程[M].北京:人民郵電出版社,2010,11.[6]趙靜

,張瑾

.基于MATLAB的通信系統(tǒng)仿真[M].北京:北京航空航天大學出版社,2010,1。[7]趙謙

.通信系統(tǒng)中MATLAB基礎與仿真應用[M]。西安:西安電子科技大學出版社,2010,3。[8]段吉海

,黃智偉.基于CPLD/FPGA的數(shù)字通信系統(tǒng)建模與設計[M].北京:電子工業(yè)出版社,2004,8。[9]趙全利,肖興達

.單片機原理及應用教程[M].北京:機械工業(yè)出版,2007,6.[10]金純

,林金朝.藍牙協(xié)議及其源代碼分析[M].北京:國防工業(yè)出版社,2006,6.[11]黃智偉

.基于NIMultisim的電子電路計算機仿真設計與分析(修訂版)[M].北京:電子工業(yè)出版社,2011,6.[12]孫屹

,戴妍峰

.SystemView通信仿真開發(fā)手冊[M].北京:國防工業(yè)出版社,2004,11.[13]劉斌。JavaME使用詳解——用Eclipse進行移動開發(fā)[M].北京:電子工業(yè)出版社,2007,2。4。課程設計工作進度計劃:序號起迄日期工作內容12015.5.5系統(tǒng)方案設計22015。5.10利用EDA軟件進行仿真設計,軟件設計32。15.6.1硬件設計、調試和測量,排除故障,分析實驗結果42015。6.25整理設計報告指導教師李圣日期:2015年5月5日附件:《通信原理課程設計》設計說明書格式一、紙張和頁面要求A4紙打印;頁邊距要求如下:頁邊距上下各為2。5厘米,左右邊距各為2.5厘米;行間距取固定值(設置值為20磅);字符間距為默認值(縮放100%,間距:標準).二、說明書裝訂頁碼順序(1)任務書(2)論文正文(3)參考文獻,(4)附錄三、課程設計說明書撰寫格式見范例范例引言(黑體四號)☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆(首行縮進兩個字,宋體小四號)1☆☆☆☆(黑體四號)正文……(首行縮進兩個字,宋體小四號)1。1(空一格)☆☆☆☆☆☆(黑體小四號)正文……(首行縮進兩個字,宋體小四號)1.2☆☆☆☆☆☆、☆☆☆正文……(首行縮進兩個字,宋體小四號)2☆☆☆☆☆☆(黑體四號)正文……(首行縮進兩個字,宋體小四號)2.1☆☆☆☆、☆☆☆☆☆☆,☆☆☆(黑體小四號)正文……(首行縮進兩個字,宋體小四號)2.1.1☆☆☆,☆☆☆☆☆,☆☆☆☆(楷體小四號)正文……(首行縮進兩個字,宋體小四號)(1)……①………………圖1.工作波形示意圖(圖題,居中,宋體五號)5結論(黑體四號)☆☆☆☆☆☆(首行縮進兩個字,宋體小四號)參考文獻(黑體四號、頂格)參考文獻要另起一頁,一律放在正文后,不得放在各章之后。只列出作者直接閱讀過或在正文中被引用過的文獻資料,作者只寫到第三位,余者寫“等”,英文作者超過3人寫“etal”。幾種主要參考文獻著錄表的格式為:⑴專(譯)著:[序號]著者.書名(譯者)[M].出版地:出版者,出版年:起~止頁碼。⑵期刊:[序號]著者.篇名[J]???,年,卷號(期號):起~止頁碼.⑶論文集:[序號]著者.篇名[A]編者。論文集名[C].出版地:出版者,出版者。出版年:起~止頁碼。⑷學位論文:[序號]著者.題名[D]。保存地:保存單位,授予年。⑸專利文獻:專利所有者.專利題名[P]。專利國別:專利號,出版日期。⑹標準文獻:[序號]標準代號標準順序號—發(fā)布年,標準名稱[S].⑺報紙:責任者.文獻題名[N]。報紙名,年—月—日(版次)。附錄(居中,黑體四號)☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆(首行縮進兩個字,宋體小四號)(另起一頁。附錄的有無根據(jù)說明書(設計)情況而定,內容一般包括正文內不便列出的冗長公式推導、符號說明(含縮寫)、計算機程序、整體仿真原理圖、系統(tǒng)仿真結果圖等。引言本設計是基于手機藍牙的遙控小車的設計與制作,藍牙選擇的是android手機的藍牙,使用的是Eclipse+androidSDKIDE開發(fā)環(huán)境,使用JAVA語言進行開發(fā)。小車的控制是基于STM32控制器,通過串口接收指令來完成相應的控制。手機藍牙軟件設計簡介藍牙:是一種無線技術標準,可實現(xiàn)固定設備,移動設備和樓宇個人域網之間的短距離數(shù)據(jù)交換(使用2。4-2.485GHz的ISM波段的UHF無線電波).藍牙技術最初由愛立信公司于1994年創(chuàng)立,當時是作為RS232數(shù)據(jù)線的無線替代方案,藍牙可連接多個設備,克服了數(shù)據(jù)同步的難題。通信協(xié)議電纜替代協(xié)議(RFCOMM)RFCOMM是基于ETSI-07.10規(guī)范的串行線仿真協(xié)議。它在藍牙基帶協(xié)議上仿真RS-232控制和數(shù)據(jù)信號,為使用串行線傳送機制的上層協(xié)議提供服務。點對點協(xié)議(PPP)在藍牙技術中,PPP位于PFCOMM上層,完成點對點的連接?;赼ndroid手機的藍牙設計對android操作系統(tǒng),在進行藍牙開發(fā)之前需要先獲得藍牙權限。方法為在AndroidManifest.xml文件中添加〈uses-permissioandroid:name="android.permission.BLUETOOTH_ADMIN"/>〈uses-permissionandroid:name="android.permission.BLUETOOTH"/〉然后是對軟件界面的開發(fā),使用的是RelativeLayout排布方法;完成圖如下UI完成圖2STM32串口通信設計2。1簡介通用同步異步收發(fā)器(USART)提供了一種靈活的方法與使用工業(yè)標準NRZ異步串行數(shù)據(jù)格式的外部設備之間進行全雙工數(shù)據(jù)交換。USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互連網),智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIRENDEC規(guī)范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。使用多緩沖器配置的DMA方式,可以實現(xiàn)高速數(shù)據(jù)通信。2.2USART功能概述接口通過三個引腳與其他設備連接在一起(見圖248).任何USART雙向通信至少需要兩個腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。RX:接收數(shù)據(jù)串行輸.通過過采樣技術來區(qū)別數(shù)據(jù)和噪音,從而恢復數(shù)據(jù).TX:發(fā)送數(shù)據(jù)輸出.當發(fā)送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時,TX引腳處于高電平。在單線和智能卡模式里,此I/O口被同時用于數(shù)據(jù)的發(fā)送和接收.●總線在發(fā)送或接收前應處于空閑狀態(tài)●一個起始位●一個數(shù)據(jù)字(8或9位),最低有效位在前●0.5,1.5,2個的停止位,由此表明數(shù)據(jù)幀的結束●使用分數(shù)波特率發(fā)生器—-12位整數(shù)和4位小數(shù)的表示方法.●一個狀態(tài)寄存器(USART_SR)●數(shù)據(jù)寄存器(USART_DR)●一個波特率寄存器(USART_BRR),12位的整數(shù)和4位小數(shù)●一個智能卡模式下的保護時間寄存器(USART_GTPR)在同步模式中需要下列引腳:●CK:發(fā)送器時鐘輸出。此引腳輸出用于同步傳輸?shù)臅r鐘,(在Start位和Stop位上沒有時鐘脈沖,軟件可選地,可以在最后一個數(shù)據(jù)位送出一個時鐘脈沖)。數(shù)據(jù)可以在RX上同步被接收。這可以用來控制帶有移位寄存器的外部設備(例如LCD驅動器)。時鐘相位和極性都是軟件可編程的。在智能卡模式里,CK可以為智能卡提供時鐘。在IrDA模式里需要下列引腳:●IrDA_RDI:IrDA模式下的數(shù)據(jù)輸入?!馡rDA_TDO:IrDA模式下的數(shù)據(jù)輸出。下列引腳在硬件流控模式中需要:●nCTS:清除發(fā)送,若是高電平,在當前數(shù)據(jù)傳輸結束時阻斷下一次的數(shù)據(jù)發(fā)送?!駈RTS:發(fā)送請求,若是低電平,表明USART準備好接收數(shù)據(jù)2.3USART編程設計串口設置的一般步驟可以總結為如下幾個步驟:1)串口時鐘使能,GPIO時鐘使能2)串口復位3)GPIO端口模式設置4)串口參數(shù)初始化5)開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)6)使能串口7)編寫中斷處理函數(shù)其中,中斷函數(shù)為本設計的關鍵,我們定義發(fā)送的指令以Q結尾,向左轉為A,向右轉為D,前進為W,后退為S,停止位P,所以下位機的程序流程圖為:3系統(tǒng)調試3.1上位機的調試:剛開始時,藍牙APP發(fā)送的數(shù)據(jù)不對,經過檢查,發(fā)現(xiàn)回調函數(shù)不對,更改后正常了。3.2下位機的調試:下載好程序進行硬件調試,在串口中斷中設置了斷點,可發(fā)現(xiàn)當有數(shù)據(jù)從手機中發(fā)送過來時,下位機程序進不到串口中斷中,后來發(fā)現(xiàn)原來是串口通信的TX與RX線沒有接對,剛開始時是天真的以為是TX與TX相連,RX與RX相連。對調連線后,下位機程序正常了。3.3系統(tǒng)總體調試:一切正常,但由于實驗空間有限,車子運行起來容易撞墻,所以后來又自己新添加了一個超聲波測距模塊,這樣便能很好的防止車子很快就被損壞.4總結要有團隊合作精神,這次課設能按標準完成就是團隊合作很好的表現(xiàn)。做任何事都要細心,特別是對于編程來說,你的任何一個不注意的錯誤可能會讓你查一天都查不出來主要參考文獻:[1]趙全利,肖興達

。單片機原理及應用教程[M].北京:機械工業(yè)出版,2007,6。[2]樊昌信.通信原理(第6版)[M]。北京:電子工業(yè)出版社,2012,12.[3]金純

,林金朝.藍牙協(xié)議及其源代碼分析[M].北京:國防工業(yè)出版社,2006,6。[4]劉斌.JavaME使用詳解——用Eclipse進行移動開發(fā)[M]。北京:電子工業(yè)出版社,2007,2.附實物圖:附上位機串口中斷處理程序:voidUSART1_IRQHandler(void)//串口1中斷服務程序{u16set_speed;u8Rx_lenth;u8Res;u8get_order;#ifdefOS_TICKS_PER_SEC//如果時鐘節(jié)拍數(shù)定義了,說明要使用ucosII了。OSIntEnter();#endifif(USART_GetITStatus(USART1,USART_IT_RXNE)?。絉ESET)//接收中斷(接收到的數(shù)據(jù)是以Q結尾的){Res=USART_ReceiveData(USART1);//(USART1->DR);//讀取接收到的數(shù)據(jù)if(Res==’Q’){Rx_lenth=USART_RX_STA;if(Rx_lenth〈2){get_order=USART_RX_BUF[0];if(get_order=='D'){if(dir〈=1870){dir+=5;TIM_SetCompare1(TIM4,dir);}else;//right}elseif(get_order=='A'){if(dir>=1830){dir—=5;TIM_SetCompare1(TIM4,dir);}else;//left}elseif(get_order=='S'){if(speed〈=3099){speed+=500;if(speed〉0){GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);TIM_SetCompare3(TIM1,speed);TIM_SetCompare4(TIM1,speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);set_speed=-speed;TIM_SetCompare3(TIM1,set_speed);TIM_SetCompare4(TIM1,set_speed);}}else;//back}elseif(get_order=='W’){if(speed>=-3099){speed—=500;if(speed〉0){GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);TIM_SetCompare3(TIM1,speed);TIM_SetCompare4(TIM1,speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);set_speed=-speed;TIM_SetCompare3(TIM1,set_speed);TIM_SetCompare4(TIM1,set_speed);}}else;//forward}elseif(get_order=='P'){speed=0;GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);//急剎TIM_SetCompare3(TIM1,3599);TIM_SetCompare4(TIM1,3599);//stop}else{USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收}}else{USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收}}else{USART_RX_BUF[USART_RX_STA]=Res;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1)){USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收}}}附藍牙程序源碼:〈?xmlversion="1。0”encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas。android.com/apk/res/android"android:layout_width="mat(yī)ch_parent"android:layout_height="match_parent"android:orientat(yī)ion="vertical"><ImageButtonandroid:id=”@+id/imageButton2"android:layout_width=”wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/imageButton3”android:layout_toRightOf=”@+id/imageButton4"android:contentDescription="@string/down"android:src=”@drawable/ic_down"/>〈ImageButtonandroid:id=”@+id/imageButton3”android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below=”@+id/imageButton1”android:layout_toRightOf="@+id/imageButton2"android:contentDescription="@string/right"android:src="@drawable/ic_right”/〉<ImageButtonandroid:id="@+id/imageButton1"android:layout_width="wrap_content"android:layout_height=”wrap_content"android:layout_alignParentTop="true"android:layout_marginTop="90dp”android:layout_toLeftOf=”@+id/imageButton3"android:contentDescription="@string/up"android:src=”@drawable/ic_up"/>〈ImageButtonandroid:id="@+id/imageButton6"android:layout_width=”wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/imageButton3”android:layout_below="@+id/imageButton2”android:layout_marginLeft="22dp"android:layout_marginTop="25dp”android:contentDescription="@string/stop”android:src="@drawable/ic_stop”/>〈ImageButtonandroid:id=”@+id/imageButton5”android:layout_width="wrap_content”android:layout_height="wrap_content"android:layout_alignLeft="@+id/imageButton4"android:layout_alignTop="@+id/imageButton6"android:contentDescription="@string/bluetooth”android:onClick="onBluetoothButton"android:src="@drawable/ic_bluet"/><ImageButtonandroid:id="@+id/imageButton4"android:layout_width="wrap_content"android:layout_height="wrap_content”android:layout_alignParentLeft="true”android:layout_below="@+id/imageButton1”android:layout_marginLeft="43dp"android:contentDescription=”@string/left"android:src="@drawable/ic_left"/></RelativeLayout>獲得本地藍牙的句柄,從而操作手機的藍牙設備BluetoothAdaptermBtAdapter=BluetoothAdapter。getDefaultAdapter();主要源碼publicclassMainActivityextendsActivity{privatefinalstaticintREQUEST_CONNECT_DEVICE=1;privatefinalstaticStringMY_UUID="00001101-0000-1000-8000-00805F9B34FB”;BluetoothSocket_Socket=null;BluetoothDevice_device=null;BluetoothSocket_socket=null;boolean_discoveryFinished=false;privateTextViewtext0;//privat(yī)eEditTextedit0;//獲得本地藍牙適配器privat(yī)eBluetoothAdapterbAdapter=BluetoothAdapter.getDefaultAdapter();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R。layout。activity_main);//藍牙打開不成功if(bAdapter==null){Toast.makeText(MainActivity.this,”手機藍牙打開不?。〈髠b確定你手機有藍牙?,",Toast.LENGTH_LONG).show();finish();return;}newThread(){publicvoidrun(){if(!bAdapter.isEnabled()){Intentenabler=newIntent(BluetoothAdapter。ACTION_REQUEST_ENABLE);intREQUEST_ENABLE=1;startActivityForResult(enabler,REQUEST_ENABLE);}}}.start();}publicvoidonBluetoothButton(ViewV){if(!bAdapter.isEnabled()){Toast.makeText(MainActivity.this,"別急!藍牙打開中。.?!?Toast.LENGTH_LONG).show();return;}//ButtonBluetoothButton=(Button)findViewById(R。id。imageButton6);if(_Socket==null){IntentserverIntent=newIntent(MainActivity.this,DeviceListActivity.class);//跳轉程序設置startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE);//設置返回宏定義}else{try{_Socket.close();_Socket=null;//BluetoothButton。setText("連接”);}catch(Exceptione){//TODO:handleexception}}return;}//定義廣播接收器privateBroadcastReceiver_foundReceiver=newBroadcastReceiver(){publicvoidonReceive(Contextcontext,Intentintent){_device=intent.getParcelableExtra(BluetoothDevice。EXTRA_DEVICE);;text0.setText(”找尋到設備:"+_device。getName());}};privateBroadcastReceiver_discoveryReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){/*卸載注冊的接收器*/unregisterReceiver(_foundReceiver);unregisterReceiver(this);_discoveryFinished=true;}};//連接搜尋服務publicvoidonSearchButtonClicked(Viewv){IntentFilterdiscoveryFilter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);registerReceiver(_discoveryReceiver,discoveryFilter);IntentFilterfoundFilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(_foundReceiver,foundFilter);newThread(){publicvoidrun(){//開始搜索bAdapter.startDiscovery();for(;;){if(_discoveryFinished){break;}try{Thread。sleep(100);}catch(InterruptedExceptione){}}}}.start();text0.setText(”正在搜尋設備?!?;}//接收活動結果,響應startActivityForResult()publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){switch(requestCode){caseREQUEST_CONNECT_DEVICE://連接結果,由DeviceListActivity設置返回//響應返回結果if(resultCode==Activity。RESULT_OK){//連接成功,由DeviceListActivity設置返回//MAC地址,由DeviceListActivity設置返回Stringaddress=data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);//得到藍牙設備句柄_device=bAdapter.getRemoteDevice(address);//用服務號得到sockettry{_socket=_device.creat(yī)eRfcommSocketToServiceRecord(UUID。fromString(MY_UUID));}catch(IOExceptione){Toast。makeText(this,"連接失敗!”,Toast。LENGTH_SHORT).show();}//連接socketButtonbtn=(Button)findViewById(R。id.imageButton5);try{_socket。connect();Toast.makeText(this,”連接"+_device.getName()+"成功?。?Toast.LENGTH_SHORT)。show();btn.setText(”斷開");}catch(IOExceptione){try{Toast.makeText(this,"連接失敗?。?,Toast.LENGTH_SHORT).show();_socket.close();_socket=null;}catch(IOExceptionee){Toast。makeText(this,"連接失敗!”,Toast。LENGTH_SHORT).show();}return;}}break;default:break;}}//連接設備publicvoidonConenectButtonClicked(Viewv){try{_socket。connect();text0。setText("成功建立連接,可以發(fā)送數(shù)據(jù)!"+_device.getName());}catch(IOExceptione){//text0.setText(e.toString());text0.setText(”連接失敗");}}}編號單片機課程設計(級)題目:基于單片機智能紅外遙控小車的設計學院:物理與機電工程學院專業(yè):電子信息科學與技術作者姓名:指導教師:職稱:副教授完成日期:20年1月6日基于單片機智能紅外遙控小車的設計摘

要本次設計的簡易智能小車,采用STC89C52RC單片機作為小車的檢測和控制核心;采用紅外線遙控遠程人為控制小車行駛狀態(tài);采用SM4105W80U3顯示小車處于自動行駛還是遙控行駛;可以實現(xiàn)小車的前進、后退、左轉、右轉、停止運動。

關鍵詞:STC89C52RC;紅外遙控1

本設計能實現(xiàn)對小車的運動狀態(tài)進行實時控制,控制靈活、可靠,精度高,可滿足對系統(tǒng)的各項要求.本設計采用MCS-51系列中的STC89C52RC單片機。以STC89C52RC為控制核心,使用紅外遙控對小車的前進、后退、左轉、右轉、停止運動進行實時的控制。

本次設計主要內容是基于STC89C52RC設計一部智能小車,小車能夠實現(xiàn)自動前進,和紅外遙控的智能小車控制系統(tǒng),包括了對驅動電路,紅外通訊等的探索和研究。

方案設計與論證

2.1

遙控方案的選擇

由于屬于小范圍內遙控,小車在小范圍內行駛,為了減少設計成本,增加便利性,所以采用常用的家用電視紅外遙控器作為紅外遙控發(fā)射部分,只需在小車上加裝紅外接收裝置即可.定義遙控器的上一曲鍵為左轉鍵,暫停鍵為右轉鍵,下一曲鍵為停止鍵,CH健為前進鍵,音量增大鍵為后退鍵,實現(xiàn)小車行駛的基本控制。

紅外遙控系統(tǒng)的組成如圖2。1所示。發(fā)射部分包括鍵盤矩陣、編碼調制、LED紅外發(fā)送器;接收部分包括光、電轉換放大器、解調、解碼電路。圖2.1紅外流程圖

2。2

遙控對小車的控制

切換到紅外遙控功能,對小車的前進、后退、左轉、右轉、停止運動實現(xiàn)實時控制,具體如下所述:(1)前進是左右兩個電機同時順時針旋轉,實現(xiàn)小車的前進;(2)后退是左右兩個電機同時逆時針旋轉,實現(xiàn)小車的后退;(3)停止是左右兩個電機同時停止旋轉,實現(xiàn)小車的停止;(4)右轉是右電機逆時針旋轉和左電機順時針旋轉同時工作,實現(xiàn)小車的右轉;(5)左轉是左電機逆時針旋轉和右電機順時針旋轉同時工作,實現(xiàn)小車的左轉;

實現(xiàn)不同的運動方式,是通過PWM信號對L293D芯片中的H橋進行控制。電橋一端接電源,另一端接了一個三極管.三極管導通時,電橋通過三極管接地,電機電樞中有電流通過;三極管截止時,電橋浮空,電機電樞中沒有電流通過。系統(tǒng)通過電橋的輸出端為轉向電機供電。通過對繼電器開閉的控制即可控制電機的開斷和轉速方向進而達到控制玩具車前行與倒車的目的。2。3系統(tǒng)原理圖系統(tǒng)原理圖如圖2.2所示:LED顯示模塊接P1。1—1.7口;紅外遙控接P3。2口;看門狗定時器接2.7口:電機控制接P0.0-0.3口;蜂鳴器接P0.7口;功能切換鍵接P3.4口。起停運動L起停運動L293D驅動STC89C52RCLED顯示紅外遙控LED顯示紅外遙控復位電路光電隔離復位電路光電隔離圖2.2系統(tǒng)框圖3

硬件設計

3.189C52單片機硬件結構

89C52單片機是把那些作為控制應用所必需的基本內容都集成在一個尺寸有限的集成電路芯片上。如果按功能劃分,它由如下功能部件組成,即微處理器、數(shù)據(jù)存儲器、程序存儲器、并行I/O口、串行口、定時器/計數(shù)器、中斷系統(tǒng)及特殊功能寄存器。它們都是通過片內單一總線連接而成,其基本結構依舊是CPU加上外圍芯片的傳統(tǒng)結構模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式。

3.2

最小應用系統(tǒng)設計

3.2。1最小系統(tǒng)用89C52單片機進行構成最小應用系統(tǒng)時,只要將單片機接上時鐘電路和復位電路即可,如圖3。1所示。由于集成度的限制,最小系統(tǒng)只能用作一些最小的控制單元。但也擁有一些有點:

(1)

有可供用戶使用的大量I/O口線。

(2)

內部存儲器容量有限。

(3)

應用系統(tǒng)開發(fā)具有特殊性。圖3.1最小系統(tǒng)電路圖3.2。2燒寫接口電路

RST置高電平,然后向單片機串行發(fā)送編程命令。P1。7(SCK)輸入移位脈沖,P1。6(MISO)串行輸出,P1.5(MOSI)串行輸入。被燒寫的單片機一定是最小系統(tǒng)(單片機已經接好電源,晶振,可以運行)。如圖3。2燒寫接口電路。圖3.2燒錄程序電路圖3.2.3

PWM脈寬調速

本設計調速采用PWM控制,選用了常用的雙極式H型變換器,它是由4個三極電力晶體管和四個續(xù)流二極管組成的橋式電路.圖3.3為雙極式H型可逆PWM變換器的電路原理圖.

4個電力晶體管的基極驅動電壓分為兩組。VT1和VT4同時導通和關斷,其驅動電路中Ub1=Ub4;VT2和VT3同時動作,其驅動電壓Ub2=Ub3=—Ub1。

雙極式PWM變換器的優(yōu)點如下:(1)電流一定連續(xù);

(2)可使電動機在四象限中運行;

(3)電機停止時有微振電流,能消除靜摩擦死區(qū);

(4)低速時,每個晶體管的驅動脈沖仍較寬,有利于保證晶體管可靠導通;

(5)低速平穩(wěn)性好,調速范圍可達20000左右。圖3.3PWM驅動電路圖3.2.4電源的設計

本設計的電源為車載電源.為保證電源工作可靠,單片機系統(tǒng)與動力伺服系統(tǒng)的電源采用了大功率、大容量的蓄電池;而傳感器的工作電源則采用了小巧輕便的干電池。3。3

紅外線遙控電路

方便起見,本設計直接采用電視遙控器作為紅外遙控的發(fā)射器,只需在小車上加裝紅外接收裝置即可

紅外接收器的電路圖如圖3.4所示:圖3.4紅外線遙控電路3.4

顯示電路設計本設計中用一片1位七段數(shù)碼管SM4105W80U3作顯示器,顯示數(shù)字。

七段數(shù)碼管SM4105W80U3中的a﹑b﹑c﹑d﹑e﹑f﹑g﹑dp分別連接在單片機的P2。1—P2.7,分別控制各段碼,與單片機的連接如圖3。5所示。圖3。5顯示電路圖4

軟件設計

4。1

設計流程

一個智能化的系統(tǒng),軟件設計必不可少,軟件設計是更具系統(tǒng)需求,通過編程語言控制單片機的行為,實現(xiàn)智能控制。

模塊化的程序設計有以下有點:(1)單個模塊比起一個完整的程序易編寫及調試;

(2)模塊可以共存,一個模塊可以被多個任務在不同條件下調用;(3)模塊程序允許設計者分割任務和利用已有程序,為設計者提供方便。

本系統(tǒng)軟件采用模塊化結構,由主程序﹑中斷子程序顯示子程序﹑算法子程序、遙控子程序構成。

本次設計采用的即是模塊化的軟件編程,各程序功能清晰、明確.軟件流程圖如圖4。1所示:NY結束自動行駛遙控行駛遙控功能選擇開始開始NY結束自動行駛遙控行駛遙控功能選擇開始開始圖4.1流程圖4。2

軟件抗干擾技術提高小車智能控制的可靠性,僅靠硬件抗干擾是不夠的,需要進一步借助于軟件抗干擾技術來克服某些干擾。在單片機控制系統(tǒng)中,如能正確的采用軟件抗干擾技術,與硬件干擾措施構成雙道抗干擾防線,無疑為了將大大提高控制系統(tǒng)的可靠性。經常采用的軟件抗干擾技術是數(shù)字濾波技術、指令冗余技術、軟件陷阱技術等。4。3

程序設計

軟件設計采用模塊化設計,思路清晰,也便于查找問題。紅外遙控鍵位對應子程序流程圖如圖4。2所示開始開始開始采集紅外遙控數(shù)據(jù)NY采集紅外遙控數(shù)據(jù)NY延時等待延時等待判地址碼判地址碼是否相同進行鍵進行鍵位對應結束結束圖4.2紅外遙控流程圖5不足與展望本次設計的總體效果不是很好,控制靈敏性較差,尋跡和避障功能沒有很好的實現(xiàn)。因此要設計具有優(yōu)良的調速特性,調速平滑,方便使用,控制精確,轉動靈敏,可實現(xiàn)頻繁的無極快速起動、制動和轉動,需要滿足生產過程自動化系統(tǒng)各種不同的特殊要求.為此,設計制造高性能、高可靠性的智能小車控制系統(tǒng)有著十分重要的現(xiàn)實意義。6設計心得經過這次課程設計我感受頗多,在正式進行設計之前,我參考了一些網上的資料,通過對這些設計方案來開拓自己的思路,最后終于有了自己的思路。此次課程設計不僅是對前面所學單片機技術和運動控制理論的一種檢驗,更是對所學知識大融合,站在新的高度看待新的問題,而且也是對自己運用所學知識的能力的一種提高.通過這次課程設計使我明白了自己原來知識還比較欠缺,自己要學習的東西還太多。以前老是覺得自己什么東西都會,什么東西都懂,有點眼高手低.通過這次課程設計,我才明白學習是一個長期積累的過程。參考文獻[1]張毅剛,喜元.原理與應用設計[M].北京:北京市海淀區(qū)四季青印刷廠,2010。[2]張毅剛.新編MCS-51單片機運用設計[M]。哈爾濱:哈爾濱工業(yè)大學出版社,2003.[3]張義和,敏男,宏昌,長春.例說51單片機(c語言版)[M]。北京:人民郵電出版社,2009.[4]馬忠梅籍順心張凱馬巖.單片機的C語言應用程序設計[M].北京:北京航空航天大學,2010。[5]SamsungElectronics。S3C44BOXRiscmicrocontrollerARMinstructionsheet.2002.[6]郭天祥.《51單片機C語言教程》[M]。子工業(yè)出版社,2005年7月.[7]丁元杰.《單片微機原理及應用》[M],械工業(yè)出版社,2005年7月.[8]樓然苗,光。《單片機課程設計指導》[M].京:北京航空航天大學出版社,2007。附錄1實物圖2源程序清單#include〈REGX52.H〉#include<intrins.h>sbitLeftLed=P2^0;sbitRightLed=P0^7;sbitFontLled=P1^7;sbitLeftIR=P3^5;sbitRightIR=P3^6;sbitFontIR=P3^7;sbitM1A=P0^0;sbitM1B=P0^1;sbitM2A=P0^2;sbitM2B=P0^3;sbitB1=P0^4;sbitSB1=P0^6;sbitIRIN=P3^3;unsignedcharcodeLedShowData[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x19};unsignedcharcodeRecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};unsignedcharIRCOM[7];stat(yī)icunsignedintLedFlash;bitEnableLight=0;#defineShowPortP2unsignedchartemp=1;voidtingzhi(){M1A=0;M1B=0;M2A=0;M2B=0;}voidqianjin(){M1A=1;M1B=0;M2A=1;M2B=0;}voidhoutui(){M1A=0;M1B=1;M2A=0;M2B=1;}voidzuozhuan(){M1A=0;M1B=1;M2A=1;M2B=0;}voidyouzhuan(){M1A=1;M1B=0;M2A=0;M2B=1;}voidDelay1ms(unsignedinti){unsignedcharj,k;do{j=10;do{k=50;do{_nop_();}while(—-k);}while(--j);}while(--i);}voiddelay_nus(unsignedinti){i=i/10;while(——i);}voiddelay_nms(unsignedintn){n=n+1;while(-—n)delay_nus(900);}voiddelayms(unsignedcharx){unsignedchari;while(x--){for(i=0;i〈13;i++){}}}voidDelay(){unsignedintDelayTime=30000;while(DelayTime—-);return;}voidControlCar(unsignedcharConType)tingzhi();switch(ConType){case1://前進{LeftLed=0;qianjin();break;}case2://后退{LeftLed=1;houtui();break;}case3://左轉{zuozhuan();break;}case4://右轉{youzhuan();break;}case8://停止{tingzhi();break;}}}voidControlCar_yaokong(unsignedcharConType){tingzhi();switch(ConType){case1://前進{tingzhi();Delay1ms(150);LeftLed=0;qianjin();break;}case2://后退{tingzhi();Delay1ms(150);LeftLed=1;houtui();break;}case3://左轉{tingzhi();Delay1ms(150);zuozhuan();break;}case4://右轉{tingzhi();Delay1ms(150);youzhuan();break;}case8://停止{tingzhi();break;}}}voidmain(){bitRunFlag=0;LedFlash=3000;EX1=1;IT1=1;EA=1;ControlCar(8);while(1){if(P3_2==0){delay_nms(10);if(P3_2==0){temp++;while(!P3_2);}}if(temp〉3){temp=1;}switch(temp){case1:ShowPort=LedShowData[1];Robot_Traction();EX1=0;break;case2:ShowPort=LedShowData[2];Robot_Avoidance();EX1=0;break;case3:ShowPort=LedShowData[3];EX1=1;break;}}}voidIR_IN()interrupt2using0{unsignedcharj,k,N=0;EX1=0;delayms(15);if(IRIN==1){EX1=1;return;}while(!IRIN){delayms(1);}for(j=0;j<4;j++){for(k=0;k<8;k++){while(IRIN){delayms(1);}while(!IRIN){delayms(1);}while(IRIN){delayms(1);N++;if(N>=30){EX1=1;return;}}IRCOM[j]=IRCOM[j]>〉1;if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}N=0;}}if(IRCOM[2]?。絶IRCOM[3]){EX1=1;return;}for(j=0;j<10;j++){if(IRCOM[2]==RecvDat(yī)a[j]){ControlCar_yaokong(j);}}EX1=1;}JJINGCHUUNIVERSITYOFTECHNOLOGY《一個簡單的計算器設計》課程設計報告學院:計算機工程學院學號:2012304030223姓名:朱鐘雄專業(yè)年級:12計算機應用技術2班指導教師:游明坤時間:2014年12月25日基于對話框的計算器MFC方法實現(xiàn)隨著社會的發(fā)展,人們在日常生活中經常需要用到計算器來進行簡單或者復雜的運算,計算器在人們生活中的地位也越來越重要.簡單的計算器能實現(xiàn)加、減、乘、除、開方、平方等運算。學習了C++的程序設計語言這門課程,可以利用基于VC的MFC方法制作一個簡易的計算器,實現(xiàn)基本的運算功能,從而滿足生活中的需要,降低計算的難度。一.面向對象的程序設計方法區(qū)別與面向過程的“先功能后數(shù)據(jù)”思想,面向對象的程序設計方法把狀態(tài)(數(shù)據(jù))和行為(功能)捆綁在一起,形成了對象。當遇到一個具體的問題時,我們只需要將一個系統(tǒng)分解成一個個的對象,同時將狀態(tài)和行為封裝在對象中.

面向對象的程序設計方法具有三個基本特點:封裝、繼承和多態(tài).

(1)

封裝性

封裝是一個用來指代將對象的狀態(tài)和行為捆綁到一個單一邏輯單元的機制的正式術語。它不是面向對象語言所特有的,面向過程的C語言用結構封裝了數(shù)據(jù),函數(shù)封裝了邏輯。但是面向對象封裝了兩者,從這種意義上來說,面向對象的封裝更加完美。

出于一些安全性與方便性的考慮,對象經常會限制對它們特征(包括屬性和方法)的訪問,這種限制稱為信息隱藏。作為對象的抽象,類通常只公開對象可以公開的東西,主要是一個特定對象對系統(tǒng)的服務,而隱藏執(zhí)行服務的內部細節(jié)和為了完成這些服務而設計的數(shù)據(jù)。

2)

繼承性

繼承是定義新類的一種機制,使用這種機制創(chuàng)建新類時只需要聲明新類和已創(chuàng)建類之間的差別。

對于一個特定的繼承關系,我們將創(chuàng)建的新類稱為子類(subclass),被繼承的原始類稱為超類(superclass).子類可以使用超類定義屬性和方法,也可以自己定義新的屬性和方法。超類的特征不會受到子類的影響.

繼承帶來的第一個且是最顯而易見的好處是減少了代碼冗余,因此也減輕了需要改進或重寫代碼時的負擔.

進一步地,子類會比不使用繼承時更加簡潔,這點應當不難理解;通過繼承可以不加修改地重用和擴展已經徹底測試的代碼,這避免了工程性的組裝對已經完成測試代碼的影響;最好的一點,即使沒有已有類的源代碼,仍然可以從已有的類中派生出新類,只要我們擁有那個類編譯后的字節(jié)碼.

(3)多態(tài)性

術語多態(tài)指的是屬于兩個或多個不同類的對象以各自的類相關的不同方式響應同一消息(方法調用)的能力。同一個消息根據(jù)發(fā)送的對象不同而采用多種不同的行為方式.換句話說多態(tài)使得消息發(fā)送者能給一組具有公共接口的對象發(fā)送相同的消息,接收者做出相應的回應。

多態(tài)的作用:增強了代碼的可讀性、操作的透明性,增強了代碼的靈活性和可擴充性。二。MFC程序設計方法

(1)API

應用程序編程的接口函數(shù)

一個應用程序要和具體的硬件打交道,比如接收按鍵值,接收鼠標左擊或右擊,記錄鼠標的坐標等,就勢必要有所有這些硬件的驅動,這樣加大了程序的代碼量。而且,每一個應用程序都得寫,增加了不必要的重復工作。操作系統(tǒng)就是解決這些問題的。

操作系統(tǒng)基于硬件和應用程序之間,它提供應用程序調用的函數(shù),應用程序可通過這些函數(shù)與硬件打交道。而這些函數(shù)就是API.

(2)MFC(Microsoft

Foundation

Class)微軟基礎類庫

MFC類庫集成了大量已經預先定義好的類,用戶可以根據(jù)編程的需要調用響應的類,或根據(jù)需要自定義有關的類.

(3)窗口

就是一個應用程序能夠看到的部分。是Windows應用程序中一個非常重要的元素。

通常都包含標題欄、菜單欄、系統(tǒng)菜單等

(4)消息和消息隊列

消息

:應用程序接收的事件都會產生相應的消息,消息的產生是因為事件發(fā)生的結果。如鍵盤有鍵盤按下和抬起消息,鼠標有點擊消息,畫面有刷新消息,重畫消息等。

編寫應用程序時,如果需要對某事件進行響應,如需要當按下Ctrl+S組合鍵就進行保存操作時,就需要對Ctrl+S這個事件對應的消息設計響應函數(shù)。

消息隊列

:

應用程序對事件消息進行的響應時從它本身的消息隊列里取出消息來執(zhí)行的。事件是有操作系統(tǒng)接收的,然后把它轉化成消息,再把消息送到應用程序所在的隊列中,供應用程序取走。

(5)事件驅動

Windows應用程序函數(shù)執(zhí)行過程沒有一個固定的順序。一條消息過來就對應進行響應(只要設計了響應函數(shù)),那條消息來就執(zhí)行那條對應的函數(shù),沒有消息就等待。

MFC程序設計的好處:一是MFC提供了一個標準化的結構,通過創(chuàng)建時的選擇就可以實現(xiàn)一個基本的程序功能.這樣不必從頭開始設計創(chuàng)建和管理一個標準Windows應用程序所需的代碼,節(jié)省了時間;二是它可以自動生成很多代碼,比如只要用類向導(ClassWizard)添加了一個成員變量,它就會自動在代碼的相應位置添加代碼進去,如果手動添加,不光麻煩,而且文件很多,位置不固定可能會遺漏。所以類向導是經常需要用的,以提高編程效率,減少出錯。

MFC編程的主要過程就是編寫消息響應函數(shù)的過程,因為其他的工作都自動生成了。因此就需要我們知道如何添加消息響應函數(shù)(用類向導),響應函數(shù)中寫什么內容。

響應函數(shù)的內容主要是調用系統(tǒng)函數(shù),類里定義的成員函數(shù),系統(tǒng)的系統(tǒng)函數(shù),以及變量的傳遞等.三。MFC實現(xiàn)計算器的程序設計程序流程圖點擊加減乘除點擊加減乘除等進行運算選擇點擊數(shù)字鍵,輸入第二個操作數(shù)點擊數(shù)字鍵,輸入第一個操作數(shù)點擊“=”鍵,輸出運算結果程序開始顯示運算結果主要程序代碼如下://為了能在同一個編輯框里顯示完整的算式,我添加了兩個編輯框,同時輸入,一個負責計算數(shù)據(jù)的不可見,另一個可見的用來顯示。voidCJncalDlg::OnNUM1()//點擊數(shù)字鍵1時顯示1{UpdateData(TRUE);?m_str1=m_str1+”1";/在編輯框1的字符串后加上字符1?m_str2=m_str2+"1";/在編輯框2的字符串后加上字符1UpdateData(FALSE);}voidCJncalDlg::OnNUM2()//按下數(shù)字鍵2時顯示數(shù)字2{UpdateData(TRUE); m_str1=m_str1+”2";//在編輯框1的字符串后加上字符2?m_str2=m_str2+"2”;//在編輯框2的字符串后加上字符2UpdateData(FALSE);}voidCJncalDlg::OnNUM3()//按下數(shù)字鍵3時顯示數(shù)字3{UpdateData(TRUE); m_str1=m_str1+”3";//在編輯框1的字符串后加上字符3?m_str2=m_str2+"3”;//在編輯框2的字符串后加上字符3UpdateData(FALSE);}數(shù)字鍵4、5、6、7、8、9、0、00的代碼同上voidCJncalDlg::OnSUB()//加法{UpdateData(TRUE); m_str2=m_str2+"+";//顯示框上顯示“+"Updat(yī)eDat(yī)a(FALSE);?SaveValue1();//調用函數(shù)將第一個操作數(shù)變?yōu)閐ouble型并保存m_Sign=0;//選擇語句的條件賦值}voidCJncalDlg::OnDEC()//減法{UpdateData(TRUE); m_str2=m_str2+”—";//顯示框上顯示“-”Updat(yī)eDat(yī)a(FALSE);?SaveValue1();//調用函數(shù)將第一個操作數(shù)變?yōu)椋鋙uble型并保存m_Sign=1;//選擇語句的條件賦值}voidCJncalDlg::OnMUL(){Updat(yī)eData(TRUE); m_str2=m_str2+"×";//顯示框上顯示“×”UpdateData(FALSE); SaveValue1();//調用函數(shù)將第一個操作數(shù)變?yōu)閐ouble型并保存m_Sign=2;//選擇語句的條件賦值}voidCJncalDlg::OnDIV()//除法{UpdateData(TRUE);?m_str2=m_str2+”÷”;//顯示框上顯示“÷"UpdateData(FALSE);?SaveValue1();//調用函數(shù)將第一個操作數(shù)變?yōu)椋洌飖ble型并保存m_Sign=3;//選擇語句的條件賦值}voidCJncalDlg::OnEQUAL()//“="操作{?Calculator();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論