2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩31頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  單片機課程設計</b></p><p>  課題:步進電機正反轉設計</p><p>  系 別: 電氣與電子工程系</p><p><b>  專 業: </b></p><p><b>  姓 名: </b></p&

2、gt;<p><b>  學 號</b></p><p><b>  指導老師: </b></p><p>  2013年01月09日</p><p><b>  一 設計目的</b></p><p>  1、增進對單片機的感性認識,加深對單片機理論方面

3、的理解;</p><p>  2、掌握單片機的內部功能模塊的應用,如定時器/計數器、中斷、片內外存貯器、I/O口、A/D、D/A、串行口通訊等;</p><p>  3、了解和掌握單片機應用系統的軟硬件設計過程、方法及實現;</p><p>  4、了解步進電機控制的基本原理,能實現電機正反轉驅動控制,掌握控制步進電機轉動的編程方法。 </p><

4、;p><b>  二 設計要求</b></p><p>  1、具有速度和轉向設定功能;</p><p>  2、設置開始、停止以及正反轉??;</p><p>  3、轉速以及轉向有數碼管顯示(本設計使用的為LCD12864)。</p><p><b>  三 、總體設計</b></p

5、><p>  步進電機是一種將電脈沖轉化為角位移的數字控制執行機構。它將電脈沖信號轉變成角位移,即給一個脈沖信號,步進電機就轉動一個角度,因此非常適合于單片機控制。 步進電機具有控制簡便、定位準確等特點。隨著科學技術的發展,在許多領域將得到廣泛的應用。鑒于傳統的脈沖系統移植性不好,本文提出微機控制系統代替脈沖發生器和脈沖分配器,用軟件的方法產生控制脈沖,通過軟件編程可以任意設定步進電機的轉速、旋轉角度、轉動次

6、數和控制步進電機的運行狀態。以簡化控制電路,降低生產成本,提高系統的運行效率和靈活性。</p><p>  步進電機的角位移與輸入脈沖數嚴格成正比,因此,當它轉動一周后,沒有累計誤差,具有良好的跟隨性。由步進電機與驅動電路組成的開環數控系統,既非常簡單、 廉價,又非??煽?。同時,它也可以與角度反饋環節組成高性能的閉環數控系統。步進電機的動態響應快,易于起停、正反轉及變速。速度可在相當寬的范圍內平滑 調節,低速下仍

7、能保證獲得大轉矩。步進電機只能通過脈沖電源供電才能運行,它不能直接使用交流電源和直流電源。 步進電機存在振蕩和失步現象,必須對控制系統和機械負載采取相應的措施。步進電機自身的噪聲和振動較大,帶慣性負載的能力較差。</p><p>  步進電機是自動控制系統中常用的執行部件。步進電機的輸入信號為脈沖電流,它能將輸入的脈沖信號轉換為階躍型的角位移或直線位移,因而步進電機可看作是一個串行的數/模轉換器。由于步進電機能夠

8、直接接受數字信號,而不需數/模轉換,所以使用微機控制步進電機顯得非常方便。</p><p>  步進電機有以下優點:</p><p>  (1)通常不需要反饋就能對位置和速度進行控制;</p><p>  (2)位置誤差不會積累;</p><p>  (3)與數組設備兼容,能夠直接接收數字信號;</p><p>  (

9、4)可以快速啟停。</p><p>  步進電機的品種規格很多,按照它們的結構和工作原理可以劃分為磁阻式(也稱反應式或變磁阻式)電機、混合式電機、永磁式電機和特種電機等四種主要型式。步進電機不需位移傳感器就可精確定位,所以在精確定位系統中應用廣泛。目前打字機、計算機外部設備、數控機床、傳真機等設備中都使用了步進電機。隨著電子計算機技術的發展,步進電機必將發揮它的控制方便、控制準確的特點,在工業控制等領域取得更為廣

