版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 單片機(jī)原理及系統(tǒng)課程設(shè)計</p><p> 專 業(yè): 電氣工程及其自動化 </p><p> 班 級: </p><p> 姓 名: </p><p> 學(xué) 號: </p><
2、p> 指導(dǎo)教師: </p><p> 2012 年 7月 1日</p><p> 基于51單片機(jī)數(shù)字溫度計設(shè)計</p><p> 1 數(shù)字溫度計的設(shè)計要求與設(shè)計方案</p><p> 1.1 基本設(shè)計要求</p><p> 隨著人們生活水平的不斷提高,單片機(jī)控制無疑是人們追求的
3、目標(biāo)之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設(shè)施就需要從數(shù)單片機(jī)技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p> 本設(shè)計所介紹的數(shù)字溫度計與傳統(tǒng)的溫度計相比,具有讀數(shù)方便,測溫范圍廣,測溫準(zhǔn)確,其輸出溫度采用數(shù)字顯示,主要用于對測溫比較準(zhǔn)確的場所,或科研實(shí)驗(yàn)室使用,該設(shè)計控制器使用單片機(jī)
4、AT89C52,測溫傳感器使用DS18B20,用1602液晶實(shí)現(xiàn)溫度顯示,能準(zhǔn)確達(dá)到以上要求。</p><p><b> 1.2 性能指標(biāo)</b></p><p> (1) 基本范圍-50℃-110℃;</p><p> (2) 精度誤差小于0.5℃;</p><p> (3) 液晶LCD顯示;</p>
5、;<p> (4) 可以設(shè)定溫度的上下限報警功能。</p><p> 2 數(shù)字溫度計系統(tǒng)的硬件設(shè)計</p><p> 2.1 數(shù)字溫度計硬件框圖</p><p> 數(shù)字溫度計系統(tǒng)硬件框圖如圖2.1所示。</p><p> 圖2.1系統(tǒng)的硬件框圖</p><p> 2.2 AT89C52單片機(jī)&
6、lt;/p><p> AT89C52單片機(jī)引腳配置圖,如圖2.2所示。</p><p> 圖2.2 AT89C52引腳配置截圖</p><p><b> 2.3 總設(shè)計圖</b></p><p> 數(shù)字溫度計系統(tǒng)的硬件總設(shè)計圖如圖2.3所示。</p><p><b> 圖2.3總設(shè)
7、計圖</b></p><p> 如圖2.3所示,AT89C52的時鐘電路是單片機(jī)內(nèi)部有一個高增益、反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。通過這兩個引腳在芯片外并接石英晶體振蕩器和兩只電容(電容和一般取33pF)。構(gòu)成一個穩(wěn)定的自激振蕩器。</p><p> AT89C52的按鍵復(fù)位操作,若要復(fù)位,只要按圖中的RESET鍵,電源VCC經(jīng)電阻分壓,
8、在RESET端產(chǎn)生一個復(fù)位高電平。</p><p> 顯示電路對于現(xiàn)實(shí)電路我們采用LCD1602液晶顯示。 </p><p> 故障狀態(tài)指示電路本設(shè)計采用發(fā)光二級管以及蜂鳴器對運(yùn)行方式進(jìn)行指示,可清楚看到系統(tǒng)的故障狀態(tài)。</p><p> 3 數(shù)字溫度計系統(tǒng)的軟件設(shè)計及系統(tǒng)整體流程</p><p><b> 3.1 總體流程
9、圖</b></p><p> 數(shù)字溫度計系統(tǒng)總體流程圖如圖3.1所示。</p><p> 圖3.1 主流序流程圖</p><p> 3.2 子程序流程圖</p><p> 數(shù)字溫度計系統(tǒng)子程序主要包含:讀溫度子程序、轉(zhuǎn)換溫度子程序、計算溫度子程序。</p><p> 3.2.1 讀溫度子程序流程圖
10、</p><p> 讀溫度子程序流程圖如圖3.2所示。</p><p> 圖3.2 讀溫度子程序流程圖</p><p> 3.2.2 轉(zhuǎn)換溫度子程序流程圖</p><p> 轉(zhuǎn)換溫度子程序流程圖如圖3.3所示。</p><p> 圖3.3 轉(zhuǎn)換溫度子程序流程圖</p><p> 3.
11、2.3 計算溫度子程序流程圖</p><p> 計算溫度子程序流程圖如圖3.4所示。</p><p> 圖3.4 計算溫度子程序流程圖</p><p><b> 4 設(shè)計體會與小結(jié)</b></p><p> 通過這次對數(shù)字溫度計的設(shè)計與制作,讓我了解了設(shè)計電路的程序,也讓我了解了關(guān)于數(shù)字溫度計的原理與設(shè)計理念。本
12、設(shè)計主要完成了一款簡單的數(shù)字溫度計設(shè)計,溫度通過LCD屏顯示出來。實(shí)現(xiàn)溫度測試的基本功能要求。</p><p> 在1周的課程設(shè)計中我學(xué)會了很多的東西。經(jīng)過自己努力,基本上完成了設(shè)計要求的內(nèi)容,在系統(tǒng)可行性分析、原理圖設(shè)計等方面都作了許多實(shí)際工作,取得了一些成績,同時也存在一些不足。對于本次的課程設(shè)計還有很大提升空間,目前僅完成的是基本功能實(shí)現(xiàn),還有很多的擴(kuò)展功能可以提升。</p><p&g
13、t; 在這次課程設(shè)計中我發(fā)現(xiàn),凡事都要自己去動下手,去實(shí)踐一下,遇到困難,永遠(yuǎn)不要沮喪氣餒,只有這樣才能讓自己進(jìn)一步的去學(xué)會新的東西和知識。在動手的過程中,不僅能增強(qiáng)實(shí)踐能力,而且在理論上可以有更深的認(rèn)識。 </p><p><b> 參考文獻(xiàn)</b></p><p> [1] 李群芳,張士軍,黃建.單片微型計算機(jī)與接口技術(shù)[M].北京:電子工業(yè)出版.2008.
14、</p><p> [2] 丁元杰,吳大偉.單片微機(jī)習(xí)題集與實(shí)驗(yàn)指導(dǎo)書[M].機(jī)械工業(yè)出版社.2004.</p><p> [3] 張友德,趙志英,涂時亮.單片微型機(jī)原理[M].上海:復(fù)旦大學(xué)出版社.2005.</p><p><b> 附錄A 源程序</b></p><p> //使用1602LCD顯示DS18
15、B20轉(zhuǎn)換的溫度值</p><p> #include <reg52.H></p><p> #include <intrins.H></p><p> #include <math.H></p><p> #define uchar unsigned char</p><p&g
16、t; #define uint unsigned int</p><p> sbit RS = P3^0; //數(shù)據(jù)/命令選擇端(H/L)</p><p> sbit LCDEN = P3^2; //使能端</p><p> sbit deng=P1^6; //超過溫度限制指示燈</p><p> sbit beep=P1
17、^7; //超過溫度限制報警器</p><p> uchar high=30; //最高溫度</p><p> uchar low=10; //最低溫度</p><p> unsigned char r;</p><p> void delayUs() //短延時</p><p>&l
18、t;b> {</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p> void delayMs(uint a) //長延時</p><p><b> {</b></p>
19、<p> uint i, j;</p><p> for(i = a; i > 0; i--)</p><p> for(j = 100; j > 0; j--);</p><p><b> }</b></p><p> //第一行開始地址為0x80, 第二行開始地址為0xc0;<
20、;/p><p> //寫命令:RS=0, RW=0;</p><p> void writeComm(uchar comm)</p><p><b> {</b></p><p> RS = 0; </p><p> P2 = comm;</p><p> L
21、CDEN = 1;</p><p> delayUs();</p><p> LCDEN = 0;</p><p> delayMs(1);</p><p><b> }</b></p><p> //寫數(shù)據(jù):RS=1, RW=00</p><p> void
22、writeData(uchar dat)</p><p><b> {</b></p><p><b> RS = 1;</b></p><p><b> P2 = dat;</b></p><p> LCDEN = 1;</p><p> d
23、elayUs();</p><p> LCDEN = 0;</p><p> delayMs(1);</p><p><b> }</b></p><p><b> //初始化函數(shù)</b></p><p> //顯示模式, 固定指令為00111000=0x38, 1
24、6*2顯示, 5*7點(diǎn)陣,8位數(shù)據(jù)接口</p><p> //顯示開/關(guān)及光標(biāo)設(shè)置00001100=0x0c</p><p> //指令1: 00001DCB : D:開顯示/關(guān)顯示(H/L); C:顯示光標(biāo)/不顯示(H/L), B:光標(biāo)閃爍/不閃爍(H/L)</p><p> //指令2: 000001NS :</p><p> /
25、/N=1, 當(dāng)讀/寫一個字符后地址指針加1, 且光標(biāo)也加1; N=0則相反</p><p> //S=1, 當(dāng)寫一個字符, 整屏顯示左移(N=1)或右移(N=0), 但光標(biāo)不移動; S=0, 整屏不移動</p><p> void init()</p><p><b> {</b></p><p> writeC
26、omm(0x38); //顯示模式</p><p> writeComm(0x0c); //開顯示, 關(guān)光標(biāo)</p><p> writeComm(0x06); //寫字符后地址加1, 光標(biāo)加1</p><p> writeComm(0x01); //清屏</p><p><b> }</b></p>
27、<p> void writeString(uchar * str, uchar length)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i = 0; i < length; i++)</p><p&
28、gt;<b> {</b></p><p> writeData(str[i]);</p><p><b> }</b></p><p><b> }</b></p><p> /*****************************DS18B20********
29、***********************/</p><p> sbit ds = P3^7;</p><p> //初始化DS18B20</p><p> //讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動</p><p> void dsInit()</p><p>&
30、lt;b> {</b></p><p> //對于11.0592MHz時鐘, unsigned int型的i, 作一個i++操作的時間大于為8us</p><p> unsigned int i; </p><p><b> ds = 0;</b></p><p> i = 100; /
31、/拉低約800us, 符合協(xié)議要求的480us以上</p><p> while(i>0) i--;</p><p> ds = 1; //產(chǎn)生一個上升沿, 進(jìn)入等待應(yīng)答狀態(tài)</p><p><b> i = 4;</b></p><p> while(i>0) i--;</p>
32、<p><b> }</b></p><p> void dsWait()</p><p><b> {</b></p><p> unsigned int i;</p><p> while(ds); </p><p> while(~ds); /
33、/檢測到應(yīng)答脈沖</p><p><b> i = 4;</b></p><p> while(i > 0) i--;</p><p><b> }</b></p><p> //向DS18B20讀取一位數(shù)據(jù)</p><p> //讀一位, 讓DS18B20一
34、小周期低電平, 然后兩小周期高電平, </p><p> //之后DS18B20則會輸出持續(xù)一段時間的一位數(shù)據(jù)</p><p> bit readBit()</p><p><b> {</b></p><p> unsigned int i;</p><p><b> bit
35、 b;</b></p><p><b> ds = 0;</b></p><p> i++; //延時約8us, 符合協(xié)議要求至少保持1us</p><p><b> ds = 1; </b></p><p> i++; i++; //延時約16us, 符合協(xié)議要求的至少延
36、時15us以上</p><p><b> b = ds;</b></p><p><b> i = 8; </b></p><p> while(i>0) i--; //延時約64us, 符合讀時隙不低于60us要求</p><p><b> return b;</b
37、></p><p><b> }</b></p><p> //讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readBit()來實(shí)現(xiàn)</p><p> unsigned char readByte()</p><p><b> {</b></p><p> unsigned i
38、nt i;</p><p> unsigned char j, dat;</p><p><b> dat = 0;</b></p><p> for(i=0; i<8; i++)</p><p><b> {</b></p><p> j = readBit
39、();</p><p> //最先讀出的是最低位數(shù)據(jù)</p><p> dat = (j << 7) | (dat >> 1);</p><p><b> }</b></p><p> return dat;</p><p><b> }</b&g
40、t;</p><p> //向DS18B20寫入一字節(jié)數(shù)據(jù)</p><p> void writeByte(unsigned char dat)</p><p><b> {</b></p><p> unsigned int i;</p><p> unsigned char j;&l
41、t;/p><p><b> bit b;</b></p><p> for(j = 0; j < 8; j++)</p><p><b> {</b></p><p> b = dat & 0x01;</p><p> dat >>= 1;//
42、寫"1", 將DQ拉低15us后, 在15us~60us內(nèi)將DQ拉高, 即完成寫1</p><p><b> if(b) </b></p><p><b> {</b></p><p><b> ds = 0;</b></p><p> i++;
43、 i++; //拉低約16us, 符號要求15~60us內(nèi)</p><p> ds = 1; </p><p> i = 8; while(i>0) i--; //延時約64us, 符合寫時隙不低于60us要求</p><p><b> }</b></p><p> else //寫"
44、0", 將DQ拉低60us~120us</p><p><b> {</b></p><p><b> ds = 0;</b></p><p> i = 8; while(i>0) i--; //拉低約64us, 符號要求</p><p><b> ds = 1;
45、</b></p><p> i++; i++; //整個寫0時隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時64us了</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&
46、gt;<p> //向DS18B20發(fā)送溫度轉(zhuǎn)換命令</p><p> void sendChangeCmd()</p><p><b> {</b></p><p> dsInit(); //初始化DS18B20, 無論什么命令, 首先都要發(fā)起初始化</p><p> dsWait();
47、 //等待DS18B20應(yīng)答</p><p> delayMs(1); //延時1ms, 因?yàn)镈S18B20會拉低DQ 60~240us作為應(yīng)答信號</p><p> writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom</p><p> writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字 Convert T</p&
48、gt;<p><b> }</b></p><p> //向DS18B20發(fā)送讀取數(shù)據(jù)命令</p><p> void sendReadCmd()</p><p><b> {</b></p><p><b> dsInit();</b></p&g
49、t;<p><b> dsWait();</b></p><p> delayMs(1);</p><p> writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom</p><p> writeByte(0xbe); //寫入讀取數(shù)據(jù)令字 Read Scratchpad</p><
50、p><b> }</b></p><p><b> //獲取當(dāng)前溫度值</b></p><p> int getTmpValue()</p><p><b> {</b></p><p> unsigned int tmpvalue;</p>&l
51、t;p> int value; //存放溫度數(shù)值</p><p><b> float t;</b></p><p> unsigned char low, high;</p><p> sendReadCmd();</p><p> //連續(xù)讀取兩個字節(jié)數(shù)據(jù)</p><p>
52、low = readByte(); </p><p> high = readByte();</p><p> //將高低兩個字節(jié)合成一個整形變量</p><p> //計算機(jī)中對于負(fù)數(shù)是利用補(bǔ)碼來表示的</p><p> //若是負(fù)值, 讀取出來的數(shù)值是用補(bǔ)碼表示的, 可直接賦值給int型的value</p><
53、p> tmpvalue = high;</p><p> tmpvalue <<= 8;</p><p> tmpvalue |= low;</p><p> value = tmpvalue;</p><p> //使用DS18B20的默認(rèn)分辨率12位, 精確度為0.0625度, 即讀回數(shù)據(jù)的最低位代表0.062
54、5度</p><p> t = value * 0.0625;</p><p> //將它放大10倍, 使顯示時可顯示小數(shù)點(diǎn)后一位, 并對小數(shù)點(diǎn)后第二位進(jìn)行4舍5入</p><p> //如t=11.0625, 進(jìn)行計數(shù)后, 得到value = 111, 即11.1 度</p><p> //如t=-11.0625, 進(jìn)行計數(shù)后, 得
55、到value = -111, 即-11.1 度</p><p> value = t * 10 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5</p><p> return value;</p><p><b> }</b></p><p><b>
56、 //顯示溫度</b></p><p> void display(int v) </p><p><b> {</b></p><p> unsigned char count;</p><p> unsigned char datas[] = {0, 0, 0, 0};</p>&l
57、t;p> unsigned int tmp = abs(v);</p><p> datas[0] = tmp / 1000;</p><p> datas[1] = tmp % 1000 / 100;</p><p> datas[2] = tmp % 100 / 10;</p><p> datas[3] = tmp %
58、10;</p><p> r= tmp/10;</p><p> writeComm(0xc0+3);</p><p><b> if(v < 0)</b></p><p><b> {</b></p><p> writeString("- &qu
59、ot;, 2);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> writeString("+ ", 2);</p><p><b
60、> }</b></p><p> if(datas[0] != 0)</p><p><b> {</b></p><p> writeData('0'+datas[0]);</p><p><b> }</b></p><p>
61、 for(count = 1; count != 4; count++)</p><p><b> {</b></p><p> writeData('0'+datas[count]);</p><p> if(count == 2)</p><p><b> {</b>&l
62、t;/p><p> writeData('.');</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /***********************
63、*******報警*******************************/</p><p> void BEEP()//報警</p><p> {if((r>=high&&r<129)||r<low)</p><p><b> { </b></p><p> beep=
64、!beep;</p><p><b> deng=1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {beep=1;</b></p><p><b
65、> deng=0;</b></p><p><b> }</b></p><p><b> } </b></p><p> /******************************DS18B20*******************************/</p>&
66、lt;p> void main()</p><p><b> { </b></p><p> uchar table[] = "Now Temperature ";</p><p> delayMs(1);</p><p> sendChangeCmd();</p>
67、<p><b> init();</b></p><p> writeComm(0x80);</p><p> writeString(table, 16);</p><p><b> while(1)</b></p><p><b> {</b></
68、p><p> delayMs(1000); //溫度轉(zhuǎn)換時間需要750ms以上</p><p> writeComm(0xc0);</p><p> display(getTmpValue());</p><p> sendChangeCmd();</p><p><b> BEEP();</b&
69、gt;</p><p><b> }</b></p><p><b> }</b></p><p><b> 附錄B 運(yùn)行圖示</b></p><p><b> 正常溫度顯示</b></p><p> 溫度計正常溫度顯示如
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字溫度計課程設(shè)計---基于51單片機(jī)數(shù)字溫度計設(shè)計
- 溫度計課程設(shè)計---基于51單片機(jī)數(shù)字溫度計設(shè)計
- 基于51單片機(jī)的數(shù)字溫度計課程設(shè)計
- 單片機(jī)課程設(shè)計--數(shù)字溫度計
- 單片機(jī)課程設(shè)計--數(shù)字溫度計
- 單片機(jī)課程設(shè)計-數(shù)字溫度計
- 單片機(jī)課程設(shè)計—數(shù)字溫度計
- 單片機(jī)數(shù)字溫度計課程設(shè)計
- 單片機(jī)課程設(shè)計---數(shù)字溫度計
- 單片機(jī)課程設(shè)計-數(shù)字溫度計
- 單片機(jī)課程設(shè)計—數(shù)字溫度計
- 單片機(jī)課程設(shè)計——數(shù)字溫度計
- 單片機(jī)課程設(shè)計—數(shù)字溫度計
- 基于51單片機(jī)數(shù)字溫度計設(shè)計報告課程設(shè)計
- 基于單片機(jī)數(shù)字溫度計課程設(shè)計
- 單片機(jī)課程設(shè)計-數(shù)字溫度計
- 數(shù)字溫度計--單片機(jī)課程設(shè)計
- 單片機(jī)課程設(shè)計--數(shù)字溫度計設(shè)計
- 單片機(jī)課程設(shè)計--數(shù)字溫度計設(shè)計
- 課程設(shè)計--基于單片機(jī)數(shù)字溫度計設(shè)計
評論
0/150
提交評論