基于at89c51單片機的電機控制綜合課程設計_第1頁
已閱讀1頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于AT89C51單片機的電機控制綜合設計</p><p><b>  目錄</b></p><p><b>  1 系統(tǒng)的設計1</b></p><p>  1.1設計的目的和要求1</p><p><b>  1.2系統(tǒng)原理1</b></p

2、><p><b>  2 系統(tǒng)的構成2</b></p><p>  2.1控制器部分2</p><p>  2.1.1控制器分析2</p><p>  2.1.2控制器主要功能特性2</p><p>  2.1.2控制器引腳功能描述3</p><p>  2.2 數(shù)據(jù)

3、顯示部分4</p><p>  2.2.1 12864液晶顯示模塊概述4</p><p>  2.2.2 基本參數(shù)4</p><p>  2.2.3模塊引腳說明5</p><p>  2.2.4 具體指令介紹:5</p><p>  2.2.5顯示坐標關系8</p><p>  3

4、硬件電路設計8</p><p>  3.1 LCD控制電路原理圖8</p><p>  3.2電機控制電路9</p><p>  3.3速度反饋電路10</p><p>  3.4 MCU接口11</p><p>  3.5 按鍵電路11</p><p><b>  4 軟

5、件設計12</b></p><p>  4.1程序要求12</p><p>  4.2 程序流程圖12</p><p>  4.3 程序清單12</p><p>  4.3.1 LCD驅動程序12</p><p>  4.3.2 主函數(shù)程序17</p><p><b

6、>  5程序的調試21</b></p><p>  5.1 編程軟件KEIL C51簡介21</p><p>  5.2 程序編譯和調試21</p><p><b>  6 結語25</b></p><p><b>  1 系統(tǒng)的設計</b></p><

7、p>  1.1設計的目的和要求</p><p>  基于AT89C51單片機的電機控制綜合系統(tǒng),以電機為被控對象,由AT89C51單片機作為控制器,結合速度反饋和LCD液晶顯示模塊,組成一個有較好控制性和實時性的電機控制綜合系統(tǒng)。</p><p><b>  1.2系統(tǒng)原理</b></p><p>  系統(tǒng)的原理如上圖1.2所示,控制器A

8、T89C51通過外圍電路控制電機轉動。由速度反饋電路反饋電機的速度信息,并進行伺服計算和控制。整個系統(tǒng)的主要信息可以在LCD顯示模塊上顯示。</p><p><b>  2 系統(tǒng)的構成</b></p><p><b>  2.1控制器部分</b></p><p>  2.1.1控制器分析</p><p&

9、gt;  AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89

10、C51是一種高效微控制器。AT89C單片機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。</p><p>  2.1.2控制器主要功能特性</p><p>  ·與MCS-51 兼容 </p><p>  ·4K字節(jié)可編程閃爍存儲器 </p><p>  ·壽命:1000寫/擦循環(huán) </p>

11、<p>  ·數(shù)據(jù)保留時間:10年 </p><p>  ·全靜態(tài)工作:0Hz-24MHz </p><p>  ·三級程序存儲器鎖定 </p><p>  ·128×8位內部RAM </p><p>  ·32可編程I/O線 </p><p>  

12、·兩個16位定時器/計數(shù)器 </p><p><b>  ·5個中斷源 </b></p><p><b>  ·可編程串行通道 </b></p><p>  ·低功耗的閑置和掉電模式 </p><p>  ·片內振蕩器和時鐘電路</p>

13、<p>  2.1.2控制器引腳功能描述</p><p>  AT89C51 提供以下標準功能:4k 字節(jié)Flash 閃速存儲器,128字節(jié)內部RAM,32 個I/O 口線,兩個16位定時/計數(shù)器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數(shù)器,串

14、行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p><b>  Vcc:電源電壓</b></p><p><b>  GND:地</b></p><p>  P0口是一組8 位

15、漏極開路型雙向I/O 口,也即地址/數(shù)據(jù)總線復用口。作為輸出口用</p><p>  時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數(shù)據(jù)總線復用,在訪問期間激活內部上拉電阻。在FIash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。</p><p&g

16、t;  P1口是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電</p><p>  流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。FIash編程和程序校驗期間,P1接收低8位地址。</p><p>  P2口是一個帶有內部上拉電

