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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

,徐偉強(qiáng)

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

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

,張瑾

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

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

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

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

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

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

,戴妍峰

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

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

,林金朝.藍(lán)牙協(xié)議及其源代碼分析[M].北京:國防工業(yè)出版社,2006,6。[4]劉斌.JavaME使用詳解——用Eclipse進(jìn)行移動開發(fā)[M]。北京:電子工業(yè)出版社,2007,2.附實(shí)物圖:附上位機(jī)串口中斷處理程序:voidUSART1_IRQHandler(void)//串口1中斷服務(wù)程序{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結(jié)尾的){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ù)錯誤,重新開始接收}}}附藍(lán)牙程序源碼:〈?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>獲得本地藍(lán)牙的句柄,從而操作手機(jī)的藍(lán)牙設(shè)備BluetoothAdaptermBtAdapter=BluetoothAdapter。getDefaultAdapter();主要源碼publicclassMainA(yù)ctivityextendsActivity{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;//獲得本地藍(lán)牙適配器privat(yī)eBluetoothAdapterbAdapter=BluetoothAdapter.getDefaultAdapter();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R。layout。activity_main);//藍(lán)牙打開不成功if(bAdapter==null){Toast.makeText(MainActivity.this,”手機(jī)藍(lán)牙打開不啊!大俠確定你手機(jī)有藍(lán)牙?,",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(MainA(yù)ctivity.this,"別急!藍(lán)牙打開中。.?!?Toast.LENGTH_LONG).show();return;}//ButtonBluetoothButton=(Button)findViewById(R。id。imageButton6);if(_Socket==null){IntentserverIntent=newIntent(MainActivity.this,DeviceListActivity.class);//跳轉(zhuǎn)程序設(shè)置startActivityForResult(serverIntent,REQUEST_CONNECT_DEVICE);//設(shè)置返回宏定義}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(”找尋到設(shè)備:"+_device。getName());}};privateBroadcastReceiver_discoveryReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){/*卸載注冊的接收器*/unregisterReceiver(_foundReceiver);unregisterReceiver(this);_discoveryFinished=true;}};//連接搜尋服務(wù)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(”正在搜尋設(shè)備?!?;}//接收活動結(jié)果,響應(yīng)startActivityForResult()publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){switch(requestCode){caseREQUEST_CONNECT_DEVICE://連接結(jié)果,由DeviceListActivity設(shè)置返回//響應(yīng)返回結(jié)果if(resultCode==Activity。RESULT_OK){//連接成功,由DeviceListActivity設(shè)置返回//MAC地址,由DeviceListActivity設(shè)置返回Stringaddress=data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);//得到藍(lán)牙設(shè)備句柄_device=bAdapter.getRemoteDevice(address);//用服務(wù)號得到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,"連接失敗?。ⅲ詏ast.LENGTH_SHORT).show();_socket.close();_socket=null;}catch(IOExceptionee){Toast。makeText(this,"連接失敗!”,Toast。LENGTH_SHORT).show();}return;}}break;default:break;}}//連接設(shè)備publicvoidonConenectButtonClicked(Viewv){try{_socket。connect();text0。setText("成功建立連接,可以發(fā)送數(shù)據(jù)!"+_device.getName());}catch(IOExceptione){//text0.setText(e.toString());text0.setText(”連接失敗");}}}編號單片機(jī)課程設(shè)計(jì)(級)題目:基于單片機(jī)智能紅外遙控小車的設(shè)計(jì)學(xué)院:物理與機(jī)電工程學(xué)院專業(yè):電子信息科學(xué)與技術(shù)作者姓名:指導(dǎo)教師:職稱:副教授完成日期:20年1月6日基于單片機(jī)智能紅外遙控小車的設(shè)計(jì)摘

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

關(guān)鍵詞:STC89C52RC;紅外遙控1

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

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

方案設(shè)計(jì)與論證

2.1

遙控方案的選擇

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

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

2。2

遙控對小車的控制

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

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

硬件設(shè)計(jì)