10、泛的應用。</p><p>  本設計采用16 位單片機AT89C51對步進電機進行控制,通過I/O口輸出的具有時序的方波作為步進電機的控制信號,信號經過驅動芯片驅動步進電機;同時,用觸發按鍵來對電機的狀態進行控制,并用128X64LCD顯示電機的狀態及轉速。</p><p>  因為步進電機的控制是通過脈沖信號來控制的,將電脈沖信號轉變為角位移或線位移的開環控制元件。所以怎樣產生這個脈沖

11、信號和產生怎樣的信號是電機控制的關鍵。</p><p>  用軟件控制單片機產生脈沖信號,通過單片機的P1口輸出脈沖信號,因為所選電機是兩相的,所以只需要P0口的低四位P0.0-P0.3分別通過ULN2003A接到電機的五根電線上??梢酝ㄟ^調整輸出脈沖的頻率來調整電機的轉速,通過改變輸入脈沖的順序來改變轉動方向,P2口和P3口接128X64LCD,可以顯示當前的電機轉速和轉向,設置復位鍵可使正在轉動的電機停止轉動

12、,大概可分為如下圖所示的幾部分。</p><p>  注:由于此設計程序較復雜,在此沒有列出程序的框圖,程序框圖詳見軟件設計。</p><p>  四 、主要器件介紹及電路設計</p><p><b>  4.1、步進電機</b></p><p>  4.1.1 步進電機概述</p><p>  

13、步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電機的轉速、停止的位置只取決于脈沖信號的頻率和脈沖數,而不受負載變化的影響,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步運行的??梢酝ㄟ^控制脈沖個數來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。由于脈沖信號數與步距

14、角的線性關系,加上步進電機只有周期性的誤差而無累積誤差等特點,使得在速度、位置等控制領域用步進電機來控制變的非常的簡單。 步進電機是一種感應電機,它的工作原理是利用電子電路,將直流電變成分時供電的,多相時序控制電流,用這種電流為步進電機供電,步進電機才能正常工作,驅動器就是為步進電機分時供電的,多相時序控制器 </p><p>  雖然步進電機已被廣泛地應用,但步進電機并不能象普通的直流電機,交流電機在常規

15、下使用。它必須由雙環形脈沖信號、功率驅動電路等組成控制系統方可使用。因此用好步進電機卻非易事,它涉及到機械、電機、電子及計算機等許多專業知識。 </p><p>  步進電機作為執行元件,是機電一體化的關鍵產品之一, 廣泛應用在各種自動化控制系統中。隨著微電子和計算機技術的發展,步進電機的需求量與日俱增,在各個國民經濟領域都有應用。</p><p>  4.1.2 步進電機的工作原理<

16、;/p><p>  通常電機的轉子為永磁體,當電流流過定子繞組時,定子繞組產生一矢量磁場。該磁場會帶動轉子旋轉一角度,使得轉子的一對磁場方向與定子的磁場方向一致。當定子的矢量磁場旋轉一個角度。轉子也隨著該磁場轉一個角度。每輸入一個電脈沖,電動機轉動一個角度前進一步。它輸出的角位移與輸入的脈沖數成正比、轉速與脈沖頻率成正比。改變繞組通電的順序,電機就會反轉。所以可用控制脈沖數量、頻率及電動機各相繞組的通電順序來控制步進

17、電機的轉動</p><p>  四相步進電機,采用單極性直流電源供電。只要對步進電機的各相繞組按合適的時序通電,就能使步進電機步進轉動。圖1是該四相</p><p>  反應式步進電機工作原理圖。</p><p>  圖2 四相反應式步進電機工作原理圖</p><p>  開始時,開關SB接通電源,SA、SC、SD斷開,B相磁極和轉子0、3號

18、齒對齊,同時,轉子的1、4號齒就和C、D相 繞組磁極產生錯齒,2、5號齒就和D、A相繞組磁極產生錯齒。當開關SC接通電源,SB、SA、SD斷開時,由于C相繞組的磁力線和1、4號齒之間磁力線的作用,使轉子轉動,1、4號齒和C相繞組的磁極對齊。而0、3號齒和A、B相繞組產生錯齒,2、5號齒就和A、D相繞組磁極產生錯齒。依次類推,A、B、C、D四相繞組輪流供電,則轉子會沿著A、B、C、D方向轉動。</p><p>  