17、阻的8位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出</p><p>  電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX@DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8 位地址的外部數(shù)據(jù)存儲器(如執(zhí)行M

18、OVX@RI 指令)時,P2 口線上的內容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內容),在整個訪問期間不改變。Flash編程或校驗時,P2亦接收高位地址和其它控制信號。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p>  P3口是一組帶有內部上拉電阻的8 位雙向I/O 口。P3 口輸出緩沖級可驅動(吸收或輸</p><p>  出電流)4 個TT

19、L邏輯門電路。對P3 口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。作輸入端時,被外部拉低的P3 口將用上拉電阻輸出電流(IIL)。</p><p>  P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如下表2.1.2所示:</p><p>  P3口還接收一些用于Flash閃速存儲器編程和程序校驗的控制信號。</p><p>  RST :

20、復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p>  ALE/PROG: 當訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖</p><p>  用于鎖存地址的低8位字節(jié)。即使不訪問外部存儲器,ALE 仍以時鐘振蕩頻率的l/6 輸出固定的正脈沖信號,因此它可對外

21、輸出時鐘或用于定時目的。要注意的是:每當訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。</p><p>  如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的DO 位置位,可禁止ALE 操作。該位置位后,只有一條MOVX和MOVC指令ALE才會被激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置ALE無效。</p>&

22、lt;p>  PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT89C51 由外部程序</p><p>  存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數(shù)據(jù)存儲器,這兩次有效的PSEN信號不出現(xiàn)。</p><p>  EA VPP: 外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),E

23、A端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態(tài)。</p><p>  如EA端為高電平(接VCC端),CPU則執(zhí)行內部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。</p><p>  XTAL1: 振蕩器反相放大器的及內部時鐘發(fā)生器的輸入端。</p>

24、<p>  XTAL2:振蕩器反相放大器的輸出端。</p><p>  2.2 數(shù)據(jù)顯示部分</p><p>  2.2.1 12864液晶顯示模塊概述</p><p>  12864液晶顯示模塊是128×64 點陣的漢字圖形型液晶顯示模塊,可顯示漢字及圖形,內置國標GB2312 碼簡體中文字庫(16X16 點陣)、128 個字符(8X16

25、點陣)及64X256 點陣顯示RAM(GDRAM)??膳cCPU 直接接口,提供兩種界面來連接微處理機:8-位并行及串行兩種連接方式。具有多種功能:光標顯示、畫面移位、睡眠模式等。</p><p>  2.2.2 基本參數(shù) </p><p>  液晶屏類型 STN FSTN </p><p><b>  模塊顯示效果: </b></p>

26、;<p><b>  黃綠底黑字 </b></p><p>  藍底白字 白底黑字 視角 6點鐘 12點鐘 </p><p>  驅動方式 1/64 DUTY 1/9 BIAS </p><p>  背光 LED白色 LED黃綠色 </p><p>  控制器 KS0108或兼容 ST7920 T6963C

27、 </p><p>  數(shù)據(jù)總線 8 位并口/6800 方式 串口 </p><p>  溫度特性 工作溫度:-20℃~+70℃ 儲藏溫度:-30℃~+80℃ </p><p>  點陣格式 128 x 64</p><p>  2.2.3模塊引腳說明</p><p>  2.2.4 具體指令介紹:</p>

