版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 基于單片機的步進電機控制系統(tǒng)設(shè)計</p><p><b> 摘要</b></p><p> 本文介紹了以89S52單片機為核心控制器的步進電機控制系統(tǒng)的設(shè)計方法.利用單片機的位操作功能輸出步進電機工作所需要的脈沖電壓/電流;利用單片機的通用同步/異步串行口與PC通信,接收PC送來的控制信號,控制步進電機的工作狀態(tài);也可以通過對按鍵的操作完成步
2、進電機的手動控制;通過在電機車軸上安裝牙輪磁環(huán),利用霍爾傳感器檢測電機的實時轉(zhuǎn)速;電機的當(dāng)前工作狀態(tài)、轉(zhuǎn)速、步長、步進方式等均可以由PC或鍵盤來設(shè)定,并在LCD上顯示出來。</p><p> 同時本文詳細(xì)論述了整個系統(tǒng)的整體框圖和各模塊的具體功能。整個控制器的操作方便、快捷且性能穩(wěn)定可靠。當(dāng)然,在設(shè)計中存在的一些問題,以及影控制精度的因素,和解決這些問題的可行性方法都作了詳細(xì)的說明。</p>&l
3、t;p> 關(guān)鍵字:步進電機單片機串行通信</p><p><b> Summary</b></p><p> This text introduces to take a machine of 89 S52s as the core controller to tread the design method that controls the syst
4、em into the electrical engineering.An operation function that makes use of a machine outputs to tread into the electrical engineering work need of pulse electric voltage electric current;Make use of a machine in general
5、 use synchronous the difference treads the string to go the and PCs correspondence, receiving the control signal that PC deliver, controling to tread into the</p><p> At the same time detailed treatise of t
6、his text the whole frame diagram of the whole system and concrete function of each mold piece.The operation convenience of the whole controller, fast and the function stability credibility.Certainly, some problems exist
7、in the design, and the ying control the factor of the accuracy, definitely reach agreement these problem of possibility methods all made the expatiation.</p><p> Key word: Step Motor Microcontrollor Uni
8、t</p><p> Series Communication</p><p><b> 第一章緒論</b></p><p> 步進電機(Step Motor)又稱為脈沖電動機或階躍電動機,是一種無刷直流電動機,作為執(zhí)行元件,是機電一體化的關(guān)鍵產(chǎn)品之一, 廣泛應(yīng)用在各種自動化控制系統(tǒng)中。步進電動機可以用數(shù)字信號直接進行開環(huán)控制,系統(tǒng)簡單
9、;位移與輸入脈沖信號數(shù)相對應(yīng),步距誤差不長期積累,可以組成高精度的控制系統(tǒng);無刷,易于啟動、停止、正反轉(zhuǎn)及變速,具有自鎖能力。隨著微電子和計算機技術(shù)的發(fā)展,步進電機的需求量與日俱增,在各個國民經(jīng)濟領(lǐng)域都有應(yīng)用</p><p> 單片機是20世紀(jì)70年代中期發(fā)展起來的一種面向控制的大規(guī)模集成電路模塊,具有功能強、體積小、可靠性高、價格低廉等特點,在工業(yè)控制、數(shù)據(jù)采集、智能儀表、機電一體化、家用電器等領(lǐng)域得到了廣泛
10、的應(yīng)用。由于單片機的精確位控制功能,在實時脈沖控制領(lǐng)域的應(yīng)用不斷擴大。</p><p> 利用單片機控制步進電機,系統(tǒng)簡單,可靠。通過單片機輸出一組脈沖序列,經(jīng)過電流驅(qū)動器,進行精確控制。</p><p> 第二章步進電機原理</p><p> 步進電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu)。當(dāng)步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個
11、固定的角度(稱為“步距角”),它的旋轉(zhuǎn)是以固定的角度一步一步運行的??梢酝ㄟ^控制脈沖個數(shù)來控制角位移量,從而達到準(zhǔn)確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。步進電機可以作為一種控制用的特種電機,利用其沒有積累誤差(精度為100%)的特點,廣泛應(yīng)用于各種開環(huán)控制。</p><p> 現(xiàn)在比較常用的步進電機包括反應(yīng)式步進電機(VR)、永磁式步進電機(PM)、混合式步進電
12、機(HB)和單相式步進電機等。</p><p> 永磁式步進電機一般為兩相,轉(zhuǎn)矩和體積較小,步進角一般為7.5度 或15度;反應(yīng)式步進電機一般為三相,可實現(xiàn)大轉(zhuǎn)矩輸出,步進角一般為1.5度,但噪聲和振動都很大。反應(yīng)式步進電機的轉(zhuǎn)子磁路由軟磁材料制成,定子上有多相勵磁繞組,利用磁導(dǎo)的變化產(chǎn)生轉(zhuǎn)矩。 混合式步進電機是指混合了永磁式和反應(yīng)式的優(yōu)點。它又分為兩相和五相:兩相步進角一般為1.8度而五相步進角一般為 0.
13、72度。這種步進電機的應(yīng)用最為廣泛,也是本次細(xì)分驅(qū)動方案所選用的步進電機。</p><p> 電機固有步距角: </p><p> 它表示控制系統(tǒng)每發(fā)一個步進脈沖信號,電機所轉(zhuǎn)動的角度。電機出廠時給出了一個步距角的值,如86BYG250A型電機給出的值為0.9°/1.8°(表示半步工作時為0.9°、整步工作時為1.8°),這個步距角可以稱之為‘
14、電機固有步距角’,它不一定是電機實際工作時的真正步距角,真正的步距角和驅(qū)動器有關(guān)。</p><p><b> 步進電機的相數(shù): </b></p><p> 是指電機內(nèi)部的線圈組數(shù),目前常用的有二相、三相、四相、五相步進電機。電機相數(shù)不同,其步距角也不同,一般二相電機的步距角為0.9°/1.8°、三相的為0.75°/1.5°、
15、五相的為0.36°/0.72° 。在沒有細(xì)分驅(qū)動器時,用戶主要靠選擇不同相數(shù)的步進電機來滿足自己步距角的要求。如果使用細(xì)分驅(qū)動器,則‘相數(shù)’將變得沒有意義,用戶只需在驅(qū)動器上改變細(xì)分?jǐn)?shù),就可以改變步距角。</p><p> 步進電機的一些特點:</p><p> 1.一般步進電機的精度為步進角的3-5%,且不累積。</p><p> 2.步
16、進電機外表允許的最高溫度在150度以下。 </p><p> 3.步進電機的力矩會隨轉(zhuǎn)速的升高而下降。 </p><p> 4.步進電機低速時可以正常運轉(zhuǎn),但若高于一定速度就無法啟動,并伴有嘯叫聲。 </p><p> 步進電動機以其顯著的特點,在數(shù)字化制造時代發(fā)揮著重大的用途。伴隨著不同的數(shù)字化技術(shù)的發(fā)展以及步進電機本身技術(shù)的提高,步進電
17、機將會在更多的領(lǐng)域得到應(yīng)用。</p><p> 第三章設(shè)計原理與方案論證</p><p> 系統(tǒng)方框圖如下所示:</p><p> 控制信號的產(chǎn)生可以由鍵盤和計算機來完成。鍵盤直接對單片機I/O進行操作,單片機通過檢測I/O信號的變化,判斷按鍵,完成相當(dāng)功能;計算機通過串行通信口與單片機相聯(lián),利用串行通信發(fā)送操作命令給單片機,完成命令所指定的功能。單片機接收
18、到控制信號后,產(chǎn)生相應(yīng)的輸出信號,控制電機驅(qū)動電路產(chǎn)生相當(dāng)?shù)尿?qū)動信號,使電機運轉(zhuǎn);同時,單片機還要控制液晶顯示器顯示出當(dāng)前的系統(tǒng)信息。在電機運轉(zhuǎn)過程中,單片機通過采樣霍爾傳感器采樣到的電機的轉(zhuǎn)速信息,即時顯示電機的當(dāng)時轉(zhuǎn)速和方向。</p><p> 系統(tǒng)程序流程圖如下所示:</p><p> 電機的選擇和方案論證:</p><p> 電機的種類繁多,本系統(tǒng)中采
19、用了二相小功率的步進電機,電路原理圖如下:</p><p> 該電機的正轉(zhuǎn)驅(qū)動信號時序如下:</p><p> 通過改變時序的順序就可以控制其轉(zhuǎn)向,反轉(zhuǎn)時的時序為1-4-3-2.</p><p> 為了產(chǎn)生精確的時序脈沖,程序設(shè)計過程中采用中斷的方法產(chǎn)生脈沖信號.并可以通過外部命令來控制產(chǎn)生時序的順序,從而實現(xiàn)正反轉(zhuǎn)的控制.</p><p&
20、gt;<b> 時序產(chǎn)生程序如下:</b></p><p> sbitAA=P3^4;</p><p> sbitAB=P3^5;</p><p> sbitBA=P3^6;</p><p> sbitBB=P3^7;</p><p> uchar thdata,tl
21、data;</p><p> bitstep_permit=0;</p><p> bitdirection,sisdf;//set direction flag</p><p> ucharint_cnt;</p><p> TMOD=0x21;//T0工作在方式1,T1工作在方式2自動重裝</p>&
22、lt;p><b> EA=1;</b></p><p><b> TR1=1;</b></p><p><b> //產(chǎn)生脈沖波形</b></p><p> void Timer0(void)interrupt 1 using 1</p><p> {TL
23、0=(tldata+10);</p><p> TH0=thdata;</p><p> if(step_permit)int_cnt++;</p><p> if(direction)//反轉(zhuǎn)</p><p> {switch(cnt)</p><p><b>
24、{</b></p><p> case 0:AA=1;AB=1;BA=0;BB=0;break;</p><p> case 1:AA=0;AB=1;BA=1;BB=0;break;</p><p> case 2:AA=0;AB=0;BA=1;BB=1;break;</p><p> case 3:AA=1;AB=
25、0;BA=0;BB=1;break;</p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p> else{switch(cnt)</p><p><b> {
26、</b></p><p> case 0:AA=1;AB=1;BA=0;BB=0;break;</p><p> case 1:AA=1;AB=0;BA=0;BB=1;break;</p><p> case 2:AA=0;AB=0;BA=1;BB=1;break;</p><p> case 3:AA=0;AB=1
27、;BA=1;BB=0;break;</p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p><b> ++cnt;</b></p><p> if(
28、cnt==4)cnt=0;</p><p><b> }</b></p><p><b> 驅(qū)動電路的設(shè)計:</b></p><p> 本設(shè)計中步進電機功率較小,采用普通的電流型驅(qū)動器件即可,所以采用了UL2003的電流驅(qū)動模塊,該項模塊的內(nèi)部結(jié)構(gòu)框圖如下:</p><p> 該驅(qū)動模塊的
29、的電壓為12V,驅(qū)動電流可達500MA.</p><p> 轉(zhuǎn)速檢測電路的設(shè)計:</p><p> 本設(shè)計中利用霍爾傳感器磁敏感效應(yīng),通過在電機轉(zhuǎn)軸上安裝牙輪磁環(huán),來檢測出電機的轉(zhuǎn)速.</p><p> 霍爾傳感的工作原理如下:</p><p> 原邊電流Ip產(chǎn)生的磁通量聚集在磁路中,并由霍爾器件檢測出霍爾電壓信號,經(jīng)過放大器放大,該
30、電壓信號精確地反映原邊電流。原邊電流Ip產(chǎn)生的磁通量與霍爾電壓經(jīng)放大產(chǎn)生的副邊電流Is通過副邊線圈所產(chǎn)生的磁通量相平衡。副邊電流Is精確地反映原邊電流。原邊電壓Vp通過原邊電阻R1轉(zhuǎn)換為原邊電流Ip,Ip產(chǎn)生的磁通量與霍爾電壓經(jīng)放大產(chǎn)生的副邊電流Is通過副邊線圈所產(chǎn)生的磁通量相平衡。副邊電流Is精確地反映原邊電壓。</p><p> 當(dāng)電機轉(zhuǎn)動時,霍爾傳感器將轉(zhuǎn)軸上磁環(huán)引起的磁場的變化轉(zhuǎn)換為電脈沖信號,送往單片
31、機,單片機根據(jù)脈沖頻率,計算出轉(zhuǎn)動的速度.</p><p> 鍵盤的方案論證和電路及程序設(shè)計:</p><p> 鍵盤可以分為獨立連接式和行列式(矩陣式)兩類。獨立式按鍵是指各按鍵相互獨立地接通一條輸入數(shù)據(jù)線,當(dāng)任何一個鍵按下時,與之相連的輸入數(shù)據(jù)線即被清0或置1,利用單片機位處理指令十分方便查詢到按鍵。矩陣式按鍵采用列行掃描方式進行按鍵的判斷,節(jié)約I/O線。相比之下,本設(shè)計由于I/O
32、線的占用數(shù)目不多,采用獨立式鍵盤電路簡單,容易實現(xiàn)。</p><p><b> 鍵盤電路設(shè)計如下:</b></p><p> 讀鍵值程序設(shè)計如下:</p><p> #include<reg52.h></p><p> uchar GetKey(void)</p><p>
33、 {uint i=0;</p><p> uchar keybuf=0;</p><p> if(P1!=0xff)</p><p><b> {</b></p><p> keybuf=P1;</p><p> if(keybuf!=0xff)</p><
34、p> {while((P1==keybuf)&&(i<0x6000))i+=1;</p><p> if(i>101) </p><p> { return keybuf;} </p><p> else return 0;</p><p>&
35、lt;b> }</b></p><p> else return0; </p><p><b> }</b></p><p> elsereturn 0;</p><p><b> }</b></p><p> 串行通信的方案
36、論證和電路及程序設(shè)計:</p><p> 單片機的串行接口是一個可編程的全雙工通信接口,通過軟件編程它既可用作通用異步接收和發(fā)送器使用,也可作同步移位寄存器使用。</p><p><b> ?、佟纹瑱C串行接口</b></p><p> 單片機的串行接口主要由兩個數(shù)據(jù)緩沖寄存器SBUF和一個輸入移位寄存器,以及一個串行控制寄存器SCON組成
37、。定時器T1常用做其波特率發(fā)生器。</p><p> 串行口可以有多種工作方式,不同工作方式的數(shù)據(jù)格式不同,在本系統(tǒng)中,采用的串行口工作方式1,波特率設(shè)置為2400。</p><p> 串行口通信接口電路設(shè)計如下:</p><p> 串行通信程序設(shè)計如下:</p><p> TMOD=0x21;// T1工作在方式2自動重裝<
38、;/p><p> TH1=0xF3;//波特率設(shè)置;晶振12MHz;波特率為2400</p><p> TL1=0xF3;</p><p> SCON=0X50;//串行口工作在方式1,八位方式,允許接收</p><p> PCON=0;//SMOD設(shè)置為0</p><p><b> EA=1
39、;</b></p><p> ES=1; //串行中斷允許</p><p><b> ET0=0;</b></p><p> void SeriCab(void)interrupt 4 using 2</p><p> {ucharsda;</p><p><
40、;b> RI=0;</b></p><p><b> sda=SBUF;</b></p><p> if(sda>=64)</p><p> {if((sda<95)&&(run==0)){step_length=sda*3;stepflag=1;}</p>&
41、lt;p> elseif((sda==0x61)&&(SData_flag==1)){run=1;stopflag=0;}</p><p> elseif(sda==0x63){direction=0;sisdf=1;}</p><p> elseif(sda==0x64){direction=1;sisdf=1;}</p><p>
42、; elseif((sda==0x62)&&(SData_flag==1)){run=0;stopflag=1;}</p><p> elseif((sda==0x65)&&(SData_flag==1)){step_permit=1;}</p><p><b> }</b></p><p> e
43、lse {speed=sda*2;spdset=1;}</p><p> ++sicnt;</p><p> if(sicnt==2){sicnt=0;SData_flag=1;}</p><p><b> } </b></p><p> 顯示電路的方案論證和電路及程序的設(shè)計:&l
44、t;/p><p> 單片機顯示電路一般由LED或LCD完成。LED顯示電路結(jié)構(gòu)簡單,成本低,但顯示內(nèi)容相對偏少。LCD顯示電路信息容量大,電路相對復(fù)雜。在本系統(tǒng)中,由于顯示的信息量大,所以采用HS12864顯示器。該顯示器為128*64點陣顯示屏,可以顯示4*8個漢字或4*16個字符。</p><p><b> 顯示電路設(shè)計如下:</b></p><
45、;p><b> 顯示程序設(shè)計如下:</b></p><p> #include<_REG52_.H></p><p> /*WRITE 12864.H*/ </p><p> sbit CS1=P2^3;</p><p> sbit CS2=P2^4;</p><
46、p> sbit RST=P2^5;</p><p> sbit DI=P2^0;</p><p> sbit RW=P2^1;</p><p> sbit ALE=P2^2; </p><p><b> //軟件復(fù)位程序</b></p><p> void
47、IntRst(void)</p><p> { uchar i;</p><p><b> RST=0;</b></p><p><b> i=0;</b></p><p><b> i=1;</b></p><p> RST=1;
48、 //軟件復(fù)位</p><p><b> }</b></p><p> voidBusy_Judge(void)//讀BUSY信號</p><p><b> {</b></p><p><b> uchari;</b></p><p&
49、gt; uchar temp;</p><p> do {P0=0xff;</p><p><b> ALE=1;</b></p><p><b> i=0;</b></p><p><b> temp=P0;</b></p><p>&l
50、t;b> ALE=0;</b></p><p> } while((temp&0x80)==1);</p><p><b> }</b></p><p> //12864發(fā)送命令子程序</p><p> voidComSend(ucharCOM)</p><p&
51、gt; {uchari; </p><p><b> DI=0;</b></p><p> RW=1; </p><p> Busy_Judge();//讀BUSY信號</p><p><b> RW=0;</b></p><p>
52、<b> P0=COM;</b></p><p><b> ALE=1;</b></p><p> i=0;//NOP</p><p><b> ALE=0;</b></p><p><b> }</b></p><p
53、> //12864發(fā)送數(shù)據(jù)子程序 </p><p> voidDaSend(uchar DAT)</p><p> { uchari; </p><p><b> DI=0;</b></p><p><b> RW=1;</b></p><p
54、> Busy_Judge();//讀BUSY信號</p><p><b> DI=1;</b></p><p><b> RW=0;</b></p><p><b> P0=DAT;</b></p><p><b> ALE=1;</b>&
55、lt;/p><p> i=0;//NOP</p><p><b> ALE=0;</b></p><p><b> }</b></p><p> //左半屏寫命令子程序 </p><p> voidLeft_ComSend(COM)</p><
56、p><b> {</b></p><p> CS2=0;CS1=1;</p><p> ComSend(COM);</p><p><b> CS1=0;</b></p><p><b> }</b></p><p> //左半屏寫數(shù)據(jù)
57、子程序 </p><p> voidLeft_DaSend(DAT)</p><p><b> {</b></p><p> CS2=0;CS1=1;</p><p> DaSend(DAT);</p><p><b> CS1=0;</b></p>
58、<p><b> }</b></p><p> //右半屏寫命令子程序 </p><p> voidRight_ComSend(COM)</p><p><b> {</b></p><p> CS1=0;CS2=1;</p><p> ComSen
59、d(COM);</p><p><b> CS2=0;</b></p><p><b> }</b></p><p> //右半屏寫數(shù)據(jù)子程序 </p><p> voidRight_DaSend(DAT)</p><p><b> {</b>
60、;</p><p> CS1=0;CS2=1;</p><p> DaSend(DAT);</p><p><b> CS2=0;</b></p><p><b> }</b></p><p> //左半屏寫一個字節(jié)數(shù)據(jù)程序,</p><p>
61、; //入口參數(shù)為X,Y的起始地址</p><p> //以及Y的變址范圍(寫入的字節(jié)數(shù))和寫入數(shù)據(jù)的指針</p><p> voidLeft_Bytes_DaSend(uchar x,uchar y,uchar *loc,uchar bytes)</p><p> {uchari;</p><p> Left_ComSend
62、(x|0xB8);//填入特征位0xB8,定位X</p><p> Left_ComSend(y|0x40);//填入特征位0x40 ,定位Y</p><p> for(i=0;i<bytes;i++)</p><p> Left_DaSend(*(loc+i));</p><p><b> }&
63、lt;/b></p><p> //右半屏寫一個字節(jié)數(shù)據(jù)程序,</p><p> //入口參數(shù)為X,Y的起始地址</p><p> //以及Y的變址范圍(寫入的字節(jié)數(shù))和寫入數(shù)據(jù)的指針</p><p> voidRight_Bytes_DaSend(uchar x,uchar y,uchar *loc,uchar bytes)
64、</p><p> {uchari;</p><p> Right_ComSend(x|0xB8);//填入特征位0xB8 ,定位X</p><p> Right_ComSend(y|0x40);//填入特征位0x40, 定位Y</p><p> for(i=0;i<bytes;i++)&l
65、t;/p><p> Right_DaSend(*(loc+i));</p><p><b> }</b></p><p><b> //開LCD</b></p><p> void Lcd_On(void)</p><p><b> {</
66、b></p><p> Left_ComSend(0x3F);</p><p> Right_ComSend(0x3F);</p><p><b> }</b></p><p><b> //關(guān)LCD</b></p><p> voidLcd_Off(voi
67、d)</p><p><b> {</b></p><p> Left_ComSend(0x3e);</p><p> Right_ComSend(0x3e);</p><p><b> }</b></p><p><b> //設(shè)置Z地址 </b
68、></p><p> voidLcd_SetZ(uchar z)</p><p><b> {</b></p><p><b> z=z*8;</b></p><p> Left_ComSend(z|0xc0);</p><p> Right_ComS
69、end(z|0xc0);</p><p><b> }</b></p><p> //顯示初始化程序集</p><p> //右邊顯示符號元素的子程序</p><p> voidRight_Show_Sign(uchar x,uchar y,uchar *pointer,uchar snum)</p&g
70、t;<p><b> {</b></p><p><b> uchar*p;</b></p><p> p=pointer;</p><p> p=(p+snum*16);</p><p> Right_Bytes_DaSend(x,y,p,8);<
71、/p><p> Right_Bytes_DaSend(x+1,y,p+8,8);</p><p><b> }</b></p><p> //左邊顯示符號元素的子程序</p><p> voidLeft_Show_Sign(uchar x,uchar y,uchar *pointer,uchar snum)
72、</p><p><b> {</b></p><p><b> uchar*p;</b></p><p> p=pointer;</p><p> p=(p+snum*16);</p><p> Left_Bytes_DaSend(x,y,p,
73、8);</p><p> Left_Bytes_DaSend(x+1,y,p+8,8);</p><p><b> }</b></p><p> //右邊顯示漢字元素的子程序</p><p> voidRight_Show_Word(uchar x,uchar y,uchar *pointer,ucha
74、r wnum)</p><p><b> {</b></p><p><b> uchar*p;</b></p><p> p=pointer;</p><p> p=(p+wnum*32);</p><p> Right_Bytes_DaSend(x
75、,y,p,16);</p><p> Right_Bytes_DaSend(x+1,y,p+16,16);</p><p><b> }</b></p><p> //左邊顯示漢字元素的子程序</p><p> voidLeft_Show_Word(uchar x,uchar y,uchar *p
76、ointer,uchar wnum)</p><p><b> {</b></p><p><b> uchar*p;</b></p><p> p=pointer;</p><p> p=(p+wnum*32);</p><p> Left_Byte
77、s_DaSend(x,y,p,16);</p><p> Left_Bytes_DaSend(x+1,y,p+16,16);</p><p><b> }</b></p><p><b> 系統(tǒng)源代碼</b></p><p><b> 主程序源代碼如下:</b&
78、gt;</p><p> #definelow_speed10</p><p> #define high_speed100</p><p> #include<_reg52_.h></p><p> #include<Key_Define.h></p><p> #includ
79、e<Get_Key_Declare.h></p><p> #include<Lcd_Init_Declare.h></p><p> //#include<Main_Define.h></p><p> uchar speed=50,step_length=10,thdata,tldata;</p><
80、;p> #include<Start.h></p><p> bitSData_flag=0;</p><p> bitstep_permit=0;</p><p> bitdirection,sisdf;//set direction flag</p><p> bitstepflag=0;
81、//步進標(biāo)志</p><p> bitrun=0;//全帶運行標(biāo)志</p><p> bitstopflag=0;</p><p> ucharint_cnt;</p><p> bitspdset;</p><p> sbitAA=P3^4;</p><p&g
82、t; sbitAB=P3^5;</p><p> sbitBA=P3^6;</p><p> sbitBB=P3^7;</p><p> ucharcnt;</p><p> ucharsicnt=0;</p><p><b> //產(chǎn)生脈沖波形</b></
83、p><p> void Timer0(void)interrupt 1</p><p><b> {</b></p><p> TL0=(tldata+10);</p><p> TH0=thdata;</p><p> if(step_permit)int_cnt++;
84、</p><p> if(direction)//反轉(zhuǎn)</p><p><b> {</b></p><p> switch(cnt)</p><p><b> {</b></p><p> case 0:AA=1;AB=1;BA=0;BB=0;br
85、eak;</p><p> case 1:AA=0;AB=1;BA=1;BB=0;break;</p><p> case 2:AA=0;AB=0;BA=1;BB=1;break;</p><p> case 3:AA=1;AB=0;BA=0;BB=1;break;</p><p> default:break;</p
86、><p><b> }</b></p><p><b> }</b></p><p><b> else{</b></p><p> switch(cnt)</p><p><b> {</b></p>
87、<p> case 0:AA=1;AB=1;BA=0;BB=0;break;</p><p> case 1:AA=1;AB=0;BA=0;BB=1;break;</p><p> case 2:AA=0;AB=0;BA=1;BB=1;break;</p><p> case 3:AA=0;AB=1;BA=1;BB=0;break;<
88、/p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p><b> ++cnt;</b></p><p> if(cnt==4)cnt=0;</p&g
89、t;<p><b> }</b></p><p> void SeriCab(void)interrupt 4</p><p><b> {</b></p><p> ucharsda;</p><p><b> RI=0;</b><
90、/p><p><b> sda=SBUF;</b></p><p> if(sda>=64)</p><p><b> {</b></p><p> if((sda<95)&&(run==0)){step_length=sda*3;stepflag=1;}</p
91、><p> elseif((sda==0x61)&&(SData_flag==1)){run=1;stopflag=0;}</p><p> elseif(sda==0x63){direction=0;sisdf=1;}</p><p> elseif(sda==0x64){direction=1;sisdf=1;}</p>&
92、lt;p> elseif((sda==0x62)&&(SData_flag==1)){run=0;stopflag=1;}</p><p> elseif((sda==0x65)&&(SData_flag==1)){step_permit=1;}</p><p><b> }</b></p><p&g
93、t; else {speed=sda*2;spdset=1;}</p><p> ++sicnt;</p><p> if(sicnt==2){sicnt=0;SData_flag=1;}</p><p><b> }</b></p><p> voidST_Convert(vo
94、id)//將轉(zhuǎn)速轉(zhuǎn)換為T0常數(shù)</p><p><b> {</b></p><p> uinttdbuf;</p><p> tdbuf=(1000000/speed)/192;</p><p> tdbuf=0xffff-tdbuf;</p><p> tldata=(ucha
95、r)(tdbuf&0xff);</p><p> thdata=(uchar)((tdbuf>>8)&0xff);</p><p><b> }</b></p><p> bitOperating(void)//開機初始化程序</p><p> {ucharke
96、y;</p><p> bitstep_flag=0;</p><p> Show_Null();</p><p><b> key=0;</b></p><p> Show_Sign();//顯示===========</p><p> Show_Speed_Set(
97、);//顯示"請預(yù)置轉(zhuǎn)速 "</p><p> speed=Get_Speed(speed);//轉(zhuǎn)速設(shè)置子程序</p><p> Show_Null();</p><p> Show_Operation_Model();</p><p> while(key!=LEFT&&key!
98、=RIGHT)</p><p> key=GetKey();</p><p> Show_Null();</p><p> if(key==RIGHT)//步進</p><p><b> {</b></p><p><b> key=0;</b>&
99、lt;/p><p> step_flag=1;</p><p> Show_Sign();//顯示===========</p><p> Show_Step_Length(); //顯示"請預(yù)置步長: " </p><p> step_length=Get_Step_Length(step_
100、length);//預(yù)置步長</p><p><b> }</b></p><p> returnstep_flag;</p><p><b> }</b></p><p> voidmain(void)</p><p><b>
101、; {</b></p><p> ucharkey,stl,stepcnt=0;</p><p> IntRst();</p><p> Lcd_SetZ(1);</p><p> Lcd_Off();</p><p> Show_Null();</p><p>
102、; Show_Sign();//顯示===========</p><p> Show_Greet();</p><p><b> Lcd_On();</b></p><p> TMOD=0x21;//T0工作在方式1,T1工作在方式2自動重裝</p><p> TH1=0xF3;//波特率設(shè)置;晶
103、振12MHz;波特率為2400</p><p> TL1=0xF3;</p><p> SCON=0X50;//串行口工作在方式1,八位方式,允許接收</p><p> PCON=0;//SMOD設(shè)置為0</p><p><b> EA=1;</b></p><p> ES
104、=1; //串行中斷允許</p><p> ET0=0;//T0中斷禁止</p><p><b> TR1=1;</b></p><p> while((key==0)&&(SData_flag==0))</p><p> key=GetKey();</p><
105、;p> if(key)stepflag=Operating();</p><p> ST_Convert();//將轉(zhuǎn)速轉(zhuǎn)換為T0常數(shù)</p><p> TH0=thdata;</p><p> TL0=tldata;</p><p><b> TR0=1;</b></p><p
106、> Show_Null();</p><p> Show_Sign();//顯示===========</p><p> Show_Ready();//顯示"準(zhǔn)備好:"</p><p> Show_Direction(direction);</p><p><b> key=0;<
107、/b></p><p> while((key!=START)&&(run==0))</p><p><b> {key=0;</b></p><p> key=GetKey();</p><p><b> }</b></p><p&
108、gt; if(stepflag)//步進方式</p><p> {stl=step_length*4;</p><p> Show_Null();//清屏</p><p> Show_Sign();//顯示===</p><p> //Show_Step();//顯示"步進"<
109、/p><p> Show_Direction(direction);</p><p> Show_Speed(speed);</p><p> Show_StepCnt(stepcnt);//"顯示"步進:XXX""步進數(shù)</p><p><b> while(1)</b>&l
110、t;/p><p><b> {</b></p><p> if(int_cnt==stl)</p><p> {ET0=0;</p><p> int_cnt=0;</p><p> step_permit=0;</p><p><b
111、> }</b></p><p> if(spdset){ST_Convert();Show_Speed(speed);spdset=0;}</p><p><b> key=0;</b></p><p> key=GetKey();</p><p> if(key==STEP)<
112、;/p><p><b> {</b></p><p> step_permit=1;</p><p> int_cnt=0;</p><p> ET0=1;</p><p> Show_StepCnt(++stepcnt);//"顯示":
113、XXX""步進數(shù)</p><p><b> }</b></p><p> elseif((key==DIR)||sisdf)</p><p><b> {</b></p><p> direction=(~direction);</p><p>
114、 Show_Direction(direction);</p><p><b> sisdf=0;</b></p><p><b> }</b></p><p> else if(key==RESET)(*(void(*)())0)();//熱啟動</p><p><b> }
115、</b></p><p><b> }</b></p><p> else//全速運行方式</p><p> {</p><p><b> ET0=1;</b></p><p><b> run=0;<
116、;/b></p><p> //Show_Null();//清屏</p><p> //Show_Sign();//顯示===</p><p> //Show_Start();//顯示"啟動"</p><p> Show_Null();//清屏</p><p&g
117、t; Show_Sign();//顯示===</p><p> Show_Running();//顯示"運行中"</p><p> Show_Direction(direction);</p><p> Show_Speed(speed);</p><p><b> while(1)&l
118、t;/b></p><p><b> {</b></p><p> if(spdset)</p><p> {ST_Convert();</p><p> Show_Speed(speed);</p><p><b> spdset=0;</b></p
119、><p><b> }</b></p><p><b> key=0;</b></p><p> key=GetKey();</p><p> if((key==DIR)||sisdf)</p><p><b> {</b></p>
120、<p> direction=(~direction);</p><p> Show_Direction(direction);</p><p><b> sisdf=0;</b></p><p><b> }</b></p><p> else if((key==STOP)
121、||stopflag)</p><p> {ET0=0;</p><p> Show_Null();//清屏</p><p> Show_Sign();//顯示===</p><p> Show_Stop();//顯示"停止"</p><p> Show_D
122、irection(direction);</p><p> stopflag=0;</p><p><b> }</b></p><p> else if((key==START)||run)</p><p> {ET0=1;</p><p> //Show_Null(
123、);//清屏</p><p> //Show_Sign();//顯示===</p><p> //Show_Start();//顯示"啟動"</p><p> Show_Null();//清屏</p><p> Show_Sign();//顯示===</p><p&g
124、t; Show_Running();//顯示"運行中"</p><p> Show_Direction(direction);</p><p> Show_Speed(speed);</p><p><b> run=0;</b></p><p><b> }<
125、;/b></p><p> else if(key==RESET)(*(void(*)())0)();//熱啟動</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&l
126、t;/p><p> 第五章 總結(jié)與開發(fā)工具</p><p><b> 4.1、總結(jié)</b></p><p> 外界環(huán)境溫度的變化,將導(dǎo)致晶體的頻率發(fā)生一定的偏移,從而影響了定時精度,導(dǎo)致輸出的時序不夠精確。這種由于環(huán)境變化而影響的定時偏差可以采用穩(wěn)定性更高的晶體來解決。當(dāng)然,這種方法還是有受晶體制約的,要想得到更加穩(wěn)定的脈沖序列,則應(yīng)采用專用
127、的控制芯片,其誤差可可大大減小,且占用更少的CPU資源。</p><p><b> 4.2、結(jié)束語</b></p><p> 通過對本系統(tǒng)的測試與調(diào)試,結(jié)合本系統(tǒng)的實際情況,基本上達到設(shè)計要求。通過對流程的優(yōu)化,使得操作方便,可靠。</p><p><b> 4.3、使用工具</b></p><p
128、> 偉福E51/S仿真器</p><p><b> 示波器</b></p><p> KEIL C51編譯軟件</p><p><b> WD990徽機電源</b></p><p><b> 數(shù)字萬用表、電腦</b></p><p>&l
129、t;b> 參考文獻</b></p><p> [1]哈工大·成都電機廠.步進電動機.科學(xué)出版社.1979.</p><p> [2]王宗培.步進電動機.微特電機.1976</p><p> [3]程樹康.步進電動機靜轉(zhuǎn)矩計算的數(shù)據(jù)前處理程序.微特電機1985.</p><p> [4]陳理壁.步進電
130、動機及其應(yīng)用.上海科技出版社.1985</p><p> [5]李忠杰,寧守信.步進電動機應(yīng)用技術(shù).北京:機械工業(yè)出版社.1988.</p><p> [6]、彭為、黃科、雷道仲編著 單片機典型系統(tǒng)設(shè)計 電子工業(yè)出版社</p><p> [7]凌玉華 等編著單片機原理及應(yīng)用系統(tǒng)設(shè)計 中南大學(xué)出版社</p><p> [8]蔡美琴等編
131、著MCS-51系列單片機系統(tǒng)及其應(yīng)用 高等教育出版社</p><p> [9]楊忠煌、黃博俊、李文昌編著單芯8051實務(wù)與應(yīng)用 中國水利水電出版社</p><p><b> 致謝</b></p><p> 經(jīng)過長時間的努力,我順利地完成了畢業(yè)設(shè)計。</p><p> 這次畢業(yè)設(shè)計是單片機學(xué)習(xí)的第一次實戰(zhàn)
132、過程,在做畢業(yè)設(shè)計的過程中,遇到了很多的問題,但在萬琴和何敏教師的精心指導(dǎo)和嚴(yán)格要求下,并通過自己的耐心鉆研,查閱大量資料,把這些資料與自己的設(shè)計結(jié)合起來,完成了本次設(shè)計。</p><p> 在這段時間的學(xué)習(xí)與實踐中,我綜合了有關(guān)單片機的所有知識以及匯編語言程序設(shè)計,鞏固了自己所學(xué)的專業(yè)知識,并對單片機有了深刻的了解,為以后的學(xué)習(xí)打好了基礎(chǔ)。在這個實踐過程中,忠誠的感謝教師的教導(dǎo)和鼓勵,老師開闊的思路、淵博的知
133、識、豐富的實踐經(jīng)驗、嚴(yán)格的工作作風(fēng)、勇于創(chuàng)新的精神將成為我終生學(xué)習(xí)的榜樣。銘記教師的深深教誨,在以后的學(xué)習(xí)中不斷努力創(chuàng)新,用成績來向老師表示最誠摯的感謝!</p><p> 同時,在本次畢業(yè)設(shè)計中,同學(xué)們也了我無私的幫助。在些向所有給予我?guī)椭凸膭畹钠渌處熀屯瑢W(xué)表示感謝!</p><p><b> 附錄</b></p><p> LC
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計----基于單片機的步進電機控制系統(tǒng)設(shè)計
- 步進電機畢業(yè)設(shè)計---基于單片機的步進電機控制系統(tǒng)畢業(yè)設(shè)計論文
- 畢業(yè)設(shè)計----基于單片機的步進電機控制系統(tǒng)
- 基于單片機的步進電機控制系統(tǒng)設(shè)計--畢業(yè)設(shè)計
- 畢業(yè)設(shè)計---基于單片機的步進電機控制系統(tǒng)設(shè)計
- 基于單片機的步進電機控制系統(tǒng)畢業(yè)設(shè)計論文
- 畢業(yè)設(shè)計--基于單片機的步進電機控制系統(tǒng)設(shè)計與實現(xiàn)
- 基于單片機步進電機控制系統(tǒng)設(shè)計畢業(yè)正文
- 基于單片機的步進電機控制畢業(yè)設(shè)計
- 基于單片機的步進電機控制畢業(yè)設(shè)計
- 畢業(yè)設(shè)計----基于單片機的步進電機控制
- 基于單片機的步進電機控制系統(tǒng)設(shè)計
- 基于單片機的步進電機運行控制系統(tǒng)畢業(yè)設(shè)計論文
- 基于單片機的步進電機控制系統(tǒng)畢業(yè)設(shè)計(含外文翻譯)
- 基于單片機的步進電機控制系統(tǒng)設(shè)計畢業(yè)論文
- 基于51單片機的步進電機控制系統(tǒng)設(shè)計
- 基于單片機的步進電機控制系統(tǒng)設(shè)計論文
- 基于單片機的步進電機控制系統(tǒng)畢業(yè)設(shè)計(含外文翻譯)
- 基于單片機步進電機控制系統(tǒng)設(shè)計畢業(yè)正文定
- 單片機課程設(shè)計——單片機控制步進電機控制系統(tǒng)設(shè)計
評論
0/150
提交評論