計(jì)算機(jī)控制技術(shù)課程設(shè)計(jì)--單閉環(huán)直流電機(jī)調(diào)速系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  《計(jì)算機(jī)控制技術(shù)》課 程 設(shè) 計(jì)</p><p> 單閉環(huán)直流電機(jī)調(diào)速系統(tǒng)</p><p><b>  1 設(shè)計(jì)目的</b></p><p>  計(jì)算機(jī)控制技術(shù)課程是集微機(jī)原理、計(jì)算機(jī)技術(shù)、控制理論、電子電路、自動(dòng)控制系統(tǒng)、工業(yè)控制過(guò)程等課程基礎(chǔ)知識(shí)一體的應(yīng)用性課程,具有很強(qiáng)的實(shí)踐性,通過(guò)這次課程設(shè)計(jì)進(jìn)一步加深對(duì)計(jì)算機(jī)控制

2、技術(shù)課程的理解,掌握計(jì)算機(jī)控制系統(tǒng)硬件和軟件的設(shè)計(jì)思路,以及對(duì)相關(guān)課程理論知識(shí)的理解和融會(huì)貫通,提高運(yùn)用已有的專業(yè)理論知識(shí)分析實(shí)際應(yīng)用問(wèn)題的能力和解決實(shí)際問(wèn)題的技能,培養(yǎng)獨(dú)立自主、綜合分析與創(chuàng)新性應(yīng)用的能力。</p><p><b>  2 設(shè)計(jì)任務(wù)</b></p><p><b>  2.1 設(shè)計(jì)題目</b></p><p&

3、gt;  單閉環(huán)直流電機(jī)調(diào)速系統(tǒng)</p><p>  實(shí)現(xiàn)一個(gè)單閉環(huán)直流電機(jī)調(diào)壓調(diào)速控制,用鍵盤(pán)實(shí)現(xiàn)對(duì)直流電機(jī)的起/停、正/反轉(zhuǎn)控制,速度調(diào)節(jié)要求既可用鍵盤(pán)數(shù)字量設(shè)定也可用電位器連續(xù)調(diào)節(jié),需要有速度顯示電路。擴(kuò)展要求能夠利用串口通信方式在PC上設(shè)置和顯示速度曲線并且進(jìn)行數(shù)據(jù)保存和查看。</p><p><b>  2.2 設(shè)計(jì)要求</b></p><

4、;p>  2.2.1 基本設(shè)計(jì)要求</p><p> ?。?)根據(jù)系統(tǒng)控制要求設(shè)計(jì)控制整體方案;包括微處理芯片選用,系統(tǒng)構(gòu)成框圖,確定參數(shù)測(cè)范圍等;</p><p>  (2)選用參數(shù)檢測(cè)元件及變送器;系統(tǒng)硬件電路設(shè)計(jì),包括輸入接口電路、邏輯電路、操作鍵盤(pán)、輸出電路、顯示電路;</p><p> ?。?)建立數(shù)學(xué)模型,確定控制算法;</p>&l

5、t;p>  (4)設(shè)計(jì)功率驅(qū)動(dòng)電路;</p><p> ?。?)制作電路板,搭建系統(tǒng),調(diào)試。</p><p>  2.2.2 擴(kuò)展設(shè)計(jì)要求</p><p> ?。?)在已能正常運(yùn)行的微計(jì)算機(jī)控制系統(tǒng)的基礎(chǔ)上,通過(guò)串口與PC連接;</p><p> ?。?)編寫(xiě)人機(jī)界面控制和顯示程序;編寫(xiě)微機(jī)通信程序;實(shí)現(xiàn)人機(jī)實(shí)時(shí)交互。</p>

6、;<p><b>  3方案比較</b></p><p>  方案一:采用繼電器對(duì)電動(dòng)機(jī)的開(kāi)或關(guān)進(jìn)行控制。這個(gè)方案的優(yōu)點(diǎn)是電路較為簡(jiǎn)單,缺點(diǎn)是繼電器的響應(yīng)時(shí)間慢、機(jī)械結(jié)構(gòu)易損壞、壽命較短、可靠性不高。</p><p>  方案二:采用電阻網(wǎng)絡(luò)或數(shù)字電位器調(diào)整電動(dòng)機(jī)的分壓,從而達(dá)到調(diào)速的目的。但是電阻網(wǎng)絡(luò)只能實(shí)現(xiàn)有級(jí)調(diào)速,而數(shù)字電阻的元器件價(jià)格比較昂貴。更

7、主要的問(wèn)題在于一般電動(dòng)機(jī)的電阻很小,但電流很大;分壓不僅會(huì)降低效率,而且實(shí)現(xiàn)很困難。</p><p>  方案三:采用由電力電子器件組成的H型PWM電路。用單片機(jī)控制電力電子器件使之工作在占空比可調(diào)的開(kāi)關(guān)狀態(tài),精確調(diào)整電動(dòng)機(jī)轉(zhuǎn)速。這種電路由于工作在電力電子器件的飽和截止模式下,效率非常高;H型電路保證了可以簡(jiǎn)單地實(shí)現(xiàn)轉(zhuǎn)速和方向的控制;電子開(kāi)關(guān)的速度很快,穩(wěn)定性也極佳,是一種廣泛采用的PWM調(diào)速技術(shù)。</p&

8、gt;<p>  兼于方案三調(diào)速特性優(yōu)良、調(diào)整平滑、調(diào)整范圍廣、過(guò)載能力大,因此本設(shè)計(jì)采用方案三。</p><p>  4單閉環(huán)直流電機(jī)調(diào)速系統(tǒng)設(shè)計(jì)</p><p>  4.1單閉環(huán)調(diào)速原理</p><p>  4.1.1 閉環(huán)系統(tǒng)框圖</p><p>  4.1.2 調(diào)速原理</p><p><b

