版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023年全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽風(fēng)板控制裝置(I題)【高職高專組】2023年8月15日摘要本系統(tǒng)通過對(duì)直流小風(fēng)扇風(fēng)速的調(diào)節(jié)實(shí)現(xiàn)對(duì)風(fēng)板轉(zhuǎn)角的控制,使風(fēng)板轉(zhuǎn)角可以隨風(fēng)速變化而改變,且能快速達(dá)成設(shè)定角度并穩(wěn)定。IAP15F2K61S2單片機(jī)為控制核心,通過鍵盤設(shè)定風(fēng)板板角度12864實(shí)時(shí)顯示風(fēng)板當(dāng)前角度。單片機(jī)輸出PWM波控制風(fēng)扇的風(fēng)速,通過GY521mpu-6050測(cè)量風(fēng)板的傾角反饋至單片機(jī),采用PID控制經(jīng)典算法,使系統(tǒng)實(shí)現(xiàn)精確控制,然后微調(diào)小風(fēng)扇的轉(zhuǎn)速改變風(fēng)速的大小使風(fēng)板角度達(dá)成穩(wěn)定。并且在達(dá)成設(shè)定范圍時(shí)進(jìn)行聲光提醒。通過調(diào)試與測(cè)試,實(shí)現(xiàn)了基本部分與發(fā)揮部分,最終實(shí)現(xiàn)在懸掛重物的情況下風(fēng)板能達(dá)成設(shè)定角度控制,且最終絕對(duì)值誤差不超過5度.關(guān)鍵字:1602;GY521mpu-6050;PWM;PID算法。目錄1系統(tǒng)方案 11.1角度測(cè)量方案選擇 11.2風(fēng)扇控制方案選擇 21.3顯示方案選擇 21.4控制器方案選擇 22系統(tǒng)理論分析與計(jì)算 32.1風(fēng)扇調(diào)試原理 32.2角度測(cè)量原理 32.3PID控制算法的分析 33電路與程序設(shè)計(jì) 43.1電路的設(shè)計(jì) 43.1.1系統(tǒng)總體框圖 43.1.2角度檢測(cè)電路 43.1.3風(fēng)扇驅(qū)動(dòng)電路 53.1.4按鍵及顯示電路 53.1.5電源電路 63.2程序的設(shè)計(jì) 63.2.1程序功能描述與設(shè)計(jì)思緒 63.2.2程序流程圖 64測(cè)試方案與測(cè)試結(jié)果 74.1測(cè)試方法與儀器 74.2測(cè)試過程及數(shù)據(jù) 74.3測(cè)試分析與結(jié)論 8附錄1:電路原理圖 10附錄2:實(shí)物圖 111系統(tǒng)方案根據(jù)題目規(guī)定,本系統(tǒng)可以分為控制部分和信號(hào)檢測(cè)部分.控制部分則涉及顯示模塊、按鍵模塊、聲光報(bào)警模塊、風(fēng)扇驅(qū)動(dòng)模塊四個(gè)基本部分。信號(hào)檢測(cè)部分為角度測(cè)量模塊,測(cè)量風(fēng)板的角度。下面分別論證這幾個(gè)模塊的選擇。1.1角度測(cè)量方案選擇方案一:采用MMA7260重力加速度傳感器,由于加速度傳感器在靜止放置時(shí)受到重力作用,因此會(huì)有1g的重力加速度。運(yùn)用這個(gè)性質(zhì),通過測(cè)量重力加速度在加速度傳感器的X軸和Y軸上的分量,可以計(jì)算出其在垂直平面上的傾斜角度。根據(jù)如圖1.1所示,有Ax=gsinα,Ay=gcosα。則=tanα即α=arctan().這樣,根據(jù)以上原理一個(gè)2軸加速度傳感器可以測(cè)量在X-Y平面上的傾斜角度。該方案原理簡(jiǎn)樸,操作方便,但使用起來(lái)運(yùn)算量較大,程序較為復(fù)雜,對(duì)于單片機(jī)來(lái)說(shuō),會(huì)顯得有點(diǎn)吃力,因此我們放棄選用該方案。圖1.1加速度傳感器角度測(cè)量原理 方案二:MPU-6000為全球首例整合性6軸運(yùn)動(dòng)解決組件,相較于多組件方案,免去了組合陀螺儀與加速器時(shí)之間軸差的問題,減少了大量的包裝空間。MPU-6000能以數(shù)字輸出6軸或9軸的旋轉(zhuǎn)矩陣、四元數(shù)(quaternion)、歐拉角格式(EulerAngleforma)的融合演算數(shù)據(jù)。內(nèi)建之運(yùn)作時(shí)間偏差與磁力感測(cè)器校正演算技術(shù),免去了客戶須此外進(jìn)行校正的需求。符合設(shè)計(jì)規(guī)定,同時(shí)也是我們平時(shí)有接觸的模塊。故綜合考慮實(shí)際中選擇方案二。1.2風(fēng)扇控制方案選擇方案一:采用可控硅控制調(diào)速,通過控制雙向可控硅的導(dǎo)通角,使輸出端電壓發(fā)生改變,從而使施加在電風(fēng)扇的輸入電壓發(fā)生改變,以調(diào)節(jié)風(fēng)扇的轉(zhuǎn)速,實(shí)現(xiàn)各檔位風(fēng)速的無(wú)級(jí)調(diào)速。但可控硅控制控制原理決定了只能滯后觸發(fā),因此,晶閘管可控制整流器對(duì)交流電源來(lái)說(shuō)相稱于一個(gè)感性負(fù)載,吸取滯后的無(wú)功電流,因此功率因素低。并且晶閘管整流裝置的輸出電壓是脈動(dòng)的,并且脈波數(shù)總是有限的。假如主電路電感不是非常大,則輸出電流總存在連續(xù)和斷續(xù)兩種情況,因而機(jī)械特性也有連續(xù)和斷續(xù)兩段,因此功率因素低,故我們不選用該方案。方案二:采用直流斬波控制,改變電壓輸出開關(guān)斷時(shí)間,將直流電源電壓斷續(xù)加到負(fù)載上,即可實(shí)現(xiàn)風(fēng)扇調(diào)速控制,它具有效率高、體積小、成本低等優(yōu)點(diǎn)。我們可以采用單片機(jī)由軟件來(lái)實(shí)現(xiàn)PWM波,簡(jiǎn)化系統(tǒng)硬件設(shè)計(jì),通過改變PWM波的占空比的值即可改變電樞端電壓的平均值從而達(dá)成調(diào)速的目的。再加上PID算法控制,而整個(gè)系統(tǒng)的PWM波形的產(chǎn)生是通過PID算法調(diào)節(jié),這樣提高了系統(tǒng)的穩(wěn)定性和可靠性,讓系統(tǒng)控制更加精確。故綜合考慮實(shí)際中選擇方案二。1.3顯示方案選擇方案一:使用數(shù)碼管顯示,通過數(shù)碼管顯示被測(cè)角度和設(shè)定角度。該方案程序簡(jiǎn)樸,但硬件占用單片機(jī)I/O口較多,對(duì)于盡量節(jié)約端口,讓線路簡(jiǎn)樸來(lái)說(shuō)不是好方法,并且顯示也不夠直觀靈活,只能顯示數(shù)字,不能顯示漢字顯示功能提醒,故不適合本次設(shè)計(jì)應(yīng)用。方案二:使用液晶屏LCD1602,具有體積小,使用方便等特點(diǎn)。并且可以顯示字母,數(shù)字等功能,觀測(cè)顯示很直觀,通過字幕顯示各種菜單界面、設(shè)定角度、測(cè)量角度等。該方案程序較復(fù)雜,但顯示觀測(cè)清楚,顯示直接明白,完全符合本系統(tǒng)設(shè)計(jì)功能。故為最佳方案,我們選擇方案二。方案二:使用液晶屏LCD1602,具有體積小,使用方便等特點(diǎn)。并且可以顯示字母,數(shù)字等功能,觀測(cè)顯示很直觀,通過字幕顯示各種菜單界面、設(shè)定角度、測(cè)量角度等。該方案程序較復(fù)雜,但顯示觀測(cè)清楚,顯示直接明白,完全符合本系統(tǒng)設(shè)計(jì)功能。故為最佳方案,我們選擇方案二。1.4控制器方案選擇方案一:采用FPGA(現(xiàn)場(chǎng)可編程門陣列)作為系統(tǒng)的控制器;將所有的器件集成在一塊芯片上,這樣外圍電路較少,控制板的體積小,穩(wěn)定性高,擴(kuò)展性能好;并且FPGA采用并行的輸入/輸出方式,系統(tǒng)解決速度快,再加上FPGA有方便的開發(fā)環(huán)境和豐富的開發(fā)工具等資源可運(yùn)用,易于調(diào)試;但是FPGA得成本偏高,算術(shù)運(yùn)算能力不強(qiáng),而本設(shè)計(jì)系統(tǒng)的設(shè)計(jì)會(huì)用到較多算術(shù)運(yùn)算,所以FPGA的高速解決的優(yōu)勢(shì)得不到充足體現(xiàn)。方案二:采用STC公司的IAP15F2K61S2單片機(jī)作為系統(tǒng)的控制器。單片機(jī)算術(shù)運(yùn)算功能強(qiáng),軟件編程靈活,可用軟件較簡(jiǎn)樸的實(shí)現(xiàn)各種算術(shù)和邏輯控制,并且由于其成本低,體積小和功耗低等優(yōu)點(diǎn),使其在各個(gè)領(lǐng)域應(yīng)用廣泛;此外,由于本設(shè)計(jì)中會(huì)用到較多的算術(shù)運(yùn)算,所以對(duì)本系統(tǒng)來(lái)說(shuō)非常適合運(yùn)用單片機(jī)作為控制器?;谝陨戏治觯x擇方案二。2系統(tǒng)理論分析與計(jì)算2.1風(fēng)扇調(diào)試原理單片機(jī)控制的小型直流電機(jī)的一般采用PWM脈沖調(diào)制方式實(shí)現(xiàn)速度的控制。PWM基本原理:PWM即脈沖寬度調(diào)制(定義),是直流電源電壓基本不變的情況下通過電子開關(guān)的通斷,改變施加到電機(jī)電樞端得直流電壓脈沖寬度(即所謂的占空比),以調(diào)節(jié)輸入電機(jī)電樞的電壓平均值的調(diào)速方式。通過改變固定周期內(nèi)直流電壓的占空比來(lái)改變電機(jī)兩端的直流平均電壓,進(jìn)而達(dá)成控制風(fēng)力大小的一種方法。PWM可以應(yīng)用在許多方面,如電機(jī)調(diào)速、溫度控制、壓力控制等。通過改變直流電機(jī)電樞上電壓的"占空比"來(lái)改變平均壓的大小,從而控制電動(dòng)機(jī)的轉(zhuǎn)速。只要按一定規(guī)律,改變通、斷電的時(shí)間,即可讓電機(jī)轉(zhuǎn)速得到控制。設(shè)電機(jī)始終接通電源時(shí),電機(jī)轉(zhuǎn)速最大為Vmax,設(shè)占空比為D=t1/T,則電機(jī)的平均速度為式中,Vd--電機(jī)的平均速度;Vmax--電機(jī)全通電時(shí)的速度(最大);D=t1/T占空比。由此可見,當(dāng)我們改變占空比D:t1/T時(shí),就可以得到不同的電機(jī)平均速度Vd,嚴(yán)格地講,平均速度Vd與占空比D并不是嚴(yán)格的線性關(guān)系,在一般的應(yīng)用中,可以將其近似地當(dāng)作線性關(guān)系。2.2角度測(cè)量原理mpu6050工作原理:作為一款物理傳感器,其工作原理是運(yùn)用物理效應(yīng),諸如壓電效應(yīng),將被測(cè)信號(hào)量的微小變化轉(zhuǎn)換成電信號(hào)。MPU6050是一款9軸運(yùn)動(dòng)解決傳感器。它集成了3軸MEMS陀螺儀,3軸MEMS加速度計(jì),以及一個(gè)可擴(kuò)展的數(shù)字運(yùn)動(dòng)解決器DMP(DigitalMotionProcessor),可用I2C接口連接一個(gè)第三方的數(shù)字傳感器,比如磁力計(jì)。擴(kuò)展之后就可以通過其I2C或SPI接口輸出一個(gè)9軸的信號(hào)(SPI接口僅在MPU-6000可用)。MPU-6050也可以通過其I2C接口連接非慣性的數(shù)字傳感器,比如壓力傳感器。極大提高系統(tǒng)最小精度,符合題目規(guī)定。2.3PID控制算法的分析PID控制算法是控制理論中應(yīng)用很廣泛的一種算法,對(duì)于一般控制系統(tǒng)來(lái)說(shuō),PID算法從某種意義來(lái)說(shuō)具有通用性,對(duì)各種系統(tǒng)具有廣泛的合用性,通過現(xiàn)場(chǎng)的參數(shù)調(diào)試,可以達(dá)成很好的控制效果。對(duì)于我們這次風(fēng)板控制系統(tǒng)的設(shè)計(jì),我們同樣也可以使用PID控制算法,具體算法如下:e(i)=t測(cè)-t設(shè)E=(2)算法中,u(i)為當(dāng)時(shí)的功率輸出。T為采樣時(shí)間,E為誤差積累,KP為比例常數(shù),Ti為積分常數(shù),Td為微分常數(shù)。根據(jù)實(shí)際系統(tǒng),調(diào)節(jié)這三個(gè)常數(shù),可以達(dá)成更好的效果。3電路與程序設(shè)計(jì)3.1電路的設(shè)計(jì)3.1.1系統(tǒng)總體框圖系統(tǒng)總體框圖如圖3.1所示:圖3.1系統(tǒng)總體框圖3.1.2角度檢測(cè)電路采用GY-52角度傳感器,免去了組合陀螺儀與加速器時(shí)之軸間差的問題,減少了大量的包裝空間。MPU-6000整合了3軸陀螺儀、3軸加速器,可以直接輸出角度轉(zhuǎn)換為數(shù)字信號(hào)傳遞給單片機(jī)進(jìn)行調(diào)速控制。其電路圖如圖3.2所示:圖3.2角度檢測(cè)電路3.1.3風(fēng)扇驅(qū)動(dòng)電路采用單片機(jī)產(chǎn)生PWM波,簡(jiǎn)化硬件電路設(shè)計(jì),實(shí)現(xiàn)性價(jià)比高特點(diǎn),改變PWM波的占空比的值即可改變電樞端電壓的平均值從而達(dá)成調(diào)速的目的。外加LM298驅(qū)動(dòng)電路,即可完全實(shí)現(xiàn)調(diào)速控制。LM298N它采用單片集成塑裝,是一個(gè)高電壓、大電流全雙橋驅(qū)動(dòng)器,由標(biāo)準(zhǔn)的TTL電平控制。L298N支持50V以內(nèi)的電機(jī)控制電壓,在直流運(yùn)轉(zhuǎn)條件下,可以通過高達(dá)2A的電流,因此它滿足了一般小型電機(jī)的控制規(guī)定。接法見圖3.3,圖中二極管的作用是消除電機(jī)的反向電動(dòng)勢(shì),保護(hù)電路,因此采用整流二極管比較合適。PWM控制信號(hào)由in1、in2輸入。假如in1為高電平,in2為低電平時(shí)電機(jī)為正向轉(zhuǎn)速,反之in1為低電平,in2為高電平時(shí),電機(jī)為反向轉(zhuǎn)速。本設(shè)計(jì)將in2直接接地,即采用單向制動(dòng)的方式。圖3.3L298N模塊實(shí)物圖3.1.4按鍵及顯示電路圖3.41602顯示電路本設(shè)計(jì)采用1個(gè)鍵作為鍵盤,分別為選擇2種模式。按是一種,不按又是一種。圖3.5按鍵輸入電路3.1.5電源電路 電源由變壓部分、濾波部分、穩(wěn)壓部分組成。為整個(gè)系統(tǒng)提供5V或者12V電壓,保證電路的正常穩(wěn)定工作。我們采用的是單電源供電,把12v的直流電供應(yīng)電機(jī),用降壓芯片把電壓穩(wěn)定到5V,提供應(yīng)單片機(jī)工作,并實(shí)現(xiàn)了互不干擾。同時(shí)單片機(jī)可以間接控制電機(jī)的調(diào)速。LM337可調(diào)穩(wěn)壓3.2程序的設(shè)計(jì)3.2.1程序功能描述與設(shè)計(jì)思緒1、程序功能描述:可以輸出精確的角度信息,并運(yùn)用PWM來(lái)高速調(diào)節(jié)電機(jī)的開關(guān)從而實(shí)現(xiàn)對(duì)電機(jī)速度控制,使得角度傳感器,風(fēng)板,電機(jī),單片機(jī),LCD1602,形成了一個(gè)簡(jiǎn)樸的系統(tǒng)。2、程序設(shè)計(jì)思緒:先是運(yùn)用角度傳感器對(duì)風(fēng)板的角度進(jìn)行精確的實(shí)時(shí)顯示,運(yùn)用角度傳感器傳輸?shù)臄?shù)據(jù)對(duì)pwm進(jìn)行控制,使得電機(jī)的風(fēng)速得到控制,最后風(fēng)速來(lái)反饋給角度傳感器,形成了一個(gè)封閉的反饋使的閉環(huán)系統(tǒng)。4測(cè)試方案與測(cè)試結(jié)果4.1測(cè)試方法與儀器測(cè)試方法:先通過KeilC軟件實(shí)現(xiàn)程序調(diào)試和進(jìn)行初步仿真,再通過protues仿真軟件搭建電理圖,實(shí)現(xiàn)對(duì)程序功能的實(shí)現(xiàn)仿真,并且用虛擬仿真軟件Multisim對(duì)硬件電路實(shí)現(xiàn)功能仿真,保證電路無(wú)誤后,在制作硬質(zhì)電路板,焊接電路,實(shí)現(xiàn)軟硬件聯(lián)合調(diào)試。測(cè)試儀器:量角器、秒表、直尺、模擬示波器、數(shù)字示波器、數(shù)字萬(wàn)用表、指針式萬(wàn)用表。4.2測(cè)試過程及數(shù)據(jù)1.測(cè)試基本功能一:用手搬動(dòng)風(fēng)板時(shí),數(shù)字顯示風(fēng)板的轉(zhuǎn)角。實(shí)際測(cè)試時(shí),風(fēng)板角度可以從45-135度變化,符合題目規(guī)定。2.測(cè)試基本功能二:當(dāng)懸掛10克重物時(shí),使風(fēng)板角度可以在45-135度范圍變化,并實(shí)時(shí)顯示角度。在完畢規(guī)定的同時(shí),規(guī)定誤差不超過5度,反映時(shí)間15秒,測(cè)試如下:風(fēng)力大小(%) 角度(°)40 3044 4547 5050 6553 8055 9560 10565 12073 135表1基本功能二測(cè)試3.測(cè)試基本功能三:當(dāng)間距為10cm時(shí),通過控制按鍵控制風(fēng)力大小,在45°±5°范圍內(nèi)。規(guī)定控制過程在10秒內(nèi)完畢,實(shí)時(shí)顯示θ,并由聲光提醒,以便進(jìn)行測(cè)試。測(cè)試數(shù)據(jù)如表2所示:風(fēng)力大?。?) 角度(°) 用時(shí)(s)52 48 6.351 48 3.143 44 3.1表2.基本功能測(cè)試三4.測(cè)試發(fā)揮功能一:當(dāng)間距掛10克重物時(shí),通過鍵盤設(shè)定風(fēng)板轉(zhuǎn)角,其范圍為45-135要θ在15秒內(nèi)達(dá)成設(shè)定值,并實(shí)時(shí)顯示θ。最大誤差的絕對(duì)值不超過5°測(cè)試數(shù)據(jù)如表3所示:設(shè)定角度(°) 實(shí)際角度(°) 風(fēng)力大?。?) 調(diào)整時(shí)間(s)30 30 0 050 14 12 1370 24 17 1690 28 22 13110 36 43 12130 54 76 11150 180 80 05測(cè)試發(fā)揮功能二:在功能一的基礎(chǔ)上,通過鍵盤設(shè)定模式,規(guī)定θ在兩個(gè)預(yù)設(shè)角度間擺動(dòng)四次,擺動(dòng)周期不超過5秒,最大誤差的絕對(duì)值不超過5°。測(cè)試數(shù)據(jù)達(dá)成規(guī)定4.3測(cè)試分析與結(jié)論根據(jù)上述測(cè)試數(shù)據(jù),系統(tǒng)完全符合規(guī)定,誤差在允許范圍內(nèi),實(shí)現(xiàn)所有功能,有些指標(biāo)還很高精度。由此可以得出以下結(jié)論:綜上所述,本設(shè)計(jì)達(dá)成設(shè)計(jì)規(guī)定。附錄1:電路原理圖角度傳感器電路原理圖附錄2:實(shí)物圖附錄3:系統(tǒng)程序#include<stc15f2k60s2.H> #include<math.h>//Keillibrary#include<stdio.h>//Keillibrary #include<INTRINS.H>typedefunsignedcharuchar;typedefunsignedshortushort;typedefunsignedintuint;//****************************************//定義51單片機(jī)端口//****************************************#defineDataPortP0 //LCD1602數(shù)據(jù)端口sbitSCL=P2^4; //IIC時(shí)鐘引腳定義sbitSDA=P2^3; //IIC數(shù)據(jù)引腳定義sbitLCM_RS=P2^2; //LCD1602命令端口 sbitLCM_RW=P2^1; //LCD1602命令端口 sbitLCM_EN=P2^0; //LCD1602命令端口//****************************************//定義MPU6050內(nèi)部地址//****************************************#define SMPLRT_DIV 0x19 //陀螺儀采樣率,典型值:0x07(125Hz)#define CONFIG 0x1A //低通濾波頻率,典型值:0x06(5Hz)#define GYRO_CONFIG 0x1B //陀螺儀自檢及測(cè)量范圍,典型值:0x18(不自檢,2023deg/s)#define ACCEL_CONFIG 0x1C //加速計(jì)自檢、測(cè)量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz)#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40#define PWR_MGMT_1 0x6B //電源管理,典型值:0x00(正常啟用)#define WHO_AM_I 0x75 //IIC地址寄存器(默認(rèn)數(shù)值0x68,只讀)#define SlaveAddress 0xD0 //IIC寫入時(shí)的地址字節(jié)數(shù)據(jù),+1為讀取//****************************************//定義類型及變量//****************************************uchardis[4]; //顯示數(shù)字(-511至512)的字符數(shù)組int dis_data; //變量//int Temperature,Temp_h,Temp_l; //溫度及高低位數(shù)據(jù)//****************************************//函數(shù)聲明//****************************************voiddelay(unsignedintk); //延時(shí)//LCD相關(guān)函數(shù)voidInitLcd(); //初始化lcd1602voidlcd_printf(uchar*s,inttemp_data);voidWriteDataLCM(uchardataW); //LCD數(shù)據(jù)voidWriteCommandLCM(ucharCMD,ucharAttribc); //LCD指令voidDisplayOneChar(ucharX,ucharY,ucharDData); //顯示一個(gè)字符voidDisplayListChar(ucharX,ucharY,uchar*DData,L); //顯示字符串//MPU6050操作函數(shù)voidInitMPU6050(); //初始化MPU6050voidDelay5us();voidI2C_Start();voidI2C_Stop();voidI2C_SendACK(bitack);bitI2C_RecvACK();voidI2C_SendByte(uchardat);ucharI2C_RecvByte();voidI2C_ReadPage();voidI2C_WritePage();voiddisplay_ACCEL_x();voiddisplay_ACCEL_y();voiddisplay_ACCEL_z();ucharSingle_ReadI2C(ucharREG_Address); //讀取I2C數(shù)據(jù)voidSingle_WriteI2C(ucharREG_Address,ucharREG_data); //向I2C寫入數(shù)據(jù)//****************************************//整數(shù)轉(zhuǎn)字符串//****************************************voidlcd_printf(uchar*s,inttemp_data){ *++s=temp_data/100+0x30; temp_data=temp_data%100;//取余運(yùn)算 *++s=temp_data/10+0x30; temp_data=temp_data%10;//取余運(yùn)算 *++s=temp_data+0x30; }//****************************************//延時(shí)//****************************************voiddelay(unsignedintk) { unsignedinti,j; for(i=0;i<k;i++) { for(j=0;j<121;j++); } }//****************************************//LCD1602初始化//****************************************voidInitLcd() { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); DisplayOneChar(0,0,'A'); DisplayOneChar(0,1,'G');} //****************************************//LCD1602寫允許//****************************************voidWaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } //****************************************//LCD1602寫入命令//****************************************voidWriteCommandLCM(ucharCMD,ucharAttribc){ if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;} //****************************************//LCD1602寫入數(shù)據(jù)//****************************************voidWriteDataLCM(uchardataW){ WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0;} //****************************************//LCD1602寫入一個(gè)字符//****************************************voidDisplayOneChar(ucharX,ucharY,ucharDData){ Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } //****************************************//LCD1602顯示字符串//****************************************voidDisplayListChar(ucharX,ucharY,uchar*DData,L){ ucharListLength=0; Y&=0x1; X&=0xF; while(L--) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; }}//**************************************//延時(shí)5微秒(STC90C52RC@12M)//不同的工作環(huán)境,需要調(diào)整此函數(shù)//當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)//**************************************voidDelay5us(){ _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();}//**************************************//I2C起始信號(hào)//**************************************voidI2C_Start(){SDA=1;//拉高數(shù)據(jù)線SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)SDA=0;//產(chǎn)生下降沿Delay5us();//延時(shí)SCL=0;//拉低時(shí)鐘線}//**************************************//I2C停止信號(hào)//**************************************voidI2C_Stop(){SDA=0;//拉低數(shù)據(jù)線SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)SDA=1;//產(chǎn)生上升沿Delay5us();//延時(shí)}//**************************************//I2C發(fā)送應(yīng)答信號(hào)//入口參數(shù):ack(0:ACK1:NAK)//**************************************voidI2C_SendACK(bitack){SDA=ack;//寫應(yīng)答信號(hào)SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)SCL=0;//拉低時(shí)鐘線Delay5us();//延時(shí)}//**************************************//I2C接受應(yīng)答信號(hào)//**************************************bitI2C_RecvACK(){SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)CY=SDA;//讀應(yīng)答信號(hào)SCL=0;//拉低時(shí)鐘線Delay5us();//延時(shí)returnCY;}//**************************************//向I2C總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)//**************************************voidI2C_SendByte(uchardat){uchari;for(i=0;i<8;i++)//8位計(jì)數(shù)器{dat<<=1;//移出數(shù)據(jù)的最高位SDA=CY;//送數(shù)據(jù)口SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)SCL=0;//拉低時(shí)鐘線Delay5us();//延時(shí)}I2C_RecvACK();}//**************************************//從I2C總線接受一個(gè)字節(jié)數(shù)據(jù)//**************************************ucharI2C_RecvByte(){uchari;uchardat=0;SDA=1;//使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),for(i=0;i<8;i++)//8位計(jì)數(shù)器{dat<<=1;SCL=1;//拉高時(shí)鐘線Delay5us();//延時(shí)dat|=SDA;//讀數(shù)據(jù)SCL=0;//拉低時(shí)鐘線Delay5us();//延時(shí)}returndat;}//**************************************//向I2C設(shè)備寫入一個(gè)字節(jié)數(shù)據(jù)//**************************************voidSingle_WriteI2C(ucharREG_Address,ucharREG_data){I2C_Start();//起始信號(hào)I2C_SendByte(SlaveAddress);//發(fā)送設(shè)備地址+寫信號(hào)I2C_SendByte(REG_Address);//內(nèi)部寄存器地址,I2C_SendByte(REG_data);//內(nèi)部寄存器數(shù)據(jù),I2C_Stop();//發(fā)送停止信號(hào)}//**************************************//從I2C設(shè)備讀取一個(gè)字節(jié)數(shù)據(jù)//**************************************ucharSingle_ReadI2C(ucharREG_Address){ ucharREG_data; I2C_Start();//起始信號(hào) I2C_SendByte(SlaveAddress);//發(fā)送設(shè)備地址+寫信號(hào) I2C_SendByte(REG_Address);//發(fā)送存儲(chǔ)單元地址,從0開始 I2C_Start();//起始信號(hào) I2C_SendByte(SlaveAddress+1);//發(fā)送設(shè)備地址+讀信號(hào) REG_data=I2C_RecvByte();//讀出寄存器數(shù)據(jù) I2C_SendACK(1);//接受應(yīng)答信號(hào) I2C_Stop();//停止信號(hào) returnREG_data;}//**************************************//初始化MPU6050//**************************************voidInitMPU6050(){ Single_WriteI2C(PWR_MGMT_1,0x00); //解除休眠狀態(tài) Single_WriteI2C(SMPLRT_DIV,0x07); Single_WriteI2C(CONFIG,0x06); Single_WriteI2C(GYRO_CONFIG,0x18); Single_WriteI2C(ACCEL_CONFIG,0x01);}//**************************************//合成數(shù)據(jù)//**************************************intGetData(ucharREG_Address){ charH,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return(H<<8)+L;//合成數(shù)據(jù)}//**************************************//在1602上顯示10位數(shù)據(jù)//**************************************voidDisplay10BitData(intvalue,ucharx,uchary){ lcd_printf(dis,value); //轉(zhuǎn)換數(shù)據(jù)顯示 DisplayListChar(x,y,dis,4); //啟始列,行,顯示數(shù)組,顯示長(zhǎng)度}//**************************************/sbitmac1=P1^0;sbitmac=P1^1;voidpwm_init(){ CMOD=0X02;CH=0;CL=0; CCAPM0=0X42;CCAP0L=0X9a;CCAP0H=0X9a;Delay5us(); CCAPM1=0X42;CCAP1L=0X9a;CCAP1H=0X9a;Delay5us(); CR=1;}sbitkey=P2^5;sbitkey1=P2^6;sbitkey2=P2^7;sbitkey3=P1^7;sbitled=P1^6;uintflag=0,flag1=0;ucharflag3=0;uinttemp;uintcnt=0,cnt1=0;ucharcodeangl1[3]={"060"};ucharcodeangl2[10]={"100090"};voidDelay50ms(uintr) //@11.0592MHz{ unsignedchari,j,k; uintt; for(t=0;t<r;t++) { _nop_(); _nop_(); i=3; j=26; k=223; do { do { while(--k); }while(--j); }while(--i); }}uintjd(){ intv[10],i;inty,z;uintte; for(i=0;i<10;i++) { y=GetData(ACCEL_YOUT_H);Delay5us(); z=GetData(ACCEL_ZOUT_H);Delay5us(); y/=64;z/=64; if(y<0)y=-y; v[i]=(float)(((atan2(z,y)*180)/3.14159265));v[i]=90-v[i]; } te=v[0]+v[1]+v[2]+v[4]+v[4]+v[5]+v[6]+v[7]+v[8]+v[9]; te=(te/10)+((te%10)); Display10BitData(te,2,0); returnte;}voidang1_93()//需要進(jìn)一步優(yōu)化基本的第一問{ if(temp<140) { CCAP0L=150-36;CCAP0H=150-36;CCAP1L=150-30;CCAP1H=150-30; if(temp==105){led=0;} //調(diào)整時(shí)間, if((temp>94)&&(temp<101)&&(led==0)){Delay50ms(1);flag++;} } if(flag==90) {led=1;flag1=1;} if(flag1==1){ CCAP0L=150;CCAP0H=150;CCAP1L=150-36;CCAP1H=150-36;Delay50ms(10); CCAP0L=0x9a;CCAP0H=0x9a;CCAP1L=0x9a;CCAP1H=0x9a; } }voidang2_70_105(){ uintflag2=0; intj,t[2]; intpwm_counter0=0,pwm_counter1=0; for(j=0;j<2;j++){t[j]=jd();delay(15);} if((t[1]-t[0])>0)flag2=1;elseif((t[1]-t[0])<0)flag2=2; //負(fù)數(shù) if(temp<85) { if(flag2==2) { pwm_counter1++;pwm_counter1++;delay(1); CCAP1L=150-pwm_counter1;CCAP1H=150-pwm_counter1; if(pwm_counter1>=51)pwm_counter1=51; } if(flag2==1) { pwm_counter1++;pwm_counter1++;delay(1); CCAP1L=150-pwm_counter1;CCAP1H=150-pwm_counter1; pwm_counter0--;delay(1); CCAP0L=150-pwm_counter0;CCAP0H=150-pwm_counter0; if(pwm_counter1>=51)pwm_counter1=51; if(pwm_counter0<=0)pwm_counter0=0; } } if(temp>95) { if(flag2==1) { pwm_counter0++; pwm_counter0++;delay(1); CCAP0L=150-pwm_counter0;CCAP0H=150-pwm_counter0; pwm_counter1--; delay(1); CCAP1L=150-pwm_counter1;CCAP1H=150-pwm_counter1; if(pwm_counter0>=47)pwm_counter0=48; if(pwm_counter1<=0)pwm_counter1=0; } if(flag2==2) { pwm_counter0++; pwm_counter0++; delay(1); CCAP0L=150-pwm_counter0;CCAP0H=150-pwm_counter0; pwm_counter1--; delay(1); CCAP1L=150-pwm_counter1;CCAP1H=150-pwm_counter1; if(pwm_counter0>=47)pwm_counter0=48; if(pwm_counter1<=0)pwm_counter1=0; } }}voidtime
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度貨物供應(yīng)與安裝合同
- 出租空地合租大棚合同范例
- 2024年企業(yè)采購(gòu)戰(zhàn)略合作項(xiàng)目的產(chǎn)品研發(fā)合同
- 2024年20xx新型化肥研發(fā)與生產(chǎn)合同
- 2024年醫(yī)療設(shè)備采購(gòu)與安裝合同
- 凈水器合同范例
- 2024年商標(biāo)許可合同的許可使用范圍與權(quán)利限制
- 品牌線上代理授權(quán)合同范例
- 賣公寓租房合同范例
- 商鋪遞增合同范例
- 江蘇開放大學(xué)2023年秋《中級(jí)會(huì)計(jì)實(shí)務(wù)(上) 050284》第4次任務(wù)參考答案
- 屋頂光伏安全專項(xiàng)施工方案
- 4.與食品經(jīng)營(yíng)相適應(yīng)的主要設(shè)備設(shè)施布局操作流程等文件
- 四班三倒排班表
- 銀行業(yè)信息系統(tǒng)災(zāi)難恢復(fù)管理規(guī)范
- 醫(yī)院重點(diǎn)崗位工作人員輪崗制度
- 2023光伏發(fā)電工程項(xiàng)目安全文明施工方案
- 帶式輸送機(jī)膠帶安裝
- 陳育民對(duì)FLAC3D常見問題的解答概要
- 專利文獻(xiàn)檢索方法與步驟課件
- 第5講-申論大作文課件
評(píng)論
0/150
提交評(píng)論