版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計--單片機(jī)控制步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計-單片機(jī)控制步進(jìn)電機(jī)
- 單片機(jī)步進(jìn)電機(jī)課程設(shè)計--單片機(jī)控制步進(jìn)電機(jī)的設(shè)計
- 單片機(jī)課程設(shè)計--基于單片機(jī)的步進(jìn)電機(jī)控制
- 單片機(jī)課程設(shè)計——單片機(jī)控制步進(jìn)電機(jī)控制系統(tǒng)設(shè)計
- 單片機(jī)-控制步進(jìn)電機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計--步進(jìn)電機(jī)控制
- 單片機(jī)課程設(shè)計報告--步進(jìn)電機(jī)控制設(shè)計
- 基于單片機(jī)的步進(jìn)電機(jī)控制單片機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計---步進(jìn)電機(jī)控制
- 單片機(jī)課程設(shè)計--步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計步進(jìn)電機(jī)控制設(shè)計
- 單片機(jī)課程設(shè)計---步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計--基于單片機(jī)的四相步進(jìn)電機(jī)控制
- 單片機(jī)課程設(shè)計-步進(jìn)電機(jī)
- 單片機(jī)課程設(shè)計-步進(jìn)電機(jī)的控制
- 單片機(jī)課程設(shè)計--步進(jìn)電機(jī)角度控制
- 單片機(jī)課程設(shè)計---步進(jìn)電機(jī)控制 (2)
- 單片機(jī)課程設(shè)計——基于單片機(jī)的步進(jìn)電機(jī)控制器設(shè)計
- 單片機(jī)課程設(shè)計-步進(jìn)電機(jī)的控制
評論
0/150
提交評論