28、<p>  1、清除顯示(指令代碼為01H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:清除顯示屏幕,把DDRAM 位址計數(shù)器調整為“00H”。</p><p>  2、位址歸位(02H)</p>&

29、lt;p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:把DDRAM 位址計數(shù)器調整為“00H”,游標回原點,該功能不影響顯示DDRAM。</p><p>  3、點設定(07H/04H/05H/06H)</p><p>  CODE:

30、 RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:設定光標移動方向并指定整體顯示是否移動。</p><p>  I/D=1 光標右移,I/D=0 光標左移。</p><p>  SH=1 且DDRAM 為寫狀態(tài):整體顯示移動,方向由I/D 決定(I/D=1 左移,I/D=

31、0 右移)</p><p>  SH=0 或DDRAM 為讀狀態(tài):整體顯示不移動</p><p>  4、顯示狀態(tài)開/關(08H/0CH/0EH/0FH)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能: D=

32、1;整體顯示ON C=1;游標ON B=1;游標位置ON.</p><p>  5、游標或顯示移位控制(10H/14H/18H/1CH)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:10H/14H:光標左/右移動;18H/1CH:

33、整體顯示左右移動,光標跟隨移動,AC 值不變</p><p>  6、功能設定(36H/30H/34H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:DL=1(必須設為1) RE=1;擴充指令集動作 RE=0:基本指令集動作5、游

34、標或顯示移位控制(10H/14H/18H/1CH)</p><p>  7、設定CGRAM 位址(40H-7FH)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:設定CGRAM 位址到位址計數(shù)器(AC)</p><

35、;p>  8、設定DDRAM 位址(80H-9FH)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:設定 DDRAM 位址到位址計數(shù)器(AC)</p><p>  9、讀取忙碌狀態(tài)(BF)和位址(BF=1, 狀態(tài)忙)</

36、p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:讀取忙碌狀態(tài)(BF)可以確認內部動作是否完成,同時可以讀出位址計數(shù)器(AC)的值</p><p>  10、寫資料到RAM(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)&l

37、t;/p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:寫入資料到內部的 RAM(DDRAM/CGRAM/TRAM/GDRAM)</p><p>  11、讀出RAM 的值</p><p>  CODE: RW

38、 RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:從內部 RAM 讀取資料(DDRAM/CGRAM/TRAM/GDRAM)</p><p>  12、待命模式(01H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4

39、 DB3 DB2 DB1 DB0</p><p>  功能:進入待命模式,執(zhí)行其他命令都可終止待命模式</p><p>  13、卷動位址或IRAM 位址選擇(02H/03H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p>&

40、lt;p>  功能:SR=1;允許輸入卷動位址 SR=0;允許輸入IRAM 位址</p><p>  14、反白選擇(04H\05H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:選擇 4 行中的任一行作反白顯示,并可決定反

41、白的與否</p><p>  15、睡眠模式(08H/0CH)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:SL=1;脫離睡眠模式 SL=0;進入睡眠模式</p><p>  16、擴充功能設定(36H/3

42、0H/34H)</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:RE=1;擴充指令集動作 RE=0;基本指令集動作 G=1;繪圖顯示ON G=0;繪圖顯示OFF</p><p>  17、設定IRAM 位址或卷動位址(40H-7FH)

43、</p><p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:SR=1;AC5~AC0 為垂直卷動位址 SR=0;AC3~AC0 寫ICONRAM 位址</p><p>  18、設定繪圖RAM 位址(80H-FFH)</p>&l

44、t;p>  CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0</p><p>  功能:設定 GDRAM 位址到位址計數(shù)器(AC)</p><p>  2.2.5顯示坐標關系</p><p>  X 坐標</p>

45、<p>  Line1 80H 81H 82H 83H 84H 85H 86H 87H</p><p>  Line2 90H 91H 92H 93H 94H 95H 96H 97H</p><p>  Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH</p><p>  Li

46、ne4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH</p><p><b>  3 硬件電路設計</b></p><p>  3.1 LCD控制電路原理圖</p><p><b>  3.2電機控制電路</b></p><p>  電機H橋控制電路如下圖3.2所

47、示。當DCMotorA為高電平時,NPN型三極管Q4導通,則PNP型三極管Q2和NPN型三極管Q6會同時導通;同時DCMotorB為低電平,NPN型三極管Q5關閉,則PNP型三極管Q3和NPN型三極管Q7會同時關閉。此時,電流將從MOTOR B經過電機向MOTORA方向流動,如此驅動電機正向轉動。反之,DCMotorA為低電平,DCMotorB為高電平,電機為反向轉動。如此可以實現(xiàn)電機的正反轉控制。調節(jié)DCMotorA或DCMotorB

48、的導通時間,可以實現(xiàn)電機的調速控制。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p><b>  3.3速度反饋電路</b></p><p>  速度反饋電路如上圖3.3所示。當光耦Optoisolator1導通時,PNP型三極管Q1導通,指示燈LED1發(fā)光,此時DCMotorSpeed端口為低電平。當光耦Optoisolator1

49、不導通時,指示燈LED1不發(fā)光,此時DCMotorSpeed端口為高電平。電機帶了一個有四個缺口的轉盤,如此。當電機轉動一圈時,會有4個脈沖輸入給單片機,對這些脈沖進行計數(shù),可以計算出電機的轉動速度。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p>  由于裝在電機上的碼盤格數(shù)比較少,而我們程序中速度的級數(shù)為255,相對較大。給速度計數(shù)的T0計數(shù)器,為滿足系統(tǒng)的實時控制性,則獲

50、取速度數(shù)據(jù)的時間應該盡量短(即程序中T0定時器初始化程序中的Delay延時)。同時,這一時間又要滿足當給定速度最大時,仍有足夠的時間能夠對速度反饋值進行正確的計數(shù)。所以這一時間不能夠太短。合理的確定這一時間的方法是,給定電機速度為255,讓其全速轉動。此時,從小到大更改計數(shù)延時Delay()的時間,然后在液晶顯示器上觀察反饋的速度值,當其剛好為255時,此時的延時Delay()時間為系統(tǒng)的的最佳速度采樣時間。</p>&l

51、t;p>  經過上述處理后,我們發(fā)現(xiàn)獲得的這個延時時間是相對比較長的,這是因為當給定速度較大時,電機需要轉幾十圈才能反饋出實際的速度值,所以反饋速度所需的時間比較長,實時控制的能力相對較差。為克服以上系統(tǒng)的缺點,可以通過減少速度的級數(shù),即減小Pwm_MAX的值來實現(xiàn)。但是速度的級數(shù)減少后,電機調速的連續(xù)性就必然會降低,電機在速度動態(tài)變化過程中的穩(wěn)定性就會相應降低。另外,還可以采用增加電機碼盤格數(shù)的方法來實現(xiàn)速度反饋的快速性和準確性

52、,借此可以在較合理的時間內得到電機速度的準備值。第二種改進方案更為合理和科學。</p><p><b>  3.4 MCU接口</b></p><p><b>  3.5 按鍵電路</b></p><p>  按鍵電路如上圖3.5所示。當任意一個按鍵KEY被按下時,P2.0~P2.2引腳會對應的的產生一個低電平。</

53、p><p><b>  4 軟件設計</b></p><p><b>  4.1程序要求</b></p><p>  我們使用C語言對AT89C51進行控制程序的編寫。程序中使用到的資源有兩個定時器資源,T0工作在16位外部計數(shù)模式,用于速度的反饋和計算等數(shù)據(jù)處理。T1工作在8位定時器自動重載模式,引腳P3.4接計數(shù)信息輸入端

54、口。在T1的定時溢出中斷程序中進行速度的產生及對電機的控制操作。系統(tǒng)使用到5個普通I/O口資源。P1.6和P1.7為控制電機轉動的兩路控制信號。P2.0作為加速按鍵信息輸入端口,P2.1作為減速按鍵信息輸入端口,P2.2作為方向控制鍵信息輸入端口。(本文由 點夢時刻 www.dreamoment.com 傾情奉獻)</p><p>  程序運行時,先進行LCD控制程序的初始化并對顯示進行預處理。然后讀預設速度初值

55、,由T1中斷服務程序產生PWM速度控制信號,T0反饋速度信息并進行速度的計算處理。KEY1和KEY2可對速度進行加減操作。KEY3可對電機進行正反轉的控制操作。</p><p>  程序的編寫要遵循性保證系統(tǒng)穩(wěn)定性的前提下消耗盡量少消耗資源的原則,并要考慮實際的可操作性和滿足系統(tǒng)在各種工作環(huán)境下能穩(wěn)定正常運行的要求。</p><p><b>  4.2 程序流程圖</b&g

56、t;</p><p><b>  4.3 程序清單</b></p><p>  4.3.1 LCD驅動程序</p><p><b>  /*</b></p><p><b>  LCD.C</b></p><p>  128×64 LCD驅動程

57、序頭文件</p><p><b>  */</b></p><p>  #ifndef LCD_H_</p><p>  #define LCD_H_</p><p>  #include<REG51.H></p><p>  sbit LCD_BL=P1^4; //定義背光控制信

58、號</p><p>  void LcdLightOn();//點亮背光燈</p><p>  void LcdLightOff();//熄滅背光燈</p><p>  void LcdClear();//清屏</p><p>  void LcdInit();//初始化</p><p>  void Lcd

59、PutChar(unsigned char c);//顯示ASCⅡ碼</p><p>  void LcdPuts(unsigned char*s); //顯示字符串</p><p>  #endif //LCD_H_</p><p><b>  /*</b></p><p><b>  LCD.C<

60、;/b></p><p>  128×64 LCD驅動程序</p><p><b>  */</b></p><p>  #include <INTRINS.H></p><p>  #include <ABSACC.H></p><p>  unsigne

61、d char LcdCursor; //定義屏幕光標(取值0~63,光標本身不可見)</p><p><b>  int i,j;</b></p><p>  void LcdLightOn() //功能:點亮背光燈</p><p><b>  {</b></p><p>  LCD_

62、BL = 1;</p><p><b>  }</b></p><p>  void LcdLightOff() //功能:熄滅背光燈</p><p><b>  {</b></p><p>  LCD_BL = 0;</p><p><b>  }<

63、;/b></p><p><b>  /*</b></p><p>  函數(shù):LcdGetBF()</p><p><b>  返回:</b></p><p>  BF=1,表示忙,不可進行任何操作</p><p>  BF=0,表示不忙,可以進行正常操作</p&

64、gt;<p><b>  */</b></p><p>  bit LcdGetBF()//功能:讀出狀態(tài)位BF</p><p><b>  {</b></p><p>  unsigned char dat;</p><p>  dat = XBYTE[0xD002];//XB

65、YTE的定義見<ABSACC.H></p><p>  return (bit)(dat & 0x80);</p><p><b>  }</b></p><p>  void LcdWriteCmd(unsigned char cmd) //功能:向LCD發(fā)送命令</p><p><b>

66、  {</b></p><p>  while ( LcdGetBF() );</p><p>  XBYTE[0xD000] = cmd;</p><p><b>  }</b></p><p>  void LcdWriteDat(unsigned char dat)// 功能:向LCD寫入數(shù)據(jù)<

67、/p><p><b>  {</b></p><p>  while ( LcdGetBF() );</p><p>  XBYTE[0xD001] = dat;</p><p><b>  }</b></p><p>  unsigned char LcdReadDat()

68、 //功能:從LCD讀出數(shù)據(jù)</p><p><b>  {</b></p><p>  volatile unsigned char dat;</p><p>  while ( LcdGetBF() );</p><p>  dat = XBYTE[0xD003];</p><p>  d

69、at = XBYTE[0xD003];//需要連續(xù)執(zhí)行兩次才能夠讀出真正的數(shù)據(jù)</p><p>  return dat;</p><p><b>  }</b></p><p><b>  /*</b></p><p>  函數(shù):LcdSetAC()</p><p>

70、  功能:設置DDRAM(顯示數(shù)據(jù)RAM)的AC(地址計數(shù)器)值</p><p><b>  */</b></p><p>  void LcdSetAC(unsigned char ac)</p><p><b>  {</b></p><p>  ac &= 0x3F;</p>

71、;<p>  ac |= 0x80;</p><p>  LcdWriteCmd(ac);</p><p><b>  }</b></p><p>  void LcdClear()//功能:LCD清屏,并使光標回到0</p><p><b>  {</b></p>

72、<p>  LcdWriteCmd(0x01);//清屏命令</p><p>  LcdCursor = 0;</p><p><b>  }</b></p><p>  void LcdDelay(unsigned char t) //功能:延時(t*100)個機器周期</p><p><b&g

73、t;  {</b></p><p>  unsigned char n;</p><p><b>  do</b></p><p><b>  {</b></p><p><b>  n = 49;</b></p><p>  while (

74、 --n != 0 );</p><p>  } while ( --t != 0 );</p><p><b>  }</b></p><p>  void LcdInit()//功能:LCD初始化</p><p><b>  {</b></p><p>  LcdWri

75、teCmd(0x30);//設置基本指令集</p><p>  LcdDelay(3);</p><p>  LcdWriteCmd(0x30);//設置基本指令集(需要再執(zhí)行一次)</p><p>  LcdDelay(1);</p><p>  LcdWriteCmd(0x0C);//開啟顯示</p><p>

76、;  LcdDelay(3);</p><p>  LcdClear();//清屏</p><p>  LcdDelay(250);</p><p>  LcdWriteCmd(0x06);//設置進入點</p><p>  LcdDelay(10);</p><p><b>  }</b>

77、;</p><p>  void LcdCheckAC() //功能:根據(jù)光標位置調整AC</p><p><b>  {</b></p><p>  switch ( LcdCursor )</p><p><b>  {</b></p><p><b> 

78、 case 16:</b></p><p>  LcdSetAC(16);</p><p><b>  break;</b></p><p><b>  case 32:</b></p><p>  LcdSetAC(8);</p><p><b>  

79、break;</b></p><p><b>  case 48:</b></p><p>  LcdSetAC(24);</p><p><b>  break;</b></p><p><b>  case 64:</b></p><p>

80、;  LcdCursor = 0;</p><p>  LcdSetAC(0);</p><p><b>  break;</b></p><p><b>  default:</b></p><p><b>  break;</b></p><p>&

81、lt;b>  }</b></p><p><b>  }</b></p><p>  void LcdPutChar(unsigned char c) //功能:顯示ASCII碼</p><p><b>  {</b></p><p>  LcdWriteDat(c);</p

82、><p>  LcdCursor++;</p><p>  LcdCheckAC();</p><p><b>  }</b></p><p>  void LcdPutHZ(unsigned char ch, unsigned char cl) //功能:顯示漢字</p><p><b>

