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

下載本文檔

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

文檔簡介

1、<p><b>  單片機(jī)原理及應(yīng)用</b></p><p><b>  課程設(shè)計報告</b></p><p>  設(shè)計課題: 單片機(jī)控制步進(jìn)電機(jī) </p><p>  專業(yè)班級: 信工091班 </p><p>  學(xué)生姓名: *

2、 </p><p>  指導(dǎo)教師: </p><p>  2012 年 5 月</p><p><b>  目 錄</b></p><p><b>  目 錄1</b></p><p><b>  1

3、設(shè)計任務(wù)書2</b></p><p>  1.1 基本設(shè)計要求2</p><p>  1.2 選作項目2</p><p><b>  2 設(shè)計闡明3</b></p><p><b>  2.1設(shè)計內(nèi)容3</b></p><p><b>  2.

4、2設(shè)計要求3</b></p><p>  2.3設(shè)備及工作環(huán)境3</p><p>  3 系統(tǒng)方案整體設(shè)計4</p><p>  3.1 設(shè)計思路4</p><p><b>  4 硬件設(shè)計6</b></p><p>  4.1 系統(tǒng)硬件設(shè)計6</p><

5、;p>  4.1.1 最小單片機(jī)系統(tǒng)6</p><p>  4.1.2 鍵盤設(shè)計6</p><p>  4.2 系統(tǒng)工作原理論述7</p><p><b>  5 軟件設(shè)計9</b></p><p>  5.1 分析論證9</p><p>  5.1.1 步進(jìn)電機(jī)運(yùn)行驅(qū)動模塊9&

6、lt;/p><p>  5.1.2 溫度采集模塊9</p><p>  5.1.3 主函數(shù)模塊9</p><p>  5.1.4 整體功效9</p><p>  5.2 程序流程圖10</p><p>  5.3程序清單11</p><p>  6 調(diào)試過程及分析18</p>

7、<p><b>  7 設(shè)計總結(jié)19</b></p><p>  參 考 文 獻(xiàn)20</p><p><b>  1 設(shè)計任務(wù)書</b></p><p>  1.1 基本設(shè)計要求</p><p> ?。?)用萬能板、主芯片AT89S52、35BYJ412步進(jìn)電機(jī)、BLN2003以及

8、其他周圍原件芯片完成實驗設(shè)計。</p><p> ?。?)程序的首地址應(yīng)使目標(biāo)機(jī)可以直接運(yùn)行,即從0000H開端。在主程序的開端部分必須設(shè)置一個合適的棧底。程序放置的地址須持續(xù)且靠前,不要在中間留下大批的空間地址,以使目標(biāo)機(jī)可以應(yīng)用較少的硬件資源。</p><p> ?。?)采用單片機(jī)控制一個三相單三拍的步進(jìn)電機(jī)工作。步進(jìn)電機(jī)的旋轉(zhuǎn)方向由正反轉(zhuǎn)控制信號控制。步進(jìn)電機(jī)的步數(shù)由鍵盤輸入,可輸入

9、的步數(shù)分別為3、6、9、12、15、18、21、24和27步,且鍵盤具有鍵盤鎖功能,當(dāng)鍵盤上鎖時,步進(jìn)電機(jī)不接受輸入步數(shù),也不會運(yùn)轉(zhuǎn)。只有當(dāng)鍵盤鎖打開并輸入步數(shù)時,步進(jìn)電機(jī)才開始工作。</p><p> ?。?)電機(jī)運(yùn)轉(zhuǎn)的時候有正轉(zhuǎn)和反轉(zhuǎn)指示燈指示。</p><p> ?。?)電機(jī)在運(yùn)轉(zhuǎn)過程中,如果過熱,則電機(jī)停止運(yùn)轉(zhuǎn),同時紅色指示燈亮,同時警報響。本題目的關(guān)鍵之處是:如何生成控制步進(jìn)電機(jī)

10、的脈沖序列。</p><p><b>  1.2 選作項目</b></p><p>  1、用單片機(jī)(AT89S52)為主芯片設(shè)計電路來控制步進(jìn)電機(jī)。</p><p>  2、設(shè)三個自鎖按鍵,分別作開關(guān)鍵盤、左轉(zhuǎn)、右轉(zhuǎn)控制。</p><p>  3、設(shè)9個觸電按鍵分別控制輸入的步數(shù)為3、6、9、12、15、18、21、2

