版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 單片機實訓(xùn)</b></p><p> 課題 溫度檢測 </p><p> 班級 11電氣一班 </p><p> 學(xué)號 </p><p> 姓名 </p><p> 指導(dǎo)教師
2、 </p><p> 日期 2013.1.4~2014.1.15 </p><p><b> 摘要 </b></p><p> 隨著人們生活水平的不斷提高,單片機技術(shù)已經(jīng)普及到我們生活,工作,科研等各個領(lǐng)域。單片機控制無疑是人們追求的目標之一,它所給人帶來的方便是不可否定的,其中數(shù)字溫度計就是一個典型
3、的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活提供更好的更方便的設(shè)施就需要從數(shù)單片機技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。本文利用單片機結(jié)合傳感器技術(shù)開發(fā)設(shè)計,把傳感器理論與單片機實際應(yīng)用有機結(jié)合,詳細地講述了利用溫度傳感器DS18B20測量環(huán)境溫度,設(shè)置上下報警溫度,當(dāng)溫度不在設(shè)置范圍內(nèi)是,可以報警。同時51單片機在現(xiàn)代電子產(chǎn)品中廣泛應(yīng)用以及其技術(shù)已經(jīng)非常成熟,DS18B20可以直接讀出被測溫度值,而且采用一
4、線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點。</p><p> 關(guān)鍵詞:DS18B20;單片機控制;溫度檢測;溫度傳感器</p><p><b> 目錄</b></p><p> 一、設(shè)計目的:..............................................1</p><
5、;p> 二、設(shè)計要求:..............................................1</p><p> 三、數(shù)字溫度傳感器DS18B20:.................................1</p><p> 四、基本設(shè)計思想:..........................................3</p>
6、;<p> 五、實施方案論述:..........................................3</p><p> 六、系統(tǒng)分析與設(shè)計:........................................3</p><p> 1、程序流程圖及說明.....................................3</p>
7、;<p> 2、溫度計的的電路設(shè)計...................................7</p><p> 七、實物圖:................................................7</p><p> 八、程序設(shè)計:..............................................8<
8、/p><p><b> 一、設(shè)計目的 </b></p><p> 使用單片機AT89c51和溫度傳感器DS18B20實現(xiàn)基本范圍-55℃-125℃的測量,顯示精度誤差小于1℃,用1602lcd直接讀出溫度。</p><p><b> 二、設(shè)計要求 </b></p><p>
9、1.綜合運用課程中所學(xué)到的理論知識完成一個設(shè)計課題</p><p> 2.通過查閱手冊和文獻資料,培養(yǎng)分析和解決實際問題的能力 </p><p> 進一步熟悉常用電子器件的類型和特性,并掌握合理選用的原則</p><p> 4.熟練掌握單片機電路的設(shè)計和焊接 </p><p> 5.撰寫課程設(shè)計總結(jié)報告</p
10、><p> 6. 培養(yǎng)嚴肅認真的工作作風(fēng)</p><p> 三、數(shù)字溫度傳感器DS18B20 </p><p> 本次設(shè)計的硬件電路簡單,關(guān)鍵的地方在DS18B20,也是最復(fù)雜難懂的。 由DALLAS半導(dǎo)體公司生產(chǎn)的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事等領(lǐng)域的溫度測量及
11、控制儀器、測控系統(tǒng)和大型設(shè)備中。它具有體積小,接口方便,傳輸距離遠等特點。 </p><p> DS18B20的性能特點: </p><p> ① 采用單總線專用技術(shù),既可通過串行口線,也可通過其它I/O口線與微機接口,無須經(jīng)過其它變換電路,直接輸出被測溫度值(9位二進制數(shù),含符號位) </p><p> ?、?#160;
12、測溫范圍為-55℃-+125℃,測量分辨率最小為0.0625℃ </p><p> ?、?#160;內(nèi)含64位經(jīng)過激光修正的只讀存儲器ROM </p><p> ④ DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi)</p><p> ?、?#160;適配各種單片機或系統(tǒng)機 &l
13、t;/p><p> ⑥ 測量結(jié)果直接輸出數(shù)字溫度信號,以“一線總線“串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p> ?、?#160;用戶可分別設(shè)定各路溫度的上、下限 </p><p> ?、?#160;適應(yīng)電壓范圍寬,3.0~5.5V,在寄生電源方式下可由數(shù)據(jù)線供電</p><p>
14、如圖為其引腳功能圖:</p><p><b> 圖1</b></p><p> DS18B20溫度值格式</p><p> 默認的12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,
15、測到的數(shù)值需要取反加1再乘于0.0625即可得到實際溫度。</p><p><b> 如圖:</b></p><p><b> 表1:ROM指令表</b></p><p><b> 表2:RAM指令表</b></p><p><b> 四、基本設(shè)計思想<
16、/b></p><p> 基本設(shè)計方案:根據(jù)DS18B20的通訊協(xié)議,單片機控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個步驟:每一次讀寫之前都要對DS18B20進行復(fù)位操作,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,當(dāng)DS18B20收到信號后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收
17、到此信號表示復(fù)位成功。</p><p> 于是,給DS18B20不同的時序,可以讀取溫度傳感器的值,根據(jù)溫度算法算出當(dāng)時的溫度值,在給顯示部分,通過LCD顯示出來。</p><p><b> 五、實施方案論述</b></p><p> 這個課題主要實現(xiàn)溫度的檢測以及通過數(shù)碼管顯示這兩個大功能,以及讀取這個相對較為容易的功能。因此在溫度檢測
18、這一模塊上,利用DS18B20這一目前比較先進的溫度傳感器,可以很精確地感測實時溫度,對于DS18B20的通訊協(xié)議的控制,讀取測量的溫度值,經(jīng)過一定的算法,可以把溫度轉(zhuǎn)化為十進制,分別為高位和低位,先暫存起來。經(jīng)顯示模塊調(diào)用,最終在LCD上顯示。</p><p><b> 六、系統(tǒng)分析與設(shè)計</b></p><p> 1、程序流程圖及說明</p>&
19、lt;p> 主函數(shù)完成對DS18B20的初始化,讀取溫度的轉(zhuǎn)換值,調(diào)用數(shù)據(jù)處理的子程序然后再生成顯示代碼,再將溫度顯示出來,然后根據(jù)溫度顯示的代碼判斷溫度值可以判斷它的值是否超出了預(yù)設(shè)的范圍。然后返回到主函數(shù)開始的位置,無論溫度值是否超出預(yù)設(shè)值,程序都會返回開始的位置,重復(fù)循環(huán)。</p><p><b> 主函數(shù)流程圖</b></p><p> DS18B
20、20復(fù)位子程序</p><p><b> 溫度值子程序</b></p><p> 2、溫度計的的電路設(shè)計</p><p> 溫度計采用AT89C51單片機作為微處理器,溫度計系統(tǒng)的外圍接口電路由晶振、LCD顯示電路、復(fù)位電路、溫度檢測電路、LCD驅(qū)動電路。溫度計系統(tǒng)的的硬件電路圖如下圖所示。</p><p> 溫
21、度計的工作過程是:初始化其接收需要檢測的溫度,并一直處于檢測狀態(tài),并將檢測到的溫度值讀取,并轉(zhuǎn)化為十進制數(shù)值,通過LCD顯示出來,再顯示溫度,方便用戶來讀數(shù)使用記錄數(shù)據(jù)。</p><p> 具體實現(xiàn)方法是:單片機將從P3.4管腳讀進來的數(shù)據(jù)進行處理,P0.1到P0.7為數(shù)碼管的段選端口,通過上拉電阻的驅(qū)動對LCD進行驅(qū)動。</p><p><b> 七、實物圖</b&g
22、t;</p><p><b> 八、程序設(shè)計</b></p><p> //DS18B20溫度檢測及其液晶顯示</p><p> #include<reg51.h> //包含單片機寄存器的頭文件</p><p> #include<intrins.h> //包含_nop_()函數(shù)定
23、義的頭文件</p><p> unsigned char code digit[10]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字</p><p> unsigned char code Str[]={"ai shi bi"}; //說明顯示的是溫度</p><p> unsigned cha
24、r code Error[]={"Error!Check!"}; //說明沒有檢測到DS18B20</p><p> unsigned char code Temp[]={"Temp:"}; //說明顯示的是溫度</p><p> unsigned char code Cent[]={"Cent"
25、;}; //溫度單位</p><p> /*******************************************************************************</p><p> 以下是對液晶模塊的操作程序</p><p> ***********************************
26、********************************************/</p><p> sbit RS=P3^5; //寄存器選擇位,將RS位定義為P2.0引腳</p><p> sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳</p><p> sbit E=P3^4;
27、 //使能信號位,將E位定義為P2.2引腳</p><p> sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳</p><p> /*****************************************************</p><p> 函數(shù)功能:延時1ms</p>
28、<p> (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒</p><p> ***************************************************/</p><p> void delay1ms()</p><p><b> {</b></
29、p><p> unsigned char i,j;</p><p> for(i=0;i<4;i++)</p><p> for(j=0;j<33;j++)</p><p><b> ; </b></p><p><b> }</b></p>
30、;<p> /*****************************************************</p><p> 函數(shù)功能:延時若干毫秒</p><p><b> 入口參數(shù):n</b></p><p> ***********************************************
31、****/</p><p> void delaynms(unsigned char n)</p><p><b> {</b></p><p> unsigned char i;</p><p> for(i=0;i<n;i++)</p><p> delay1ms();<
32、/p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)</p><p> 返回值:result。result=1,忙碌;result=0,不忙</p&g
33、t;<p> ***************************************************/</p><p> bit BusyTest(void)</p><p><b> {</b></p><p> bit result;</p><p> RS=0;
34、//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)</p><p><b> RW=1;</b></p><p> E=1; //E=1,才允許讀寫</p><p> _nop_(); //空操作</p><p><b> _nop_();</b></p>
35、<p><b> _nop_(); </b></p><p> _nop_(); //空操作四個機器周期,給硬件反應(yīng)時間</p><p> result=BF; //將忙碌標志電平賦給result</p><p> E=0; //將E恢復(fù)低電平</p><p> return
36、 result;</p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊</p><p> 入口參數(shù):dictate</p>
37、<p> ***************************************************/</p><p> void WriteInstruction (unsigned char dictate)</p><p><b> { </b></p><p> while(BusyTest()==1
38、); //如果忙就等待</p><p> RS=0; //根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令</p><p><b> RW=0; </b></p><p> E=0; //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,</p>
39、<p> // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"</p><p><b> _nop_();</b></p><p> _nop_(); //空操作兩個機器周期,給硬件反應(yīng)時間</p><p> P0=dictate; //將數(shù)據(jù)送入P0口,即寫
40、入指令或地址</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> _nop_(); //空操作四個機器周期,給硬件反應(yīng)時
41、間</p><p> E=1; //E置高電平</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><
42、p> _nop_(); //空操作四個機器周期,給硬件反應(yīng)時間</p><p> E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令</p><p><b> }</b></p><p> /*********************************
43、********************</p><p> 函數(shù)功能:指定字符顯示的實際地址</p><p><b> 入口參數(shù):x</b></p><p> ***************************************************/</p><p> void WriteAddre
44、ss(unsigned char x)</p><p><b> {</b></p><p> WriteInstruction(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"</p><p><b> }</b></p><p> /********
45、*********************************************</p><p> 函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊</p><p> 入口參數(shù):y(為字符常量)</p><p> ***************************************************/</p>&l
46、t;p> void WriteData(unsigned char y)</p><p><b> {</b></p><p> while(BusyTest()==1); </p><p> RS=1; //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)</p><p><b>
47、; RW=0;</b></p><p> E=0; //E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,</p><p> // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"</p><p> P0=y; //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊</p><p&g
48、t;<b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> _nop_(); //空操作四個機器周期,給硬件反應(yīng)時間</p><p> E=1;
49、 //E置高電平</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> _nop_(); //空操作四個機器周期,給硬件反應(yīng)時
50、間</p><p> E=0; //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令</p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:對LCD的顯
51、示模式進行初始化設(shè)置</p><p> ***************************************************/</p><p> void LcdInitiate(void)</p><p><b> {</b></p><p> delaynms(15);
52、 //延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間</p><p> WriteInstruction(0x38); //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口</p><p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間</p><p> WriteI
53、nstruction(0x38);</p><p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間</p><p> WriteInstruction(0x38); //連續(xù)三次,確保初始化成功</p><p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間&l
54、t;/p><p> WriteInstruction(0x0c); //顯示模式設(shè)置:顯示開,無光標,光標不閃爍</p><p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間</p><p> WriteInstruction(0x06); //顯示模式設(shè)置:光標右移,字符不移</p>
55、<p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間</p><p> WriteInstruction(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除</p><p> delaynms(5); //延時5ms ,給硬件一點反應(yīng)時間</p><p><b&g
56、t; } </b></p><p> /************************************************************************</p><p> 以下是DS18B20的操作程序</p><p> ***********************************************
57、*************************/ </p><p> sbit DQ=P3^3;</p><p> unsigned char time; //設(shè)置全局變量,專門用于嚴格延時</p><p> /*****************************************************</p><p&
58、gt; 函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號</p><p> 出口參數(shù):flag </p><p> ***************************************************/</p><p> bit Init_DS18B20(void)</p><p><b> {&l
59、t;/b></p><p> bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在</p><p> DQ = 1; //先將數(shù)據(jù)線拉高</p><p> for(time=0;time<2;time++) //略微延時約6微秒</p><
60、p><b> ;</b></p><p> DQ = 0; //再將數(shù)據(jù)線從高拉低,要求保持480~960us</p><p> for(time=0;time<200;time++) //略微延時約600微秒</p><p> ; //以向DS18B20發(fā)出一持續(xù)480~960us的低
61、電平復(fù)位脈沖 </p><p> DQ = 1; //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) </p><p> for(time=0;time<10;time++)</p><p> ; //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)</p><p> flag=DQ;
62、 //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) </p><p> for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢</p><p><b> ;</b></p><p> return (flag); //返回檢測成功標志</p><
63、;p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)</p><p><b> 出口參數(shù):dat</b></p><p>
64、 ***************************************************/ </p><p> unsigned char ReadOneChar(void)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> uns
65、igned char dat; //儲存讀出的一個字節(jié)數(shù)據(jù)</p><p> for (i=0;i<8;i++)</p><p><b> {</b></p><p> DQ =1; // 先將數(shù)據(jù)線拉高</p><p> _nop_(); //等待一個機器周期 </p>
66、<p> DQ = 0; //單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序</p><p><b> dat>>=1;</b></p><p> _nop_(); //等待一個機器周期 </p><p> DQ = 1; //將數(shù)據(jù)線"人為"
67、拉高,為單片機檢測DS18B20的輸出電平作準備</p><p> for(time=0;time<2;time++)</p><p> ; //延時約6us,使主機在15us內(nèi)采樣</p><p><b> if(DQ==1)</b></p><p> dat|=0x80; //如果讀到的數(shù)據(jù)
68、是1,則將1存入dat</p><p><b> else</b></p><p> dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat</p><p> //將單片機檢測到的電平信號DQ存入r[i]</p><p> for(time=0;time<8;time++)</p>&
69、lt;p> ; //延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期</p><p> } </p><p> return(dat); //返回讀出的十進制數(shù)據(jù)</p><p><b> }</b></p><p> /****
70、*************************************************</p><p> 函數(shù)功能:向DS18B20寫入一個字節(jié)數(shù)據(jù)</p><p><b> 入口參數(shù):dat</b></p><p> ***************************************************/
71、</p><p> WriteOneChar(unsigned char dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=0; i<8; i++)</p><p><b> {<
72、/b></p><p> DQ =1; // 先將數(shù)據(jù)線拉高</p><p> _nop_(); //等待一個機器周期 </p><p> DQ=0; //將數(shù)據(jù)線從高拉低時即啟動寫時序 </p><p> DQ=dat&0x01; //利用與運算取出要寫的某
73、位二進制數(shù)據(jù),</p><p> //并將其送到數(shù)據(jù)線上等待DS18B20采樣</p><p> for(time=0;time<10;time++)</p><p> ;//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣</p><p> DQ=1; //釋放數(shù)據(jù)線
74、</p><p> for(time=0;time<1;time++)</p><p> ;//延時3us,兩個寫時序間至少需要1us的恢復(fù)期</p><p> dat>>=1; //將dat中的各二進制位數(shù)據(jù)右移1位</p><p><b> }</b></p>&l
75、t;p> for(time=0;time<4;time++)</p><p> ; //稍作延時,給硬件一點反應(yīng)時間</p><p><b> }</b></p><p> /***************************************************************************
76、***</p><p> 以下是與溫度有關(guān)的顯示設(shè)置</p><p> ******************************************************************************/</p><p> /*****************************************************&l
77、t;/p><p> 函數(shù)功能:顯示沒有檢測到DS18B20</p><p> ***************************************************/ </p><p> void display_error(void)</p><p><b> {</b></p>
78、<p> unsigned char i;</p><p> WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示</p><p> i = 0; //從第一個字符開始顯示</p><p> while(Error[i] != '\0') //只要沒有寫到結(jié)束標志,就
79、繼續(xù)寫</p><p><b> {</b></p><p> WriteData(Error[i]); //將字符常量寫入LCD</p><p> i++; //指向下一個字符</p><p> delaynms(100); //延時100ms較長時
80、間,以看清關(guān)于顯示的說明</p><p><b> }</b></p><p> while(1) //進入死循環(huán),等待查明原因</p><p><b> ;</b></p><p><b> }</b></p><p&g
81、t; /*****************************************************</p><p> 函數(shù)功能:顯示說明信息</p><p> ***************************************************/ </p><p> void display_explain(void)&
82、lt;/p><p><b> {</b></p><p> unsigned char i;</p><p> WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示</p><p> i = 0; //從第一個字符開始顯示</p><
83、p> while(Str[i] != '\0') //只要沒有寫到結(jié)束標志,就繼續(xù)寫</p><p><b> {</b></p><p> WriteData(Str[i]); //將字符常量寫入LCD</p><p> i++; //指向下一個字符</p&
84、gt;<p> delaynms(100); //延時100ms較長時間,以看清關(guān)于顯示的說明</p><p><b> }</b></p><p><b> }</b></p><p> /***********************************************
85、******</p><p> 函數(shù)功能:顯示溫度符號</p><p> ***************************************************/ </p><p> void display_symbol(void)</p><p><b> {</b></p>
86、<p> unsigned char i;</p><p> WriteAddress(0x40); //寫顯示地址,將在第2行第1列開始顯示</p><p> i = 0; //從第一個字符開始顯示</p><p> while(Temp[i] != '\0') //只要沒有寫到結(jié)束標志,就
87、繼續(xù)寫</p><p><b> {</b></p><p> WriteData(Temp[i]); //將字符常量寫入LCD</p><p> i++; //指向下一個字符</p><p> delaynms(50); //延時1ms給硬件一點反應(yīng)
88、時間</p><p><b> }</b></p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:顯示溫度的小數(shù)點</p><p&
89、gt; ***************************************************/ </p><p> void display_dot(void)</p><p> { </p><p> WriteAddress(0x49); //寫顯示地址,將在第2行第10列開始顯示 </p>
90、<p> WriteData('.'); //將小數(shù)點的字符常量寫入LCD</p><p> delaynms(50); //延時1ms給硬件一點反應(yīng)時間</p><p><b> }</b></p><p> /********************************
91、*********************</p><p> 函數(shù)功能:顯示溫度的單位(Cent)</p><p> ***************************************************/ </p><p> void display_cent(void)</p><p><b> {
92、</b></p><p> unsigned char i; </p><p> WriteAddress(0x4c); //寫顯示地址,將在第2行第13列開始顯示</p><p> i = 0; //從第一個字符開始顯示 </p><p> while(Cent
93、[i] != '\0') //只要沒有寫到結(jié)束標志,就繼續(xù)寫</p><p><b> {</b></p><p> WriteData(Cent[i]); //將字符常量寫入LCD</p><p> i++; //指向下一個字符</p><p&
94、gt; delaynms(50); //延時1ms給硬件一點反應(yīng)時間</p><p><b> }</b></p><p><b> }</b></p><p> /*****************************************************</p>&l
95、t;p> 函數(shù)功能:顯示溫度的整數(shù)部分</p><p><b> 入口參數(shù):x</b></p><p> ***************************************************/ </p><p> void display_temp1(unsigned char x)</p><
96、;p><b> {</b></p><p> unsigned char j,k,l; //j,k,l分別儲存溫度的百位、十位和個位</p><p> j=x/100; //取百位</p><p> k=(x%100)/10; //取十位</p><p> l=x%
97、10; //取個位 </p><p> WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示</p><p> WriteData(digit[j]); //將百位數(shù)字的字符常量寫入LCD</p><p> WriteData(digit[k]); //將十位數(shù)字的字符常量寫入LCD<
98、;/p><p> WriteData(digit[l]); //將個位數(shù)字的字符常量寫入LCD</p><p> delaynms(50); //延時1ms給硬件一點反應(yīng)時間 </p><p><b> }</b></p><p> /**************************
99、***************************</p><p> 函數(shù)功能:顯示溫度的小數(shù)數(shù)部分</p><p><b> 入口參數(shù):x</b></p><p> ***************************************************/ </p><p> void dis
100、play_temp2(unsigned char x)</p><p><b> {</b></p><p> WriteAddress(0x4a); //寫顯示地址,將在第2行第11列開始顯示</p><p> WriteData(digit[x]); //將小數(shù)部分的第一位數(shù)字字符常量寫入LCD</p>
101、<p> delaynms(50); //延時1ms給硬件一點反應(yīng)時間</p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:做好讀溫度的準備</p>&
102、lt;p> ***************************************************/ </p><p> void ReadyReadTemp(void)</p><p><b> {</b></p><p> Init_DS18B20(); //將DS18B20初始化</p>
103、<p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換 </p><p> for(time=0;time<100;time++)</p><p> ; //溫度轉(zhuǎn)換需要一點時間</p><p> Init_D
104、S18B20(); //將DS18B20初始化</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位</p><p><b> }</b></p><p> /***
105、**************************************************</p><p><b> 函數(shù)功能:主函數(shù)</b></p><p> ***************************************************/ </p><p> void main(void)</p
106、><p><b> { </b></p><p> unsigned char TL; //儲存暫存器的溫度低位</p><p> unsigned char TH; //儲存暫存器的溫度高位</p><p> unsigned char TN; //儲存溫度的整數(shù)部分</p>
107、<p> unsigned char TD; //儲存溫度的小數(shù)部分</p><p> LcdInitiate(); //將液晶初始化</p><p> delaynms(5); //延時5ms給硬件一點反應(yīng)時間</p><p> if(Init_DS18B20()==1)</p>&l
108、t;p> display_error();</p><p> display_explain();</p><p> display_symbol(); //顯示溫度說明</p><p> display_dot(); //顯示溫度的小數(shù)點</p><p> display_cent(); //顯示
109、溫度的單位</p><p> while(1) //不斷檢測并顯示溫度</p><p><b> {</b></p><p> ReadyReadTemp(); //讀溫度準備</p><p> TL=ReadOneChar(); //先讀的是溫度值低位</p&
110、gt;<p> TH=ReadOneChar(); //接著讀的是溫度值高位</p><p> TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16</p><p> //這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了</p><p> TD=(TL%16)*10/16;
111、//計算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整,</p><p> //這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù))</p><p> display_temp1(TN); //顯示溫度的整數(shù)部分</p><p> display_temp2(TD); //顯示溫度的小數(shù)部分</p><p> delaynm
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ds18b20溫度檢測畢業(yè)設(shè)計
- ds18b20溫度計課程設(shè)計
- ds18b20溫度檢測程序(c語言)
- 課程設(shè)計--ds18b20數(shù)字溫度計
- ds18b20數(shù)字溫度計設(shè)計課程設(shè)計
- ds18b20課程設(shè)計---溫度監(jiān)控系統(tǒng)設(shè)計
- 課程設(shè)計 ---基于ds18b20的溫度測試led顯示
- 課程設(shè)計---基于ds18b20的多點溫度測量系統(tǒng)
- 課程設(shè)計-基于ds18b20數(shù)字溫度計的設(shè)計
- 基于ds18b20多點溫度檢測系統(tǒng)畢業(yè)論文
- 數(shù)字溫度計ds18b20課程設(shè)計報告
- 基于ds18b20數(shù)字式溫度計課程設(shè)計
- 自動檢測技術(shù)課程設(shè)計-基于單片機的溫度自動檢測儀表設(shè)計
- 基于ds18b20和1602的溫度計課程設(shè)計報告
- 智能儀表課程設(shè)計--基于ds18b20的溫度采集系統(tǒng)
- 課程設(shè)計---基于ds18b20的單片機溫度采集系統(tǒng)
- 基于單片機設(shè)計的溫度計(ds18b20)課程設(shè)計
- 傳感器課程設(shè)計-----ds18b20數(shù)字溫度計的設(shè)計
- 單片機課程設(shè)計-- ds18b20的溫度測量與顯示系統(tǒng)
- 基于ds18b20的溫度計設(shè)計
評論
0/150
提交評論