9、>  直流電機(jī)轉(zhuǎn)速有:</b></p><p>  常數(shù)Ke Ka不變,Ra比較小。 所以調(diào)節(jié)Ua就能調(diào)節(jié)n。</p><p><b>  4.2 系統(tǒng)框圖</b></p><p><b>  4.3系統(tǒng)基本原理</b></p><p>  通過(guò)鍵盤(pán)按鍵控制

10、電機(jī)的啟停、正反轉(zhuǎn)、加速和減速,單片機(jī)接收鍵盤(pán)信號(hào)與反饋信號(hào)進(jìn)行比較處理,也可以通過(guò)電位器調(diào)速,將模擬調(diào)節(jié)量轉(zhuǎn)換為數(shù)字量后送給單片機(jī)處理,電機(jī)的速度由傳感器測(cè)量后回饋給單片機(jī)處理,單片機(jī)接收到各路信號(hào)后控制顯示器顯示特定的內(nèi)容,同時(shí)控制電機(jī)驅(qū)動(dòng)電路工作,從而控制直流電機(jī)的轉(zhuǎn)速。</p><p><b>  5系統(tǒng)硬件電路設(shè)計(jì)</b></p><p><b>

11、  5.1電機(jī)驅(qū)動(dòng)電路</b></p><p>  電機(jī)驅(qū)動(dòng)電路主要有L298N和四個(gè)二極管組成,其中PWM驅(qū)動(dòng)原理如下</p><p>  Ud是有效值,調(diào)節(jié)占空比就能調(diào)節(jié)Ud進(jìn)而調(diào)節(jié)n.</p><p>  PWM驅(qū)動(dòng)器由L298來(lái)實(shí)現(xiàn)的,L298是SGS公司的產(chǎn)品,比較常見(jiàn)的是15腳Multiwatt封裝的L298N,內(nèi)部同樣包含4通道邏輯驅(qū)動(dòng)電路

12、??梢苑奖愕尿?qū)動(dòng)兩個(gè)直流電機(jī),或一個(gè)兩相步進(jìn)電機(jī)。</p><p><b>  3</b></p><p>  iii. 如圖4,L298的封裝和功能表。通過(guò)改變C、D的狀態(tài)來(lái)改變電機(jī)的正反轉(zhuǎn)和急停和調(diào)節(jié)占空比進(jìn)而調(diào)速;Ven直接接高電位。是對(duì)C、D分別輸出0和PWM波或者PWM波和0來(lái)進(jìn)行的,初始化的占空比為50%。</p><p><

13、;b>  5.2 測(cè)速電路</b></p><p>  測(cè)速電路用自制的光電編碼盤(pán),通過(guò)紅外接收發(fā)射管和施密特觸發(fā)器組成。當(dāng)接收管接收到發(fā)射管發(fā)出的低電平信號(hào),再通過(guò)施密特整形送給單片機(jī)的INT0,進(jìn)而通過(guò)程序進(jìn)行計(jì)算速度。</p><p><b>  5.3 顯示電路</b></p><p>  LCD 1602顯示電路用于

14、顯示轉(zhuǎn)速設(shè)定值與當(dāng)前值。</p><p><b>  5.4 鍵盤(pán)</b></p><p>  0-9按鍵為數(shù)值的設(shè)定,CLR為后退按鍵,ENT為確定鍵,KEY為鍵盤(pán)輸入按鍵,REP為電位器調(diào)速按鍵,RUN為運(yùn)行/正轉(zhuǎn)按鍵,F(xiàn)為運(yùn)行/反轉(zhuǎn)按鍵, STOP為停止按鍵。</p><p>  5.5 模擬調(diào)速電路</p><p&g

15、t;  模擬調(diào)速電路由電位器分壓輸出給定電壓,再經(jīng)過(guò)AD轉(zhuǎn)換器ADC0831輸入的單片機(jī)中。</p><p><b>  5.6 電源電路</b></p><p><b>  5</b></p><p>  6V /0.5A的外部輸入電壓Vin經(jīng)過(guò)由MC7805ACK與兩個(gè)由470Pf、一個(gè)100uf的電解電容組成的穩(wěn)壓電

16、路,穩(wěn)壓成5V的電壓,供系統(tǒng)使用。</p><p>  5.7 串口通信電路</p><p>  主要用來(lái)燒寫(xiě)程序進(jìn)去單片機(jī)。MAX232將ttl電平轉(zhuǎn)換成可以和電腦串口匹配的電壓。從而與PC機(jī)進(jìn)行通信。</p><p><b>  6</b></p><p>  上圖位stc單片機(jī)專用ISp下載軟件。</p>

17、;<p>  5.8 晶振和復(fù)位電路</p><p>  左邊為復(fù)位電路、右邊為12M的晶振電路,這兩塊與單片機(jī)組成最小系統(tǒng)。</p><p><b>  7</b></p><p><b>  6 軟件設(shè)計(jì)</b></p><p>  如圖12,主程序是先初始化LCD1602和中斷,

18、然后進(jìn)入轉(zhuǎn)速設(shè)定和調(diào)節(jié)循環(huán)。其中INT0中斷是用來(lái)測(cè)試輔助的,TO和T1配合參數(shù)PWM波和調(diào)節(jié)占空比(其中PWM為一個(gè)8位二進(jìn)制數(shù)0-255),轉(zhuǎn)速的反饋調(diào)節(jié)主要是進(jìn)行優(yōu)化的P調(diào)節(jié)。</p><p>  如題13和圖14,是T0和T1的中斷服務(wù)程序,TO設(shè)定256us的循環(huán)和初始化T1,然后對(duì)電機(jī)進(jìn)行正轉(zhuǎn)、反轉(zhuǎn)、停機(jī)(急停)三個(gè)判斷;T1中斷服務(wù)程序只負(fù)責(zé)關(guān)閉T1中斷。</p><p> 