19、四相步進電機按照通電順序的不同,可分為單四拍、雙四拍、八拍三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉動力矩又可以提高控制精度。</p><p>  單四拍、雙四拍與八拍工作方式的電源通電時序與波形分別如圖2.a、b、c所示:</p><p>  a單四拍 b雙四拍

20、 c八拍</p><p>  圖3.步進電機工作時序波形圖</p><p>  4.2 ULN2003</p><p>  ULN是集成達林頓管IC,內部還集成了一個消線圈反電動勢的二極管,可用來驅動繼電器。它是雙列16腳封裝,NPN晶體管矩陣,最大驅動電壓=50V,電流=500mA,輸入電壓=5V,適用于TTL COMS,由達林頓管組成驅

21、動電路。 ULN是集成達林頓管IC,內部還集成了一個消線圈反電動勢的二極管,它的輸出端允許通過電流為200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。用戶輸出口的外接負載可根據以上參數估算。采用集電極開路輸出,輸出電流大,故可直接驅動繼電器或固體繼電器,也可直接驅動低壓燈泡。通常單片機驅動ULN2003時,上拉2K的電阻較為合適,同時,COM引腳應該懸空或接電源。</p><p>  ULN20

22、03是一個非門電路,包含7個單元,但獨每個單元驅動電流最大可達350mA.資料的最后有引用電路,9腳可以懸空。 比如1腳輸入,16腳輸出,你的負載接在VCC與16腳之間,不用9腳。 </p><p>  ULN2003的作用:ULN2003是大電流驅動陣列,多用于單片機、智能儀表、PLC、數字量輸出卡等控制電路中??芍苯域寗永^電器等負載。輸入5VTTL電平,輸出可達500mA/50V。</p>&l

23、t;p>  ULN2003是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。 該電路的特點如是: ULN2003的每一對達林頓都串聯一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標準邏輯緩沖器。</p><p>  ULN2003 是高壓大電流達林頓晶體管陣列系列產品,具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應于各類要求高速大

24、功率驅動的系統。 </p><p>  ULN2003A引腳圖及功能如下:</p><p>  圖4 ULN2003A引腳圖</p><p>  ULN2003 是高耐壓、大電流、內部由七個硅NPN達林頓管組成的驅動芯片。 </p><p>  經常在以下電路中使用,作為: </p><p>&

25、lt;b>  1、顯示驅動</b></p><p><b>  2、繼電器驅動</b></p><p><b>  3、照明燈驅動</b></p><p><b>  4、電磁閥驅動</b></p><p>  5、伺服電機、步進電機驅動等電路中。</p

26、><p>  ULN2003的每一對達林頓都串聯一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據。ULN2003 工作電壓高,工作電流大,灌電流可達500mA,并且能夠在關態時承受50V 的電壓,輸出還可以在高負載電流并行運行。ULN2003 的封裝采用DIP—16 或SOP—16 </p><p>  ULN

27、2003A在各種控制電路中常用它作為驅動繼電器的芯片,其芯片內部做了一個消線圈反電動勢的二極管。ULN2003的輸出端允許通過IC 電流200mA,飽和壓降VCE 約1V左右,耐壓BVCEO 約為36V。輸出電流大,故可以直接驅動繼電器或固體繼電器(SSR)等外接控制器件,也可直接驅動低壓燈泡。</p><p>  ULN2003可以驅動7個繼電器,具有高電壓輸出特性,并帶有共陰極的續流二極管使器件可用于開關型感