83、  {</b></p><p>  if ( LcdCursor & 0x01 )</p><p>  {//顯示漢字時,必須偶地址對準,即光標位置不能是奇數(shù)</p><p>  LcdPutChar(' ');//額外輸出一個空格</p><p><b>  }</b></p

84、><p>  LcdWriteDat(ch);</p><p>  LcdWriteDat(cl);</p><p>  LcdCursor += 2;</p><p>  LcdCheckAC();</p><p><b>  }</b></p><p>  void Lcd

85、Puts(unsigned char *s) //功能:顯示字符串</p><p><b>  {</b></p><p>  unsigned char ch, cl;</p><p><b>  for (;;)</b></p><p><b>  {</b></p&

86、gt;<p>  ch = *s++;</p><p>  if ( ch == '\0' ) break;</p><p>  if ( ch < 0x80 )</p><p><b>  {</b></p><p>  LcdPutChar(ch);</p><

87、p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cl = *s++;</p><p>  LcdPutHZ(ch,cl);</p><p><b>  

88、}</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  4.3.2 主函數(shù)程序</p><p><b>  /*</b></p><p><b>  顯示主程序</b&g

89、t;</p><p><b>  */</b></p><p>  #include<REG51.H></p><p>  unsigned char SD[4]={'1','2','3','4'};//速度設定</p><p>  unsign

90、ed char FK[4]={'2','2','3','4'};//速度反饋</p><p>  unsigned int D=0; //方向控制中間變量</p><p>  unsigned int Pwm=0; //速度產生中間變量</p><p

91、>  unsigned int Pwm_Value=0; //速度計算中間量 </p><p>  unsigned int Value=0; //速度初值 </p><p>  sbit KEY1=P2^0; //按鍵</p><p>  sbit KEY2=P2^1;</p&g

92、t;<p>  sbit KEY3=P2^2;</p><p>  sbit MotorA=P1^6; //兩個電機控制端</p><p>  sbit MotorB=P1^7; </p><p>  bit SWTR; //延時程序變量</p><p><b

93、>  bit SWTF;</b></p><p>  unsigned int SWTV;</p><p>  #define Pwm_MAX 255 //速度級數(shù)</p><p>  /********************************************************/</p><p&

94、gt;  函數(shù):Delay()</p><p>  延時1ms 65.53s</p><p>  t>0時,延時(t*0.001)s</p><p>  t=0時。延時65.53s</p><p>  /********************************************************/</p>

95、<p>  void Delay(unsigned int T) //延時程度</p><p><b>  {</b></p><p><b>  SWTV=T;</b></p><p><b>  SWTR=1;</b></p><p>  while(!S

96、WTF);</p><p><b>  SWTR=0;</b></p><p><b>  SWTF=0;</b></p><p><b>  }</b></p><p>  void KEY() //按鍵處理函數(shù)</p><p><b