11、4和27步。</p><p>  4、設(shè)置一片LCD12864顯示器實時顯示步進(jìn)電機(jī)工作狀態(tài),并提示用戶步操作。</p><p><b>  2 設(shè)計闡明</b></p><p><b>  2.1設(shè)計內(nèi)容</b></p><p>  用ZY15MCU12BD型綜合單片機(jī)實驗箱仿真實現(xiàn)控制步進(jìn)電機(jī)集

12、采問過程。</p><p><b>  2.2設(shè)計要求</b></p><p> ?。?)采用單片機(jī)控制一個三相單三拍的步進(jìn)電機(jī)工作。步進(jìn)電機(jī)的旋轉(zhuǎn)方向由正反轉(zhuǎn)控制信號控制。步進(jìn)電機(jī)的步數(shù)由鍵盤輸入,可輸入的步數(shù)分別為3、6、9、12、15、18、21、24和27步,且鍵盤具有鍵盤鎖功能,當(dāng)鍵盤上鎖時,步進(jìn)電機(jī)不接受輸入步數(shù),也不會運(yùn)轉(zhuǎn)。只有當(dāng)鍵盤鎖打開并輸入步數(shù)時,

13、步進(jìn)電機(jī)才開始工作。</p><p> ?。?)電機(jī)運(yùn)轉(zhuǎn)的時候有正轉(zhuǎn)和反轉(zhuǎn)指示燈指示。</p><p> ?。?) 電機(jī)在運(yùn)轉(zhuǎn)過程中,如果過熱,則電機(jī)停止運(yùn)轉(zhuǎn),同時紅色指示燈亮,同時警報響。</p><p> ?。?) 上機(jī)調(diào)試程序。</p><p> ?。?) 寫出設(shè)計報告。</p><p>  2.3設(shè)備及工作環(huán)境

14、</p><p>  (1) 硬件:AT89S52單片機(jī)一片、35BYJ412步進(jìn)電機(jī)一臺、ISP下載器一個、LCD12864顯示器、溫度傳感器18B20芯片。</p><p>  (2) 軟件:Windows操縱系統(tǒng)、Keil C51軟件。</p><p>  3 系統(tǒng)方案整體設(shè)計</p><p><b>  3.1 設(shè)計思路&l

15、t;/b></p><p>  步進(jìn)電機(jī)的不同驅(qū)動方式,都是在工作時,脈沖信號按一定順序輪流加到三相繞組上,從而實現(xiàn)不同的工作狀態(tài)。由于通電順序不同,其運(yùn)行方式有三相單三相拍、三相雙三拍和三相單、雙六拍三種(注意:上面“三相單三拍”中的“三相”指定子有三相繞組;“拍”是指定子繞組改變一次通電方式;“三拍”表示通電三次完成一個循環(huán)?!叭嚯p三拍”中的“雙”是指同時有兩相繞組通電)。</p>&l

16、t;p> ?。?)三相單三拍運(yùn)行方式:下頁圖所示為反應(yīng)式步進(jìn)電動機(jī)工作原理圖,若通過脈沖分配器輸出的第一個脈沖使A相繞組通電,B,C相繞組不通電,在A相繞組通電后產(chǎn)生的磁場將使轉(zhuǎn)子 上產(chǎn)生反應(yīng)轉(zhuǎn)矩,轉(zhuǎn)子的1、3齒將與定子磁極對齊,如果圖(a)所示。第二個脈沖到來,使B相繞組通電,而A、C相繞組不通電;B相繞組產(chǎn)生的磁場將 使轉(zhuǎn)子的2、4齒與B相磁極對齊,如圖(b)所示,與圖(a)相比,轉(zhuǎn)子逆時針方向轉(zhuǎn)動了一個角度。第三個脈沖到來后