3.189C52單片機(jī)硬件結(jié)構(gòu)

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

3.2

最小應(yīng)用系統(tǒng)設(shè)計(jì)

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

(1)

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

(2)

內(nèi)部存儲器容量有限。

(3)

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

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

PWM脈寬調(diào)速

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

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

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

(2)可使電動機(jī)在四象限中運(yùn)行;

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

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

(5)低速平穩(wěn)性好,調(diào)速范圍可達(dá)20000左右。圖3.3PWM驅(qū)動電路圖3.2.4電源的設(shè)計(jì)

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

紅外線遙控電路

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

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

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

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

軟件設(shè)計(jì)

4。1

設(shè)計(jì)流程

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

模塊化的程序設(shè)計(jì)有以下有點(diǎn):(1)單個模塊比起一個完整的程序易編寫及調(diào)試;

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

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

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

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

程序設(shè)計(jì)

軟件設(shè)計(jì)采用模塊化設(shè)計(jì),思路清晰,也便于查找問題。紅外遙控鍵位對應(yīng)子程序流程圖如圖4。2所示開始開始開始采集紅外遙控?cái)?shù)據(jù)NY采集紅外遙控?cái)?shù)據(jù)NY延時等待延時等待判地址碼判地址碼是否相同進(jìn)行鍵進(jìn)行鍵位對應(yīng)結(jié)束結(jié)束圖4.2紅外遙控流程圖5不足與展望本次設(shè)計(jì)的總體效果不是很好,控制靈敏性較差,尋跡和避障功能沒有很好的實(shí)現(xiàn)。因此要設(shè)計(jì)具有優(yōu)良的調(diào)速特性,調(diào)速平滑,方便使用,控制精確,轉(zhuǎn)動靈敏,可實(shí)現(xiàn)頻繁的無極快速起動、制動和轉(zhuǎn)動,需要滿足生產(chǎn)過程自動化系統(tǒng)各種不同的特殊要求.為此,設(shè)計(jì)制造高性能、高可靠性的智能小車控制系統(tǒng)有著十分重要的現(xiàn)實(shí)意義。6設(shè)計(jì)心得經(jīng)過這次課程設(shè)計(jì)我感受頗多,在正式進(jìn)行設(shè)計(jì)之前,我參考了一些網(wǎng)上的資料,通過對這些設(shè)計(jì)方案來開拓自己的思路,最后終于有了自己的思路。此次課程設(shè)計(jì)不僅是對前面所學(xué)單片機(jī)技術(shù)和運(yùn)動控制理論的一種檢驗(yàn),更是對所學(xué)知識大融合,站在新的高度看待新的問題,而且也是對自己運(yùn)用所學(xué)知識的能力的一種提高.通過這次課程設(shè)計(jì)使我明白了自己原來知識還比較欠缺,自己要學(xué)習(xí)的東西還太多。以前老是覺得自己什么東西都會,什么東西都懂,有點(diǎn)眼高手低.通過這次課程設(shè)計(jì),我才明白學(xué)習(xí)是一個長期積累的過程。參考文獻(xiàn)[1]張毅剛,喜元.原理與應(yīng)用設(shè)計(jì)[M].北京:北京市海淀區(qū)四季青印刷廠,2010。[2]張毅剛.新編MCS-51單片機(jī)運(yùn)用設(shè)計(jì)[M]。哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2003.[3]張義和,敏男,宏昌,長春.例說51單片機(jī)(c語言版)[M]。北京:人民郵電出版社,2009.[4]馬忠梅籍順心張凱馬巖.單片機(jī)的C語言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué),2010。[5]SamsungElectronics。S3C44BOXRiscmicrocontrollerARMinstructionsheet.2002.[6]郭天祥.《51單片機(jī)C語言教程》[M]。子工業(yè)出版社,2005年7月.[7]丁元杰.《單片微機(jī)原理及應(yīng)用》[M],械工業(yè)出版社,2005年7月.[8]樓然苗,光。《單片機(jī)課程設(shè)計(jì)指導(dǎo)》[M].京:北京航空航天大學(xué)出版社,2007。附錄1實(shí)物圖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://前進(jìn){LeftLed=0;qianjin();break;}case2://后退{(lán)LeftLed=1;houtui();break;}case3://左轉(zhuǎn){zuozhuan();break;}case4://右轉(zhuǎn){youzhuan();break;}case8://停止{tingzhi();break;}}}voidControlCar_yaokong(unsignedcharConType){tingzhi();switch(ConType){case1://前進(jìn){tingzhi();Delay1ms(150);LeftLed=0;qianjin();break;}case2://后退{tingzhi();Delay1ms(150);LeftLed=1;houtui();break;}case3://左轉(zhuǎn){tingzhi();Delay1ms(150);zuozhuan();break;}case4://右轉(zhuǎn){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《一個簡單的計(jì)算器設(shè)計(jì)》課程設(shè)計(jì)報告學(xué)院:計(jì)算機(jī)工程學(xué)院學(xué)號:2012304030223姓名:朱鐘雄專業(yè)年級:12計(jì)算機(jī)應(yīng)用技術(shù)2班指導(dǎo)教師:游明坤時間:2014年12月25日基于對話框的計(jì)算器MFC方法實(shí)現(xiàn)隨著社會的發(fā)展,人們在日常生活中經(jīng)常需要用到計(jì)算器來進(jìn)行簡單或者復(fù)雜的運(yùn)算,計(jì)算器在人們生活中的地位也越來越重要.簡單的計(jì)算器能實(shí)現(xiàn)加、減、乘、除、開方、平方等運(yùn)算。學(xué)習(xí)了C++的程序設(shè)計(jì)語言這門課程,可以利用基于VC的MFC方法制作一個簡易的計(jì)算器,實(shí)現(xiàn)基本的運(yùn)算功能,從而滿足生活中的需要,降低計(jì)算的難度。一.面向?qū)ο蟮某绦蛟O(shè)計(jì)方法區(qū)別與面向過程的“先功能后數(shù)據(jù)”思想,面向?qū)ο蟮某绦蛟O(shè)計(jì)方法把狀態(tài)(數(shù)據(jù))和行為(功能)捆綁在一起,形成了對象。當(dāng)遇到一個具體的問題時,我們只需要將一個系統(tǒng)分解成一個個的對象,同時將狀態(tài)和行為封裝在對象中.