97、>  {</b></p><p>  if(KEY1==0)</p><p><b>  {</b></p><p>  Pwm_Value=Pwm_Value+1;</p><p><b>  }</b></p><p>  if(KEY2==0)<

98、/p><p><b>  {</b></p><p>  Pwm_Value=Pwm_Value-1;</p><p><b>  }</b></p><p>  if(Pwm_Value>255) Pwm_Value=255;</p><p>  if(Pwm_Value

99、<0) Pwm_Value=0;</p><p>  if(KEY3==0)</p><p><b>  {</b></p><p>  if(D==0) D=1;</p><p>  else D=0;</p><p><b>  }</b></p>

100、<p><b>  }</b></p><p>  void PWM_Init() //速度產生函數(shù)</p><p><b>  {</b></p><p>  staticunsigned char t=0;</p><p><b>  t++;</b>&

101、lt;/p><p>  if(t>Pwm_MAX) t=0;</p><p>  if(t<=Pwm_Value)</p><p><b>  {</b></p><p><b>  Pwm=1;</b></p><p><b>  }</b>&

102、lt;/p><p><b>  else</b></p><p><b>  {</b></p><p><b>  Pwm=0;</b></p><p><b>  }</b></p><p><b>  if(D==0)&

103、lt;/b></p><p><b>  {</b></p><p><b>  MotorA=0;</b></p><p>  MotorB=Pwm;</p><p><b>  }</b></p><p><b>  else<