19、 如圖14,外部中斷INT0處理調(diào)理好的測(cè)試脈沖,中斷服務(wù)程序?qū)γ恳粋€(gè)測(cè)速脈沖對(duì)變量n進(jìn)行加+,返回到主函數(shù)的測(cè)速程序。</p><p>  PWM的優(yōu)化型P控制算法,對(duì)轉(zhuǎn)速比較盡興分級(jí)調(diào)節(jié),當(dāng)實(shí)際值無(wú)設(shè)定值相差超過(guò)1000rpm時(shí)PWM調(diào)整15,相差超過(guò)500rpm時(shí)調(diào)整10,相差超過(guò)300時(shí)調(diào)整6,相差超過(guò)100時(shí)調(diào)整2,相差小于100時(shí)調(diào)整1。</p><p><b>  

20、8</b></p><p><b>  9</b></p><p><b>  10</b></p><p>  7 電路與程序仿真和軟件調(diào)試</p><p>  7.1 Proteus仿真電路</p><p>  可以導(dǎo)入HXE文件,對(duì)編寫(xiě)好的程序和電路圖進(jìn)行仿

21、真。</p><p><b>  11</b></p><p>  7.2Keil程序編寫(xiě)與編譯。</p><p><b>  12</b></p><p><b>  8 硬件焊接與調(diào)試</b></p><p><b>  8.1 焊接與高度

22、</b></p><p>  單片機(jī)最小系統(tǒng)的焊接,成功后進(jìn)行下一步。</p><p>  串口通信電路焊接,焊完進(jìn)行串行通信,通過(guò)與PC機(jī)進(jìn)行通信、刷寫(xiě)程序進(jìn)入單片機(jī),成功進(jìn)行下一步。</p><p>  鍵盤(pán)電路與LCD1062顯示電路焊接,程序已經(jīng)寫(xiě)進(jìn)單片機(jī)里面,可以進(jìn)行參數(shù)設(shè)置來(lái)檢查按鍵與顯示是否正常,成功進(jìn)行下一步。</p>&l

23、t;p>  模擬調(diào)速電路焊接,焊完進(jìn)行模擬調(diào)速設(shè)置,從顯示器能觀察是否正常。</p><p>  電機(jī)驅(qū)動(dòng)電路焊接,焊完進(jìn)行調(diào)試,發(fā)現(xiàn)電機(jī)接上之后系統(tǒng)不穩(wěn)定,經(jīng)分析發(fā)現(xiàn)是電源功率不足,電源是一個(gè)6V0.5A的小型電源,正好驅(qū)動(dòng)芯片L298的電源電路分開(kāi)供電,用另外的電源給電機(jī)供電,改裝完后系統(tǒng)正常,進(jìn)行下一步。</p><p>  測(cè)速電路焊接,連接到單片機(jī)后一切正常。</p&

24、gt;<p>  整體焊接完成后對(duì)軟件進(jìn)行實(shí)物調(diào)試,通過(guò)不斷的運(yùn)行測(cè)試和重新刷寫(xiě)程序,主要克服的問(wèn)題有:調(diào)速反應(yīng)遲鈍、速度顯示精度、PWM調(diào)試算法。</p><p><b>  成品系統(tǒng)。</b></p><p><b>  13</b></p><p>  8.2 系統(tǒng)參數(shù)與實(shí)驗(yàn)數(shù)據(jù)</p>

25、<p><b>  系統(tǒng)的調(diào)試參數(shù):</b></p><p>  轉(zhuǎn)速測(cè)量誤差范圍:+ —30 rpm</p><p>  所使用電機(jī)PWM調(diào)壓范圍:0—7.5V</p><p>  所使用電機(jī)PWM穩(wěn)定調(diào)速范圍:正轉(zhuǎn)時(shí)390—2460rpm</p><p>  反轉(zhuǎn)時(shí)390—2700rpm</p>

26、<p><b>  調(diào)試結(jié)果表格</b></p><p>  上述調(diào)試結(jié)果表明:實(shí)際轉(zhuǎn)速跟設(shè)定轉(zhuǎn)速的差值不超過(guò)30rpm,效果較好,符合設(shè)計(jì)要求。</p><p><b>  14</b></p><p><b>  9 結(jié)論</b></p><p>  在此次課

27、程設(shè)計(jì)中,設(shè)計(jì)了PWM單閉環(huán)調(diào)速系統(tǒng),它由STC89C52RC單片機(jī)的I/O口輸出PWM信號(hào),直接用TTL電平控制驅(qū)動(dòng)芯片L298實(shí)現(xiàn)對(duì)電動(dòng)機(jī)進(jìn)行調(diào)速,這樣能夠充分發(fā)揮單片機(jī)的效能,對(duì)于簡(jiǎn)易速度控制系統(tǒng)的實(shí)現(xiàn)提供了一種有效的途徑。軟件方面,它采用計(jì)數(shù)法加軟件延時(shí)法進(jìn)行設(shè)計(jì)的思路,為采用純軟件對(duì)電機(jī)速度的平滑調(diào)節(jié)提供了一種不錯(cuò)的解決方案。運(yùn)行實(shí)驗(yàn)表明,系統(tǒng)硬件接口電路簡(jiǎn)單,工作穩(wěn)定可靠,滿足了調(diào)速的功能要求,有很好的可操作性和維護(hù)性,具有