28、性負載。每對達林頓管的額定集電極電流是500mA,達林頓對管還可并聯使用以達到更高的輸出電流能力。ULN2003A中每對達林頓管的基極都串聯有一個2.7kΩ的電阻,可直接與TTL或5V CMOS器件連接。</p><p>  4.3 12864LCD</p><p>  12864A-1漢字圖形點陣液晶顯示模塊,可顯示漢字及圖形,內置8192個中文漢字(16X16點陣,16*8=128,1

29、6*4=64,一行只能寫8個漢字,4行;)、128個字符(8X16點陣)及64X256點陣顯示RAM(GDRAM)。</p><p>  4.3.1 主要技術參數和顯示特性如下:</p><p>  電源:VDD 3.3V-5V(內置升壓電路,無需負壓);</p><p>  顯示內容:128列× 64行(128表示點數)</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>  多種軟件功能:光標顯示、畫面移位、自定義字符、睡眠模式等</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>  串行數據傳送共分三個字節完成:</p><p>  第一字節:串口

34、控制—格式 11111ABC。A為數據傳送方向控制:H表示數據從LCD到MCU,L表示數據從MCU到LCD。B為數據類型選擇:H表示數據是顯示數據,L表示數據是控制指令。 C固定為0</p><p>  第二字節:(并行)8位數據的高4位—格式 DDDD0000</p><p>  第三字節:(并行)8位數據的低4位—格式 0000DDDD</p><p>  串行

35、接口時序參數:(測試條件:T=25℃ VDD=4.5V)</p><p>  4.4 系統的時鐘電路</p><p>  時鐘電路是用于產生單片機工作時所必需的時鐘信號。時鐘是單片機的心臟,單片機各功能部件的運行都是以時鐘頻率為基準的,有條不紊地一拍一拍地工作。時鐘頻率直接影響單片機的速度,時鐘電路的質量也直接影響單片機系統的穩定性。在本系統中采用外部時鐘方式的電路,如圖所示:</p

36、><p>  圖9 系統的時鐘電路</p><p>  在本設計中的電容C1、C2典型值為30±10 pF。外接代內容的值雖然沒有嚴格的要求,但是電容的大小會影響振蕩器的穩定性和起振的快速性。同時,在系統中采用12MHz的晶體振蕩器來產生時鐘脈沖。這樣可以滿足系統在設計時的機器周期的需要。</p><p>  4.5 步進電機驅動電路</p>&

37、lt;p>  由單片機直接輸出的脈沖不足以驅動步進電機正常工作所以需要驅動電路給步進電機提供電源,在本設計中采用型號為ULN2003A的芯片,使步進電機正常工作。驅動信號由P0口的P0.0-P0.3輸出,分別與驅動芯片的B1-B4相連,電路如下圖所示:</p><p>  圖10 步進電機的驅動電路</p><p><b>  五 軟件設計</b></p&

38、gt;<p><b>  1、主程序的設計</b></p><p>  主程序需具備的功能,要不斷掃描P1口并判斷觸發按鍵是否閉合,并能根據其電平高低,輸出不同的控制脈沖,并調用顯示子程序顯示轉速及方向。</p><p>  圖11 主程序設計流程</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; //設定步進電機的轉向</p><p>  uint set_speed;

41、 //設定步進電機的轉速</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 //正轉</p><p>  #define CST_STEP_MOTOR_F 20 //反轉</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,"反轉");</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,"正轉");</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、顯示子程序的設計</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 //設置頁指令。</p><p>  #define LCDLINE 0x40 //設置列指令。</p><p>  //LCD判斷忙的子程序</p><p>  void chkbusy(void) //測LCD忙狀態 </p><p><b>  { &

79、lt;/b></p><p>  E=1; //使能LCD</p><p>  RS=0; //讀寫指令 </p><p>  RW=1; //讀 </p><p>  P2=0xff;

80、 //讀操作前先進行一次空讀操作 ,接下來才能讀到數據 </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; //輸出 設置 </p><p>  P2=cd;

83、 //寫數據代碼 </p><p>  E=1; //以下兩句產生下降沿 </p><p>  E=0; </p><p><b>  }</b></p><p>  //把

84、顯示數據寫到內存單元中 </p><p>  void wdata(uchar dat) //寫顯示數據</p><p><b>  {</b></p><p>  chkbusy(); //寫等待 </p><p>

85、;  P2=0xff; //使能LCD</p><p>  RW=0; //讀禁止 </p><p>  RS=1; //輸出 設置 </p><p>  P2=dat ^0xFF;