104、/b></p><p><b>  {</b></p><p>  MotorA=Pwm;</p><p><b>  MotorB=0;</b></p><p><b>  }</b></p><p><b>  }</b>

105、</p><p>  void Show_Value(unsigned char CH[]) //數(shù)據(jù)顯示函數(shù)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<4;i++)</p><p&g

106、t;<b>  {</b></p><p>  LcdPutChar(CH[i]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Show_Init() //數(shù)據(jù)顯示預處理

107、函數(shù)</p><p><b>  {</b></p><p>  LcdWriteCmd(0x80);</p><p>  LcdPuts("速度設定");</p><p>  LcdWriteCmd(0x90);</p><p>  LcdPuts("速度反饋&qu

108、ot;);</p><p>  LcdWriteCmd(0x88);</p><p>  LcdPuts("速度方向");</p><p>  LcdWriteCmd(0x98);</p><p>  LcdPuts("測控071 ");</p><p>  LcdWriteCm

109、d(0x9c);</p><p>  LcdPuts(" 29號 ");</p><p><b>  }</b></p><p>  void T_int()//定時器初始化函數(shù)</p><p><b>  {</b></p><p>  T

110、MOD&=0x00;</p><p>  TMOD=0x25;</p><p>  TH1=TL1=0xa4;</p><p>  TH0=TL0=0;</p><p><b>  ET1=1;</b></p><p><b>  TR1=1;</b></p&g

111、t;<p><b>  EA=1;</b></p><p><b>  }</b></p><p>  void MeasureSpeed()//速度反饋及信息處理函數(shù)</p><p><b>  {</b></p><p>  unsigned int

112、m;</p><p>  TH0=TL0=0;</p><p><b>  TR0=1;</b></p><p>  Delay(2400);</p><p><b>  TR0=0;</b></p><p><b>  TF0=0;</b></p

113、><p>  m=2*(TH0*255+TL0);</p><p>  if(m>Value) Pwm_Value++;</p><p>  if(m<Value) Pwm_Value--;</p><p>  FK[3]=(m%10)+48;</p><p>  FK[2]=(m/10%10)+48;&l

114、t;/p><p>  FK[1]=(m/100%10)+48;</p><p>  FK[0]=(m/1000%10)+48;</p><p>  SD[3]=(Pwm_Value%10)+48;</p><p>  SD[2]=(Pwm_Value/10%10)+48;</p><p>  SD[1]=(Pwm_Valu

115、e/100%10)+48;</p><p>  SD[0]=(Pwm_Value/1000%10)+48;</p><p><b>  }</b></p><p>  void main()//主函數(shù)部分</p><p><b>  { </b></p><p>