28、較大的理論及實(shí)用價(jià)值。</p><p><b>  10 心得體會(huì)</b></p><p>  通過(guò)這次課程設(shè)計(jì),我們?cè)谑斋@知識(shí)的同時(shí),還收獲了閱歷,收獲了成熟。在此過(guò)程中,我們通過(guò)查找大量資料,請(qǐng)教老師,以及不懈的努力,不僅培養(yǎng)了獨(dú)立思考、動(dòng)手操作的能力,在各種其它能力上也都有了提高。更重要的是,在課程設(shè)計(jì)上,我們學(xué)會(huì)了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益

29、匪淺。要面對(duì)社會(huì)的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。在如今單一的理論學(xué)習(xí)中,很少有機(jī)會(huì)能有實(shí)踐的機(jī)會(huì),但我們可以,而且設(shè)計(jì)也是一個(gè)團(tuán)隊(duì)的任務(wù),一起的工作可以讓我們有說(shuō)有笑,相互幫助,配合默契。我們的工作是一個(gè)團(tuán)隊(duì)的工作,團(tuán)隊(duì)需要個(gè)人,個(gè)人也離不開(kāi)團(tuán)隊(duì),必須發(fā)揚(yáng)團(tuán)結(jié)協(xié)作的精神。某個(gè)人的離群都可能導(dǎo)致導(dǎo)致整項(xiàng)工作的失敗。課程設(shè)計(jì)中只有一個(gè)人知道原理是遠(yuǎn)遠(yuǎn)不夠的,必須讓每個(gè)人都知道,否則一個(gè)人的錯(cuò)誤,就有可能導(dǎo)致整個(gè)工作失敗。團(tuán)結(jié)協(xié)

30、作是我們實(shí)習(xí)成功的一項(xiàng)非常重要的保證。而這次實(shí)習(xí)也正好鍛煉我們這一點(diǎn),這也是非常寶貴的。對(duì)我們而言,知識(shí)上的收獲重要,精神上的豐收更加可喜。挫折是一份財(cái)富,經(jīng)歷是一份擁有。這次實(shí)習(xí)必將成為我人生旅途上一個(gè)非常美好的回憶!</p><p><b>  11 致謝</b></p><p>  感謝我們的指導(dǎo)老師,不管在選題階段,還是在設(shè)計(jì)階段,在制作階段,正是她給予我不斷

31、的指導(dǎo)與鼓勵(lì),我們才能順利地完成我的課程設(shè)計(jì),她那種對(duì)待學(xué)生和藹親切,對(duì)待工作一絲不茍的品質(zhì)和精神值得我們每一個(gè)人學(xué)習(xí)。借此,向我們的指導(dǎo)老師畢老師表示衷心的感謝。</p><p>  在此我要感謝我的同學(xué)們,在電路設(shè)計(jì)、程序編寫(xiě)和焊接過(guò)程遇到困難時(shí),正是由于同學(xué)們的指導(dǎo)我們才能順利地完成本次課程設(shè)計(jì)。</p><p><b>  15</b></p>

32、<p><b>  16</b></p><p>  附錄(一)小組分工情況表</p><p><b>  17</b></p><p><b>  附錄二 總電路圖</b></p><p><b>  18</b></p><

33、;p><b>  附錄(三)</b></p><p><b>  元器件清單</b></p><p><b>  附錄(四)</b></p><p><b>  控制程序</b></p><p>  #include<reg52.h>&l

34、t;/p><p>  #include <intrins.h></p><p>  #define LCM_Data P0 //數(shù)據(jù)接口</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int </p><p>  

35、uchar code uctech[] = {"SSpeed="};</p><p>  uchar code net[] = {"RSpeed="};</p><p>  uchar code Data[]={'0','1','2','3','4','5'

36、;,'6','7','8','9'}; </p><p>  uchar idata plus[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};</p><p>  uchar SSpeed[4]={0,0,0,0};</p><p>  uchar RSpee

37、d[4]={0,0,0,0};</p><p>  uchar k; FLAG;</p><p>  uchar PWM=0x7f ; //賦初值</p><p>  uint n=0; num=0; //T0中斷次數(shù)和INT0中斷次數(shù)</p><p>  uint speed; //實(shí)際轉(zhuǎn)速</p><p&

38、gt;  uint SetSpeed; // 數(shù)字和模擬速度設(shè)定值</p><p><b>  20</b></p><p>  sbit D=P2^0;</p><p>  sbit A=P2^1;</p><p>  sbit Run=P2^2; </p><p>  sbit Fan=P

39、2^3; </p><p>  sbit Stop=P2^4;</p><p>  sbit LCM_E=P2^5;//定義接口</p><p>  sbit LCM_RW=P2^6;</p><p>  sbit LCM_RS=P2^7;</p><p>  sbit IN1=P3^4; //L298兩驅(qū)

40、動(dòng)端口</p><p>  sbit IN2=P3^5;</p><p>  sbit SCL2=P3^7;//連接ADC0831SCL腳</p><p>  sbit SDA2=P3^6;//連接ADC0831SDA腳</p><p>  sbit CS=P3^3;</p><p>  void LCM_Wr

41、iteData(uchar WDLCM); //LCD寫(xiě)數(shù)據(jù)</p><p>  void LCM_WriteCommand(uchar WCLCM,BuysC); //LCD寫(xiě)命令</p><p>  uchar LCM_ReadData(void); //LCD讀數(shù)據(jù) </p><p>  uchar LCM_ReadStatus(vo

42、id); //LCD讀狀態(tài)</p><p>  void LCM_Init(void); //LCD初始化</p><p>  void DisplayOneChar(uchar X, uchar Y, uchar DData); //LCD顯示1個(gè)字符</p><p>  void DisplayListChar(uc

