微機(jī)課設(shè)報(bào)告 51單片機(jī)程序 超聲波視力保護(hù)系統(tǒng)_第1頁
微機(jī)課設(shè)報(bào)告 51單片機(jī)程序 超聲波視力保護(hù)系統(tǒng)_第2頁
微機(jī)課設(shè)報(bào)告 51單片機(jī)程序 超聲波視力保護(hù)系統(tǒng)_第3頁
微機(jī)課設(shè)報(bào)告 51單片機(jī)程序 超聲波視力保護(hù)系統(tǒng)_第4頁
微機(jī)課設(shè)報(bào)告 51單片機(jī)程序 超聲波視力保護(hù)系統(tǒng)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

IV

DesignofultrasonicvisionprotectionsystemABSTRACTThemicrocomputerprinciplecoursedesignsystemfortheultrasonicvisionprotectionsystem,usingATC89C516RD+single-chipmicrocomputerasthecorehardware,firstofall,theoveralldesignoftheapplicationsystem,therequirementsofthesystemhasacertainfunction,whichcansetthetimeanddate,readingtime,visualprotectiondistance,andhasthepowerprotectionstoragefunction;Whentheultrasonicdetectiondistanceislowerthanthesetvalue,thebuzzerwillsendoutthebirdchirpingpromptsound,higherthanthesetvaluewillautomaticallystopchirping;Whenthecountdowntoreadingtimeis0,thebuzzerandLEDlightswillworkatthesametime;AndbytheLCDreal-timedisplaydate,time,readingcountdown,visualprotectiondistanceandotherinformation.Inaddition,thesystemrealizesthecommunicationbetweenupperandlowercomputersthroughserialport,andcandisplaythecurrentstatusandoperationparametersofthevisualprotectionsystemontheuppercomputerinrealtime.ThiscoursedesignsystemistoaddDS1302clockchip,usedforpowerfailureprotectionreal-timetime,andaccuratetiming,toachievethefunctionexpansionofultrasonicvisionprotectionsystem,usingexternalEEPROMAT24C02chipfordatastorage,withpowerfailureprotectionfunction,canachieveuser-defineddatastorage.Thesystemprogramiswritteninblockcodetofacilitatethefunctionexpansionandfunctionmodificationofthesystemaswellasthecodetransplantationoperationwhendesigningotherrelatedsystemsinthefuture.Keywords:UltrasonicvisionprotectionUltrasonicrangingMicrocontrolleroffPowerprotectionElectronicclock目錄TOC\o"1-3"\h\u13635第1章工作原理 187851.1仿真電路圖分析 1288901.2硬件電路圖分析 1292071.3工作原理詳述 1240721.3.1掉電保護(hù)模塊 1267951.3.2電子時(shí)鐘模塊 2176791.3.3LCD1602顯示模塊 2173881.3.4矩陣鍵盤輸入模塊 3123971.3.5超聲波測(cè)距模塊 3131.3.6主程序及串口通信 38305第2章重要程序代碼分析 6259612.1代碼分析與軟硬件適配調(diào)整 626695第3章系統(tǒng)調(diào)試結(jié)果 12240113.1調(diào)試結(jié)果與分析 1226773第4章過程難題工作及不足與改進(jìn) 1454124.1過程難題攻克 14153334.2系統(tǒng)不足及改進(jìn)思路 1418629結(jié)束語 1519307參考文獻(xiàn) 16407附頁一 1714056附頁二 186376附頁三 19第2頁共4頁第第2頁共29頁第1章工作原理1.1仿真電路圖分析使用proteus軟件進(jìn)行系統(tǒng)的仿真設(shè)計(jì),具體仿真電路圖見附件一,圖中從左向右一次是EEPROM掉電保護(hù)模塊、電子時(shí)鐘模塊、AT89C52單片機(jī)模塊、LCD1602顯示模塊、串口通信模塊、超聲波測(cè)距模塊、蜂鳴器及LED燈顯示模塊、矩陣鍵盤輸入模塊,其中需要注意的是在分配單片機(jī)與外部元器件管腳連接時(shí),需要考慮工作時(shí)間是否重疊,即系統(tǒng)運(yùn)行的時(shí)序問題。在進(jìn)行硬件連接之前,需要查看各個(gè)元器件的使用手冊(cè)說明,查看是否實(shí)現(xiàn)特定功能所需要連接的外圍電路,并且仿真系統(tǒng)嚴(yán)格按照單片機(jī)硬件電路板進(jìn)行設(shè)計(jì),從而使硬件和仿真代碼具有兼容性。這里在仿真時(shí)使用了虛擬終端作為串口通信的設(shè)備,從而不必設(shè)置虛擬串口工具,減少了人為操作。為單片機(jī)加入了12MHz的晶振電路從而更方便的使用定時(shí)器進(jìn)行計(jì)時(shí),并加入復(fù)位電路,防止程序在脫機(jī)使用時(shí)出現(xiàn)卡頓[[][]蔣輝平,周國雄.基于Proteus的單片機(jī)系統(tǒng)設(shè)計(jì)與仿真實(shí)例[M].北京:機(jī)械工業(yè)出版社,2009.1.2硬件電路圖分析按硬件電路主要使用了普中A4單片機(jī)學(xué)習(xí)版,單片機(jī)型號(hào)為STC89C516RD+,具體硬件電路圖見附件二,由于單片機(jī)學(xué)習(xí)版集成度較高,DS1302芯片未接入備用電源,因此只能在單片機(jī)打開電源開關(guān)后電子時(shí)鐘才開始工作。若后期進(jìn)行改善,則可以外接另一片DS1302時(shí)鐘芯片,并接入5V的備用電源實(shí)現(xiàn)電子時(shí)鐘在單片機(jī)關(guān)電后也能走時(shí)。由于硬件電路的引腳接口盡量與仿真一致,故選擇D3為顯示讀書是否結(jié)束的標(biāo)志LED,位于學(xué)習(xí)版LED模塊從左至右第三個(gè)。1.3工作原理詳述1.3.1掉電保護(hù)模塊本功能模塊使用AT24C02芯片作為外部EEPROM來實(shí)現(xiàn),AT24C02是一個(gè)2K的位串行CMOS,內(nèi)部含有256個(gè)8位字節(jié),并且該器件通過I2C總線接口進(jìn)行操作,它有一個(gè)專門的寫保護(hù)功能,故用它來存儲(chǔ)重要數(shù)據(jù)是十分穩(wěn)定安全的。在使用AT24C02芯片之前,需要先了解I2C總線傳送數(shù)據(jù)協(xié)議,即通過SCL和SDA的電平變化來產(chǎn)生數(shù)據(jù)傳輸前的起始信號(hào)和數(shù)據(jù)傳輸后的停止信號(hào),并注意在使用I2C通信時(shí),需要設(shè)計(jì)應(yīng)答信號(hào),否則不能實(shí)現(xiàn)數(shù)據(jù)的連續(xù)讀寫[[][]高玉芹.單片機(jī)原理與應(yīng)用及C51編程技術(shù)[M].北京:機(jī)械工業(yè)出版社,2011.6.1.3.2電子時(shí)鐘模塊電子時(shí)鐘模塊選擇的芯片為DS1302,在使用前,需要查看相關(guān)使用手冊(cè),由于DS1302可以實(shí)現(xiàn)時(shí)鐘計(jì)算年、月、日、時(shí)、分、秒、星期,并且可以使用至2100年,并具有閏年調(diào)節(jié)功能,使用時(shí)限很長,故可以采用DS1302作為該系統(tǒng)的電子時(shí)鐘模塊核心部件,這里DS1302采用的是SPI串行總線傳輸協(xié)議,其中CE為芯片輸入輸出選擇控制端,在讀寫時(shí)必須保持高電平,I/O為數(shù)據(jù)串行傳送端,可以進(jìn)行數(shù)據(jù)的輸入輸出。SCLK為外部時(shí)鐘輸入端,控制數(shù)據(jù)的串行輸入輸入時(shí)序。由于我們需要時(shí)鐘信息自我修改功能,故需要向DS1302芯片送入數(shù)據(jù),可以設(shè)計(jì)ds1302_write_byte(u8addr,u8dat)函數(shù)向DS1302寫入一字節(jié)數(shù)據(jù),并根據(jù)內(nèi)部數(shù)據(jù)的地址,進(jìn)行修改年、月、日、時(shí)、分、秒、星期等信息,然后單片機(jī)需要實(shí)時(shí)讀取時(shí)鐘信息,然后顯示時(shí)間,故需要設(shè)計(jì)ds1302_read_byte(u8addr)和ds1302_read_time(void)函數(shù),進(jìn)行時(shí)間的讀取,最終時(shí)間信息存儲(chǔ)在全局變量gDS1302_TIME[7]數(shù)組中[[][]安會(huì),蒲禹辰,李紀(jì)榕,馬紅靜,李莉,張靜.基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)與制作[J].電子制作,2022,30(01).1.3.3LCD1602顯示模塊本系統(tǒng)需要顯示實(shí)時(shí)日期時(shí)間、讀書時(shí)間、視力保護(hù)距離、當(dāng)前測(cè)試距離以及系統(tǒng)運(yùn)行狀態(tài)等信息,故使用數(shù)碼管難以顯示眾多信息,且信息均為字符型數(shù)據(jù),故可以采用LCD1602液晶顯示器作為顯示模塊的主要部件。1602液晶也叫1602字符型液晶,它能顯示2行字符信息,每行又能顯示16個(gè)字符。它是一種專門用來顯示字母、數(shù)字、符號(hào)的點(diǎn)陣型液晶模塊。各引腳信息為:VL,液晶顯示偏壓信號(hào),用于調(diào)整LCD1602的顯示對(duì)比度;RS,數(shù)據(jù)/命令選擇端;R/W,讀寫選擇端;E,使能信號(hào),利用該信號(hào)的上升沿實(shí)現(xiàn)對(duì)LCD1602的數(shù)據(jù)傳輸;7~14腳為8位并行數(shù)據(jù)口,與51單片機(jī)一組I/O適配。LCD1602不是所有地址都可以直接用來顯示字符數(shù)據(jù),只有第一行中的00-0F,第二行中的40-4F才能顯示,其他地址只能用來存儲(chǔ)。故我們可以用LCD1602顯示總共32個(gè)字符。了解LCD1602的基本結(jié)構(gòu)后,就可以開始編程,通過向LCD1602輸入指令編碼,來實(shí)現(xiàn)LCD1602的各種指令在這里,我們根據(jù)需要,編輯了初始化函數(shù)LcdInit(),顯示字符串函數(shù)LcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str)以及顯示單個(gè)字符函數(shù)DisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)。通過在主程序中調(diào)用這些函數(shù),就可以實(shí)現(xiàn)LCD顯示各種數(shù)據(jù)的功能。1.3.4矩陣鍵盤輸入模塊由于在使用系統(tǒng)時(shí),需要自行設(shè)置時(shí)間、日期、距離等數(shù)據(jù),故需要至少0-9共10個(gè)數(shù)據(jù)的按鍵定義,并且還需要設(shè)置修改日期按鍵、修改視力保護(hù)距離按鍵、修改讀書時(shí)間按鍵、讀書啟動(dòng)按鍵、讀書結(jié)束返回按鍵、無條件返回按鍵等等,故這里使用了4*4的矩陣鍵盤進(jìn)行輸入,共可以實(shí)現(xiàn)16個(gè)按鍵輸入功能,這里編寫矩陣鍵盤掃描函數(shù)時(shí),采用了行列掃描法,先送一列為低電平,其余幾列全為高電平,此時(shí)就確定了列數(shù),然后立即輪流檢測(cè)一次各行是否有低電平,若檢測(cè)到某一行為低電平,這時(shí)又確定了行數(shù),則我們便可確認(rèn)當(dāng)前被按下的鍵是哪一行哪一列的,從而達(dá)到整個(gè)鍵盤的檢測(cè)。確定按鍵的標(biāo)號(hào)。在設(shè)計(jì)掃描函數(shù)時(shí),由于機(jī)械按鈕在按時(shí)可能存在抖動(dòng),會(huì)需要一段適當(dāng)?shù)难舆t進(jìn)行消抖,這里大約延遲了1ms,在后續(xù)軟硬件聯(lián)合調(diào)試時(shí),發(fā)現(xiàn)需要長時(shí)間按住按鍵,否則可能導(dǎo)致未掃描到,此時(shí)可以根據(jù)使用習(xí)慣,適當(dāng)縮小延遲。1.3.5超聲波測(cè)距模塊由于超聲波模塊為該系統(tǒng)的主要模塊,并且在系統(tǒng)運(yùn)行時(shí)需要實(shí)時(shí)進(jìn)行超聲波測(cè)距,并顯示距離,故將超聲波測(cè)距模塊寫入主程序,這里我們選用了市場上常用的超聲波測(cè)距模塊HC-SR04,通過查看其使用手冊(cè)來對(duì)其進(jìn)行使用。HC-SR04的工作原理是,當(dāng)引腳TRIG接收到一個(gè)最少為10us的高電平時(shí),模塊會(huì)自動(dòng)向外發(fā)出8個(gè)40kHz的方波,并自動(dòng)檢測(cè)是否有信號(hào)返回,若有信號(hào)返回,則通過ECHO引腳輸出一個(gè)高電平,高電影持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間,然后根據(jù)聲音在空氣中傳播的速度,可以由公式“測(cè)試距離=(高電平時(shí)間*聲速)/2”計(jì)算得出[[]王宇.一種基于單片機(jī)的超聲波測(cè)距系統(tǒng)設(shè)計(jì)[J].中國科技信息,2022(12):112-113.]。在進(jìn)行軟件設(shè)計(jì)時(shí),為了保證HC-SR04啟動(dòng),我們可以采用大于20us的高電平脈沖輸送給TRIG,由于有可能HC-SR04前面障礙物較遠(yuǎn),導(dǎo)致模塊接收不到返回超聲波信號(hào),從而導(dǎo)致ECHO輸送的時(shí)間脈沖不準(zhǔn)確,故我們可以在處理時(shí)間脈沖的時(shí)候限定超聲波測(cè)量最大距離,該系統(tǒng)的最大測(cè)試距離為7m,測(cè)試單位精確到厘米,當(dāng)距離超過7m時(shí),顯示模塊顯示距離為“[]王宇.一種基于單片機(jī)的超聲波測(cè)距系統(tǒng)設(shè)計(jì)[J].中國科技信息,2022(12):112-113.1.3.6主程序及串口通信在串口通信部分,通過使用單片機(jī)的內(nèi)部資源串口中斷來實(shí)現(xiàn)下位機(jī)向上位機(jī)傳輸數(shù)據(jù),首先在程序開始時(shí)進(jìn)行串口初始化,使串口工作在方式一,此時(shí)選擇定時(shí)器1工作在方式2來設(shè)置一定的波特率,從而保證串口通信時(shí)數(shù)據(jù)的正確傳輸。在下位機(jī)向上位機(jī)傳輸數(shù)據(jù)時(shí),可以引入stdio.h庫,使用printf函數(shù)可以輸出各種形式的數(shù)據(jù),十分方便。下面進(jìn)行主函數(shù)的設(shè)計(jì),主函數(shù)流程圖如圖1所示:圖SEQ圖\*ARABIC1主函數(shù)流程圖首先讀取EEPROM中的原始數(shù)據(jù),從而可以恢復(fù)上次關(guān)機(jī)前的數(shù)據(jù)狀態(tài),實(shí)現(xiàn)掉電保護(hù),然后對(duì)外圍芯片及其相關(guān)數(shù)據(jù)進(jìn)行初始化,之后進(jìn)行鍵盤掃描,鍵11用來修改時(shí)期時(shí)間,鍵12用來修改讀書時(shí)間,鍵13用來修改視力保護(hù)距離,鍵14用來啟動(dòng)讀書模式,鍵16用來清屏,防止LCD因?yàn)殡娢徊黄胶庠斐傻目D影響。若不人為按動(dòng)按鍵或按其它按鍵,則直接進(jìn)入LCD顯示、串口通信傳送數(shù)據(jù),然后通過讀書啟動(dòng)標(biāo)志start_read參數(shù)是否位為1來判斷是否進(jìn)入讀書模式,若進(jìn)入讀書模式,則根據(jù)已保存的時(shí)鐘信息和當(dāng)前時(shí)鐘信息做差,從而對(duì)讀書時(shí)間進(jìn)行修正,之后判斷讀書時(shí)間是否為0,若讀書結(jié)束,則啟動(dòng)蜂鳴器和LED,然后通過按鍵15來判斷是否返回,之后開始進(jìn)行超聲波測(cè)距,然后比較測(cè)量距離和設(shè)置視力保護(hù)距離的大小,若小于視力保護(hù)距離,則揚(yáng)聲器鳴叫提示,否則不鳴叫,然后進(jìn)入循環(huán)重新掃描鍵盤。第2章重要程序代碼分析2.1代碼分析與軟硬件適配調(diào)整//超聲波測(cè)距及顯示函數(shù)voidConut(void)//超聲波測(cè)出距離并顯示{ time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100;//算出來是CM if((S>=700)||flag==1)//超出測(cè)量范圍顯示“-” { flag=0; DisplayOneChar(0,1,ASCII[11]); DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn) DisplayOneChar(2,1,ASCII[11]); DisplayOneChar(3,1,ASCII[11]); DisplayOneChar(4,1,ASCII[12]); //顯示M } else { disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10%10; DisplayOneChar(0,1,ASCII[disbuff[0]]); DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn) DisplayOneChar(2,1,ASCII[disbuff[1]]); DisplayOneChar(3,1,ASCII[disbuff[2]]); DisplayOneChar(4,1,ASCII[12]); //顯示M }}time參數(shù)值為超聲波傳播的時(shí)間,然后根據(jù)傳播速度可以求出障礙物的距離,此處為了防止距離過大時(shí)誤差過大,且超聲波返回值不正確,故設(shè)置當(dāng)距離計(jì)算大于7m時(shí),顯示結(jié)果為“-.--m”,并且距離單位為m,精確到cm。//讀書啟動(dòng)及其倒計(jì)時(shí)函數(shù)case14:{ start_read=1; save_time=gDS1302_TIME[0]; read_time_[0]=read_time[0]; read_time_[1]=read_time[1]; LcdShowStr(6,1,"reading"); break; }if(start_read==1) { if(save_time!=gDS1302_TIME[0]) { save_time=gDS1302_TIME[0]; if(read_time[1]==0&&read_time[0]>0) { read_time[1]=9; read_time[0]--; } elseif(read_time[1]==0&&read_time[0]==0) { while(1) { yangshengqi=~yangshengqi; LED=0; delay_10us(100); if(key_matrix_ranks_scan()==15) { LcdInit(); break; } } read_time[1]=read_time_[1]; read_time[0]=read_time_[0]; start_read=0; LED=1; yangshengqi=0; } elseread_time[1]--; } }由于單片機(jī)內(nèi)部資源定時(shí)器中斷T0和T1分別用于超聲波計(jì)時(shí)和設(shè)置串口通信波特率,故這里在進(jìn)行讀書時(shí)間倒計(jì)時(shí)的時(shí)候,為了防止定時(shí)器沖突,資源不夠用,這里通過軟件操作,在按下讀書啟動(dòng)按鍵后,記錄此時(shí)的電子時(shí)鐘信息并讓讀書啟動(dòng)標(biāo)志start_read置1,然后當(dāng)運(yùn)行到判別start_read是否為1時(shí),若已經(jīng)啟動(dòng)讀書模式,則根據(jù)記錄的電子時(shí)鐘信息與當(dāng)下時(shí)鐘信息進(jìn)行對(duì)比,然后修正讀書剩余時(shí)間,這樣不僅計(jì)時(shí)精準(zhǔn),而且減少了硬件資源的使用,但前提要求是,需要保證在主函數(shù)while循環(huán)中一個(gè)運(yùn)行周期內(nèi)時(shí)間不能過長,經(jīng)過簡單的計(jì)算,可以發(fā)現(xiàn)一次運(yùn)行周期大概在0.5s左右,正好符合要求。鑒于本系統(tǒng)作為課程設(shè)計(jì),為了驗(yàn)收方便及實(shí)驗(yàn)調(diào)試方便,設(shè)置的讀書時(shí)間以秒為單位,若投入實(shí)際應(yīng)用,則可以以分鐘為單位,此時(shí)只需要改動(dòng)讀書剩余時(shí)間修正模塊即可。//矩陣鍵盤掃描函數(shù)u8key_matrix_ranks_scan(){ u8key_value=0; KEY_MATRIX_PORT=0xf7;//給第一列賦值0,其余全為1 if(KEY_MATRIX_PORT!=0xf7)//判斷第一列按鍵是否按下 { delay_10us(1000);//消抖 switch(KEY_MATRIX_PORT)//保存第一列按鍵按下后的鍵值 { case0x77:key_value=1;break; case0xb7:key_value=5;break; case0xd7:key_value=9;break; case0xe7:key_value=13;break; } } while(KEY_MATRIX_PORT!=0xf7);//等待按鍵松開 KEY_MATRIX_PORT=0xfb;//給第二列賦值0,其余全為1 if(KEY_MATRIX_PORT!=0xfb)//判斷第二列按鍵是否按下 { delay_10us(1000);//消抖 switch(KEY_MATRIX_PORT)//保存第二列按鍵按下后的鍵值 { case0x7b:key_value=2;break; case0xbb:key_value=6;break; case0xdb:key_value=10;break; case0xeb:key_value=14;break; } } while(KEY_MATRIX_PORT!=0xfb);//等待按鍵松開 KEY_MATRIX_PORT=0xfd;//給第三列賦值0,其余全為1 if(KEY_MATRIX_PORT!=0xfd)//判斷第三列按鍵是否按下 { delay_10us(1000);//消抖 switch(KEY_MATRIX_PORT)//保存第三列按鍵按下后的鍵值 { case0x7d:key_value=3;break; case0xbd:key_value=7;break; case0xdd:key_value=11;break; case0xed:key_value=15;break; } } while(KEY_MATRIX_PORT!=0xfd);//等待按鍵松開 KEY_MATRIX_PORT=0xfe;//給第四列賦值0,其余全為1 if(KEY_MATRIX_PORT!=0xfe)//判斷第四列按鍵是否按下 { delay_10us(1000);//消抖 switch(KEY_MATRIX_PORT)//保存第四列按鍵按下后的鍵值 { case0x7e:key_value=4;break; case0xbe:key_value=8;break; case0xde:key_value=12;break; case0xee:key_value=16;break; } } while(KEY_MATRIX_PORT!=0xfe);//等待按鍵松開 returnkey_value; }由于本實(shí)驗(yàn)按鍵較多,故采用了矩陣鍵盤進(jìn)行輸入,并采取行列掃描法進(jìn)行矩陣鍵盤的掃描。其中消抖函數(shù)長達(dá)1ms,且由于主函數(shù)while循環(huán)一次大約0.5s,故在按動(dòng)按鍵進(jìn)入不同系統(tǒng)功能時(shí),需要長按至1s以上來確保掃描函數(shù)讀取到結(jié)果。第3章系統(tǒng)調(diào)試結(jié)果3.1調(diào)試結(jié)果與分析仿真系統(tǒng)調(diào)試,程序開始運(yùn)行后如圖2所示圖SEQ圖\*ARABIC2仿真程序運(yùn)行開始超聲波測(cè)量距離與實(shí)際距離存在一定誤差,大于在2cm左右,此時(shí)串口通信正常,EEPROM讀取數(shù)據(jù)正常,LCD顯示正常。按動(dòng)鍵12可以修改讀書時(shí)間,此時(shí)LCD顯示修改頁面及修改成功頁面,如圖3、圖4所示圖SEQ圖\*ARABIC3修改讀書時(shí)間圖SEQ圖\*ARABIC4修改讀書時(shí)間成功按動(dòng)鍵14可以啟動(dòng)讀書模式,當(dāng)讀書倒計(jì)時(shí)結(jié)束后,蜂鳴器和LED同時(shí)工作,如圖5所示圖SEQ圖\*ARABIC5讀書結(jié)束當(dāng)超聲波測(cè)試距離小于視力保護(hù)距離時(shí),蜂鳴器開始發(fā)出鳥鳴聲,當(dāng)超聲波測(cè)試距離大于視力保護(hù)距離時(shí),蜂鳴器自動(dòng)停止發(fā)出鳥鳴聲。第4章過程難題工作及不足與改進(jìn)4.1過程難題攻克首先在使用外部芯片時(shí)需要了解單片機(jī)與外圍芯片串行通信的法則,如使用AT24C02則需要使用I2C串行總線,使用DS1302則需要使用SPI串行總線,由于這些模塊與51單片機(jī)聯(lián)合使用的范例非常多,故組合硬件時(shí)不容易出現(xiàn)時(shí)序不匹配的問題。另外由于單片機(jī)內(nèi)部資源有限,在使用超聲波測(cè)距時(shí)占用了定時(shí)器T0來計(jì)算超聲波傳感器返回脈沖的寬度,使用了定時(shí)器T1來設(shè)置合適的波特率進(jìn)行上下位機(jī)串口通信,故在進(jìn)行讀書時(shí)間倒計(jì)時(shí)的時(shí)候需要采用另外的方法,一種方法可以是外接芯片,然后實(shí)現(xiàn)倒計(jì)時(shí)的功能,但是這需要增加產(chǎn)品的成本,而硬件的增加也會(huì)增加系統(tǒng)的不穩(wěn)定性,增大系統(tǒng)的功耗等等。還有一種方法是根據(jù)已有硬件資源進(jìn)行軟件設(shè)計(jì),這時(shí)就可以發(fā)現(xiàn),我們已經(jīng)使用了電子時(shí)鐘,故可以根據(jù)電子時(shí)鐘的信息來進(jìn)行倒計(jì)時(shí)的設(shè)計(jì),在啟動(dòng)讀書模式后記錄下當(dāng)下的時(shí)間,然后每當(dāng)要顯示讀書時(shí)間的時(shí)候,就可以再次讀取電子時(shí)鐘信息,與之前記錄的時(shí)間做差,然后校正讀書剩余時(shí)間,從而實(shí)現(xiàn)倒計(jì)時(shí)的功能,但是這時(shí)會(huì)發(fā)現(xiàn),時(shí)鐘信息倒計(jì)時(shí)并不是一秒一秒的進(jìn)行,有時(shí)會(huì)跳變,經(jīng)過分析可以得到是由于一個(gè)主函數(shù)while循環(huán)時(shí)間過長,導(dǎo)致時(shí)間跳變,故應(yīng)該將一個(gè)while循環(huán)控制在1s以內(nèi),這樣就可以實(shí)現(xiàn)倒計(jì)時(shí)功能,當(dāng)然如果在后期投入產(chǎn)品實(shí)際應(yīng)用,則需要將倒計(jì)時(shí)單位改為分鐘,用這種方法進(jìn)行倒計(jì)時(shí)仍然具有好的效果,甚至比使用單片機(jī)內(nèi)部定時(shí)器具有更加準(zhǔn)確、編寫簡單的優(yōu)點(diǎn)。另外在設(shè)計(jì)矩陣鍵盤掃描輸入的時(shí)候,剛開始使用行列掃描法,由于沒有考慮消抖,導(dǎo)致按鍵可能會(huì)被重復(fù)按動(dòng)兩下,或者沒有掃描到,在加入消抖后,又會(huì)發(fā)現(xiàn),第一次按動(dòng)矩陣鍵盤的時(shí)候并不是百試百靈,經(jīng)過仿真調(diào)試,觀看節(jié)點(diǎn)高低電位可以發(fā)現(xiàn)是矩陣鍵盤的掃描周期較短,這時(shí)就需要考慮縮短主函數(shù)while循環(huán)的時(shí)間,這時(shí)根據(jù)各個(gè)芯片的使用要求,適當(dāng)?shù)恼{(diào)整各個(gè)delay()延遲函數(shù),縮短延遲時(shí)間,最終調(diào)整至按鍵時(shí)需長按1s后方保證掃描成功。4.2系統(tǒng)不足及改進(jìn)思路最終系統(tǒng)成型后,基本功能均可以實(shí)現(xiàn),但是也有不足之處,其一,超聲波測(cè)距的誤差較大,基本在2cm左右,猜測(cè)可能是傳感器的問題,也有可能是T1設(shè)置波特率的時(shí)候影響了系統(tǒng)的時(shí)鐘周期,導(dǎo)致計(jì)時(shí)不精確。其二,電子時(shí)鐘模塊由于沒有外接備用電源,每次關(guān)機(jī)后,時(shí)鐘模塊不能正常走時(shí),可以考慮在外接一塊DS1302,從而接上備用電池,然后通過寫入命令字,使電子時(shí)鐘實(shí)現(xiàn)涓流充電。其三,LCD屏幕切換有時(shí)會(huì)出現(xiàn)bug,例如當(dāng)讀書過程中屏幕右下角顯示“reading”,倒計(jì)時(shí)結(jié)束后,蜂鳴器和LED燈同時(shí)工作,按動(dòng)鍵15后應(yīng)返回主界面,則“reading”字符消失,但有時(shí)實(shí)際狀況則是有時(shí)消失有時(shí)不消失,故我設(shè)計(jì)了鍵16進(jìn)行清屏,從而人為的消除使用過程中的bug,但是系統(tǒng)不太完美,這個(gè)原因可能是LCD1602的內(nèi)部電位的原因,也有可能是軟件代碼設(shè)計(jì)的問題,例如假如在蜂鳴器響的時(shí)候按動(dòng)按鍵,可能出問題。其四,使用矩陣鍵盤時(shí),在第一次按鍵時(shí),需要長按至少1s保證鍵盤掃描成功,這是由于一個(gè)while循環(huán)過程時(shí)間較長,而每個(gè)while循環(huán)中只會(huì)進(jìn)行一次矩陣鍵盤掃描,故需要保證按足夠的時(shí)間,在這段時(shí)間內(nèi)足以完成一次while循環(huán),但這樣使用體驗(yàn)不佳,不流暢,我的想法是可以引入外部中斷,再加入下個(gè)外部芯片,使得按動(dòng)任何一個(gè)按鍵都會(huì)引發(fā)一個(gè)外部中斷,然后并可以取得該按鍵的信息,但是具體思路還沒有,另外應(yīng)該還可以調(diào)整一下軟件設(shè)計(jì)的整體結(jié)構(gòu),來改善鍵盤掃描。結(jié)束語在這次微機(jī)原理系統(tǒng)設(shè)計(jì)中,我學(xué)會(huì)了很多軟硬件知識(shí),并且將它們付之于行動(dòng),“興趣是最好的老師”,在選題時(shí)我就覺得超聲波視力保護(hù)系統(tǒng)是一個(gè)很有意義而且有些挑戰(zhàn)性的題目,做出來后自己會(huì)很有成就感,在實(shí)際設(shè)計(jì)過程中,我首先是先確定需要使用的各個(gè)模塊,然后查閱資料,由于單片機(jī)學(xué)習(xí)板是很早之前購買,當(dāng)時(shí)購買全憑興趣,并未考慮單片機(jī)接口的使用和各個(gè)模塊的引腳如何,導(dǎo)致這次在設(shè)計(jì)時(shí),有些管腳出現(xiàn)沖突,而導(dǎo)致不能同時(shí)使用。另外我還深刻理解了軟硬件編程的過程,并且有了自己動(dòng)手實(shí)驗(yàn)、自我創(chuàng)造的經(jīng)驗(yàn),在設(shè)計(jì)時(shí)不僅要考慮硬件,還要考慮軟件,綜合考慮兩方面因素,在要完成一個(gè)功能前,考慮使用哪個(gè)方法更簡單,更加有效,這是我認(rèn)為非常重要的。參考文獻(xiàn)[1]蔣輝平,周國雄.基于Proteus的單片機(jī)系統(tǒng)設(shè)計(jì)與仿真實(shí)例[M].北京:機(jī)械工業(yè)出版社,2009.[2]高玉芹.單片機(jī)原理與應(yīng)用及C51編程技術(shù)[M].北京:機(jī)械工業(yè)出版社,2011.6.[3]安會(huì),蒲禹辰,李紀(jì)榕,馬紅靜,李莉,張靜.基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)與制作[J].電子制作,2022,30(01).[4]王宇.一種基于單片機(jī)的超聲波測(cè)距系統(tǒng)設(shè)計(jì)[J].中國科技信息,2022(12):112-113.附頁一Proteus仿真圖附頁二硬件電路連接圖附頁三部分頭文件代碼及主程序代碼Public.h#ifndef_public_H#define_public_H#include"intrins.h" #include"reg52.h"#include"stdio.h"typedefunsignedlongu32;typedefunsignedintu16; //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義typedefunsignedcharu8;voiddelay_10us(u16ten_us);voiddelay_ms(u16ms);#endifiic.h#ifndef_iic_H#define_iic_H#include"public.h"http://定義EEPROM控制腳sbitIIC_SCL=P2^1;//SCL時(shí)鐘線sbitIIC_SDA=P2^0;//SDA數(shù)據(jù)線//IIC所有操作函數(shù) voidiic_start(void); //發(fā)送IIC開始信號(hào)voidiic_stop(void); //發(fā)送IIC停止信號(hào)voidiic_write_byte(u8txd); //IIC發(fā)送一個(gè)字節(jié)u8iic_read_byte(u8ack); //IIC讀取一個(gè)字節(jié)u8iic_wait_ack(void); //IIC等待ACK信號(hào)voidiic_ack(void); //IIC發(fā)送ACK信號(hào)voidiic_nack(void); //IIC不發(fā)送ACK信號(hào)#endif24C0.2.h#ifndef_24c02_H#define_24c02_H#include"public.h"voidat24c02_write_one_byte(u8addr,u8dat);//AT24C02指定地址寫數(shù)據(jù)u8at24c02_read_one_byte(u8addr);//AT24C02指定地址讀數(shù)據(jù)#endifKey.h#ifndef_key_H#define_key_H#include"public.h"#defineKEY_MATRIX_PORT P1 //使用宏定義矩陣按鍵控制口u8key_matrix_ranks_scan(void);#endifLcd1602.h#ifndef__lcd1602_H_#define__lcd1602_H_#include<public.h>#defineuintunsignedint#defineucharunsignedchar/**********************************PIN口定義**********************************/#defineLCD1602_DATAPINSP0sbitLCD1602_E=P2^7;sbitLCD1602_RW=P2^4;sbitLCD1602_RS=P2^6;/**********************************函數(shù)聲明**********************************//*在51單片機(jī)12MHZ時(shí)鐘下的延時(shí)函數(shù)*/voidLcd1602_Delay1ms(uintc);//誤差0us/*LCD1602寫入8位命令子函數(shù)*/voidLcdWriteCom(ucharcom);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/ voidLcdWriteData(uchardat) ;/*LCD1602初始化子程序*/ voidLcdInit(); voidLcdSetCursor(unsignedcharx,unsignedchary);//坐標(biāo)顯示voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);//顯示字符串voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData) #endifDs1302.h#ifndef_ds1302_H#define_ds1302_H#include"public.h"http://管腳定義sbitDS1302_RST=P3^5;//復(fù)位管腳sbitDS1302_CLK=P3^6;//時(shí)鐘管腳sbitDS1302_IO=P3^4;//數(shù)據(jù)管腳//變量聲明externu8gDS1302_TIME[7];//存儲(chǔ)時(shí)間externu8gREAD_RTC_ADDR[7];//讀取地址externu8gWRITE_RTC_ADDR[7];//寫入地址//函數(shù)聲明voidds1302_init(void);voidds1302_read_time(void);voidds1302_write_byte(u8addr,u8dat);u8ds1302_read_byte(u8addr);#endifmain.c#include"24c02.h"#include"key.h"#include"lcd1602.h"#include"public.h"#include"smg.h"#include"ds1302.h"sbitTrig=P2^4;sbitEcho=P2^3;sbityangshengqi=P2^5;sbitLED=P2^2;/* 按鍵控制:S1-S10代表數(shù)字1-9、0,S11為設(shè)置時(shí)期時(shí)間,S12為設(shè)置讀書時(shí)間,S13為設(shè)置人與視力保護(hù)距離,S14為開始讀書.S15為返回,S16為清屏一下*/ u16time=0;u32S=0;bitflag=0;u8disbuff[3] ={0,0,0};u8read_time[2]={0,0};//讀書時(shí)間u8read_time_[2]={0,0};u8distance_eye[2]={1,0};//視力距離u8a=1200;//用于T1中斷計(jì)時(shí)10秒u8start_read=0;u8save_time=0;u8cha_time=0;u8codeASCII[14]={'0','1','2','3','4','5','6','7','8','9','.','-','M',':'};voidsave_all()//保存數(shù)據(jù)到eeprom{ at24c02_write_one_byte(0,distance_eye[0]); at24c02_write_one_byte(1,distance_eye[1]); at24c02_write_one_byte(2,read_time[0]); at24c02_write_one_byte(3,read_time[1]);}voidread_all() //讀取數(shù)據(jù)eeprom{ distance_eye[0]=at24c02_read_one_byte(0); distance_eye[1]=at24c02_read_one_byte(1); read_time[0]=at24c02_read_one_byte(2); read_time[1]=at24c02_read_one_byte(3);}voidConut(void)//超聲波測(cè)出距離并顯示{ time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100;//算出來是CM if((S>=700)||flag==1)//超出測(cè)量范圍顯示“-” { flag=0; DisplayOneChar(0,1,ASCII[11]); DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn) DisplayOneChar(2,1,ASCII[11]); DisplayOneChar(3,1,ASCII[11]); DisplayOneChar(4,1,ASCII[12]); //顯示M } else { disbuff[0]=S%1000/100; disbuff[1]=S%1000%100/10; disbuff[2]=S%1000%10%10; DisplayOneChar(0,1,ASCII[disbuff[0]]); DisplayOneChar(1,1,ASCII[10]); //顯示點(diǎn) DisplayOneChar(2,1,ASCII[disbuff[1]]); DisplayOneChar(3,1,ASCII[disbuff[2]]); DisplayOneChar(4,1,ASCII[12]); //顯示M }}voidzd0()interrupt1 //T0中斷用來計(jì)數(shù)器溢出,超過測(cè)距范圍{flag=1; //中斷溢出標(biāo)志}voidStartModule() //啟動(dòng)模塊{ Trig=1; //啟動(dòng)一次模塊 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();//大約20us Trig=0;}//顯示時(shí)間voiddisplay_time(){ u8i=0; u8time_buf[8]; ds1302_read_time(); time_buf[0]=gDS1302_TIME[2]/16; time_buf[1]=gDS1302_TIME[2]&0x0f; time_buf[2]=13; time_buf[3]=gDS1302_TIME[1]/16; time_buf[4]=gDS1302_TIME[1]&0x0f; time_buf[5]=13; time_buf[6]=gDS1302_TIME[0]/16; time_buf[7]=gDS1302_TIME[0]&0x0f; for(i=0;i<8;i++) { DisplayOneChar(i,0,ASCII[time_buf[i]]); } }u8decimal_bcd_code(u8decimal)//十進(jìn)制轉(zhuǎn)BCD碼{ u8sum=0,i;//i計(jì)數(shù)變量,sum返回的BCD碼 for(i=0;decimal>0;i++) { sum|=((decimal%10)<<(4*i)); decimal/=10; } returnsum;}voidprint_on(){ u8i=0; u8time_buf[8]; ds1302_read_time(); time_buf[0]=gDS1302_TIME[2]/16; time_buf[1]=gDS1302_TIME[2]&0x0f; time_buf[2]=13; time_buf[3]=gDS1302_TIME[1]/16; time_buf[4]=gDS1302_TIME[1]&0x0f; time_buf[5]=13; time_buf[6]=gDS1302_TIME[0]/16; time_buf[7]=gDS1302_TIME[0]&0x0f; printf("%c%c:%c%c:%c%c\n",ASCII[time_buf[0]],ASCII[time_buf[1]],ASCII[time_buf[3]],ASCII[time_buf[4]],ASCII[time_buf[6]],ASCII[time_buf[7]]); printf("視力距離:%c%c\n",ASCII[distance_eye[0]],ASCII[distance_eye[1]]); printf("讀書時(shí)間:%c%c\n",ASCII[read_time[0]],ASCII[read_time[1]]); printf("實(shí)時(shí)距離:%c.%c%cM\n",ASCII[disbuff[0]],ASCII[disbuff[1]],ASCII[disbuff[2]]);}//串口初始化voidInit_Serial(void){SCON=0x50;//串口工作方式1TMOD=(TMOD&0x0F)|0x20;//選擇定時(shí)器1方式2PCON=0x80;//波特率倍增TH1=0xFD;//計(jì)數(shù)初值,19200bpsTR1=1;//啟動(dòng)定時(shí)器1ES=0;}//主函數(shù)voidmain(void){ read_all(); yangshengqi=0; ds1302_init();//初始化DS1302 TMOD=0x01; //設(shè)T0為方式1,GATE=1; TH0=0; TL0=0; ET0=1;//允許T0中斷 EA=1; //開啟總中斷 LcdInit(); Init_Serial(); SBUF=0x00; while(1) { u32distance_eye_all=0; u8key_value=key_matrix_ranks_scan(); switch(key_value) { case11:{ u8i=0; u8j=0; LcdInit(); LcdShowStr(0,0,"changetime"); while(1) { u8key[2]={0,0}; j=0; while(1) { key[j]=key_matrix_ranks_scan(); if(key[j]!=0) { if(key[j]==10)key[j]=0; j++; } if(j==2) { gDS1302_TIME[6-i]=decimal_bcd_code(key[0]*10+key[1]); i++; break; } } if(i==7)break; } ds1302_write_byte(0x8E,0X00); for(i=0;i<7;i++) { ds1302_write_byte(gWRITE_RTC_ADDR[i],gDS1302_TIME[i]); } ds1302_write_byte(0x8E,0X80); LcdInit(); break; } case12:{ u8i=0; u8read_time_[2]={0,0}; LcdInit(); LcdShowStr(0,0,"changereadtime"); while(1) { read_time_[i]=key_matrix_ranks_scan(); if(read_time_[i]>0&&read_time_[i]<11) i++; if(i==2) break; } if(read_time_[0]==10)read_time_[0]=0; if(read_time_[1]==10)read_time_[1]=0; read_time[0]=read_time_[0]; read_time[1]=read

溫馨提示

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

評(píng)論

0/150

提交評(píng)論