116、  unsigned char i;</p><p><b>  MotorA=0;</b></p><p><b>  MotorB=0;</b></p><p><b>  EA=0; </b></p><p>  T_int(); //定時器初始化</p>

117、<p>  Delay(50);</p><p>  LcdInit();//LCD初始化</p><p>  /*****************************************/</p><p>  for(i=0;i<2;i++)</p><p><b>  {</b></

118、p><p>  LcdLightOff();</p><p>  Delay(660);</p><p>  LcdLightOn();</p><p>  Delay(660);</p><p><b>  }</b></p><p>  Delay(660);</p&

119、gt;<p>  LcdClear();</p><p>  Delay(660);</p><p>  /****************************************/</p><p>  Show_Init();</p><p>  Delay(20);</p><p>  Val

120、ue=90;//速度初值</p><p>  Pwm_Value=Value;</p><p><b>  EA=1;</b></p><p><b>  for(;;)</b></p><p><b>  {</b></p><p>  KEY()

121、;//按鍵處理</p><p>  MeasureSpeed(); //速度反饋</p><p>  LcdWriteCmd(0x94);</p><p>  Show_Value(FK); //顯示實時速度</p><p>  LcdWriteCmd(0x84);</p><p>  Show_Value

122、(SD); //顯示設定值</p><p>  LcdWriteCmd(0x8c); //顯示方向</p><p>  if(D==0)LcdPuts("正向");</p><p>  if(D==1)LcdPuts("反向");</p><p><b>  }</b>&l