43、har X, uchar Y, uchar code *DData); //LCD顯示一串字符</p><p>  void break_Init(void); //定時(shí)器和中斷初始化</p><p>  void delay200us(void); //延時(shí)200us</p><p>  void delay400ms(void);

44、 //延時(shí)400ms</p><p>  void delay10ms(void); //延時(shí)10ms</p><p>  void Getch (void); //鍵值判斷函數(shù)</p><p>  void GetchIt(void); //鍵值獲取函數(shù)</p><p>  void InputSet(void

45、); //鍵盤(pán)設(shè)定函數(shù)</p><p>  void motorPWM(void); //PWM調(diào)速</p><p>  void RSpeeddisplay(void); //實(shí)際轉(zhuǎn)速顯示</p><p><b>  21</b></p><p>  uchar ad0831read(void);

46、//定義該函數(shù)為讀取ADC0831的數(shù)據(jù)</p><p>  void Vvchange(void); //AD采集與轉(zhuǎn)速轉(zhuǎn)換,同時(shí)顯示電位器設(shè)定轉(zhuǎn)速值</p><p>  void main(void)</p><p><b>  {</b></p><p>  delay400ms();//啟動(dòng)等待,等LCM講入

47、工作狀態(tài)</p><p>  LCM_Init();//LCM初始化</p><p>  delay200us();//延時(shí)片刻(可不要)</p><p>  DisplayListChar(1, 0, uctech);</p><p>  DisplayListChar(12,0,"RPM");</p>&

48、lt;p>  DisplayListChar(1, 1, net);</p><p>  DisplayListChar(12,1,"RPM");</p><p>  LCM_WriteCommand(0x0c,1);// 顯示關(guān)光標(biāo)設(shè)置 指令4:置功能</p><p>  LCM_WriteCommand(0x0c,1);// 顯示關(guān)光標(biāo)

49、設(shè)置 指令4:置功能</p><p>  break_Init(); //中斷初始化</p><p><b>  while(1)</b></p><p><b>  { Run=1;</b></p><p><b>  Fan=1;</b></p><p&

50、gt;<b>  D=1;</b></p><p><b>  A=1;</b></p><p>  if(D==0) //按數(shù)字參數(shù)設(shè)定鍵可設(shè)定一次參數(shù),此處是為了節(jié)省CPU工作資源,使CPU運(yùn)行效率更高!</p><p><b>  {</b></p><p>  I

51、nputSet();</p><p>  LCM_WriteCommand(0x0c,1);// 顯示關(guān)及光標(biāo)設(shè)置 指令4:置功能</p><p><b>  n=0;</b></p><p><b>  }</b></p><p><b>  22</b></p>

52、<p>  if(A==0) //按電位器模擬參數(shù)設(shè)定</p><p><b>  {</b></p><p>  Vvchange();</p><p><b>  n=0}</b></p><p>  if(n==745) //每0.2S進(jìn)行一次實(shí)際速度計(jì)算,同時(shí)顯示實(shí)際轉(zhuǎn)速