17、,是C相繞組通電,而 A、B相不通電,這時轉(zhuǎn)子的1、3齒會與C組對齊,轉(zhuǎn)子的位置如圖(c)所示,與圖(b)比較,又逆時針轉(zhuǎn)過了一個角度。</p><p>  圖 反應(yīng)式步進(jìn)電機(jī)工作原理圖</p><p>  當(dāng)脈沖不斷到來時,通過分配器使定子的繞組按著A相--B相--C相--A相……的規(guī)律不斷地接通與斷開,這時步進(jìn)電動機(jī)的轉(zhuǎn)子就連續(xù)不停地一步步的逆時 針方向轉(zhuǎn)動。如果改變步進(jìn)電動機(jī)的轉(zhuǎn)動

18、方向,只要將定子各繞組通電的順序改為A相--C相--B相--A相,轉(zhuǎn)子轉(zhuǎn)動方向即改為順時針方向。</p><p>  單三拍分配方式時,步進(jìn)電動機(jī)由A相通電轉(zhuǎn)換到B相同點,步進(jìn)電動機(jī)的轉(zhuǎn)子轉(zhuǎn)過一個角度,稱為一步。這時轉(zhuǎn)子轉(zhuǎn)過的角度是30度。步進(jìn)電動機(jī)每一步轉(zhuǎn)過的角度稱為步距角。</p><p> ?。?)三相雙三拍運(yùn)行方式三相雙三拍運(yùn)行方式:每次都有兩個繞組通電,通電方式是AB--BC--

19、CA--AB……,如果通電順序改為AB--CA--BC--AB……則步進(jìn)電機(jī)反轉(zhuǎn)。雙三拍分配方式時,步進(jìn)電動機(jī)的步距角也是30度</p><p>  (3)三相單,雙六拍運(yùn)行方式:三相六拍分配方式就是每個周期內(nèi)有六個通電狀態(tài)。這六中通電狀態(tài)的順序可以使A--AB--B--BC--C--CA--A……或者A-- CA--C--BC--B--AB--A……六拍通電方式中,有一個時刻兩個繞組同時通電,這是轉(zhuǎn)子齒的位置將

20、位于通電的兩相的中間位置。在三相六拍分配 方式下,轉(zhuǎn)子每一步轉(zhuǎn)過的角度只是三相三拍方式下的一半,步距角是15度。</p><p>  單三拍運(yùn)行的突出問題是每次只有一相繞組通電,在轉(zhuǎn)換過程中,一相繞組斷電,另一相繞組通電,容易發(fā)生失步;另外單靠一相繞組通電吸引轉(zhuǎn)子,穩(wěn)定性不好,容易在平衡位置附近震蕩,故用的較少。</p><p>  雙三拍運(yùn)行的特點是每次都有兩相繞組通電,且在轉(zhuǎn)換過程中始

21、終有一相繞組保持通電狀態(tài),因此工作穩(wěn)定,且步距角與單三拍相同。</p><p>  六拍運(yùn)行方式轉(zhuǎn)換時始終有一相繞組通電,且步距角較小,故工作穩(wěn)定性好,但電源較復(fù)雜,實際應(yīng)用較多。</p><p><b>  4 硬件設(shè)計</b></p><p>  4.1 系統(tǒng)硬件設(shè)計</p><p>  4.1.1 最小單片機(jī)系統(tǒng)&

22、lt;/p><p>  5V電源:給系統(tǒng)供電。</p><p>  復(fù)位電路:程序跑飛時復(fù)位電路可以使程序從新執(zhí)行,相當(dāng)于電腦的重啟。</p><p>  晶振:給單片機(jī)運(yùn)行提供時鐘。比如電腦的2.2GHz頻率。</p><p>  EA接高電平:表示運(yùn)行內(nèi)部程序存儲器下載的程序。</p><p>  P0口接排阻:P0口

23、開漏結(jié)構(gòu),使用時一般接排阻拉高電平。</p><p>  4.1.2 鍵盤設(shè)計</p><p>  該電路中采用獨立鍵盤工作方式,共設(shè)有12個按鍵,分別提供3、6、9、12、15、18、21、24布局選擇功能、鍵盤鎖功能以及步進(jìn)電機(jī)轉(zhuǎn)動方向選擇功能。其中有程序決定起作用。</p><p>  4.2 系統(tǒng)工作原理論述</p><p>  該系