123、t;/p><p><b>  }</b></p><p>  void T1ZD() interrupt 3 //T1中斷服務程序</p><p><b>  {</b></p><p>  unsigned char m=0;</p><p><b>  TR1=0;

124、</b></p><p>  PWM_Init(); //電機控制</p><p>  if(SWTR) //延時程序控制</p><p><b>  {</b></p><p>  if(--SWTV==0) SWTF=1;</p><p><b>  }</

125、b></p><p><b>  TR1=1;</b></p><p><b>  }</b></p><p><b>  5程序的調試</b></p><p>  5.1 編程軟件Keil C51簡介</p><p>  我們使用KEIL C51

126、軟件來對程序進行編譯和調試。Keil C51是德國知名軟件公司Keil(現(xiàn)已并入ARM公司)開發(fā)的基于8051內核的微控制器軟件開發(fā)平臺,是目前開發(fā)8051內核單片機的主流編譯工具。</p><p>  5.2 程序編譯和調試</p><p> ?。?)運行Keil C51軟件。新建工程。選擇Keil C51軟件的菜單“Project | New |u Vision Project…”,參

127、考圖5.1。彈出一個名為“Create New Project”的對話框,為工程取名為“SOK”。然后存放到指定文件夾。</p><p> ?。?)緊接著,Keil C51提示您選擇CPU器件。8051內核單片機最早是由Intel公司研發(fā)的。因此,在這里您可以選擇Intel公司的第1個器件“80/87C52”,參見圖 5.2。接下來彈出一個對話框。我們不需要添加啟動代碼,所以這里選擇 “否(N)”。</p&

128、gt;<p> ?。?)選擇Keil C51軟件的菜單“File | New…”,將出現(xiàn)的新文檔命名為“SOK”。選擇菜單“File | Save”,彈出一個名為“Save As”的對話框。建議將文件名改為“SOK.c”, 如此,我們建立了一個C語言的程序文本。如圖5.3所示。</p><p>  (4)單擊Keil C51軟件左邊“Project Workspace”項目工作窗口的“+”,然后右擊

129、“Source Group 1”文件夾,會彈出如圖5.4所示的選擇菜單。單擊其中的“Add Files to Group 'Source Group 1'”項,將彈出如圖5.5所示的對話框。選擇文件類型為“C Source file”,這時,對話框內將出現(xiàn)剛才保存的“SOK.c”。單擊文件“SOK.c”,再按一次“Add”按鈕,最后按“Close”按鈕。這時,源程序文件“main.asm”出現(xiàn)在項目工作窗口的“Sourc

130、e Group 1”文件夾內,可以單擊左邊的“+”展開后查看。</p><p>  (5)在“SOK.c”文件中輸入程序代碼,單擊Keil C51工具欄的“”圖標,彈出名為“Options for Target ‘Target 1’”的對話框。單擊“Output”標簽頁,選中“Create HEX File”項,然后“確定”。參見圖 5.6。單擊工具欄的“”按鈕編譯當前源程序。編譯結果會顯示在輸出窗口內。如果是“

131、0 Error(s), 0 Warning(s)”就表示程序沒有問題了。如果存在錯誤或警告,請仔細檢查您的程序是否與程序清單一致。修改后,再編譯,直到通過為止。如此可成功生成HEX文件。</p><p> ?。?)使用“Flash Magic”軟件進行ISP方式下載HEX文件。如下圖5.7所示。選擇實際使用的COM端口,Baud Rate選擇9600或19200,Device選擇89V51RD2。勾中“Erase

132、 Blocks used by Hex File”。點擊“Browse”,然后打開文件我們需要下載的SOK.hex文件。勾中“Verify after programming”,其它選項不要選擇。按“Start”按鈕,會彈出一個紅色對話框提示您復位單片機以進入ISP模式。這時按一次Quick51實驗板上的RST按鍵,ISP下載過程開始。如果下載失敗,請仔細檢查操作步驟,再試一次。再按一次Quick51實驗板上的RST按鍵,程序開始運行。

溫馨提示

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

評論

0/150

提交評論