53、,進(jìn)行一次PWM調(diào)速。</p><p>  {speed=30*num;</p><p><b>  num=0;</b></p><p><b>  n=0;</b></p><p>  RSpeeddisplay(); //顯示實(shí)際轉(zhuǎn)速</p><p>  moto

54、rPWM(); //PWM調(diào)速</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /**********************************</p>

55、<p><b>  鍵盤(pán)和轉(zhuǎn)速設(shè)定函數(shù)</b></p><p>  **********************************/</p><p>  void delay10ms(void) //延時(shí)程序</p><p><b>  { </b></p><p>  uchar

56、 i,j; </p><p>  for(i=20;i>0;i--) </p><p>  for(j=248;j>0;j--); </p><p><b>  } </b></p><p>  void Getch ()</p><p>  { unsigned char X,Y

57、,Z;</p><p><b>  P1=0xff;</b></p><p>  P1=0x0f; //先對(duì)P1置數(shù) 行掃描</p><p><b>  23</b></p><p>  if(P1!=0x0f) //判斷是否有鍵按下</p><p> 

58、 {delay10ms(); //延時(shí),軟件去干擾</p><p>  if(P1!=0x0f) //確認(rèn)按鍵按下X = P1;</p><p><b>  {</b></p><p>  X=P1; //保存行掃描時(shí)有鍵按下時(shí)狀態(tài)</p><p>  P1=0xf0; //列掃描

59、</p><p>  Y=P1; //保存列掃描時(shí)有鍵按下時(shí)狀態(tài)</p><p>  Z=X|Y; //取出鍵值</p><p>  switch ( Z ) //判斷鍵值(那一個(gè)鍵按下)</p><p><b>  {</b></p><p>  case

60、0xee: k=1;FLAG=0;break; //對(duì)鍵值賦值,10代表清零,11代表確認(rèn)</p><p>  case 0xde: k=2;FLAG=0;break; </p><p>  case 0xbe: k=3;FLAG=0;break; </p><p>  case 0xed: k=4;FLAG=0;break; </p><p&g

61、t;  case 0xdd: k=5;FLAG=0;break; </p><p>  case 0xbd: k=6;FLAG=0;break; </p><p>  case 0xeb: k=7;FLAG=0;break; </p><p>  case 0xdb: k=8;FLAG=0;break; </p><p>  case 0xb

62、b: k=9;FLAG=0;break; </p><p>  case 0xe7: k=10;FLAG=0;break; </p><p>  case 0xd7: k=0;FLAG=0;break; </p><p>  case 0xb7: k=11;FLAG=0;break;</p><p><b>  } </b&

63、gt;</p><p>  delay400ms(); //延時(shí)防止連擊!</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>

64、;  24</b></p><p>  void GetchIt(void)</p><p><b>  {FLAG=1;</b></p><p>  while(FLAG)</p><p><b>  Getch();</b></p><p><b>

65、  }</b></p><p>  //鍵盤(pán)數(shù)字轉(zhuǎn)速設(shè)定函數(shù)</p><p>  void InputSet(void) //參數(shù)設(shè)定函數(shù)</p><p>  { uchar n=0,i=8,m=0,j=8,p;</p><p>  LCM_WriteCommand(0x02,1); //指令2:光標(biāo)返回00H</p&

66、gt;<p>  for(p=0;p<8;p++) LCM_WriteCommand(0x14,1);// 右移動(dòng)光標(biāo) 指令5:置功能</p><p>  LCM_WriteCommand(0x0e,1);// 顯示開(kāi)及光標(biāo)設(shè)置 指令4:置功能</p><p>  GetchIt();</p><p>  while((k!=11)&&a

67、mp;(n<4))</p><p><b>  { </b></p><p><b>  if(k<10)</b></p><p>  {SSpeed[n]=k;</p><p>  DisplayOneChar(i,0,Data[SSpeed[n]]);</p><

68、p><b>  n++;</b></p><p><b>  i++;</b></p><p>  if(n==4) {LCM_WriteCommand(0x0c,1);// 顯示關(guān)及光標(biāo)設(shè)置 指令4:置功能</p><p>  LCM_WriteCommand(0x10,1);// 左移動(dòng)光標(biāo) 指令5:置功能<

69、;/p><p>  LCM_WriteCommand(0x0e,1);// 顯示開(kāi)光標(biāo)設(shè)置 指令4:置功能</p><p><b>  }</b></p><p>  GetchIt();</p><p><b>  }</b></p><p><b>  25<

70、;/b></p><p>  else if(k==10) </p><p>  {if(i!=8)LCM_WriteCommand(0x10,1);// 左移動(dòng)光標(biāo) 指令5:置功能</p><p><b>  i--;</b></p><p><b>  n--;</b></p>

71、<p>  GetchIt();</p><p><b>  }</b></p><p><b>  } </b></p><p>  SetSpeed=1000*SSpeed[0]+100*SSpeed[1]+10*SSpeed[2]+SSpeed[3]; </p><p><

72、;b>  }</b></p><p>  /************************</p><p>  AD采集和轉(zhuǎn)速數(shù)學(xué)模型函數(shù)</p><p>  ************************/</p><p>  //模擬轉(zhuǎn)速設(shè)定函數(shù)</p><p>  uchar ad0831r

73、ead(void)//ad0831讀8位AD數(shù)據(jù)</p><p><b>  {</b></p><p>  uchar i,tmp=0;</p><p><b>  SDA2=1;</b></p><p><b>  CS=0;</b></p>

74、<p>  delay200us();</p><p><b>  SCL2=0;</b></p><p>  delay200us();</p><p><b>  SCL2=1;</b></p><p>  delay200us();</p><p><b

75、>  SCL2=0;</b></p><p>  delay200us();</p><p>  for(i=0;i<8;i++)</p><p><b>  26</b></p><p><b>  {</b></p><p>  if(SDA2)

76、 tmp++;</p><p><b>  tmp<<=1;</b></p><p><b>  SCL2=1;</b></p><p>  delay200us();</p><p><b>  SCL2=0;</b></p><p>

77、;  delay200us();</p><p><b>  }</b></p><p><b>  CS=1;</b></p><p>  return tmp;</p><p><b>  }</b></p><p>  //電位器電壓與轉(zhuǎn)速轉(zhuǎn)換數(shù)學(xué)

78、模型函數(shù)以及顯示函數(shù)</p><p>  void Vvchange(void)</p><p>  {uint ASpeed;</p><p>  uchar i,k=8,tmp;</p><p>  tmp=ad0831read();</p><p>  ASpeed=10*tmp;</p><

79、p>  SSpeed[0]=ASpeed/1000;</p><p>  SSpeed[1]=ASpeed%1000/100;</p><p>  SSpeed[2]=ASpeed%1000%100/10;</p><p>  SSpeed[3]=ASpeed%1000%100%10;</p><p>  for(i=0;i<4;

80、i++)</p><p>  {DisplayOneChar(k,0,Data[SSpeed[i]]);</p><p><b>  k++;</b></p><p><b>  }</b></p><p>  delay400ms();</p><p>  SetSpee

81、d=ASpeed;</p><p><b>  27</b></p><p><b>  }</b></p><p>  //實(shí)際轉(zhuǎn)速顯示函數(shù)</p><p>  void RSpeeddisplay(void)</p><p>  {uchar l,u=8;</p&g