24、統(tǒng)的工作核心CPU為ATMEL公司生產(chǎn)的AT89S52芯片將多種功能的8位CPU與FPEROM(快閃可編程/擦除只讀存儲器)結(jié)合在一個芯片上,是一種低功耗、高性能的CMOS控制器,為很多嵌入式控制應(yīng)用提供了非常靈活而又價格適宜的方案,其性能價格比遠(yuǎn)高于同類芯片。它與MCS-51指令系統(tǒng)兼容,片內(nèi)FPEROM允許對程序存儲器在線重復(fù)編程,也可用常規(guī)的EPROM編程器編程,可循環(huán)寫入/擦除1000次。89S52內(nèi)含4KB的FPEROM,一般

25、的EEPROM的字節(jié)擦除時間和寫入時間基本上均為10ms,對于任一個實時控制系統(tǒng)來說,這樣長的時間是不可能在線修改程序的。</p><p>  CPU為Atmel公司生產(chǎn)的89C51/89C52/89C55等。出廠所配晶振頻率為11.0592MH,每個機(jī)器周期為1.085us,用戶更換晶振以提高速度;</p><p>  存貯器為64K,前4K/8K20K在CPU內(nèi)部,其它程序在EPR0M

26、27512中;</p><p>  數(shù)據(jù)存貯器為32K(62256),地址為8000—FFFFH;</p><p>  Ⅰ/O擴(kuò)展8155,片內(nèi)RAM地址∶200O-20FFH ;</p><p>  8155命令口地址為∶2100H ;</p><p>  A口地址∶21O1H B口地址:2102H C口地址:2103H ;</p&g

27、t;<p>  T低八位∶2104H T高八位∶2105H ;</p><p>  多路模擬開關(guān)的使用∶ </p><p>  IN0∶P1=0F8H IN4:P1=0FCH IN1∶P1=0F9H IN5:P1=OFDH </p><p>  IN2∶P1=0FAH IN5:P1=0FEH IN3∶P1=0FBH IN7:P1=0FF

28、H </p><p>  不掉電數(shù)據(jù)存貯器為∶500EH-507FH ;</p><p>  控制板∶160x1O9(mm) 供電∶+5V300mA +12V100mA -12V100mA ;</p><p>  AT89C51是一種低功耗、高性能的片內(nèi)含有4KB快閃可編程/擦除只讀存儲器(FPEROM-Flash Programmable and Eraseabl

29、e Read Only Memory)的8位CMOS微控制器,使用高密度、非易失存儲技術(shù)制造,并且與80C51引腳和指令系統(tǒng)完全兼容;</p><p><b>  主要性能: </b></p><p>  與MCS-51 微控制器產(chǎn)品系列兼容;</p><p>  片內(nèi)有4KB可在線重復(fù)編程的快閃擦寫存儲器 。</p><p

30、><b>  引腳簡介:</b></p><p><b>  整體介紹:</b></p><p>  該系統(tǒng)采用的芯片還有:DS18B20溫度傳感器、ULN2003A以及MP28GA四相五線步進(jìn)電機(jī),并且步進(jìn)電機(jī)在雙八拍的方式下工作,步矩為 5.625° ,步進(jìn)電機(jī)的旋轉(zhuǎn)方向由正反轉(zhuǎn)控制信號控制。步進(jìn)電機(jī)的步數(shù)由鍵盤輸入,可通過獨

31、立鍵盤S1~S9輸入的步數(shù)分別為3、6、9、12、15、18、21、24和27步對應(yīng)的角度為16.875°、33.725°、……、151.875°,且鍵盤S10具有鍵盤鎖功能,當(dāng)鍵盤上鎖時,步進(jìn)電機(jī)不接受輸入步數(shù),也不會運(yùn)轉(zhuǎn)。只有當(dāng)鍵盤鎖打開,選擇運(yùn)轉(zhuǎn)方向并且輸入步數(shù)時,步進(jìn)電機(jī)才開始工作。</p><p>  電機(jī)運(yùn)轉(zhuǎn)的時候有正轉(zhuǎn)指示燈D2和反轉(zhuǎn)指示燈D3指示。</p>

32、<p>  電機(jī)在運(yùn)轉(zhuǎn)過程中用溫度傳感器采集步進(jìn)電機(jī)外表溫度(可設(shè)置),如果過熱,則電機(jī)停止運(yùn)轉(zhuǎn),同時紅色指示燈亮,同時蜂鳴器警報響。</p><p><b>  5 軟件設(shè)計</b></p><p><b>  5.1 分析論證</b></p><p>  此步進(jìn)電機(jī)控制電路設(shè)計與實現(xiàn),主要采用了ULN20