86、 //寫數據代碼 </p><p>  E=1; //以下兩句產生下降沿 </p><p>  E=0; </p><p><b>  }</b></p>

87、<p><b>  //顯示LCD程序</b></p><p>  //可以更改程序中的64變為32就可以輸出數字了</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、面顯示不了,轉到右半平面去 </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++) //減去左邊數,從右半平面第一位開始顯示 </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>  //供調用子程序</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、 //如果字在左半平面顯示不了,轉到右半平面去 </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++) //減去左邊數,從右半平面第

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); //開顯示 設置 </p><p>  wcode(0xc0); //設置顯示

111、啟動為第一行 </p><p>  wcode(0x01); //清屏</p><p>  wcode(0x06); //畫面不動,光標右移。</p><p><b>  }</b></p>

112、<p>  //然后應用下面程序來索引漢字 </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) //應是8,中間有字符ASCII 嗎+ 漢字則只有1個字節空間不夠寫漢字所以換行</p><p>&

115、lt;b>  {</b></p><p>  hz_cnt =0;</p><p>  hang+=2; </p><p><b>  }</b></p><p>  temp1 = *point++; //取漢字數據 </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>  七、電路仿真及調試</b></p><p>  7.1Proteus介紹</p><p>  Proteus是由Labcenter Electronics開發的功能強大的單片機仿真軟件Proteus與其他的仿真軟件相比較,在下面的優點:</p>

123、<p>  1.能仿真模擬電路、數字電路、數?;旌想娐?;</p><p>  2.能繪制原理圖、PCB圖;</p><p>  3.幾乎包括實際中所有使用的儀器</p><p>  4.其最大的亮點在于能夠對單片機進行實物級的仿真。從程序的編寫,編譯到調試,目標版的仿真一應俱全。支持匯編語言和C語言的編程。還可配合Keil C實現程序的聯合調試,將Prot

124、eus中繪制的原理圖作為實際中的目標板,而用Keil C集成環境實現對目標板的控制,與實際中通過硬件仿真器對目標板的調試幾乎完全相同,并且支持多顯示器的調試,即Proteus運行在一臺計算機上,而Keil C運行在另一臺計算機上,通過網絡連接實現遠程的調試。</p><p><b>  7.2系統仿真</b></p><p>  對應的單拍正轉、雙拍正轉、單雙拍正轉種

125、情況下由虛擬示波器(OSCILLOSCOPE)采集的脈沖驅動信號,對于步進電機的控制,實際上是控制步進脈沖的個數和步進脈沖的間隔,而步進電機的間隔又可轉化為某基準延時子程序的循環次數。因此,可以很方便地用軟件來控制步進電機的運行,達到控制目的。繪制完電路圖后,將編好的程序輸入軟件內檢查所編程序是否正確,檢查程序無誤后裝入單片機內,進行防真。仿真結果可見圖13所示。</p><p><b>  八 設計總

126、結</b></p><p>  這次課程設計根據課題要求,復習了所學的單片機和步進電機的內容,通過查閱大量書籍、專業網站、論壇等,通過反復對比,采用技術較為成熟以及仿真效果的電路。在軟件設計方面,一部分參考文獻的已成程序進行修改編寫,一部分則是平時的經驗積累,初步掌握了步進電機控制的基本原理和步進電機轉動編程的方法,步進電機作為執行元件,是機電一體化的關鍵產品之一,廣泛應用在各種自動化控制系統中。隨著

127、微電子和計算機技術的發展,步進電機的需求量與日增加,在各個國民經濟領域仍將起到重要作用。根據課程設計的要求和自己通過參考有關資料,寫好程序流程圖,在程序流程圖的基礎上,根據芯片的功能寫出相應的程序,達到能夠實現所要求的功能的目的。 在寫程序時,在每條指令后都寫好注釋,以便在程序出錯的檢查過程中可以更容易查找得到。  本次課程設計重點是理論與實際的相結合,不單單只是書上的一條條分離的指令。這次實驗我們學到了有關步進電機的

溫馨提示

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

評論

0/150

提交評論