82、t;<p>  RSpeed[0]=speed/1000;</p><p>  RSpeed[1]=speed%1000/100;</p><p>  RSpeed[2]=speed%1000%100/10;</p><p>  RSpeed[3]=speed%1000%100%10;</p><p>  for(l=0;l&l

83、t;4;l++)</p><p>  {DisplayOneChar(u,1,Data[RSpeed[l]]);</p><p><b>  u++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

84、t;  /**************************</p><p>  以下是直流電機(jī)控制相關(guān)函數(shù)</p><p>  ***************************/</p><p>  // 利用定時(shí)器控制產(chǎn)生占空比可變的 PWM 波</p><p>  void break_Init() //中斷初始化<

85、/p><p><b>  { </b></p><p>  IN1=1; IN2=1;</p><p>  TMOD=0x21 ; //T0工作在16位,T1工作在自動(dòng)8位</p><p>  TH0=0xff ; //256us延時(shí)常數(shù)</p><p>  TL0=0x00

86、 ; //頻率調(diào)節(jié)</p><p>  TH1=PWM ; //脈寬調(diào)節(jié)</p><p><b>  TL1=0 ;</b></p><p>  IT0=1; //中斷設(shè)置</p><p><b>  EA=1;</b></p><p&

87、gt;<b>  ET0=1;</b></p><p><b>  28</b></p><p><b>  ET1=1; </b></p><p><b>  EX0=1;</b></p><p><b>  TR0=1;</b>

88、</p><p><b>  }</b></p><p>  //直流電機(jī)驅(qū)動(dòng)PWM函數(shù)</p><p>  void motorPWM(void) </p><p>  { uint cha;</p><p>  if((speed>SetSpeed)&&(PWM&l

89、t;0xfe)) </p><p>  {cha=speed-SetSpeed;</p><p>  if(cha>1000) PWM=PWM+15;</p><p>  else if(cha>500) PWM=PWM+10;</p><p>  else if(cha>300) PWM=PWM+6;</p&

90、gt;<p>  else if(cha>100) PWM=PWM+2;</p><p>  else PWM++;</p><p><b>  }</b></p><p>  else if(speed<SetSpeed&&PWM>0x00) </p><p>  {

91、cha=SetSpeed-speed;</p><p>  if(cha>1000) PWM=PWM-15;</p><p>  else if(cha>500) PWM=PWM-10;</p><p>  else if(cha>300) PWM=PWM-6;</p><p>  else if(cha>100)

92、 PWM=PWM-2;</p><p>  else PWM--;</p><p><b>  } </b></p><p><b>  }</b></p><p>  /*********************************************************/</

93、p><p>  // 定時(shí)器0中斷服務(wù)程序 (頻率)</p><p>  /*********************************************************/</p><p><b>  29</b></p><p>  void timer0() interrupt 1 </p&g

94、t;<p><b>  { </b></p><p><b>  TR1=0 ;</b></p><p>  TH0=0xff ;</p><p>  TL0=0x00 ;</p><p><b>  TH1=PWM ;</b></p><p

95、><b>  TR1=1 ;</b></p><p><b>  n++;</b></p><p>  if(Stop!=0)</p><p><b>  {</b></p><p>  if(Run==0) {IN1=1;IN2=0;} //啟動(dòng)輸出<

96、;/p><p>  else if(Fan==0) {IN1=0;IN2=1;}</p><p><b>  }</b></p><p><b>  else </b></p><p>  {IN1=1;IN2=1;}</p><p><b>  }</b>

97、;</p><p>  /*********************************************************/</p><p>  // 定時(shí)器1中斷服務(wù)程序 (脈寬)</p><p>  /*********************************************************/</p>&l

98、t;p>  void timer1() interrupt 3</p><p><b>  { </b></p><p><b>  TR1=0;</b></p><p><b>  IN1=1;</b></p><p>  IN2=1;//結(jié)束輸出</p>

99、<p><b>  }</b></p><p>  void INT_0() interrupt 0 </p><p><b>  30</b></p><p><b>  {num++;</b></p><p><b>  }</b><

100、;/p><p>  /*****************************************</p><p>  ** 1602A液晶屏驅(qū)動(dòng)程序</p><p>  ** 晶 振 頻 率:12 Mhz</p><p>  *****************************************/</p>

101、<p>  /****************************1602A寫(xiě)數(shù)據(jù)函數(shù)**************************/</p><p>  /*函數(shù)原型:void LCM_WriteData(uchar WDLCM)</p><p>  /*函數(shù)功能:1602A寫(xiě)數(shù)據(jù)</p><p>  /*輸入?yún)?shù):要寫(xiě)入的數(shù)據(jù)</p&g

102、t;<p><b>  /*輸出參數(shù):無(wú)</b></p><p><b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  void LCM_Wr

103、iteData(uchar WDLCM)</p><p><b>  {</b></p><p>  LCM_ReadStatus();//檢測(cè)忙</p><p>  LCM_Data = WDLCM;</p><p>  LCM_RS = 1;</p><p>  LCM_RW = 0;<

104、/p><p>  LCM_E = 0;//若晶振速度太高可以在這后加小的延時(shí)</p><p>  delay200us();</p><p>  LCM_E = 1;</p><p><b>  }</b></p><p>  /****************************1602A寫(xiě)指令

105、函數(shù)**************************/</p><p><b>  31</b></p><p>  /*函數(shù)原型:void LCM_WriteCommand(uchar WCLCM,BuysC)</p><p>  /*函數(shù)功能:1602A寫(xiě)指令</p><p>  /*輸入?yún)?shù):要寫(xiě)入的指令<

106、;/p><p><b>  /*輸出參數(shù):無(wú)</b></p><p><b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  void L

107、CM_WriteCommand(uchar WCLCM,BuysC)//BuysC為0時(shí)忽略忙檢測(cè)</p><p><b>  {</b></p><p>  if (BuysC) LCM_ReadStatus();//根據(jù)需要檢測(cè)忙</p><p>  LCM_Data = WCLCM;</p><p>  LCM_R

108、S = 0;</p><p>  LCM_RW = 0;</p><p>  LCM_E = 0;</p><p>  delay200us();</p><p>  LCM_E = 1;</p><p><b>  }</b></p><p>  /***********

109、*****************1602A讀數(shù)據(jù)函數(shù)**************************/</p><p>  /*函數(shù)原型:uchar LCM_ReadData(void)</p><p>  /*函數(shù)功能:1602A讀數(shù)據(jù)</p><p><b>  /*輸入?yún)?shù):無(wú)</b></p><p>  /

110、*輸出參數(shù):1602A返回的數(shù)據(jù)</p><p><b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  uchar LCM_ReadData(void)</p>&

111、lt;p><b>  {</b></p><p>  LCM_Data=0xFF;</p><p><b>  32</b></p><p>  LCM_RS = 1;</p><p>  LCM_RW = 1;</p><p>  LCM_E = 0;</p&g

112、t;<p>  delay200us();</p><p>  LCM_E = 1;</p><p>  return(LCM_Data);</p><p><b>  }</b></p><p>  /****************************1602A讀狀態(tài)函數(shù)**************

113、************/</p><p>  /*函數(shù)原型:uchar LCM_ReadData(void)</p><p>  /*函數(shù)功能:1602A讀狀態(tài)</p><p><b>  /*輸入?yún)?shù):無(wú)</b></p><p>  /*輸出參數(shù):1602A返回的狀態(tài)</p><p><

114、b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  uchar LCM_ReadStatus(void)</p><p><b>  {</b></p>

115、;<p>  LCM_Data = 0xFF;</p><p>  LCM_RS = 0;</p><p>  LCM_RW = 1;</p><p>  LCM_E = 0;</p><p>  delay200us();</p><p>  LCM_E = 1;</p><p>

116、;  while (LCM_Data & 0x80);//檢測(cè)忙信號(hào)</p><p>  return(LCM_Data);</p><p><b>  }</b></p><p>  /****************************1602A初始化函數(shù)**************************/</p>