33、03A驅(qū)動芯片,溫度傳感器芯片DS18B20芯片,獨立鍵盤等,包含步進(jìn)電機(jī)運(yùn)行驅(qū)動,溫度采集,主函數(shù)三大功效模塊。</p><p>  5.1.1 步進(jìn)電機(jī)運(yùn)行驅(qū)動模塊</p><p>  由于該系統(tǒng)中沒有完全使用I/O端口,所以采用了獨立鍵盤的工作方式,系統(tǒng)工作時,鍵盤控制的I/O口處于高電平狀態(tài),當(dāng)按鍵按下時觸發(fā)低電平,驅(qū)動程序?qū)崟r監(jiān)測并立即響應(yīng)執(zhí)行相應(yīng)工作。</p>&

34、lt;p>  5.1.2 溫度采集模塊</p><p>  該模塊的重要功效是對步進(jìn)電機(jī)的外表采集溫度,并且對已設(shè)定好的數(shù)值進(jìn)行比較,從而確定機(jī)身溫度是否過高,正常時電機(jī)正常轉(zhuǎn)動,當(dāng)溫度過高時電機(jī)不再轉(zhuǎn)動,并且蜂鳴器報警,紅燈點亮。</p><p>  5.1.3 主函數(shù)模塊</p><p>  該模塊重要功效是調(diào)動溫度采集函數(shù)、步進(jìn)電機(jī)函數(shù)中函數(shù),實現(xiàn)模塊化

35、編程。</p><p>  5.1.4 整體功效</p><p>  AT89S52芯片控制ULN2003A芯片驅(qū)動步進(jìn)電機(jī),掃描鍵盤輸入運(yùn)行狀態(tài)以及運(yùn)轉(zhuǎn)步數(shù),當(dāng)電機(jī)外表溫度超過32℃是電機(jī)停止轉(zhuǎn)動,并且報警!</p><p><b>  5.2 程序流程圖</b></p><p>  主程序流程圖如圖所示:</p

36、><p><b>  是</b></p><p><b>  否</b></p><p><b>  是</b></p><p><b>  否</b></p><p>  否

37、 </p><p><b>  圖2 程序流程圖</b></p><p><b>  5.3程序清單</b></

38、p><p><b>  步進(jìn)電機(jī)驅(qū)動函數(shù):</b></p><p><b>  //BJDJ.h</b></p><p>  #ifndef _BJDJ_H_</p><p>  #define _BJDJ_H_ </p><p>  #include <reg52.h

39、> </p><p>  #include <intrins.h> </p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit k1=P1^0;</p><p&

40、gt;  sbit k2=P1^1;</p><p>  sbit k3=P1^2;</p><p>  sbit k4=P1^3;</p><p>  sbit k5=P1^4;</p><p>  sbit k6=P1^5;</p><p>  sbit k7=P1^6;</p><p> 

41、 sbit k8=P1^7;</p><p>  sbit k9=P0^0;</p><p>  sbit k10=P0^1;</p><p>  sbit k11=P0^2;</p><p>  sbit k12=P0^3;</p><p>  void key_scan();</p><p>

42、;  void motor_turn();</p><p>  void motor_stop();</p><p><b>  #endif</b></p><p><b>  //BJDJ.c</b></p><p>  #include"BJDJ.h"</p>

43、<p>  uchar code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};</p><p>  uchar code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};</p><p>  uchar rate ;</p><p>  extern

44、uchar i=0; </p><p>  /********************************************************/ </p><p>  /* 延時

45、 </p><p>  /********************************************************/</p><p>  void delay(uchar x)</p><p>  { </p><p>  uchar i,j;</

46、p><p>  for(i=0;i<x;i++);</p><p>  for(j = 0 ; j<110 ; j++) ;</p><p><b>  }</b></p><p>  /********************************************************/</p

