版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 計算機控制技術(shù)綜合應(yīng)用設(shè)計</p><p> 題目 數(shù)字溫度計 </p><p> 二級學(xué)院 電子信息與自動化學(xué)院 </p><p> 專 業(yè) 電氣工程及其自動化 </p><
2、;p> 班 級 電氣三班 </p><p><b> 目錄</b></p><p><b> 1、緒論1</b></p><p> 2、設(shè)計的準(zhǔn)備工作1</p><p><b> 3、原件介紹1<
3、;/b></p><p> 3.1、 STC89C52的功能特性1</p><p> 3.2、 DS18B20的特點3</p><p> 4、設(shè)計步驟及原理4</p><p><b> 4.1方案框圖4</b></p><p> 4.2、程序設(shè)計4</p>
4、<p> 4.2.1程序流程圖4</p><p> 4.2.2定義變量5</p><p> 4.2.3 主程序6</p><p> 4.2.4 初始化DS18B20. ... ... ... ... ... ... ... ... ... ... 7</p><p> 4.2.5 DS18B20讀寫字節(jié)... .
5、.. ... ... ... ... ... ... ... ... 8</p><p> 4.2.6 讀取溫度... ... ... ... ... ... ... ... ... ... ... ...8</p><p> 4.2.7 數(shù)碼管顯示9</p><p> 4.3、電路硬件設(shè)計及Proteus軟件仿真9</p><p&g
6、t; 4.3.1、時鐘電路與復(fù)位電路9</p><p> 4.3.2 數(shù)碼管顯示10</p><p> 4.3.3 鍵位控制11</p><p> 4.3.4 總仿真圖11</p><p> 5、設(shè)計結(jié)果及分析12</p><p> 6、總結(jié)及心得體會12</p><p>
7、;<b> 7、附錄13</b></p><p> (1)、元器件清單13</p><p> ?。?)、源程序:13</p><p><b> 1、緒論</b></p><p> 隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標(biāo)之一,它所給人帶來的方便也是不可否定的,其中數(shù)字
8、溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活提供更好的更方便的設(shè)施就需要從單片機技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p> 本次課程設(shè)計,就是用單片機實現(xiàn)溫度控制,傳統(tǒng)的溫度檢測大多以熱敏電阻為溫度傳感器,但熱敏電阻的可靠性差,測量溫度準(zhǔn)確率低,而且必須經(jīng)過專門的接口電路轉(zhuǎn)換成數(shù)字信號才能由單片機進行處理。本次采用DS18B20數(shù)字溫度傳感器來實現(xiàn)基于
9、51單片機的數(shù)字溫度計的設(shè)計。</p><p> 本次課程設(shè)計的具體要求:</p><p> a)、使用溫度傳感器(模擬或數(shù)字式)測量環(huán)境溫度</p><p> b)、測量結(jié)果顯示到LED數(shù)碼管上</p><p> c)、系統(tǒng)工作滿足一般的溫度檢測要求</p><p><b> 擴展要求:</
10、b></p><p> *、可設(shè)定溫度報警閾值</p><p> *、可存儲、查看最高溫度和最低溫度</p><p><b> 2、設(shè)計的準(zhǔn)備工作</b></p><p> 由于本設(shè)計是測溫電路,功能不是太復(fù)雜,STC89C52單片機完全可以滿足要求,而測溫部分采用可以使用熱敏電阻之類的器件利用其感溫效應(yīng),
11、在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉(zhuǎn)換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,但是這種設(shè)計需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。進而考慮到用溫度傳感器,在單片機電路設(shè)計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉(zhuǎn)換,就可以滿足設(shè)計要求。在顯示部分設(shè)計要求中要求溫度顯示在數(shù)碼管上,我們考慮到傳感
12、器的測溫范圍大致為—55℃~125℃,精度也可精確到小數(shù),所以決定采用四位共陽極數(shù)碼管。</p><p> 軟件方面,編程用C語言,我們決定采用常用的keil軟件來進行程序的編寫與編譯,并生成.hex文件。再用proteus仿真軟件畫出電路圖,進行仿真,其中proteus軟件是目前最好的仿真單片機及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機愛好者、從事單片機教學(xué)的教師、致力于單片機開發(fā)應(yīng)用的科技工作
13、者的青睞。</p><p> 除此之外,就是準(zhǔn)備焊接實物的工具,焊鐵、導(dǎo)線等等。</p><p><b> 3、原件介紹</b></p><p> 3.1、 STC89C52的功能特性</p><p> STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片
14、上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8K字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU
15、 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35Mhz,6T/12T可選。 </p><p> 3.2、 DS18B20的特點</p><p> 本設(shè)計的測溫系統(tǒng)采用芯片DS18B20,DS18B20是DALLAS公司的最新單線數(shù)字溫度傳感器,它的體積更小,適用
16、電壓更寬,更經(jīng)濟。</p><p><b> 實現(xiàn)方法簡介</b></p><p> DS18B20采用外接電源方式工作,一線測溫一線與STC89C51連接,測出的數(shù)據(jù)放在寄存器中,將數(shù)據(jù)經(jīng)過BCD碼轉(zhuǎn)換后送到LED顯示。</p><p> DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱
17、敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下:</p><p> ●獨特的單線接口僅需要一個端口引腳進行通信;</p><p> ●多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能;</p><p><b> ●無須外部器件;</b>&l
18、t;/p><p> ●可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b> ●零待機功耗;</b></p><p> ●溫度以9或12位數(shù)字;</p><p> ●用戶可定義報警設(shè)置;</p><p> ●報警搜索命令識別并標(biāo)志超過程序限定溫度(溫度報警條件)的器件;&l
19、t;/p><p> ●負(fù)電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p> 圖1.DS18B20的原理圖</p><p> 圖2.DS18B20的內(nèi)部結(jié)構(gòu)</p><p><b> 4、設(shè)計步驟及原理</b></p><p><b> 4.1方案
20、框圖</b></p><p> 基于STC89C52單片機的數(shù)字溫度計設(shè)計由STC89C52單片機控制器、電源、顯示電路、溫度傳感器、復(fù)位電路和時鐘電路組成,系統(tǒng)框圖如圖1所示。電源給整個電路供電,顯示電路顯示溫度值,時鐘電路為STC89C52提供時鐘頻率。傳感器采用美國DALLAS半導(dǎo)體公司生產(chǎn)的一種智能溫度傳感器DS18B20,其測溫范圍為-55~125℃,最高分辨率可達0.0625℃,完全符合
21、設(shè)計要求。</p><p><b> 圖3.系統(tǒng)框圖</b></p><p><b> 4.2、程序設(shè)計</b></p><p> 4.2.1程序流程圖</p><p> 主程序的主要功能是負(fù)責(zé)溫度的實時顯示、讀出并處理DS18B20測量的當(dāng)前溫度值,溫度測試每1S進行一次。這樣可以在1S之
22、內(nèi)測量一次被測溫度,其程序流程圖如下圖所示。</p><p> 讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),其程序流程圖下圖所示。</p><p><b> 圖4.程序流程圖</b></p><p> 溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,采用12位分辨率轉(zhuǎn)換時間約為750ms。程序設(shè)計中采用1s顯示程序延時等待轉(zhuǎn)換的完成。計算
23、溫度子程序?qū)AM中讀取值進行BCD碼地轉(zhuǎn)換運算,并進行溫度值正負(fù)的判定,顯示數(shù)據(jù)刷新子程序主要是對顯示緩沖器中的顯示數(shù)據(jù)進行刷新操作,當(dāng)最高顯示位為0時將符號顯示位移入下一位</p><p><b> 4.2.2定義變量</b></p><p> sbit DATA = P1^1; //DS18B20接入口</p><p> ucha
24、r code table[]={0xc0,0xf9,0xa4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xc1,0x86,0x8e};//共陽極字型碼</p><p> int temp; //溫度值</p><p> int ss;//中間的一個變量</p><p><b> i
25、nt dd;</b></p><p><b> int j;</b></p><p> uchar data b;//定時器中斷次數(shù)</p><p> uchar data buf[4];//字型顯示中間變量</p><p> int alarmH=300; //默認(rèn)報警值</p>
26、<p> int alarmL=100;</p><p> //定義開關(guān)的接入口</p><p> sbit k1=P2^5;//+</p><p> sbit k2=P2^6;//-</p><p> sbit k3=P2^7;//確認(rèn)</p><p> sbit k4=P2^4; //
27、切換</p><p> sbit bell=P1^0; //蜂鳴器</p><p> sbit HLight=P1^2; //正溫指示燈</p><p> sbit LLight=P1^3; //負(fù)溫度指示燈</p><p> sbit Red=P1^6; //溫度上限設(shè)置指示燈</p><p>
28、 sbit Green=P1^7; //溫度下限設(shè)置指示燈</p><p> bit set=0;//初始化</p><p> bit Flag=0;//設(shè)置標(biāo)志</p><p><b> int n;</b></p><p><b> //函數(shù)的聲明區(qū)</b></p>
29、<p> void key_to1();</p><p> void key_to2();</p><p> void delay(uint); </p><p> void key();</p><p> void Show();</p><p><b> 4.2.3 主程序</
30、b></p><p> void Show() //顯示函數(shù),分別表示溫度正負(fù)值</p><p> { if(temp>=0)</p><p> {display();}</p><p> if(temp<0)</p><p> {display00();}</p>
31、<p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> TCON=0x01; //定時器T0工作在01模式下</p><p> TMOD=0X01;</p><p> TH0=
32、0XD8;//裝入初值</p><p><b> TL0=0XF0;</b></p><p> EA=1; //開總中斷</p><p> ET0=1; //開T0中斷</p><p> TR0=1; //T0開始運行計數(shù)</p><p> EX0=1; //開外部中斷0</p&
33、gt;<p> for(n=0;n<500;n++)//顯示啟動LOGo"- - - -"</p><p> {bell=1;warn=1;logo();}</p><p><b> Red=0;</b></p><p><b> while(1)</b></p>
34、<p><b> {</b></p><p><b> key(); </b></p><p> ss=ReadTemperature();</p><p><b> Show();</b></p><p> alarm(); //報警函數(shù)</
35、p><p> if(Flag==1)</p><p> {bell=!bell;</p><p> 4.2.4初始化DS18B20</p><p> Init_DS18B20(void) //傳感器初始化</p><p><b> {</b></p><p>
36、 uchar x=0;</p><p> DATA = 1; //DQ復(fù)位</p><p> delay(10); //稍做延時</p><p> DATA = 0; //單片機將DQ拉低</p><p> delay(80); //精確延時 大于 480us //450</p><p>
37、 DATA = 1; //拉高總線</p><p> delay(20);</p><p> x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay(30);</p><p><b> }</b></p><p> 4.
38、2.5 DS18B20讀寫字節(jié)</p><p> ReadOneChar(void) //讀一個字節(jié)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat = 0;</p><p> for (i=8;i>0;i--
39、)</p><p><b> {</b></p><p> DATA = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DATA = 1; // 給脈沖信號</p><p><b> if(DAT
40、A)</b></p><p> dat|=0x80;</p><p><b> delay(8);</b></p><p><b> }</b></p><p> return(dat);</p><p><b> }</b><
41、;/p><p> WriteOneChar(unsigned char dat)//寫一個字節(jié)</p><p><b> {</b></p><p> uchar i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b&
42、gt;</p><p><b> DATA = 0;</b></p><p> DATA = dat&0x01;</p><p> delay(10);</p><p><b> DATA = 1;</b></p><p><b> dat>
43、>=1;</b></p><p><b> }</b></p><p><b> delay(8);</b></p><p><b> }</b></p><p> 4.2.6 讀取溫度</p><p> int ReadTe
44、mperature(void) //讀取溫度</p><p><b> {</b></p><p> uchar a=0;</p><p> uchar b=0;</p><p><b> int t=0;</b></p><p> float tt=0;</
45、p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC)
46、; //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> a=ReadOneChar();//低位</p><p> b=ReadOneChar();//高位</p><p><b> t=b;</b><
47、;/p><p><b> t<<=8;</b></p><p><b> t=t|a;</b></p><p> tt=t*0.0625;</p><p> t= tt*10+0.5; </p><p> return(t);</p><
48、p><b> }</b></p><p> 4.2.7 數(shù)碼管顯示</p><p><b> P0=0xff;</b></p><p> P2=0xf2; //顯示小數(shù)點</p><p> P0=0x7f; //顯示小數(shù)點</p><p> delay(30
49、0);</p><p> P2=0xf0; // 初始燈為滅的</p><p><b> P0=0xff;</b></p><p> P2=0xf8; //片選LCD1</p><p> P0=table[buf[1]];</p><
50、;p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0xf4; //片選LCD2</p><p> P0=table[buf[2]];</p
51、><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0Xf2; //片選LCD3</p><p> P0=table[buf
52、[3]];</p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p><b> P2=0Xf1;</b></p><p> P0=table
53、[buf[0]]; //片選LCD4</p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> }</b></p><p> 4.3、電路硬件設(shè)計及Proteus軟件仿真</p><p> 4.3
54、.1、時鐘電路與復(fù)位電路</p><p> 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口, 片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工 作。掉電保護方式下,RAM內(nèi)容被
55、保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。8 位微控制器 8K 字節(jié)在系統(tǒng)可編程 Flash AT89S52</p><p> 圖5.時鐘電路與復(fù)位電路</p><p> 4.3.2數(shù)碼管顯示</p><p> 圖6.數(shù)碼顯示部分仿真圖</p><p> 其中P0.0~P0.7分別控制數(shù)碼管的管段、小數(shù)點。
56、P2.0~P2.3分別控制片選位,丄拉電阻為4.7KΩ,上拉就是將不確定的信號通過一個電阻鉗位在高電平,電阻同時起限流作用,上拉電阻是用來解決總線驅(qū)動能力不足時提供電流的問題的。一般說法是上拉增大電流,下拉電阻是用來吸收電流。數(shù)碼管為4位共陽極數(shù)碼管。</p><p><b> 4.3.3鍵位控制</b></p><p> 圖7.鍵位控制部分仿真圖</p&g
57、t;<p> 如圖,P1.6、P1.7及P2.4~P2.7管腳為設(shè)置溫度閾值,發(fā)光二極管D5、D6為設(shè)置時的指示燈,D1、D2分別為超過超過最高設(shè)定溫度時的報警燈和低于最低設(shè)置溫度時的報警燈。</p><p> 4.3.4、總仿真圖</p><p> 圖8.總仿真圖 </p><p><b> 5、設(shè)計結(jié)果及分析<
58、/b></p><p> 系統(tǒng)的性能調(diào)試以(1、主程序)為主。硬件調(diào)試比較簡單,首先檢查電路的焊接是否正確,然后用萬用表測試。軟件調(diào)試可以先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、從程序的編寫和調(diào)試,由于DS18B20與單片機采用串行數(shù)據(jù)傳送,因此對DS18B20進行編程時必須嚴(yán)格地保證讀寫時序,否則將無法讀取測量結(jié)果。</p><p> 性能測試可用制作的溫度計
59、和已有的成品溫度計來同時測量比較,由于DS18B20精度較高,所以誤差指標(biāo)可以限制在0.1°C以內(nèi),另外,-55°C至+125°C的測溫范圍使得該溫度計完全適用于一般的應(yīng)用場合,其低電壓供電的特性可做成電池供電的手持電子溫度計。</p><p><b> 6、總結(jié)及心得體會</b></p><p> 兩個星期的課程設(shè)計,從了解各個芯片
60、的性能特點到合理設(shè)計硬件電路,從從數(shù)字溫度計設(shè)計方案框圖到編寫相應(yīng)的程序,從proteus仿真到模塊焊接,再到系統(tǒng)性能調(diào)試。每一步都深深地體會到其中的不容易。</p><p> 開始設(shè)計方案時,必須熟悉原件的特點,引腳的含義,這都靠自己翻閱書籍和上網(wǎng)查找。為后面的總體設(shè)計打好基礎(chǔ)。編寫程序必須與Proteus相結(jié)合,才能保證程序的準(zhǔn)確性。模塊焊接就是考驗?zāi)愕膭邮帜芰?。這過程中,需要耐心,耐心,再耐心,細(xì)心,細(xì)心
61、,再細(xì)心。最后的性能調(diào)試,不斷發(fā)現(xiàn)問題,然后解決問題。</p><p> 這次課程設(shè)計很好地全方位地培養(yǎng)了我們的能力,我們的專業(yè)知識,動手能力,獨立工作能力與創(chuàng)造力,書寫技術(shù)報告和編制技術(shù)資料的能力。在專業(yè)知識與研究方法方面為日后的畢業(yè)設(shè)計乃至畢業(yè)后的工作奠定良好的基礎(chǔ)</p><p> 根據(jù)設(shè)計,基于單片機的數(shù)字溫度計由單片機控制器,電源,顯示電路,溫度傳感器,復(fù)位電路和時鐘電路組成
62、。制作簡單,測溫范圍在10度到32度。根據(jù)情況,加入設(shè)置溫度上限和下限的功能以及溫度報警器,誤差范圍控制在0.1℃。這樣會使這個設(shè)計應(yīng)用更廣,性價比更高。</p><p> 針對編寫好的程序進行軟件調(diào)試,在proteus軟件中模擬,電路溫度測試正常。證明系統(tǒng)程序編寫正確。</p><p> 根據(jù)設(shè)計的電路圖焊接實物。針對個各種芯片的引腳特點檢查硬件焊接是否正確。</p>
63、<p> 性能調(diào)試過程中出現(xiàn)的問題及解決方案</p><p> ?。?)LED數(shù)碼管只顯示初始溫度85℃。檢查DS18B20溫度傳感器。發(fā)現(xiàn)焊接電路沒有問題,重新焊接。溫度顯示仍然是85℃,最后發(fā)現(xiàn)是傳感器燒壞,更換后顯示正常。</p><p> ?。?)LED數(shù)碼管顯示不全亮度不夠。檢查LED數(shù)碼管焊接電路。</p><p> ?。?)在proteus
64、模擬的電路圖,在實際焊接時,并不可行。必須查找芯片對應(yīng)的引腳功能。</p><p><b> 參考文獻</b></p><p> [1] 倪曉軍.單片機原理與接口技術(shù)教程.北京:清華大學(xué)出版社,2009</p><p> [2] 林立 張俊亮 《單片機原理及應(yīng)用》 北京:電子工業(yè)出版社,2009</p><p
65、> [3] 李廣弟.單片機基礎(chǔ). 北京:北京航空航天大學(xué)出版社,1994</p><p><b> 7、附錄</b></p><p><b> (1)、元器件清單</b></p><p> 表1 基于AT89S52單片機的數(shù)字溫度計元件清單</p><p><b> ?。?
66、)、源程序:</b></p><p> #include<reg52.h></p><p> #include <intrins.h></p><p> #define uchar unsigned char </p><p> #define uint unsigned int<
67、;/p><p> sbit DATA = P1^1; //DS18B20接入口</p><p> uchar code table[]={0xc0,0xf9,0xa4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xc1,0x86,0x8e};//共陰極字型碼</p><p> int temp; /
68、/溫度值</p><p> int ss;//中間的一個變量</p><p><b> int dd;</b></p><p><b> int j;</b></p><p> uchar data b;//定時器中斷次數(shù)</p><p> uchar data
69、 buf[4];//字型顯示中間變量</p><p> int alarmH=300; //默認(rèn)報警值</p><p> int alarmL=100;</p><p> //定義開關(guān)的接入口</p><p> sbit k1=P2^5;//+</p><p> sbit k2=P2^6;//-<
70、;/p><p> sbit k3=P2^7;//確認(rèn)</p><p> sbit k4=P2^4; //切換</p><p> sbit bell=P1^0; //蜂鳴器</p><p> sbit HLight=P1^2; //正溫指示燈</p><p> sbit LLight=P1^3; //負(fù)溫
71、度指示燈</p><p> sbit warn=P1^4; //報警指示燈</p><p> sbit Red=P1^6; //溫度上限設(shè)置指示燈</p><p> sbit Green=P1^7; //溫度下限設(shè)置指示燈</p><p> bit set=0;//初始化</p><p> bi
72、t Flag=0;//設(shè)置標(biāo)志</p><p><b> int n;</b></p><p><b> //函數(shù)的聲明區(qū)</b></p><p> void key_to1();</p><p> void key_to2();</p><p> void de
73、lay(uint); </p><p> void key();</p><p> void Show();</p><p><b> //函數(shù)的定義區(qū)</b></p><p><b> /*延時子函數(shù)*/</b></p><p> void delay(uint
74、num)</p><p><b> {</b></p><p> while(num--) ;</p><p><b> }</b></p><p> //DS18b20溫度傳感器所需函數(shù),分為初始化,讀寫字節(jié),讀取溫度4個函數(shù)</p><p> Init_DS18
75、B20(void) //傳感器初始化</p><p><b> {</b></p><p> uchar x=0;</p><p> DATA = 1; //DQ復(fù)位</p><p> delay(10); //稍做延時</p><p> DATA = 0; //單
76、片機將DQ拉低</p><p> delay(80); //精確延時 大于 480us //450</p><p> DATA = 1; //拉高總線</p><p> delay(20);</p><p> x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><
77、;p> delay(30);</p><p><b> }</b></p><p> ReadOneChar(void) //讀一個字節(jié)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat =
78、 0;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> DATA = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DATA = 1; /
79、/ 給脈沖信號</p><p><b> if(DATA)</b></p><p> dat|=0x80;</p><p><b> delay(8);</b></p><p><b> }</b></p><p> return(dat);&
80、lt;/p><p><b> }</b></p><p> WriteOneChar(unsigned char dat)//寫一個字節(jié)</p><p><b> {</b></p><p> uchar i=0;</p><p> for (i=8; i>0;
81、 i--)</p><p><b> {</b></p><p><b> DATA = 0;</b></p><p> DATA = dat&0x01;</p><p> delay(10);</p><p><b> DATA = 1;<
82、/b></p><p><b> dat>>=1;</b></p><p><b> }</b></p><p><b> delay(8);</b></p><p><b> }</b></p><p>
83、 int ReadTemperature(void) //讀取溫度</p><p><b> {</b></p><p> uchar a=0;</p><p> uchar b=0;</p><p><b> int t=0;</b></p><p> floa
84、t tt=0;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> Init_DS18B20();</p><p> WriteO
85、neChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> a=ReadOneChar();//低位</p><p> b=ReadOneChar();//高位</p><p><b> t=b;&
86、lt;/b></p><p><b> t<<=8;</b></p><p><b> t=t|a;</b></p><p> tt=t*0.0625;</p><p> t= tt*10+0.5; </p><p> return(t);<
87、/p><p><b> }</b></p><p> void display00() //*********顯示負(fù)值子函數(shù)</p><p><b> {</b></p><p> dd=-(temp-1);</p><p> buf[1]=dd/100;&
88、lt;/p><p> buf[2]=dd/100;</p><p> buf[3]=dd%100/10;</p><p> buf[0]=dd%10;</p><p><b> //動態(tài)顯示</b></p><p> for(j=0;j<5;j++)</p><p&
89、gt;<b> {</b></p><p> P2=0xf0; // 初始燈為滅的</p><p><b> P0=0xff;</b></p><p> P2=0xf2; //顯示小數(shù)點</p><p> P0=0x7f; //顯示小數(shù)點</p>
90、<p> delay(300);</p><p> P2=0xf0; // 初始燈為滅的</p><p><b> P0=0xff;</b></p><p> P2=0xf8; //片選LCD1</p><p><b> P0=0
91、xbf;</b></p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0xf4; //片選LCD2</p><p
92、> P0=table[buf[2]];</p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0Xf2; //片選LCD3</p><p>
93、; P0=table[buf[3]];</p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p><b> P2=0Xf1;</b></p><
94、p> P0=table[buf[0]]; //片選LCD4</p><p> delay(300);</p><p><b> P2=0xf0;</b></p><p><b> }</b></p><p><b> }</b></p>&
95、lt;p><b> //顯示正值子函數(shù)</b></p><p> void display()</p><p><b> {</b></p><p> buf[1]=temp/1000;//顯示百位</p><p> buf[2]=temp/100%10;//顯示十位</
96、p><p> buf[3]=temp%100/10;//顯示個位</p><p> buf[0]=temp%10; //小數(shù)位</p><p> for(j=0;j<3;j++) </p><p><b> {</b></p><p> P2=0xf0; /
97、/ 初始燈為滅的</p><p><b> P0=0xff;</b></p><p> P2=0xf2; //顯示小數(shù)點</p><p> P0=0x7f; //顯示小數(shù)點</p><p> delay(300);</p><p> P2=0xf0; //
98、 初始燈為滅的</p><p><b> P0=0xff;</b></p><p> P2=0xf8; //片選LCD1</p><p> P0=table[buf[1]];</p><p> delay(300);</p><p><b> P2
99、=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0xf4; //片選LCD2</p><p> P0=table[buf[2]];</p><p> delay(300);</p><p><
100、b> P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p> P2=0Xf2; //片選LCD3</p><p> P0=table[buf[3]];</p><p> delay(300);</p><p><b&g
101、t; P2=0xf0;</b></p><p><b> P0=0xff;</b></p><p><b> P2=0Xf1;</b></p><p> P0=table[buf[0]]; //片選LCD4</p><p> delay(300);</p>
102、<p><b> P2=0xf0;</b></p><p><b> }</b></p><p> if (temp>alarmH )</p><p> {HLight=1;LLight=0;}</p><p> else if(temp<alarmL
103、)</p><p> {HLight=0;LLight=1;}</p><p><b> else</b></p><p> {HLight=0;LLight=0;}</p><p><b> }</b></p><p> void key()//按鍵掃描子
104、程序</p><p> { if(k1!=1)</p><p><b> {</b></p><p> delay(20);</p><p><b> if(k1!=1)</b></p><p><b> {</b></p>
105、<p> while(k1!=1)</p><p> { key_to1();</p><p> for(n=0;n<8;n++)</p><p><b> Show();</b></p><p><b> }</b></p><p><b&g
106、t; }</b></p><p><b> }</b></p><p><b> if(k2!=1)</b></p><p><b> {</b></p><p> delay(20);</p><p><b> if(
107、k2!=1)</b></p><p><b> {</b></p><p> while(k2!=1)</p><p> { key_to2(); </p><p> for(n=0;n<8;n++)</p><p><b> Show();</b>
108、;</p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> if(k3!=1)</b></p><p> {TR0=1; //復(fù)位,
109、開定時</p><p> temp=ReadTemperature();</p><p><b> }</b></p><p><b> if(k4!=1)</b></p><p> { delay(20);</p><p><b> if(k4!=1)
110、</b></p><p> { while(k4!=1);</p><p><b> set=!set;</b></p><p> if(set==0)</p><p> { Red=0;Green=1;}</p><p> else { Green=0;Red=1;}&l
111、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void key_to1()</p><p><b> {</b></p>&
112、lt;p> TR0=0; //關(guān)定時器</p><p><b> temp+=10;</b></p><p> if(temp>=1100)</p><p> {temp=-550;}</p><p> if(set==0)</p><p> {alarmH=
113、temp;}</p><p> else {alarmL=temp;}</p><p><b> }</b></p><p> void key_to2()</p><p><b> {</b></p><p><b> TR0=0;</b>
114、</p><p><b> //關(guān)定時器</b></p><p><b> temp-=10;</b></p><p> if(temp<=-550)</p><p> {temp=1100;}</p><p> if(set==0)</p>&
115、lt;p> { alarmH=temp;}</p><p> else { alarmL=temp;}</p><p><b> }</b></p><p> void alarm(void)</p><p><b> {</b></p><p> if(t
116、emp>alarmH||temp<alarmL) </p><p> { //bell=1;</p><p> //delay(50);</p><p><b> //bell=0;</b></p><p><b> Flag=1;</b></p><p&
117、gt; }else {Flag=0;}</p><p><b> }</b></p><p> logo()//開機的Logo </p><p> { P0=0x40;</p><p><b> P2=0xf7;</b></p><p> delay(50)
118、;</p><p><b> P2=0xfb;</b></p><p> delay(50);</p><p><b> P2=0Xfd;</b></p><p> delay(50);</p><p><b> P2=0Xfe;</b><
119、;/p><p> delay(50);</p><p> P1 = 0xff; //關(guān)閉顯示</p><p><b> }</b></p><p> void Show() //顯示函數(shù),分別表示溫度正負(fù)值</p><p> { if(temp>=0)<
120、/p><p> {display();}</p><p> if(temp<0)</p><p> {display00();}</p><p><b> }</b></p><p> void main()</p><p><b> {<
121、/b></p><p> TCON=0x01; //定時器T0工作在01模式下</p><p> TMOD=0X01;</p><p> TH0=0XD8;//裝入初值</p><p><b> TL0=0XF0;</b></p><p> EA=1; //開總中斷</p
122、><p> ET0=1; //開T0中斷</p><p> TR0=1; //T0開始運行計數(shù)</p><p> EX0=1; //開外部中斷0</p><p> for(n=0;n<500;n++)//顯示啟動LOGo"- - - -"</p><p> {bell=1;warn=1;
123、logo();}</p><p><b> Red=0;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p><b> key(); </b></p><p>
124、 ss=ReadTemperature();</p><p><b> Show();</b></p><p> alarm(); //報警函數(shù)</p><p> if(Flag==1)</p><p> {bell=!bell;</p><p> warn=!warn;} //蜂
125、鳴器滴滴響</p><p> else {bell=1;</p><p><b> warn=1;}</b></p><p><b> } </b></p><p><b> }</b></p><p> void time0(void)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 數(shù)字溫度計課程設(shè)計
- 課程設(shè)計-數(shù)字溫度計
- 課程設(shè)計---數(shù)字溫度計設(shè)計
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計的課程設(shè)計
- 數(shù)字溫度計課程設(shè)計 (3)
- 數(shù)字溫度計課程設(shè)計報告
- 課程設(shè)計之?dāng)?shù)字溫度計
- 數(shù)字溫度計課程設(shè)計報告
- 數(shù)字溫度計的課程設(shè)計
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計 (2)
- 數(shù)字溫度計課程設(shè)計---基于51單片機數(shù)字溫度計設(shè)計
- 數(shù)字溫度計課程設(shè)計---基于51單片機數(shù)字溫度計設(shè)計
評論
0/150
提交評論