版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)任務(wù)書</p><p><b> 目錄</b></p><p> 1.硬件電路及原理5</p><p><b> 2.軟件設(shè)計(jì)8</b></p><p><b> 3.調(diào)試結(jié)果20</b></p><
2、;p><b> 4.操作說明21</b></p><p><b> 5心得體會21</b></p><p><b> 參考文獻(xiàn)22</b></p><p><b> 1.硬件電路及原理</b></p><p> 1.1方案的總體設(shè)計(jì)框
3、圖</p><p> 溫度計(jì)電路設(shè)計(jì)總體設(shè)計(jì)方框圖如圖1所示,控制器采用單片機(jī)AT89c51,溫度傳感器采用DS18B20,用12864以串口傳送數(shù)據(jù)實(shí)現(xiàn)溫度顯示。</p><p> 圖1 總體設(shè)計(jì)方框圖</p><p> 1.1.1 主控制器</p><p> 單片機(jī)AT89c51具有低電壓供電和體積小等特點(diǎn),四個端口只需要兩個口就
4、能滿足電路系統(tǒng)的設(shè)計(jì)需要,很適合便攜手持式產(chǎn)品的設(shè)計(jì)使用系統(tǒng)可用二節(jié)電池供電。</p><p> 1.1.2 顯示電路</p><p> 顯示電路采用12864液晶顯示,從P0口輸出段碼。</p><p> 1.1.3溫度傳感器</p><p> DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,
5、與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點(diǎn)如下:</p><p> ●獨(dú)特的單線接口僅需要一個端口引腳進(jìn)行通信;</p><p> ●多個DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;</p><p><b> ●無須外部器件;</b&
6、gt;</p><p> ●可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b> ●零待機(jī)功耗;</b></p><p> ●溫度以9或12位數(shù)字;</p><p> ●用戶可定義報警設(shè)置;</p><p> ●報警搜索命令識別并標(biāo)志超過程序限定溫度(溫度報警條件)的
7、器件;</p><p> ●負(fù)電壓特性,電源極性接反時,溫度計(jì)不會因發(fā)熱而燒毀,但不能正常工作; </p><p> DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部結(jié)構(gòu)框圖如圖2所示。</p><p> 圖2 DS18B20內(nèi)部結(jié)構(gòu)</p><p> 64位ROM的結(jié)構(gòu)開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一的序
8、號,共有48位,最后8位是前面56位的CRC檢驗(yàn)碼,這也是多個DS18B20可以采用一線進(jìn)行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。</p><p> DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲器,結(jié)構(gòu)如圖3所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電復(fù)位
9、時被刷新。第5個字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低5位一直為1,TM是工作模式位,用于設(shè)置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設(shè)置為0,用戶要去改動,R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來設(shè)置分辨率。</p><p> 圖3 DS18B20字節(jié)定義</p>
10、;<p> 由表1可見,DS18B20溫度轉(zhuǎn)換的時間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時間越長。因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時間權(quán)衡考慮。</p><p> 高速暫存RAM的第6、7、8字節(jié)保留未用,表現(xiàn)為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。</p><p> 當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開
11、始啟動轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲在高速暫存存儲器的第1、2字節(jié)。單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示。</p><p> 當(dāng)符號位S=0時,表示測得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號位S=1時,表示測得的溫度值為負(fù)值,要先將補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制數(shù)值。表2是一部分溫度值對應(yīng)的二進(jìn)制溫度
12、數(shù)據(jù)。</p><p> 表1 DS18B20溫度轉(zhuǎn)換時間表</p><p> DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比較。若T>TH或T<TL,則將該器件內(nèi)的報警標(biāo)志位置位,并對主機(jī)發(fā)出的報警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時測量溫度并進(jìn)行報警搜索。</p><p> 在64位ROM的最高有效字節(jié)中存儲
13、有循環(huán)冗余檢驗(yàn)碼(CRC)。主機(jī)ROM的前56位來計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。</p><p> 表2 一部分溫度對應(yīng)值表</p><p> 另外,由于DS18B20單線通信功能是分時完成的,它有嚴(yán)格的時隙概念,因此讀寫時序很重要。系統(tǒng)對DS18B20的各種操作按協(xié)議進(jìn)行。操作協(xié)議為:初使化DS18B20(發(fā)復(fù)位脈沖)→發(fā)R
14、OM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。</p><p> 1.2 DS18B20溫度傳感器與單片機(jī)的接口電路</p><p> DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源。另一種是寄生電源供電方式,如圖4 所示單片機(jī)端口接單線總線,為保證在有效的DS18B20時鐘周期內(nèi)提供足夠的電流,可用一個MOSFET管來
15、完成對總線的上拉。</p><p> 當(dāng)DS18B20處于寫存儲器操作和溫度A/D轉(zhuǎn)換操作時,總線上必須有強(qiáng)的上拉,上拉開啟時間最大為10us。采用寄生電源供電方式時VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。</p><p><b> 2.軟件設(shè)計(jì)</b></p><p> #include<reg51.h>
16、;</p><p> #include<intrins.h></p><p> #include<math.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> #defi
17、ne port P0 //DB0~DB7數(shù)據(jù)口</p><p> #define beep P2^6</p><p> sbit e=P2^0;//使能</p><p> sbit rw=P2^1;//讀寫</p><p> sbit rs=P2^2;//數(shù)據(jù)/命令</p><p> sbit cs2=P2
18、^3;//片選</p><p> sbit cs1=P2^4;</p><p> sbit busy=P0^7;//檢測忙</p><p> sbit DQ=P3^0; //定義DS18B20數(shù)據(jù)端口</p><p> uchar fuhao;//負(fù)號寄存器</p><p> sbit P2_6=P2^6;
19、//蜂鳴器數(shù)據(jù)口</p><p> sbit P1_0=P1^0;//下限加鍵</p><p> sbit P1_1=P1^1;//下限減鍵</p><p> sbit P1_2=P1^2;//上限加鍵</p><p> sbit P1_3=P1^3;//上限減鍵</p><p><b> u
20、int j=0;</b></p><p> int th=10;//上限默認(rèn)值</p><p> int tl=-12;//下限默認(rèn)值</p><p> uint s=0,m=0,h=0;//時分秒初始值</p><p> uchar code hz[][32]={</p><p> {0x00,
21、0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,</p><p> 0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00},</p><p><b> //"電
22、",2</b></p><p> {0x40,0x20,0x58,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x14,0x06,0x04,0x00,0x00,</p><p> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x80,0x70,
23、0x00},</p><p><b> //"氣",3</b></p><p> {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00,</p><p> 0x10,0x10,0x10,0x10,0x10,0x1
24、0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00},</p><p><b> //"二",4</b></p><p> {0x84,0x84,0xFC,0x84,0x06,0xF4,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x86,0x04,0x00,<
25、/p><p> 0x20,0x60,0x3F,0x10,0x92,0x41,0x38,0x07,0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00},</p><p><b> //"班",5</b></p><p> {0x00,0xFE,0x22,0x5A,0x86,0x08,0x88,0x
26、48,0x38,0x0F,0xE8,0x08,0x88,0x0C,0x08,0x00,</p><p> 0x00,0xFF,0x04,0x08,0x07,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x19,0x30,0x00},</p><p><b> /*"陳",4*/</b></p>
27、<p> {0x50,0x4C,0x44,0x44,0x44,0x44,0x45,0xC6,0x44,0x44,0x44,0x44,0x44,0x54,0x4C,0x00,</p><p> 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p><p><
28、;b> /*"寧",5*/</b></p><p><b> };</b></p><p> uchar code time[][32]={</p><p> {0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10
29、,0x10,0x00,</p><p> 0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00},</p><p><b> //"時",0</b></p><p> {0x00,0x80,0x40,0x20,0x
30、98,0x86,0x80,0x80,0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00,</p><p> 0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00},</p><p><b> //"分",1</b>
31、;</p><p> {0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80,0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00,</p><p> 0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,0x40,0x20,0x17,0x08,0x04,0x03,0x00,0x00}</p>
32、<p><b> //"秒",2</b></p><p><b> };</b></p><p> uchar code num[][16]={</p><p> {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,
33、0x20,0x10,0x0F,0x00},</p><p><b> //"0",0</b></p><p> {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},</p><p><b> //&
34、quot;1",1</b></p><p> {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},</p><p><b> //"2",2</b></p><p> {0x00,0x3
35、0,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},</p><p><b> //"3",3</b></p><p> {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24
36、,0x3F,0x24,0x00},</p><p><b> //"4",4</b></p><p> {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},</p><p><b> //"
37、;5",5</b></p><p> {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},</p><p><b> //"6",6</b></p><p> {0x00,0x38,0x
38、08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},</p><p><b> //"7",7</b></p><p> {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x2
39、2,0x1C,0x00},</p><p><b> //"8",8</b></p><p> {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}</p><p><b> //"9&qu
40、ot;,9</b></p><p><b> };</b></p><p> uchar code sign[][16]={</p><p> {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},</p>
41、<p><b> //"-",0</b></p><p> {0x00,0xC0,0xE0,0x30,0x10,0x10,0x10,0x20,0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x08},</p><p><b> //"C",1</b></p&
42、gt;<p> {0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p><p><b> //"°",2</b></p><p> {0x00,0x00,0x00,0x00,0x00,0x00,0x00
43、,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00},</p><p><b> //".",3</b></p><p> {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p>
44、;<p><b> //" ",4</b></p><p> {0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00},</p><p><b> //":",5</b></
45、p><p> {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},</p><p><b> //"|",6</b></p><p> {0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x
46、00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},</p><p><b> //"+",7</b></p><p><b> };</b></p><p><b> //延時</b></p><p> void
47、 delay(uint n)</p><p><b> {</b></p><p><b> uint i;</b></p><p> for(;n>0;n--)</p><p> for(i=200;i>0;i--);</p><p><b>
48、 }</b></p><p><b> //判斷是否忙</b></p><p> void check()</p><p><b> {</b></p><p><b> rs=0; </b></p><p> rw=1;
49、 //讀 e=1;</p><p> port=0x00;</p><p><b> e=1; </b></p><p> while(busy);</p><p><b> e=0;</b></p><p><b> }</b></p
50、><p><b> //寫指令</b></p><p> void sendcommand(uchar command)</p><p><b> {</b></p><p><b> check();</b></p><p> rs=0; //
51、指令</p><p> rw=0; //寫 e=0;</p><p> port=command;</p><p><b> e=1;</b></p><p> e=0;//寫入指令</p><p><b> }</b></p><p>
52、<b> //寫數(shù)據(jù)</b></p><p> void writedata(uchar dat)</p><p><b> {</b></p><p><b> check();</b></p><p> rs=1; //數(shù)據(jù)</p><p
53、><b> rw=0;</b></p><p><b> port=dat;</b></p><p><b> e=1;</b></p><p><b> e=0;</b></p><p><b> }</b><
54、/p><p> //選屏幕 0--全屏,1--左屏,2--右屏;</p><p> void select(uint n)</p><p><b> {</b></p><p><b> switch(n)</b></p><p><b> {</b&g
55、t;</p><p> case 0:cs1=0;cs2=0;break; //低電平選中</p><p> case 1:cs1=0;cs2=1;break; //cs1左屏</p><p> case 2:cs1=1;cs2=0;break; //cs2右屏</p><p><b> } </b&g
56、t;</p><p><b> }</b></p><p><b> //頁</b></p><p> void setpage(uchar page)</p><p><b> {</b></p><p> page=page&0x0
57、7;</p><p> page=page|0xb8;</p><p> sendcommand(page);</p><p><b> }</b></p><p><b> //列</b></p><p> void setcolumn(uchar column)
58、</p><p><b> {</b></p><p> column=column&0x3f;</p><p> column=column|0x40;</p><p> sendcommand(column);</p><p><b> }</b><
59、;/p><p><b> //起始行</b></p><p> void setline(uchar line)</p><p><b> {</b></p><p> line=line&0x3f;</p><p> line=line|0xc0;</p
60、><p> sendcommand(line);</p><p><b> }</b></p><p> //屏幕開關(guān)顯示 0--關(guān),1--開;</p><p> void seton(uint n)</p><p><b> {</b></p><
61、p><b> n=n|0x3e;</b></p><p> sendcommand(n);</p><p><b> }</b></p><p> //清屏 0--全屏,1--左屏,2--右屏;</p><p> void clear(uint n)</p><p
62、><b> {</b></p><p> uchar i,j;</p><p> select(n);</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> setpage(i);</p>
63、;<p> setcolumn(0);</p><p> for(j=0;j<64;j++)</p><p> writedata(0); //置0清空</p><p><b> }</b></p><p><b> }</b></p><p>
64、;<b> //初始化</b></p><p> void init()</p><p><b> {</b></p><p><b> check();</b></p><p><b> seton(1);</b></p><
65、;p><b> clear(0);</b></p><p> setline(0);</p><p><b> }</b></p><p> //顯示漢字 16*16顯示</p><p> void show16(uchar page,uchar column,uchar scree
66、n,uchar method,uchar *str)</p><p><b> {</b></p><p> uchar i,j;</p><p> select(screen);</p><p><b> j=0;</b></p><p> setpage(pag
67、e);</p><p> setcolumn(column);</p><p> for(i=0;i<16;i++)</p><p> { if(method==1) writedata(~str[j++]);//method為顯示方式。當(dāng)?shù)扔?時,反白。</p><p> else writeda
68、ta(str[j++]); </p><p><b> }</b></p><p> setpage(page+1);</p><p> setcolumn(column);</p><p> for(i=0;i<16;i++)</p><p> { if(method
69、==1) writedata(~str[j++]);</p><p> else writedata(str[j++]); </p><p><b> }</b></p><p><b> } </b></p><p> //顯示數(shù)字 8*8顯示<
70、/p><p> void show8(uchar page,uchar column,uchar screen,uchar method,uchar *str)</p><p><b> {</b></p><p> uchar i,j;</p><p> select(screen);j=0;</p>
71、<p> setpage(page);</p><p> setcolumn(column);</p><p> for(i=0;i<8;i++)</p><p> { if(method==1) writedata(~str[j++]);</p><p> else writedata
72、(str[j++]); </p><p><b> }</b></p><p> setpage(page+1);setcolumn(column);</p><p> for(i=0;i<8;i++)</p><p> { if(method==1) writedata(~str[j++]
73、);</p><p> else writedata(str[j++]); </p><p><b> }</b></p><p><b> }</b></p><p><b> //顯示時間</b></p><p&g
74、t; void showtime()</p><p><b> {</b></p><p> show16(2,24,2,0,time[0]);</p><p> show16(4,24,2,0,time[1]);</p><p> show16(6,24,2,0,time[2]);</p>&l
75、t;p> show8(2,40,2,0,sign[5]);</p><p> show8(4,40,2,0,sign[5]);</p><p> show8(6,40,2,0,sign[5]);</p><p> show8(2,48,2,0,num[h/10]);</p><p> show8(4,48,2,0,num[m/
76、10]);</p><p> show8(6,48,2,0,num[s/10]);</p><p> show8(2,56,2,0,num[h%10]);</p><p> show8(4,56,2,0,num[m%10]);</p><p> show8(6,56,2,0,num[s%10]);</p><p&g
77、t;<b> }</b></p><p><b> //中斷服務(wù)程序</b></p><p> timer0() interrupt 1 using 1</p><p><b> {</b></p><p><b> j++;</b></p
78、><p> TH0=15536/256;</p><p> TL0=15536%256;</p><p> if(j==20){</p><p><b> j=0;</b></p><p> if(++s==60){</p><p> s=0;if(++m==60)
79、{</p><p> m=0;if(++h==24)h=0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></
80、p><p><b> //顯示個人信息</b></p><p> void welcome()</p><p><b> {</b></p><p> show16(0,0,1,0,hz[0]);</p><p> show16(0,16,1,0,hz[1]);<
81、/p><p> show16(0,32,1,0,hz[2]);</p><p> show16(0,48,1,0,hz[3]);</p><p> show16(0,8,2,0,hz[4]);</p><p> show16(0,40,2,0,hz[5]);</p><p> show8(2,0,1,0,num[
82、2]);</p><p> show8(2,8,1,0,num[0]);</p><p> show8(2,16,1,0,num[0]);</p><p> show8(2,24,1,0,num[8]);</p><p> show8(2,32,1,0,num[0]);</p><p> show8(2,40
83、,1,0,num[4]);</p><p> show8(2,48,1,0,num[2]);</p><p> show8(2,56,1,0,num[2]);</p><p> show8(2,0,2,0,num[3]);</p><p> show8(2,8,2,0,num[3]);</p><p><
84、b> }</b></p><p><b> //蜂鳴器</b></p><p> void Beep()</p><p><b> {</b></p><p><b> uchar y;</b></p><p> for(y
85、=0;y<200;y++)</p><p><b> {</b></p><p><b> delay(1);</b></p><p> P2_6=!P2_6;</p><p><b> }</b></p><p><b> }
86、</b></p><p> // *******延時函數(shù)******</p><p> void delay1(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b&
87、gt;</p><p> //*******顯示溫度并判斷是否調(diào)用蜂鳴器函數(shù)******</p><p> void display(int k)</p><p><b> {</b></p><p> uchar i=0;</p><p> if(fuhao!=0) //判斷負(fù)號是否
88、有效</p><p><b> {</b></p><p> show8(6,0,1,0,sign[0]);</p><p> if(tl<0&&k>=abs(tl)*100)Beep();</p><p> elseif(tl>=0)Beep();</p>&l
89、t;p> if(th<0&&k<=abs(th)*100)Beep();</p><p><b> }</b></p><p> else{show8(6,0,1,0,sign[4]);if(k>=th*100||k<tl*100)Beep();}</p><p> if(k/10000=
90、=0)show8(6,8,1,0,sign[4]);</p><p> elseshow8(6,8,1,0,num[k/10000]);</p><p> if(k/1000==0)show8(6,16,1,0,sign[4]);</p><p> elseshow8(6,16,1,0,num[k/1000%10]);</p><p&g
91、t; show8(6,24,1,0,num[k/100%10]);</p><p> show8(6,32,1,0,sign[3]);</p><p> show8(6,40,1,0,num[k/10%10]);</p><p> show8(6,48,1,0,num[k%10]);</p><p> show8(6,56,1,0,
92、sign[2]);</p><p> show8(6,0,2,0,sign[1]);</p><p><b> }</b></p><p> //*******初始化函數(shù)*******</p><p> Init_DS18B20(void)</p><p><b> {<
93、/b></p><p> uchar x=0;</p><p> DQ=1;//DQ復(fù)位</p><p> delay1(8); //稍作延時</p><p> DQ=0; //單片機(jī)將DQ拉低</p><p> delay1(80); //精確延時大于480us</p&
94、gt;<p> DQ=1; //拉高總線</p><p> delay1(14); </p><p> x=DQ;//稍做延時后,如果x=0則初始化成功;x=1則初始化失敗</p><p> delay1(20);</p><p><b> }</b></p>&
95、lt;p> //*******讀一個字節(jié)*******</p><p> ReadOneChar(void)</p><p><b> {</b></p><p> uchar i=0;</p><p> uint dat=0;</p><p> for(i=8;i>0;i
96、--)</p><p><b> {</b></p><p> DQ=0; //給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ=1; //給脈沖信號</p><p><b> if(DQ)&l
97、t;/b></p><p> dat|=0x80;</p><p> delay1(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> //
98、*******寫一個字節(jié)******</p><p> WriteOneChar(unsigned char dat)</p><p><b> {</b></p><p> uchar i=0;</p><p> for(i=8;i>0;i--)</p><p><b>
99、 {</b></p><p><b> DQ=0;</b></p><p> DQ=dat&0x01;</p><p> delay1(5);</p><p><b> DQ=1;</b></p><p><b> dat>&g
100、t;=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> //******讀取溫度*******</p><p> ReadTemperature(void)</p><p><b> {
101、</b></p><p> uchar a=0;</p><p> uchar b=0;</p><p><b> uint t=0;</b></p><p> float tt=0;</p><p> Init_DS18B20();</p><p>
102、 WriteOneChar(0xCC);//跳過讀序號列號的操作</p><p> WriteOneChar(0x44);//啟動溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC);//跳過讀序號列號的操作</p><p> WriteOneChar(0xBE);/
103、/讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度</p><p> a=ReadOneChar(); //低位</p><p> b=ReadOneChar(); //高位</p><p> fuhao=b&0x80;</p><p> if(fuhao!=0) //判斷溫度是否為負(fù)</p>&
104、lt;p> { //負(fù)溫度的計(jì)算方法</p><p><b> b=~b;</b></p><p><b> a=~a;</b></p><p> tt=((b*256)+a+1)*0.0625;</p><p> tt=tt*100;</p><p&
105、gt; t=(int)tt;</p><p><b> }</b></p><p><b> else </b></p><p> { //正溫度的計(jì)算方法</p><p> tt=((b*256)+a)*0.0625;</p><p> tt=
106、tt*100;</p><p> t=(int)tt;</p><p><b> }</b></p><p> return (t);</p><p><b> }</b></p><p> //顯示溫度上下限值</p><p> void
107、 showT()</p><p><b> {</b></p><p> if(tl<0)show8(4,0,1,0,sign[0]);</p><p> elseshow8(4,0,1,0,sign[4]);</p><p> if(abs(tl)/100==0)show8(4,8,1,0,sign[4
108、]);</p><p> elseshow8(4,8,1,0,num[abs(tl)/100]);</p><p> if(abs(tl)/10==0)show8(4,16,1,0,sign[4]);</p><p> elseshow8(4,16,1,0,num[abs(tl)/10%10]);</p><p> show8(4
109、,24,1,0,num[abs(tl)%100%10]);</p><p> show8(4,32,1,0,sign[6]);</p><p> if(th<0)show8(4,40,1,0,sign[0]);</p><p> elseshow8(4,40,1,0,sign[4]);</p><p> if(abs(th)/
110、100==0)show8(4,48,1,0,sign[4]);</p><p> elseshow8(4,48,1,0,num[abs(th)/100]);</p><p> if(abs(th)/10==0)show8(4,56,1,0,sign[4]);</p><p> elseshow8(4,56,1,0,num[abs(th)/10%10]);&
111、lt;/p><p> show8(4,0,2,0,num[abs(th)%100%10]);</p><p><b> }</b></p><p> //按鍵調(diào)節(jié)溫度上下限值</p><p> void welcome1()</p><p><b> {</b>&l
112、t;/p><p> if(P1_0==0){delay(250);tl+=1;}</p><p> if(P1_1==0){delay(300);tl-=1;}</p><p> if(P1_2==0){delay(300);th+=1;}</p><p> if(P1_3==0){delay(300);th-=1;}</p>
113、;<p><b> showT();</b></p><p><b> }</b></p><p> //********主函數(shù)*******</p><p> void main(void)</p><p><b> {</b></p>
114、<p><b> uint i=0;</b></p><p><b> init();</b></p><p> delay(300);//延時小于500MS</p><p> welcome();</p><p> TMOD=0x01;</p><p>
115、 TH0=15536/256;//定時器初值</p><p> TL0=15536%256;</p><p> EA=1; //開總中斷</p><p> ET0=1;//開T0中斷</p><p> TR0=1; //啟動T0</p><p><b> while(1)</b><
116、;/p><p><b> { </b></p><p> showtime();</p><p> welcome1();</p><p> i=ReadTemperature(); //讀溫度</p><p> display(i); //顯示溫度</p><p
117、><b> }</b></p><p><b> } </b></p><p><b> 3.調(diào)試結(jié)果</b></p><p><b> 結(jié)果如下圖所示:</b></p><p><b> 4.操作說明</b><
118、/p><p> 在實(shí)現(xiàn)數(shù)據(jù)顯示時,p1.0口與p1.1口接出的開關(guān)可以共同實(shí)現(xiàn)溫度下限的增大與減小,其中p1.0口的是實(shí)現(xiàn)下限值的增大,而p1.1口的是實(shí)現(xiàn)下限值的減小。P1.2口與p1.3口接出的開關(guān)可以共同實(shí)現(xiàn)溫度上限的增大與減小,其中p1.3口是實(shí)現(xiàn)上限值的增大,p1.3口是實(shí)現(xiàn)上限值的減小。而溫度的調(diào)節(jié)是通過調(diào)節(jié)DS18B20的兩個按鈕來實(shí)現(xiàn)的。</p><p> 5.心得體會
119、 本次課程設(shè)計(jì)長達(dá)兩周,在這兩周里,我收獲了很多。剛開始我們做了些基礎(chǔ)的程序設(shè)計(jì),有的甚至是以前實(shí)驗(yàn)做過的程序,這次再加以鞏固。從后面用12864顯示器顯示自己個人信息開始就基本上上進(jìn)入了這次課程設(shè)計(jì)的題目。</p><p> 在設(shè)計(jì)數(shù)字溫度計(jì)的過程中,我接觸到了很多新的知識,比如:字模提取軟件、12864顯示器以及DS18B20溫度傳感器等。在面對這些新的知識時,我學(xué)會了更好的應(yīng)用現(xiàn)有的書籍、網(wǎng)絡(luò)、同學(xué)等
120、資源來學(xué)習(xí)這些新的知識,更好的應(yīng)用它們。最主要的是單個的元器件需要通過AT89C51芯片使它們連接在一起,更好的發(fā)揮作用,而本次課程設(shè)計(jì)感覺最難的就是在對這些元器件的綜合上,很難使它們發(fā)揮最大的功效,達(dá)到理想的效果,總是會出現(xiàn)這樣或者那樣的問題,而且由于自己以前C語言基礎(chǔ)不是特別好,所以在編程時遇到的困難就比較多,很多時候知道要通過怎樣的方式來實(shí)現(xiàn)這樣的功能,但就是不能將自己的邏輯思維轉(zhuǎn)化為程序。每次遇到這樣的問題,我就會和同學(xué)一起進(jìn)行
121、一些討論,將每個人的優(yōu)勢進(jìn)行整合,已達(dá)到我們想要的結(jié)果。</p><p> 通過這次課程設(shè)計(jì),讓我更加清楚的知道了自己的劣勢,以便自己在以后的學(xué)習(xí)中能夠加強(qiáng)這方面的能力,同時,這次課程設(shè)計(jì)讓我學(xué)會了更好的利用自己的資源來解決問題,相信這點(diǎn)會對我以后的學(xué)習(xí)和工作起到很大的幫助。</p><p><b> 參考文獻(xiàn)</b></p><p>
122、[1] 李朝青.單片機(jī)原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p> [2] 李廣弟.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994</p><p> [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</p><p> [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.</
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 51單片機(jī)課程設(shè)計(jì)--簡單數(shù)字式溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)原理及應(yīng)用課程設(shè)計(jì)--多功能數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)——數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 數(shù)字溫度計(jì)--單片機(jī)課程設(shè)計(jì)
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)的設(shè)計(jì)
評論
0/150
提交評論