47、><p><b>  /*步進(jìn)電機(jī)正轉(zhuǎn)</b></p><p>  /********************************************************/</p><p>  void motor_ffw(uchar x)</p><p><b>  { </b><

48、/p><p>  uchar i,j;</p><p>  for (j=0; j<x; j++) //轉(zhuǎn)1*n圈 </p><p><b>  { </b></p><p>  for (i=0; i<8; i++) //一個周期轉(zhuǎn)45度</p><p>&l

49、t;b>  {</b></p><p>  P2 = FFW[i]; //取數(shù)據(jù)</p><p>  delay(150); //調(diào)節(jié)轉(zhuǎn)速</p><p><b>  }</b></p><p><b>  }</b></p>

50、<p><b>  }</b></p><p>  /********************************************************/</p><p><b>  /*</b></p><p><b>  /*步進(jìn)電機(jī)反轉(zhuǎn)</b></p>&l

51、t;p>  /********************************************************/</p><p>  void motor_rev(uchar x)</p><p><b>  { </b></p><p>  uchar i,j;</p><p>  for (j

52、=0; j<x; j++) //轉(zhuǎn)1*n圈 </p><p><b>  { </b></p><p><b>  //退出此循環(huán)程序</b></p><p>  for (i=0; i<8; i++) //一個周期轉(zhuǎn)45度</p><p><b>

53、  {</b></p><p>  P2 = REV[i]; //取數(shù)據(jù)</p><p>  delay(150); //調(diào)節(jié)轉(zhuǎn)速</p><p><b>  }</b></p><p><b>  }</b></p><p&g

54、t;<b>  }</b></p><p>  /*******************************************************</p><p><b>  *鍵盤掃描</b></p><p>  ***********************************************

55、*******/</p><p>  void key_scan()</p><p><b>  {</b></p><p><b>  i=0;</b></p><p><b>  if(k1==0)</b></p><p><b>  {&

56、lt;/b></p><p><b>  delay(5);</b></p><p>  if(k1==0)i=24;</p><p><b>  }</b></p><p><b>  if(k2==0)</b></p><p><b>

57、;  {</b></p><p><b>  delay(5);</b></p><p>  if(k2==0)i=46;</p><p><b>  }</b></p><p><b>  if(k3==0)</b></p><p><

58、;b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k3==0)i=72;</p><p><b>  }</b></p><p><b>  if(k4==0)</b></p><p&g

59、t;<b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k4==0)i=96;</p><p><b>  }</b></p><p><b>  if(k5==0)</b></p>&l

60、t;p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k5==0)i=120;</p><p><b>  }</b></p><p><b>  if(k6==0)</b></p&g

61、t;<p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k6==0)i=144;</p><p><b>  }</b></p><p><b>  if(k7==0)</b>&l

62、t;/p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k7==0)i=168;</p><p><b>  }</b></p><p><b>  if(k8==0)</b

63、></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k8==0)i=192;</p><p><b>  }</b></p><p><b>  if(k9==0)

64、</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k9==0)i=216;</p><p><b>  }</b></p><p><b>  }&l

65、t;/b></p><p>  /********************************************************</p><p><b>  *電機(jī)轉(zhuǎn)動</b></p><p>  ********************************************************/</

66、p><p>  void motor_turn()</p><p><b>  {</b></p><p>  if(k10==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><

67、;p>  if(k10==0)P2=P2&0xf0;</p><p><b>  }</b></p><p>  if(k11==0&&k12==1&&k10==1)</p><p><b>  { </b></p><p><b>  de

68、lay(5);</b></p><p>  if(k11==0&&k12==1&&k10==1)</p><p>  motor_ffw(i);</p><p><b>  }</b></p><p>  if(k12==0&&k11==1&&

69、k10==1)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(k12==0&&k11==1&&k10==1)</p><p>  motor_rev(i);</p><p&

70、gt;<b>  }</b></p><p><b>  }</b></p><p>  void motor_stop()</p><p><b>  {</b></p><p>  motor_rev(0);</p><p><b>

71、;  }</b></p><p>  溫度傳感器18B20驅(qū)動函數(shù):</p><p>  //DS18B20.h</p><p>  #ifndef __DS18B20_H__</p><p>  #define __DS18B20_H__</p><p>  #include<reg52.h>

72、</p><p>  #include < intrins.h ></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  extern uchar T;</p><p>  sbit DQ=P2

73、^7; //溫度輸入口</p><p>  sbit bell=P0^4;</p><p>  sbit led1=P0^7;</p><p>  void delay2(uint t);</p><p>  void ow_reset(void);</p><p