面向?qū)ο蟮某绦蛟O(shè)計(jì)方法具有三個基本特點(diǎn):封裝、繼承和多態(tài).

(1)

封裝性

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

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

2)

繼承性

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

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

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

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

(3)多態(tài)性

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

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

(1)API

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

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

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

(2)MFC(Microsoft

Foundation

Class)微軟基礎(chǔ)類庫

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

(3)窗口

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

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

(4)消息和消息隊(duì)列

消息

:應(yīng)用程序接收的事件都會產(chǎn)生相應(yīng)的消息,消息的產(chǎn)生是因?yàn)槭录l(fā)生的結(jié)果。如鍵盤有鍵盤按下和抬起消息,鼠標(biāo)有點(diǎn)擊消息,畫面有刷新消息,重畫消息等。

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

消息隊(duì)列

:

應(yīng)用程序?qū)κ录⑦M(jìn)行的響應(yīng)時從它本身的消息隊(duì)列里取出消息來執(zhí)行的。事件是有操作系統(tǒng)接收的,然后把它轉(zhuǎn)化成消息,再把消息送到應(yīng)用程序所在的隊(duì)列中,供應(yīng)用程序取走。

(5)事件驅(qū)動

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

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

MFC編程的主要過程就是編寫消息響應(yīng)函數(shù)的過程,因?yàn)槠渌墓ぷ鞫甲詣由闪?。因此就需要我們知道如何添加消息響?yīng)函數(shù)(用類向?qū)В憫?yīng)函數(shù)中寫什么內(nèi)容。

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

溫馨提示

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

評論

0/150

提交評論