117、<p><b>  33</b></p><p>  /*函數(shù)原型:void LCM_Init(void)</p><p>  /*函數(shù)功能:1602A初始化</p><p><b>  /*輸入?yún)?shù):無(wú)</b></p><p><b>  /*輸出參數(shù):無(wú)</b>

118、;</p><p><b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  void LCM_Init(void)</p><p><b>  {

119、</b></p><p>  LCM_Data = 0;</p><p>  LCM_WriteCommand(0x38,0);//三次顯示模式設(shè)置,不檢測(cè)忙信號(hào),0x38:指令6置功能,2行,5*7字符</p><p>  delay200us();</p><p>  LCM_WriteCommand(0x38,0);<

120、/p><p>  delay200us();</p><p>  LCM_WriteCommand(0x38,0);</p><p>  delay200us();</p><p>  LCM_WriteCommand(0x38,1);//顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)</p><p>  LCM_WriteComm

121、and(0x08,1);//關(guān)閉顯示 指令4:</p><p>  LCM_WriteCommand(0x01,1);//顯示清屏 指令1</p><p>  LCM_WriteCommand(0x06,1);// 顯示光標(biāo)移動(dòng)設(shè)置 指令3:置輸入模式:地址增量,顯示屏不移動(dòng)</p><p>  LCM_WriteCommand(0x0e,1);// 顯示開(kāi)及

122、光標(biāo)設(shè)置 </p><p><b>  }</b></p><p>  /******************1602A按指定位置顯示一個(gè)字符函數(shù)**********************/</p><p>  /*函數(shù)原型:void DisplayOneChar(uchar X, uchar Y, uchar DData)</p&g

123、t;<p>  /*函數(shù)功能:1602A按指定位置顯示一個(gè)字符</p><p><b>  34</b></p><p>  /*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示的字符</p><p><b>  /*輸出參數(shù):無(wú)</b></p><p><b>  /*調(diào)用模塊:</

124、b></p><p>  /**********************************************************************/</p><p>  void DisplayOneChar(uchar X, uchar Y, uchar DData)</p><p><b>  {</b><

125、/p><p><b>  Y &= 0x1;</b></p><p>  X &= 0xF;//限制X不能大于15,Y不能大于1</p><p>  if (Y) X |= 0x40;//當(dāng)要顯示第二行時(shí)地址碼+0x40;</p><p>  X |= 0x80;// 算出指令碼</p><

126、;p>  LCM_WriteCommand(X, 0);//這里不檢測(cè)忙信號(hào),發(fā)送地址碼</p><p>  LCM_WriteData(DData);</p><p><b>  }</b></p><p>  /*******************1602A按指定位置顯示一串字符函數(shù)*********************/<

127、;/p><p>  /*函數(shù)原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData)</p><p>  /*函數(shù)功能:1602A按指定位置顯示一個(gè)字符</p><p>  /*輸入?yún)?shù):X坐標(biāo) Y坐標(biāo) 要顯示字符串的首地址</p><p><b>  /*輸出參數(shù):無(wú)&l

128、t;/b></p><p><b>  /*調(diào)用模塊:</b></p><p>  /**********************************************************************/</p><p>  void DisplayListChar(uchar X, uchar Y, uchar

129、code *DData)</p><p><b>  {</b></p><p>  uchar ListLength;</p><p>  ListLength = 0;</p><p><b>  Y &= 0x1;</b></p><p>  X &=

130、0xF;//限制X不能大于15,Y不能大于1</p><p><b>  35</b></p><p>  while (DData[ListLength]>0x20)//若到達(dá)字串尾則退出</p><p><b>  {</b></p><p>  if (X <= 0xF)//X坐標(biāo)

131、應(yīng)小于0xF</p><p><b>  {</b></p><p>  DisplayOneChar(X, Y, DData[ListLength]);//顯示單個(gè)字符</p><p>  ListLength++;</p><p><b>  X++;</b></p><p&

132、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /********************200us延時(shí)函數(shù)************************/</p><p>  /*函數(shù)原型:v

133、oid delay200us(void)</p><p>  /*函數(shù)功能:200us延時(shí)</p><p><b>  /*輸入?yún)?shù):無(wú)</b></p><p><b>  /*輸出參數(shù):無(wú)</b></p><p><b>  /*調(diào)用模塊:</b></p>&l

134、t;p>  /**********************************************************************/</p><p>  void delay200us(void)</p><p><b>  {</b></p><p>  unsigned int TempCyc = 100;&l

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論