74、>  void write_byte(uchar val);</p><p>  void read_temp();</p><p>  void work_temp();</p><p><b>  #endif</b></p><p>  //DS18B20.c</p><p>  #i

75、nclude"DS18B20.h"</p><p>  extern uchar data temp_data[2]={0x00,0x00};</p><p>  uchar flag;</p><p>  char presence=1;</p><p><b>  uchar T;</b><

76、/p><p>  /***********11微秒延時函數(shù)**********/</p><p>  void delay2(uint t)</p><p><b>  {</b></p><p>  for(;t>0;t--);</p><p><b>  }</b>&l

77、t;/p><p>  /***********18B20復(fù)位函數(shù)**********/</p><p>  void ow_reset(void)</p><p><b>  {</b></p><p>  presence=1;</p><p>  while(presence)</p>

78、<p><b>  {</b></p><p>  while(presence)</p><p><b>  {</b></p><p>  DQ=1;_nop_();_nop_();</p><p>  DQ=0; //</p><p>  delay

79、2(50); // 550us</p><p>  DQ=1; // </p><p>  delay2(6); // 66us</p><p>  presence=DQ; // presence=0繼續(xù)下一步</p><p><b>  }</b></p><p>  delay2(45

80、); //延時500us</p><p>  presence = ~DQ;</p><p><b>  }</b></p><p><b>  DQ=1;</b></p><p><b>  } </b></p><p>  /*********

81、*18B20寫命令函數(shù)*********/</p><p>  void write_byte(uchar val)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for (i=8; i>0; i--) </p>

82、<p><b>  {</b></p><p><b>  DQ=1;</b></p><p>  _nop_();_nop_(); </p><p><b>  DQ = 0;</b></p><p>  _nop_();_nop_();_nop_();_nop

83、_();_nop_();//5us</p><p>  DQ = val&0x01; //最低位移出</p><p>  delay2(6); //66us</p><p>  val=val/2; //右移一位</p><p><b>  }</b></p&

84、gt;<p><b>  DQ = 1;</b></p><p>  delay2(1); </p><p><b>  }</b></p><p>  /*********18B20讀1個字節(jié)函數(shù)********/</p><p>  uchar read_byte(void)<

85、;/p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  uchar value = 0;</p><p>  for (i=8;i>0;i--)</p><p><b>  {</b></

86、p><p><b>  DQ=1;</b></p><p>  _nop_();_nop_();</p><p>  value>>=1;</p><p>  DQ = 0; //</p><p>  _nop_();_nop_();_nop_();_nop_();

87、 //4us</p><p><b>  DQ = 1;</b></p><p>  _nop_();_nop_();_nop_();_nop_(); //4us </p><p>  if(DQ)value|=0x80;</p><p>  delay2(6); //66us</p&g

88、t;<p><b>  }</b></p><p><b>  DQ=1;</b></p><p>  return(value);</p><p><b>  }</b></p><p>  /***********讀出溫度函數(shù)**********/</p

89、><p>  void read_temp()</p><p><b>  {</b></p><p>  ow_reset(); //總線復(fù)位</p><p>  write_byte(0xCC); // 發(fā)Skip ROM命令</p><p>  write_byte(0xBE); /

90、/ 發(fā)讀命令</p><p>  temp_data[0]=read_byte(); //溫度低8位</p><p>  temp_data[1]=read_byte(); //溫度高8位</p><p>  ow_reset();</p><p>  write_byte(0xCC); // Skip ROM</p><

91、p>  write_byte(0x44); // 發(fā)轉(zhuǎn)換命令</p><p><b>  }</b></p><p>  /***********溫度數(shù)據(jù)處理函數(shù)**********/</p><p>  void work_temp()</p><p><b>  {</b></p&g

92、t;<p>  T=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);</p><p><b>  }</b></p><p><b>  主函數(shù):</b></p><p><b>  //main.c<

93、/b></p><p>  #include"DS18B20.h"</p><p>  #include"BJDJ.h"</p><p>  void main()</p><p><b>  {</b></p><p><b>  whil

