

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