版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 單片機課程設(shè)計</b></p><p> 課題:步進電機正反轉(zhuǎn)設(shè)計</p><p> 系 別: 電氣與電子工程系</p><p><b> 專 業(yè): </b></p><p><b> 姓 名: </b></p&
2、gt;<p><b> 學(xué) 號</b></p><p><b> 指導(dǎo)老師: </b></p><p> 2013年01月09日</p><p><b> 一 設(shè)計目的</b></p><p> 1、增進對單片機的感性認識,加深對單片機理論方面
3、的理解;</p><p> 2、掌握單片機的內(nèi)部功能模塊的應(yīng)用,如定時器/計數(shù)器、中斷、片內(nèi)外存貯器、I/O口、A/D、D/A、串行口通訊等;</p><p> 3、了解和掌握單片機應(yīng)用系統(tǒng)的軟硬件設(shè)計過程、方法及實現(xiàn);</p><p> 4、了解步進電機控制的基本原理,能實現(xiàn)電機正反轉(zhuǎn)驅(qū)動控制,掌握控制步進電機轉(zhuǎn)動的編程方法。 </p><
4、;p><b> 二 設(shè)計要求</b></p><p> 1、具有速度和轉(zhuǎn)向設(shè)定功能;</p><p> 2、設(shè)置開始、停止以及正反轉(zhuǎn)健;</p><p> 3、轉(zhuǎn)速以及轉(zhuǎn)向有數(shù)碼管顯示(本設(shè)計使用的為LCD12864)。</p><p><b> 三 、總體設(shè)計</b></p
5、><p> 步進電機是一種將電脈沖轉(zhuǎn)化為角位移的數(shù)字控制執(zhí)行機構(gòu)。它將電脈沖信號轉(zhuǎn)變成角位移,即給一個脈沖信號,步進電機就轉(zhuǎn)動一個角度,因此非常適合于單片機控制。 步進電機具有控制簡便、定位準確等特點。隨著科學(xué)技術(shù)的發(fā)展,在許多領(lǐng)域?qū)⒌玫綇V泛的應(yīng)用。鑒于傳統(tǒng)的脈沖系統(tǒng)移植性不好,本文提出微機控制系統(tǒng)代替脈沖發(fā)生器和脈沖分配器,用軟件的方法產(chǎn)生控制脈沖,通過軟件編程可以任意設(shè)定步進電機的轉(zhuǎn)速、旋轉(zhuǎn)角度、轉(zhuǎn)動次
6、數(shù)和控制步進電機的運行狀態(tài)。以簡化控制電路,降低生產(chǎn)成本,提高系統(tǒng)的運行效率和靈活性。</p><p> 步進電機的角位移與輸入脈沖數(shù)嚴格成正比,因此,當(dāng)它轉(zhuǎn)動一周后,沒有累計誤差,具有良好的跟隨性。由步進電機與驅(qū)動電路組成的開環(huán)數(shù)控系統(tǒng),既非常簡單、 廉價,又非??煽?。同時,它也可以與角度反饋環(huán)節(jié)組成高性能的閉環(huán)數(shù)控系統(tǒng)。步進電機的動態(tài)響應(yīng)快,易于起停、正反轉(zhuǎn)及變速。速度可在相當(dāng)寬的范圍內(nèi)平滑 調(diào)節(jié),低速下仍
7、能保證獲得大轉(zhuǎn)矩。步進電機只能通過脈沖電源供電才能運行,它不能直接使用交流電源和直流電源。 步進電機存在振蕩和失步現(xiàn)象,必須對控制系統(tǒng)和機械負載采取相應(yīng)的措施。步進電機自身的噪聲和振動較大,帶慣性負載的能力較差。</p><p> 步進電機是自動控制系統(tǒng)中常用的執(zhí)行部件。步進電機的輸入信號為脈沖電流,它能將輸入的脈沖信號轉(zhuǎn)換為階躍型的角位移或直線位移,因而步進電機可看作是一個串行的數(shù)/模轉(zhuǎn)換器。由于步進電機能夠
8、直接接受數(shù)字信號,而不需數(shù)/模轉(zhuǎn)換,所以使用微機控制步進電機顯得非常方便。</p><p> 步進電機有以下優(yōu)點:</p><p> (1)通常不需要反饋就能對位置和速度進行控制;</p><p> (2)位置誤差不會積累;</p><p> (3)與數(shù)組設(shè)備兼容,能夠直接接收數(shù)字信號;</p><p> (
9、4)可以快速啟停。</p><p> 步進電機的品種規(guī)格很多,按照它們的結(jié)構(gòu)和工作原理可以劃分為磁阻式(也稱反應(yīng)式或變磁阻式)電機、混合式電機、永磁式電機和特種電機等四種主要型式。步進電機不需位移傳感器就可精確定位,所以在精確定位系統(tǒng)中應(yīng)用廣泛。目前打字機、計算機外部設(shè)備、數(shù)控機床、傳真機等設(shè)備中都使用了步進電機。隨著電子計算機技術(shù)的發(fā)展,步進電機必將發(fā)揮它的控制方便、控制準確的特點,在工業(yè)控制等領(lǐng)域取得更為廣
10、泛的應(yīng)用。</p><p> 本設(shè)計采用16 位單片機AT89C51對步進電機進行控制,通過I/O口輸出的具有時序的方波作為步進電機的控制信號,信號經(jīng)過驅(qū)動芯片驅(qū)動步進電機;同時,用觸發(fā)按鍵來對電機的狀態(tài)進行控制,并用128X64LCD顯示電機的狀態(tài)及轉(zhuǎn)速。</p><p> 因為步進電機的控制是通過脈沖信號來控制的,將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。所以怎樣產(chǎn)生這個脈沖
11、信號和產(chǎn)生怎樣的信號是電機控制的關(guān)鍵。</p><p> 用軟件控制單片機產(chǎn)生脈沖信號,通過單片機的P1口輸出脈沖信號,因為所選電機是兩相的,所以只需要P0口的低四位P0.0-P0.3分別通過ULN2003A接到電機的五根電線上??梢酝ㄟ^調(diào)整輸出脈沖的頻率來調(diào)整電機的轉(zhuǎn)速,通過改變輸入脈沖的順序來改變轉(zhuǎn)動方向,P2口和P3口接128X64LCD,可以顯示當(dāng)前的電機轉(zhuǎn)速和轉(zhuǎn)向,設(shè)置復(fù)位鍵可使正在轉(zhuǎn)動的電機停止轉(zhuǎn)動
12、,大概可分為如下圖所示的幾部分。</p><p> 注:由于此設(shè)計程序較復(fù)雜,在此沒有列出程序的框圖,程序框圖詳見軟件設(shè)計。</p><p> 四 、主要器件介紹及電路設(shè)計</p><p><b> 4.1、步進電機</b></p><p> 4.1.1 步進電機概述</p><p>
13、步進電機是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。在非超載的情況下,電機的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負載變化的影響,當(dāng)步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度,稱為“步距角”,它的旋轉(zhuǎn)是以固定的角度一步一步運行的??梢酝ㄟ^控制脈沖個數(shù)來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。由于脈沖信號數(shù)與步距
14、角的線性關(guān)系,加上步進電機只有周期性的誤差而無累積誤差等特點,使得在速度、位置等控制領(lǐng)域用步進電機來控制變的非常的簡單。 步進電機是一種感應(yīng)電機,它的工作原理是利用電子電路,將直流電變成分時供電的,多相時序控制電流,用這種電流為步進電機供電,步進電機才能正常工作,驅(qū)動器就是為步進電機分時供電的,多相時序控制器 </p><p> 雖然步進電機已被廣泛地應(yīng)用,但步進電機并不能象普通的直流電機,交流電機在常規(guī)
15、下使用。它必須由雙環(huán)形脈沖信號、功率驅(qū)動電路等組成控制系統(tǒng)方可使用。因此用好步進電機卻非易事,它涉及到機械、電機、電子及計算機等許多專業(yè)知識。 </p><p> 步進電機作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一, 廣泛應(yīng)用在各種自動化控制系統(tǒng)中。隨著微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日俱增,在各個國民經(jīng)濟領(lǐng)域都有應(yīng)用。</p><p> 4.1.2 步進電機的工作原理<
16、;/p><p> 通常電機的轉(zhuǎn)子為永磁體,當(dāng)電流流過定子繞組時,定子繞組產(chǎn)生一矢量磁場。該磁場會帶動轉(zhuǎn)子旋轉(zhuǎn)一角度,使得轉(zhuǎn)子的一對磁場方向與定子的磁場方向一致。當(dāng)定子的矢量磁場旋轉(zhuǎn)一個角度。轉(zhuǎn)子也隨著該磁場轉(zhuǎn)一個角度。每輸入一個電脈沖,電動機轉(zhuǎn)動一個角度前進一步。它輸出的角位移與輸入的脈沖數(shù)成正比、轉(zhuǎn)速與脈沖頻率成正比。改變繞組通電的順序,電機就會反轉(zhuǎn)。所以可用控制脈沖數(shù)量、頻率及電動機各相繞組的通電順序來控制步進
17、電機的轉(zhuǎn)動</p><p> 四相步進電機,采用單極性直流電源供電。只要對步進電機的各相繞組按合適的時序通電,就能使步進電機步進轉(zhuǎn)動。圖1是該四相</p><p> 反應(yīng)式步進電機工作原理圖。</p><p> 圖2 四相反應(yīng)式步進電機工作原理圖</p><p> 開始時,開關(guān)SB接通電源,SA、SC、SD斷開,B相磁極和轉(zhuǎn)子0、3號
18、齒對齊,同時,轉(zhuǎn)子的1、4號齒就和C、D相 繞組磁極產(chǎn)生錯齒,2、5號齒就和D、A相繞組磁極產(chǎn)生錯齒。當(dāng)開關(guān)SC接通電源,SB、SA、SD斷開時,由于C相繞組的磁力線和1、4號齒之間磁力線的作用,使轉(zhuǎn)子轉(zhuǎn)動,1、4號齒和C相繞組的磁極對齊。而0、3號齒和A、B相繞組產(chǎn)生錯齒,2、5號齒就和A、D相繞組磁極產(chǎn)生錯齒。依次類推,A、B、C、D四相繞組輪流供電,則轉(zhuǎn)子會沿著A、B、C、D方向轉(zhuǎn)動。</p><p>
19、四相步進電機按照通電順序的不同,可分為單四拍、雙四拍、八拍三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉(zhuǎn)動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉(zhuǎn)動力矩又可以提高控制精度。</p><p> 單四拍、雙四拍與八拍工作方式的電源通電時序與波形分別如圖2.a、b、c所示:</p><p> a單四拍 b雙四拍
20、 c八拍</p><p> 圖3.步進電機工作時序波形圖</p><p> 4.2 ULN2003</p><p> ULN是集成達林頓管IC,內(nèi)部還集成了一個消線圈反電動勢的二極管,可用來驅(qū)動繼電器。它是雙列16腳封裝,NPN晶體管矩陣,最大驅(qū)動電壓=50V,電流=500mA,輸入電壓=5V,適用于TTL COMS,由達林頓管組成驅(qū)
21、動電路。 ULN是集成達林頓管IC,內(nèi)部還集成了一個消線圈反電動勢的二極管,它的輸出端允許通過電流為200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。用戶輸出口的外接負載可根據(jù)以上參數(shù)估算。采用集電極開路輸出,輸出電流大,故可直接驅(qū)動繼電器或固體繼電器,也可直接驅(qū)動低壓燈泡。通常單片機驅(qū)動ULN2003時,上拉2K的電阻較為合適,同時,COM引腳應(yīng)該懸空或接電源。</p><p> ULN20
22、03是一個非門電路,包含7個單元,但獨每個單元驅(qū)動電流最大可達350mA.資料的最后有引用電路,9腳可以懸空。 比如1腳輸入,16腳輸出,你的負載接在VCC與16腳之間,不用9腳。 </p><p> ULN2003的作用:ULN2003是大電流驅(qū)動陣列,多用于單片機、智能儀表、PLC、數(shù)字量輸出卡等控制電路中??芍苯域?qū)動繼電器等負載。輸入5VTTL電平,輸出可達500mA/50V。</p>&l
23、t;p> ULN2003是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。 該電路的特點如是: ULN2003的每一對達林頓都串聯(lián)一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標(biāo)準邏輯緩沖器。</p><p> ULN2003 是高壓大電流達林頓晶體管陣列系列產(chǎn)品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應(yīng)于各類要求高速大
24、功率驅(qū)動的系統(tǒng)。 </p><p> ULN2003A引腳圖及功能如下:</p><p> 圖4 ULN2003A引腳圖</p><p> ULN2003 是高耐壓、大電流、內(nèi)部由七個硅NPN達林頓管組成的驅(qū)動芯片。 </p><p> 經(jīng)常在以下電路中使用,作為: </p><p>&
25、lt;b> 1、顯示驅(qū)動</b></p><p><b> 2、繼電器驅(qū)動</b></p><p><b> 3、照明燈驅(qū)動</b></p><p><b> 4、電磁閥驅(qū)動</b></p><p> 5、伺服電機、步進電機驅(qū)動等電路中。</p
26、><p> ULN2003的每一對達林頓都串聯(lián)一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標(biāo)準邏輯緩沖器來處理的數(shù)據(jù)。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關(guān)態(tài)時承受50V 的電壓,輸出還可以在高負載電流并行運行。ULN2003 的封裝采用DIP—16 或SOP—16 </p><p> ULN
27、2003A在各種控制電路中常用它作為驅(qū)動繼電器的芯片,其芯片內(nèi)部做了一個消線圈反電動勢的二極管。ULN2003的輸出端允許通過IC 電流200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。輸出電流大,故可以直接驅(qū)動繼電器或固體繼電器(SSR)等外接控制器件,也可直接驅(qū)動低壓燈泡。</p><p> ULN2003可以驅(qū)動7個繼電器,具有高電壓輸出特性,并帶有共陰極的續(xù)流二極管使器件可用于開關(guān)型感
28、性負載。每對達林頓管的額定集電極電流是500mA,達林頓對管還可并聯(lián)使用以達到更高的輸出電流能力。ULN2003A中每對達林頓管的基極都串聯(lián)有一個2.7kΩ的電阻,可直接與TTL或5V CMOS器件連接。</p><p> 4.3 12864LCD</p><p> 12864A-1漢字圖形點陣液晶顯示模塊,可顯示漢字及圖形,內(nèi)置8192個中文漢字(16X16點陣,16*8=128,1
29、6*4=64,一行只能寫8個漢字,4行;)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)。</p><p> 4.3.1 主要技術(shù)參數(shù)和顯示特性如下:</p><p> 電源:VDD 3.3V-5V(內(nèi)置升壓電路,無需負壓);</p><p> 顯示內(nèi)容:128列× 64行(128表示點數(shù))</p><p
30、><b> 顯示顏色:黃綠</b></p><p> 顯示角度:6:00鐘直視</p><p><b> LCD類型:STN</b></p><p> 與MCU接口:8位或4位并行/3位串行</p><p><b> 配置LED背光</b></p>
31、<p> 多種軟件功能:光標(biāo)顯示、畫面移位、自定義字符、睡眠模式等</p><p> 4.3.2 外形尺寸圖:</p><p> 圖5 12864LCD外形尺寸</p><p> 4.3.3 主要外形尺寸</p><p> 4.3.4 模塊引腳說明</p><p> 邏輯工作電壓(VDD):4.
32、5~5.5V</p><p> 電源地(GND):0V</p><p> 工作溫度(Ta):0~60℃(常溫) / -20~75℃(寬溫)</p><p> 4.3.5 接口時序</p><p> 模塊有并行和串行兩種連接方法(時序如下):</p><p> 4.3.5.1 8位并行連接時序圖</p&g
33、t;<p> 圖6 MPU寫資料到模塊</p><p> 圖7 MPU從模塊讀出資料</p><p> 4.3.5.2 串行連接時序圖</p><p><b> 圖8 串行連接時序</b></p><p> 串行數(shù)據(jù)傳送共分三個字節(jié)完成:</p><p> 第一字節(jié):串口
34、控制—格式 11111ABC。A為數(shù)據(jù)傳送方向控制:H表示數(shù)據(jù)從LCD到MCU,L表示數(shù)據(jù)從MCU到LCD。B為數(shù)據(jù)類型選擇:H表示數(shù)據(jù)是顯示數(shù)據(jù),L表示數(shù)據(jù)是控制指令。 C固定為0</p><p> 第二字節(jié):(并行)8位數(shù)據(jù)的高4位—格式 DDDD0000</p><p> 第三字節(jié):(并行)8位數(shù)據(jù)的低4位—格式 0000DDDD</p><p> 串行
35、接口時序參數(shù):(測試條件:T=25℃ VDD=4.5V)</p><p> 4.4 系統(tǒng)的時鐘電路</p><p> 時鐘電路是用于產(chǎn)生單片機工作時所必需的時鐘信號。時鐘是單片機的心臟,單片機各功能部件的運行都是以時鐘頻率為基準的,有條不紊地一拍一拍地工作。時鐘頻率直接影響單片機的速度,時鐘電路的質(zhì)量也直接影響單片機系統(tǒng)的穩(wěn)定性。在本系統(tǒng)中采用外部時鐘方式的電路,如圖所示:</p
36、><p> 圖9 系統(tǒng)的時鐘電路</p><p> 在本設(shè)計中的電容C1、C2典型值為30±10 pF。外接代內(nèi)容的值雖然沒有嚴格的要求,但是電容的大小會影響振蕩器的穩(wěn)定性和起振的快速性。同時,在系統(tǒng)中采用12MHz的晶體振蕩器來產(chǎn)生時鐘脈沖。這樣可以滿足系統(tǒng)在設(shè)計時的機器周期的需要。</p><p> 4.5 步進電機驅(qū)動電路</p>&
37、lt;p> 由單片機直接輸出的脈沖不足以驅(qū)動步進電機正常工作所以需要驅(qū)動電路給步進電機提供電源,在本設(shè)計中采用型號為ULN2003A的芯片,使步進電機正常工作。驅(qū)動信號由P0口的P0.0-P0.3輸出,分別與驅(qū)動芯片的B1-B4相連,電路如下圖所示:</p><p> 圖10 步進電機的驅(qū)動電路</p><p><b> 五 軟件設(shè)計</b></p&
38、gt;<p><b> 1、主程序的設(shè)計</b></p><p> 主程序需具備的功能,要不斷掃描P1口并判斷觸發(fā)按鍵是否閉合,并能根據(jù)其電平高低,輸出不同的控制脈沖,并調(diào)用顯示子程序顯示轉(zhuǎn)速及方向。</p><p> 圖11 主程序設(shè)計流程</p><p><b> 程序如下</b></p&g
39、t;<p> #include <REG51.h> </p><p> //#include <stdio.h></p><p> //#include <math.h></p><p> #include "macro.h"</p><p> void iniL
40、CD(void); </p><p> void write_hz_str( int x1,int y1, uchar *point ) ;</p><p> uchar buf_Direction; //設(shè)定步進電機的轉(zhuǎn)向</p><p> uint set_speed;
41、 //設(shè)定步進電機的轉(zhuǎn)速</p><p> uchar step_motor_loop[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};</p><p> uchar step_index;</p><p> uchar buf_SpeedString[]=" ";</p>
42、;<p> #define CST_STEP_MOTOR_Z 10 //正轉(zhuǎn)</p><p> #define CST_STEP_MOTOR_F 20 //反轉(zhuǎn)</p><p> #define CST_STEP_MOTOR_ST 0 //停</p><p> #defi
43、ne fosc_12MHz 12 </p><p> #define fosc_24MHz 24 </p><p> #define fosc_setting fosc_12MHz //工作方式1</p><p> #define CST_TIME_MS 1000
44、 </p><p> #define CST_TH0 (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)/256</p><p> #define ST_TL0 (65536-CST_TIME_MS*fosc_setting/fosc_12MHz)%256 </p><p> void step_motor_dri
45、ver(void)</p><p><b> {</b></p><p> static uint speed_delay=0;</p><p> speed_delay++;</p><p> if( buf_Direction==CST_STEP_MOTOR_Z)</p><p>&l
46、t;b> {</b></p><p> P0=step_motor_loop[step_index];</p><p> if(speed_delay >=set_speed)</p><p><b> {</b></p><p> speed_delay =0;</p>
47、<p> step_index++; //大于7,從頭再來 </p><p> if(step_index >7)</p><p> step_index =0; </p><p><b> }</b></p><p><b> }</b>&l
48、t;/p><p> else if( buf_Direction==CST_STEP_MOTOR_F)</p><p><b> {</b></p><p> P0=step_motor_loop[step_index];</p><p> if(speed_delay >=set_speed )</p&
49、gt;<p><b> {</b></p><p> speed_delay =0;</p><p> step_index--; </p><p> if(step_index <=0)</p><p> step_index =7; </p>
50、<p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> speed_delay =0;</p><p&g
51、t;<b> P0=0x00;</b></p><p><b> }</b></p><p><b> }</b></p><p> void caluate(void)</p><p><b> {</b></p><p&g
52、t; uchar temp=0;</p><p> uint u16Temp=0;</p><p> u16Temp=(100-set_speed)*100/85;</p><p> buf_SpeedString[0]='0'+(u16Temp/100);</p><p> buf_SpeedString[1]=&
53、#39;0'+(u16Temp%100/10);</p><p> buf_SpeedString[2]='0'+(u16Temp%100%10);</p><p> buf_SpeedString[3]='%';</p><p> write_hz_str(6,60,&buf_SpeedString);<
54、/p><p><b> }</b></p><p><b> //按鍵處理程序</b></p><p> void key_Scan (void) </p><p><b> { </b></p><p> static uchar key_loo
55、se=0;</p><p> uchar temp=0;</p><p><b> P1=0XFF;</b></p><p> temp=P1&0xFF;</p><p> if(key_loose >0)</p><p><b> {</b><
56、/p><p> if(temp==0xFF)</p><p> key_loose=0;</p><p><b> return;</b></p><p><b> }</b></p><p> else if(temp !=0xFF)</p><p
57、><b> {</b></p><p> key_loose=10;</p><p> temp=P1&0xFF;</p><p> switch(temp)</p><p><b> {</b></p><p> case 0xFE: <
58、;/p><p> buf_Direction=CST_STEP_MOTOR_Z; </p><p> write_hz_str(6,20,"反轉(zhuǎn)");</p><p> caluate();</p><p> break; </p><p> case 0xFD
59、: </p><p> buf_Direction=CST_STEP_MOTOR_F; </p><p> write_hz_str(6,20,"正轉(zhuǎn)");</p><p> caluate();</p><p> break; </p><p>
60、 case 0xFB: write_hz_str(6,50,"100%");</p><p> buf_Direction=CST_STEP_MOTOR_ST; </p><p> write_hz_str(6,20,"停止");</p><p> caluate();</p><p> b
61、reak; </p><p> case 0xEF: </p><p> if(buf_Direction !=CST_STEP_MOTOR_ST)</p><p><b> {</b></p><p> set_speed+=5;</p><p>
62、 if(set_speed>=80)</p><p> set_speed =80;; //減速</p><p><b> }</b></p><p> caluate();</p><p><b> break;</b></p><p> cas
63、e 0xF7: </p><p> if(buf_Direction !=CST_STEP_MOTOR_ST)</p><p><b> {</b></p><p> set_speed-=5;</p><p> if(set_speed <=15)</p><p> set
64、_speed =15; //加速 </p><p><b> }</b></p><p> caluate();</p><p><b> break;</b></p><p> default: </p><p> break;
65、 //其它值返回 </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void isr_timer0 (void) interrupt 1 usin
66、g 1</p><p><b> {</b></p><p> TH0=CST_TH0; </p><p> TL0=CST_TL0;</p><p> step_motor_driver();</p><p><b> }</b></p><p
67、> void init_timer0(void)</p><p><b> {</b></p><p> TCON=0x00;</p><p> TMOD=0x00;</p><p><b> TL0=0x00;</b></p><p><b>
68、TH0=0x00;</b></p><p> TCON=0x00;</p><p> // Timer 0 C/T=0,定時工作方式</p><p> //Timer 0 M1,M0=0,1</p><p> TMOD=0x01; //GATE=0,以運行控制位TR0 啟動定時器0 C/T=0,定時工作方式</p&
69、gt;<p> TH0=CST_TH0; </p><p> TL0=CST_TL0;</p><p> TF0=0;//clear 0. count over flag.</p><p> TR0=1;// enable TIMER0 ,start count</p><p> ET0=1; //enable acc
70、ept interrupt</p><p><b> }</b></p><p> // 主控程序</p><p> void main(void) </p><p><b> { </b></p><p><
71、;b> P2=0xff;</b></p><p><b> P1=0xff;</b></p><p><b> P0=0Xff;</b></p><p> init_timer0();</p><p> iniLCD();
72、 //初始化 LCD</p><p> write_hz_str(0,18,"2013-1-7");</p><p> write_hz_str(3,18,"步進電機仿真");</p><p> write_hz_str(6,20,"停止");</p><p
73、> buf_Direction=CST_STEP_MOTOR_ST;</p><p> set_speed=60;</p><p> step_index=3;</p><p> EA=1; //開中斷 </p><p> caluate();<
74、;/p><p><b> while(1)</b></p><p><b> {</b></p><p> key_Scan();</p><p><b> }</b></p><p><b> }</b></p>
75、<p> 2、顯示子程序的設(shè)計</p><p> 圖12 顯示程序流程圖</p><p><b> 程序如下:</b></p><p> #include <REG51.h> </p><p> //#include <stdio.h></p><p&g
76、t; //#include <math.h></p><p> #include "macro.h"</p><p> #include "LCD_HZ.h"</p><p> sbit E =P3^5;</p><p> sbit RW=P3^4;</p>&l
77、t;p> sbit RS =P3^2;</p><p> sbit L =P3^1;//左半平面 </p><p> sbit R =P3^0;//右半平面 </p><p> sbit Busy=P2^7;// //忙 判斷位 </p><p> #define LCDPAGE
78、 0xB8 //設(shè)置頁指令。</p><p> #define LCDLINE 0x40 //設(shè)置列指令。</p><p> //LCD判斷忙的子程序</p><p> void chkbusy(void) //測LCD忙狀態(tài) </p><p><b> { &
79、lt;/b></p><p> E=1; //使能LCD</p><p> RS=0; //讀寫指令 </p><p> RW=1; //讀 </p><p> P2=0xff;
80、 //讀操作前先進行一次空讀操作 ,接下來才能讀到數(shù)據(jù) </p><p> while(!Busy); //等待,不忙退出 </p><p><b> }</b></p><p><b> //寫指令代碼</
81、b></p><p> void wcode(uchar cd) //寫指令 代碼 </p><p><b> { </b></p><p> chkbusy(); //寫等待 </p><p>
82、 P2=0xff; //使能LCD</p><p> RW=0; //讀禁止 </p><p> RS=0; //輸出 設(shè)置 </p><p> P2=cd;
83、 //寫數(shù)據(jù)代碼 </p><p> E=1; //以下兩句產(chǎn)生下降沿 </p><p> E=0; </p><p><b> }</b></p><p> //把
84、顯示數(shù)據(jù)寫到內(nèi)存單元中 </p><p> void wdata(uchar dat) //寫顯示數(shù)據(jù)</p><p><b> {</b></p><p> chkbusy(); //寫等待 </p><p>
85、; P2=0xff; //使能LCD</p><p> RW=0; //讀禁止 </p><p> RS=1; //輸出 設(shè)置 </p><p> P2=dat ^0xFF;
86、 //寫數(shù)據(jù)代碼 </p><p> E=1; //以下兩句產(chǎn)生下降沿 </p><p> E=0; </p><p><b> }</b></p>
87、<p><b> //顯示LCD程序</b></p><p> //可以更改程序中的64變?yōu)?2就可以輸出數(shù)字了</p><p> void disrow(uchar page,uchar col,uchar *temp)</p><p><b> { </b></p><p>
88、<b> uchar i;</b></p><p> if(col<64) // 左半平面</p><p><b> { </b></p><p><b> L=1;R=0;</b></p>&l
89、t;p> wcode(LCDPAGE+page); // 寫指令 頁 </p><p> wcode(LCDLINE+col); //寫指令行 </p><p> if((col+16)<64) //如果字在左半平
90、面顯示不了,轉(zhuǎn)到右半平面去 </p><p><b> { </b></p><p> for(i=0;i<16;i++) //寫字 </p><p> wdata(*(temp+i));</p><p><b> }</b>&
91、lt;/p><p> else //右半平面 </p><p><b> {</b></p><p> for(i=0;i<64-col;i++) //減去左邊數(shù),從右半平面第一位開始顯示 </p><p
92、> wdata(*(temp+i)); //寫字 顯示 </p><p> L=0;R=1; //右半平面 </p><p> wcode(LCDPAGE+page); //寫指令 頁 </p><p>
93、; wcode(LCDLINE); //寫指令行 </p><p> for(i=64-col;i<16;i++) //寫字右半平面 </p><p> wdata(*(temp+i));</p><p><b> }</b>
94、;</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p><b> L=0;R=1;</b></p><p> wcode(LCDPAG
95、E+page); // 寫指令 頁 </p><p> wcode(LCDLINE+col-64); //寫指令行 </p><p> for(i=0;i<16;i++) //寫字 </p><p> wdata(
96、*(temp+i)); </p><p><b> }</b></p><p><b> }</b></p><p><b> //供調(diào)用子程序</b></p><p> void display_HZ( int page, int col,uchar *temp)&
97、lt;/p><p><b> { </b></p><p> disrow( page, col, temp); //顯示上半字 </p><p> disrow( page+1, col, temp+16); //顯示下半字 </p>
98、<p><b> } </b></p><p> ///****************************************************</p><p> void disrow_ascii(uchar page,uchar col,uchar *temp)</p><p><b> { &
99、lt;/b></p><p><b> uchar i;</b></p><p> if(col<64) // 左半平面</p><p><b> { </b></p><p><b> L=1
100、;R=0;</b></p><p> wcode(LCDPAGE+page); // 寫指令 頁 </p><p> wcode(LCDLINE+col); //寫指令行 </p><p> if((col+8)<64)
101、 //如果字在左半平面顯示不了,轉(zhuǎn)到右半平面去 </p><p><b> { </b></p><p> for(i=0;i<8;i++) //寫字 </p><p> wdata(*(temp+i));</p><p&
102、gt;<b> }</b></p><p> else //右半平面 </p><p><b> {</b></p><p> for(i=0;i<64-col;i++) //減去左邊數(shù),從右半平面第
103、一位開始顯示 </p><p> wdata(*(temp+i)); //寫字 顯示 </p><p> L=0;R=1; //右半平面 </p><p> wcode(LCDPAGE+page); // 寫指令 頁 </
104、p><p> wcode(LCDLINE); //寫指令行 </p><p> for(i=64-col;i<8;i++) //寫字 右半平面 </p><p> wdata(*(temp+i));</p><p><b>
105、}</b></p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p><b> L=0;R=1;</b></p><p> wc
106、ode(LCDPAGE+page); // 寫指令 頁 </p><p> wcode(LCDLINE+col-64); //寫指令行 </p><p> for(i=0;i<8;i++) //寫字 </p><p>
107、 wdata(*(temp+i)); </p><p><b> }</b></p><p><b> }</b></p><p> void display_ascII( int page, int col,uchar *temp)</p><p><b> { </b
108、></p><p> disrow_ascii( page, col, temp); //顯示上半字 </p><p> disrow_ascii( page+1, col, temp+8); //顯示下半字 </p><p><b> } </b></p>
109、<p><b> //LCD初始化 </b></p><p> void iniLCD(void) //初始化 </p><p><b> { </b></p><p><b> L=1;</b></p>&l
110、t;p><b> R=1;</b></p><p> wcode(0x38);</p><p> wcode(0x0f); //開顯示 設(shè)置 </p><p> wcode(0xc0); //設(shè)置顯示
111、啟動為第一行 </p><p> wcode(0x01); //清屏</p><p> wcode(0x06); //畫面不動,光標(biāo)右移。</p><p><b> }</b></p>
112、<p> //然后應(yīng)用下面程序來索引漢字 </p><p> void write_hz_str( int x1,int y1, uchar *point ) </p><p><b> { </b></p><p> signed char temp1, temp2; </p><p><b&
113、gt; int i;</b></p><p> int x,y,hang=0;</p><p> int hz_cnt=0; </p><p><b> x=x1;</b></p><p><b> y=y1;</b></p><p> while (
114、*point != '\0') //判斷是否顯示完成 </p><p><b> { </b></p><p> if (hz_cnt>=8) //應(yīng)是8,中間有字符ASCII 嗎+ 漢字則只有1個字節(jié)空間不夠?qū)憹h字所以換行</p><p>&
115、lt;b> {</b></p><p> hz_cnt =0;</p><p> hang+=2; </p><p><b> }</b></p><p> temp1 = *point++; //取漢字數(shù)據(jù) </p><p> if (temp1 &am
116、p;0x80) //如果是要顯示漢字 </p><p><b> { </b></p><p> temp2 = *point ++; </p><p> for (i = 0; i < HZ_SIZE ; i++) //字碼中共9個漢字</p><p><b> { </b&
117、gt;</p><p> if ((temp1 == GB_16[i].Index[0]) && (temp2 == GB_16[i].Index[1])) //查索引 </p><p><b> { </b></p><p> x=x1+hang;</p><p> y=y1+hz_cnt*16
118、;</p><p> display_HZ(x,y, &(GB_16[i].Msk[0])); //找到,字模指針賦值 </p><p> hz_cnt+=1;</p><p><b> break;</b></p><p><b> } </b></p><
119、;p><b> } </b></p><p><b> }</b></p><p> else if (temp1<=127 && temp1>=32)</p><p><b> { </b></p><p> temp1 -=32;
120、 </p><p> x=x1+hang;</p><p> y=y1+hz_cnt*8;</p><p> display_ascII(x,y, &(nAsciiDot[16*temp1])); //找到,字模指針賦值 </p><p> hz_cnt+=1; </p><p><b&g
121、t; } </b></p><p><b> } </b></p><p><b> }</b></p><p><b> 3、 H文件</b></p><p><b> H文件見附錄</b></p><p>
122、<b> 六、整體電路圖</b></p><p><b> 七、電路仿真及調(diào)試</b></p><p> 7.1Proteus介紹</p><p> Proteus是由Labcenter Electronics開發(fā)的功能強大的單片機仿真軟件Proteus與其他的仿真軟件相比較,在下面的優(yōu)點:</p>
123、<p> 1.能仿真模擬電路、數(shù)字電路、數(shù)?;旌想娐?;</p><p> 2.能繪制原理圖、PCB圖;</p><p> 3.幾乎包括實際中所有使用的儀器</p><p> 4.其最大的亮點在于能夠?qū)纹瑱C進行實物級的仿真。從程序的編寫,編譯到調(diào)試,目標(biāo)版的仿真一應(yīng)俱全。支持匯編語言和C語言的編程。還可配合Keil C實現(xiàn)程序的聯(lián)合調(diào)試,將Prot
124、eus中繪制的原理圖作為實際中的目標(biāo)板,而用Keil C集成環(huán)境實現(xiàn)對目標(biāo)板的控制,與實際中通過硬件仿真器對目標(biāo)板的調(diào)試幾乎完全相同,并且支持多顯示器的調(diào)試,即Proteus運行在一臺計算機上,而Keil C運行在另一臺計算機上,通過網(wǎng)絡(luò)連接實現(xiàn)遠程的調(diào)試。</p><p><b> 7.2系統(tǒng)仿真</b></p><p> 對應(yīng)的單拍正轉(zhuǎn)、雙拍正轉(zhuǎn)、單雙拍正轉(zhuǎn)種
125、情況下由虛擬示波器(OSCILLOSCOPE)采集的脈沖驅(qū)動信號,對于步進電機的控制,實際上是控制步進脈沖的個數(shù)和步進脈沖的間隔,而步進電機的間隔又可轉(zhuǎn)化為某基準延時子程序的循環(huán)次數(shù)。因此,可以很方便地用軟件來控制步進電機的運行,達到控制目的。繪制完電路圖后,將編好的程序輸入軟件內(nèi)檢查所編程序是否正確,檢查程序無誤后裝入單片機內(nèi),進行防真。仿真結(jié)果可見圖13所示。</p><p><b> 八 設(shè)計總
126、結(jié)</b></p><p> 這次課程設(shè)計根據(jù)課題要求,復(fù)習(xí)了所學(xué)的單片機和步進電機的內(nèi)容,通過查閱大量書籍、專業(yè)網(wǎng)站、論壇等,通過反復(fù)對比,采用技術(shù)較為成熟以及仿真效果的電路。在軟件設(shè)計方面,一部分參考文獻的已成程序進行修改編寫,一部分則是平時的經(jīng)驗積累,初步掌握了步進電機控制的基本原理和步進電機轉(zhuǎn)動編程的方法,步進電機作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一,廣泛應(yīng)用在各種自動化控制系統(tǒng)中。隨著
127、微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日增加,在各個國民經(jīng)濟領(lǐng)域仍將起到重要作用。根據(jù)課程設(shè)計的要求和自己通過參考有關(guān)資料,寫好程序流程圖,在程序流程圖的基礎(chǔ)上,根據(jù)芯片的功能寫出相應(yīng)的程序,達到能夠?qū)崿F(xiàn)所要求的功能的目的。 在寫程序時,在每條指令后都寫好注釋,以便在程序出錯的檢查過程中可以更容易查找得到。 本次課程設(shè)計重點是理論與實際的相結(jié)合,不單單只是書上的一條條分離的指令。這次實驗我們學(xué)到了有關(guān)步進電機的
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計步進電機啟動停止正反轉(zhuǎn)
- 單片機步進電機課程設(shè)計--單片機控制步進電機的設(shè)計
- 單片機課程設(shè)計--步進電機
- 基于avr單片機控制步進電機正反轉(zhuǎn)
- 單片機課程設(shè)計---步進電機
- 單片機課程設(shè)計-步進電機
- 單片機課程設(shè)計--單片機控制步進電機
- 單片機課程設(shè)計-單片機控制步進電機
- 微特電機課程設(shè)計--步進電機正反轉(zhuǎn)
- 微機原理課程設(shè)計---步進電機正反轉(zhuǎn)
- 單片機-控制步進電機課程設(shè)計
- 單片機課程設(shè)計步進電機控制設(shè)計
- 單片機課程設(shè)計報告——單片機控制步進電機
- 單片機課程設(shè)計--步進電機控制
- 單片機課程設(shè)計---步進電機控制
- 單片機課程設(shè)計報告--步進電機控制設(shè)計
- 單片機課程設(shè)計-步進電機的控制
- 單片機課程設(shè)計--步進電機角度控制
- 單片機課程設(shè)計---步進電機控制 (2)
- 單片機課程設(shè)計--基于單片機的步進電機控制
評論
0/150
提交評論