94、e(1)</b></p><p><b>  {</b></p><p><b>  T=0;</b></p><p><b>  P1=0xff;</b></p><p><b>  P0=0x0f;</b></p><p

95、><b>  led1=1;</b></p><p>  ow_reset(); // 開機(jī)先轉(zhuǎn)換一次</p><p>  write_byte(0xCC); // Skip ROM</p><p>  write_byte(0x44); // 發(fā)轉(zhuǎn)換命令</p><p>  read_temp();

96、 //讀出18B20溫度數(shù)據(jù)</p><p>  work_temp(); //處理溫度數(shù)據(jù)</p><p>  key_scan();</p><p><b>  if(T>31)</b></p><p><b>  {</b></p><

97、p>  motor_stop();</p><p><b>  led1=0;</b></p><p><b>  bell=1;</b></p><p>  delay2(1000);</p><p><b>  }</b></p><p>&l

98、t;b>  else </b></p><p><b>  {</b></p><p><b>  led1=1;</b></p><p><b>  bell=0;</b></p><p>  motor_turn();</p><p&g

99、t;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  6 調(diào)試過程及分析</b></p><p>  編寫好的源程序在 Keil 編譯后呈現(xiàn)很多錯誤,這些錯誤有很多時平時

100、的實驗碰到過的,例如:字母開頭忘加0,零和字母O弄混雜了,有些標(biāo)號用了幾次,CJNE寫成了CJNZ等等,幸好這些錯誤在平時的實驗中碰到了,所以改錯誤很輕易,。除了常見的錯誤外,還有幾條錯誤時在前幾次實驗都沒有出現(xiàn)過,如:AJMP跳轉(zhuǎn)指令跳不回指定的地位,是由于跳轉(zhuǎn)的長度大于AJMP跳轉(zhuǎn)的長度,最后只好用LJMP跳轉(zhuǎn)后才跳到指定的地位。在前期的程序編寫和幾天的上機(jī)調(diào)試,使我又獲得了很多新的知識,由于前期編寫程序時查了很多材料學(xué)到了很多知識

101、,這幾天的調(diào)試更時獲得很新的知識,由于程序中又很多的錯誤,為了修正錯誤必須看書或向別人請教,在這個過程中無意識的獲得了很多知識。同時也使我對單片機(jī)更感興趣了,這點我感到很重要,相信這會對以后的學(xué)習(xí)有所幫助。</p><p><b>  7 設(shè)計總結(jié)</b></p><p>  本次課程設(shè)計是用ZY15MCU12BD綜合單片機(jī)實驗箱及串口電路設(shè)計單片機(jī)驅(qū)動步進(jìn)電機(jī)電路,

102、經(jīng)過兩個星期的調(diào)試,成果滿足基本設(shè)計請求,驗證無誤。設(shè)計重要用到了多種芯片,程序也比較長,比較麻煩,同時也碰到了不少艱苦,尤其是關(guān)于校時模塊和時鐘與秒表之間切換的設(shè)計實現(xiàn)。關(guān)于顯示模塊,在以前的實驗中做過,所以題目很輕易解決。</p><p>  通過本次設(shè)計,我懂得了時鐘的設(shè)計流程,尤其是硬、軟件的設(shè)計方法以及鍵盤顯示電路的基礎(chǔ)功效及編程方法和鍵盤電路和顯示電路的一般原理,也進(jìn)一步了解了8031定時器的應(yīng)用和中

103、斷CPU程序的編程方法,開辟了思路,,提高了分工協(xié)作才能和分析題目,解決題目的能力。</p><p><b>  參 考 文 獻(xiàn) </b></p><p>  1.張毅剛編著,《單片機(jī)原理及應(yīng)用》高等教育出版社,2010。</p><p>  2. 郭天祥編著,《Altium Designer6.9 PCB設(shè)計視頻教程》,2007。</p

104、><p>  3.樓然苗等編著,《51系列單片機(jī)設(shè)計實例》北京航空航天大學(xué)出版社,2006。</p><p>  4.汪道輝編著,《單片機(jī)系統(tǒng)設(shè)計與實踐》 電子工業(yè)出版社 2005。</p><p>  5.譚浩強(qiáng)編著,《C程序設(shè)計(第三版)》清華大學(xué)出版社 2005。</p><p>  6.王港元編著,《電工電子實踐指導(dǎo)》江西科學(xué)技術(shù)出版社

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論