版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)理與信息工程學(xué)院</b></p><p> 《單片機(jī)原理及應(yīng)用》期末課程設(shè)計(jì)</p><p> 題 目: 智能體溫計(jì) </p><p> 專 業(yè): 電子信息工程 </p><p> 班 級(jí):
2、 電信061 </p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)老師: </p>
3、<p> 成 績: </p><p> ( 2008.12 )</p><p><b> 目 錄</b></p><p> 第1節(jié) 引 言……………………………………………………………………………3</p><p> 1.1 智能體
4、溫計(jì)概述 ………………………………………………………………3</p><p> 1.2 本次設(shè)計(jì)要求 …………………………………………………………………4</p><p> 1.3 系統(tǒng)主要功能 …………………………………………………………………4</p><p> 第2節(jié) 系統(tǒng)主要硬件電路設(shè)計(jì) ………………………………………………………5</p&
5、gt;<p> 2.1 主要模塊的設(shè)計(jì)方案論證………………………………………………………5</p><p> 2.1.1 溫度傳感器的選擇……………………………………………………5</p><p> 2.1.2 A/D轉(zhuǎn)換器的選擇……………………………………………………5</p><p> 2.1.3 語音提示模塊………………………………
6、…………………………5</p><p> 2.2 總系統(tǒng)設(shè)計(jì)方案 ………………………………………………………………6</p><p> 2.2.1 系統(tǒng)設(shè)計(jì)框圖…………………………………………………………6</p><p> 2.2.2 系統(tǒng)整體硬件電路……………………………………………………6 </p><p> 2.3
7、 系統(tǒng)硬件組成 …………………………………………………………………8</p><p> 2.3.1 電源電路模塊…………………………………………………………8</p><p> 2.3.2 溫度檢測和放大模塊…………………………………………………8</p><p> 2.3.3 A/D轉(zhuǎn)換模塊…………………………………………………………9</p&g
8、t;<p> 2.3. 4 溫度設(shè)置、顯示及報(bào)警電路模塊 …………………………………10</p><p> 2.3.5 串行通信模塊 ………………………………………………………10</p><p> 2.3.6 語音播放模塊 ………………………………………………………11</p><p> 第3節(jié) 系統(tǒng)軟件設(shè)計(jì) ………………………………
9、…………………………………13</p><p> 3.1 系統(tǒng)主程序設(shè)計(jì)………………………………………………………………13</p><p> 3.2 程序清單………………………………………………………………………14</p><p> 第4節(jié) 結(jié)束語 …………………………………………………………………………24</p><p>
10、 參考文獻(xiàn)…………………………………………………………………………………25</p><p><b> 智能體溫計(jì)</b></p><p><b> 引 言 </b></p><p> 隨著人們生活水平的不斷提高,單片機(jī)控制無疑是人們追求的目標(biāo)之一,它在日用電子產(chǎn)品中的應(yīng)用越來越廣泛,給人帶來的方便也是不可否定的
11、,其中智能體溫計(jì)就是一個(gè)典型的例子,但人們對(duì)它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設(shè)施就需要從單片機(jī)技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p> 傳統(tǒng)的溫度計(jì)有反應(yīng)速度慢、讀數(shù)麻煩、測量精度不高、誤差大等缺點(diǎn),溫度傳感器AD590具有線性優(yōu)良、性能穩(wěn)定、靈敏度高、抗干擾能力強(qiáng)、使用方便等優(yōu)點(diǎn),廣泛應(yīng)用于冰箱、空調(diào)器、糧倉等日常生活中溫度的測量和控制。本論文利用集
12、成溫度傳感器AD590設(shè)計(jì)并制作了一款基于AT89S52的3位數(shù)碼管顯示的智能體溫計(jì),其電路簡單,軟硬件結(jié)構(gòu)模塊化,易于實(shí)現(xiàn)。</p><p> 1.1 智能體溫計(jì)概述 </p><p> 隨著時(shí)代的進(jìn)步和發(fā)展,單片機(jī)技術(shù)已經(jīng)普及到我們生活,工作,科研,各個(gè)領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),本文將介紹一種基于單片機(jī)控制的智能體溫。</p><p> 本智能體
13、溫計(jì)采用 AT89S52作為核心器件實(shí)現(xiàn)對(duì)系統(tǒng)的自動(dòng)控制,采用雙單片機(jī)串行處理結(jié)構(gòu)。外界溫度經(jīng) AD590 集成溫度傳感器采集,溫度變化轉(zhuǎn)換為線性電壓信號(hào),再經(jīng)由 OP07 構(gòu)成高精度低溫漂的放大電路處理后,作為 ADC0809 的模擬輸入信號(hào),由ADC0809 完成 A/D轉(zhuǎn)換,得到 8位的數(shù)字信號(hào)送入單片機(jī) 1(AT89S52)。單片機(jī) 1 將采集到溫度值在 LED數(shù)碼管上顯示出來, 也通過串口通信將溫度信號(hào)傳到單片 2 (AT89
14、S52) 。此外溫度預(yù)置, 報(bào)警電路模塊功能也由單片機(jī) 1完成。 單片機(jī)2 完成溫度值的語音播放功能。通過系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)說明本設(shè)計(jì)方案切實(shí)可以,能夠完成題目所要求的基本功能部分,并留有相應(yīng)的接口,為完成擴(kuò)展功能打下基礎(chǔ)。 </p><p><b> 本次設(shè)計(jì)要求</b></p><p> 單片機(jī)在日用電子產(chǎn)品中的應(yīng)用越來越廣泛,溫度則是人們?nèi)粘I钪谐3P枰獪y量
15、和控制的一個(gè)量。本論文通過AT89S52單片機(jī)和溫度傳感器AD590從硬件和軟件兩方面進(jìn)行了設(shè)計(jì)。 </p><p> 本次設(shè)計(jì)的設(shè)計(jì)要求:</p><p> ?。?)基本范圍0℃-50℃;</p><p> ?。?)精度誤差小于0.1℃;</p><p> ?。?)LED數(shù)碼直讀顯示;</p><
16、;p><b> 擴(kuò)展功能:</b></p><p> ?。?)實(shí)現(xiàn)語音報(bào)溫功能;</p><p> ?。?)實(shí)現(xiàn)報(bào)警功能; </p><p><b> 1.3系統(tǒng)主要功能</b></p><p> 本設(shè)計(jì)完成了以下功能: </p><p> (1)溫度信號(hào)的采集
17、與歸一化處理; </p><p> ?。?)A/D轉(zhuǎn)換; </p><p> ?。?)溫度值的顯示,顯示的誤差與實(shí)際的溫度值誤差在±0.1℃ 內(nèi); </p><p> ?。?)語音播報(bào)溫度與聲音報(bào)警功能。</p><p> 系統(tǒng)主要硬件電路設(shè)計(jì)</p><p> 2.1 主要模塊的設(shè)計(jì)方案論證 </
18、p><p> 2.1.1 溫度傳感器的選擇 </p><p> 方案一:采用熱敏電阻。熱敏電阻價(jià)格便宜,對(duì)溫度靈敏,原理簡單,但線性度不好,如不進(jìn)行線性補(bǔ)償,對(duì)于本設(shè)計(jì)歸一化輸出的要求,難以達(dá)到設(shè)計(jì)精度;如要對(duì)非線性進(jìn)行補(bǔ)償,則電路結(jié)構(gòu)復(fù)雜,難以調(diào)整。故不采用。 </p><p> 方案二:采用熱電偶。熱電偶在測溫范圍內(nèi)熱電性質(zhì)穩(wěn)定,不隨時(shí)間變化而變化,電阻溫度系
19、數(shù)小,導(dǎo)電率高,比熱小,但熱電偶一般體積較大,使用不方便,價(jià)格相對(duì)較高。作為一個(gè)智能體溫計(jì)的溫度傳感器,要求體積小,使用方便,便于攜帶,故此方案不合適。 </p><p> 方案三:采用集成溫度傳感器。集成溫度傳感器一般且有具有線性好、精度高、靈敏度高、體積小、使用方便等優(yōu)點(diǎn)。根據(jù)實(shí)驗(yàn)室現(xiàn)有材料可選取 AD590。AD590 的測溫范圍為-55℃~+150℃,能滿足本設(shè)計(jì)的 0~50 度測量要求。根據(jù)相關(guān)技術(shù)
20、資料:AD590線性電流輸出為 1 µ A/K,正比于絕對(duì)溫度;AD590 的電源電壓范圍為 4V~30V,并可承受 44V正向電壓和 20V反向電壓,因而器件反接也不會(huì)被損壞。該方案能完全滿足此設(shè)計(jì)的要求,故采用此方案。 </p><p> 2.1.2 A/D 轉(zhuǎn)換器的選擇 </p><p> 方案一:選用 AD574。AD574 的數(shù)字量位數(shù)可設(shè)成 8 位也可以設(shè)為 1
21、2位,且無需外接 CLOCK時(shí)鐘,轉(zhuǎn)換時(shí)間達(dá)到 25μs,輸出模擬電壓可以是單極性的 0-10V或0-20V,也可以是雙極性的±5V或±10V之間。AD574精度高,但與 8 位的單片機(jī)接口較復(fù)雜,且價(jià)格昂貴,考慮到體溫計(jì)是對(duì)溫度的測量,其響應(yīng)時(shí)間的要求不高。故不選用此方案。</p><p> 方案二:選用 ICL7135。這類芯片比較適合于低速測量儀器,適用于精度高,速度要求不高的系統(tǒng)設(shè)計(jì)
22、中。ICL7135 的輸出為動(dòng)態(tài)掃描 BCD碼,與單片機(jī)的接口較復(fù)雜。且它的滿量程輸入為 2V電壓,如在本設(shè)計(jì)中使用要進(jìn)行衰減,較難保證轉(zhuǎn)換精度。 </p><p> 方案三:選用 ADC0809。ADC0809數(shù)字量是 8位,轉(zhuǎn)換時(shí)間為 100μs,輸入模擬電壓為單極性的 0-5V。由于本設(shè)計(jì)的要求精度不是很高,ADC0809 可以達(dá)到要求,故選用此方案。 </p><p> 2.1
23、.3 語音提示模塊 </p><p> 方案一:通過 A/D轉(zhuǎn)換器、單片機(jī),存儲(chǔ)器,D\A轉(zhuǎn)換器實(shí)現(xiàn)聲音信號(hào)的采樣、處理、存儲(chǔ)和實(shí)現(xiàn)。首先將聲音信號(hào)放大,通過 AD轉(zhuǎn)換器采樣將語音模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),并由單片機(jī)和處理存放到存儲(chǔ)器中,實(shí)現(xiàn)錄音操作。在錄、放音過程中由單片機(jī)控制 D/A轉(zhuǎn)換器,將存儲(chǔ)器中的數(shù)據(jù)轉(zhuǎn)化成聲音信號(hào)。此方案安裝調(diào)試復(fù)雜,集成度低。 </p><p>
24、方案二:采用 ISD2560語音錄放集成電路。該芯片采用多電平直接模擬量存儲(chǔ)專利技術(shù),每個(gè)采樣值可直接存儲(chǔ)在片內(nèi)單個(gè) EEPROM單元中,因此能夠非常真實(shí)、自然地再現(xiàn)語音、音樂、音調(diào)和效果聲。此外,ISD2560 還省去了 A/D和 D/A轉(zhuǎn)換器。其集成度較高,內(nèi)部包括前置放大器、內(nèi)部時(shí)鐘、定時(shí)器、采樣時(shí)鐘、濾波器、自動(dòng)增益控制、邏輯控制、模擬收發(fā)器、解碼器和 480K 字節(jié)的 EEPROM。ISD2560可不分段,也可按最小段長為單
25、位來任意組合分段。因此,選擇方案二。 </p><p><b> 總系統(tǒng)設(shè)計(jì)方案</b></p><p> 2.2.1系統(tǒng)設(shè)計(jì)框圖</p><p> 根據(jù)設(shè)計(jì)要求,可將系統(tǒng)分為若干模塊,以單片機(jī)為核心,完成多項(xiàng)功能。</p><p><b> 圖2-1 系統(tǒng)框圖</b></p>
26、<p> 系統(tǒng)框圖如圖2- 1,AD590 把采集的外部溫度信號(hào)轉(zhuǎn)換成相應(yīng)的電壓,再經(jīng)過 OP07 運(yùn)放放大后作為 ADC0809的模擬輸入信號(hào),ADC0809 將此模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),通過并口送入到單片機(jī)1。單片機(jī)1把這些信號(hào)處理后通過 LED 數(shù)碼管顯示出來。同時(shí)單片機(jī)1還處理按鍵、報(bào)警模塊。單片機(jī) 1把溫度值通過串行通信傳送給單片機(jī) 2,控制語音芯片報(bào)出相對(duì)應(yīng)的溫度值。</p><p>
27、 2.2.2系統(tǒng)整體硬件電路 </p><p> 如圖 2-2 所示,該電路主要由電源電路,溫度檢測、放大電路,A/D轉(zhuǎn)換電路,雙單片機(jī)串行通信電路,按鍵輸入、報(bào)警電路,數(shù)碼管掃描顯示電路以及語音芯片電路組成。</p><p> 圖2-2 系統(tǒng)電路原理圖</p><p> 2.3 系統(tǒng)硬件組成</p><p> 2.3.1 電源電路
28、模塊</p><p> 圖2-3 電源電壓電路</p><p> 如圖 2-3 所示,220V交流電經(jīng)變壓器市降壓、橋式整流、電容濾波后經(jīng)7812、7805、7905 三端集成穩(wěn)壓管分別得到+12V、+5V、-5V電壓,給整個(gè)電路供電。</p><p> 2.3.2 溫度檢測、放大模塊</p><p> 圖2-4 AD590 溫度檢
29、測、放大電路圖</p><p> 如圖2-4 所示,溫度檢測、放大電路主要器件的作用:OP1、OP2:電壓跟隨器;</p><p> OP3:差分放大電路;AD590:溫度傳感器;SVR:零位調(diào)整。 </p><p> ?。?)AD590 簡介 </p><p> AD590 是電流輸出型的半導(dǎo)體溫度感測組件,主要特性如下: </
30、p><p> 1.具有線性輸出電流。 </p><p> 2.寬廣的操作溫度范圍(-55℃~150℃)。</p><p> 3.寬廣的工作電壓范圍(+4V~+30V)。 </p><p> 4.良好的隔離性。 </p><p> AD590 的包裝與等效電路如圖 4 所示,是 TO-52 型金屬外殼包裝。他是兩端
31、子的半導(dǎo)體溫度感測組件,另有一端子是外殼接腳,可接地以減少噪聲干擾。 </p><p> AD590 如同一個(gè)隨溫度而改變輸出電流的定電流源,輸出電流與外殼的開氏(K)溫度成正比。開氏溫度與攝氏溫度的單位相等,0℃等于 273.2K,100℃等于 373.2K。當(dāng)溫度為 0℃時(shí),AD590 的輸出電流是 273.2μA。而溫度為 100℃時(shí),輸出電流是 373.2μA。溫度每升高 1℃,輸出電流增加 1μA,其
32、溫度系數(shù)為 1μA/℃。</p><p> 圖2-5 AD590 包裝與等效電路圖</p><p> ?。?)溫度檢測、放大電路原理 </p><p> AD590的溫度系數(shù)為 1μA/℃。所以在 T(℃)時(shí)的電流I1(T)為</p><p> I1(T)=I1(0)+1μA/℃*T
33、 (2-1)</p><p> 而溫度每變化 1℃時(shí),V2 的電壓變化是為1μA/℃*10K=10mV/℃,即溫度每增加 1℃,V2 會(huì)增加 10mV。在 0℃時(shí) V2就已經(jīng)有電壓存在,其值為</p><p> V2(0)=273.2μA *10K?=2.732V (2-2)</p><p>&l
34、t;b> 則 T℃時(shí) </b></p><p> V2(T)=V2(0)+10mV/℃*T (2-3)</p><p> 如圖 2-3 所示,OP3 組成差動(dòng)放大器,電壓增益為 </p><p> R2/R1=100K/20K=5
35、 (2-4)</p><p> 零位調(diào)整 SVR1則用于抵補(bǔ) 0℃的電壓值,由差動(dòng)放大器的公式</p><p> V0=R2/R1*(V2-V1) (2-5)</p><p> 可得知,若調(diào)整 SVR1使V1的電壓為2.732V,則 0℃時(shí),差動(dòng)放大器的輸出 VO為
36、0V。也就是說,若溫度是在 0℃至50℃之間,則差動(dòng)放大器的輸出電壓是在0V至5V之間,亦即每0.1V的輸出代表溫度上升 1℃。與設(shè)計(jì)要求相符合。</p><p> 2.3.3 A/D轉(zhuǎn)換模塊</p><p> 如圖 2-6:ADC0809 把從放大電路傳送過來的模擬信號(hào)轉(zhuǎn)變成數(shù)字信號(hào),并行傳送給單片機(jī)的 P0 口,讓單片機(jī)處理。</p><p> 圖2-6
37、 A/D轉(zhuǎn)換電路圖</p><p> 2.3.4 溫度設(shè)制、顯示及報(bào)警電路模塊</p><p> 如圖 2-7:通過按鍵可以事先設(shè)定報(bào)警溫度值,當(dāng)顯示的溫度值超過設(shè)定的溫度值時(shí),單片機(jī)就會(huì)從 INT0 腳發(fā)出一連串脈沖,驅(qū)動(dòng)蜂鳴器發(fā)出報(bào)警聲。</p><p> 圖2-7 溫度設(shè)制、顯示及報(bào)警電路圖</p><p> 2.3.5
38、 串行通信模塊</p><p> 如圖 2-8 所示, 單片機(jī) 1 把溫度值發(fā)送數(shù)據(jù)到單片機(jī) 2,單片機(jī)2 接收數(shù)據(jù)并控制語音芯片報(bào)出當(dāng)前的溫度值。</p><p> 圖2-8 串行通信電路圖</p><p> 2.3.6 語音播放模塊</p><p> 語音播放模塊如圖 2-9所示。主要由單片機(jī) AT89S51 與語音芯片 ISD
39、2560 組成。</p><p> 圖2-9 錄音、放音電路圖</p><p> (1)錄音、放音簡介 </p><p> 如圖2-9 所示,首先通過麥克風(fēng)向語音ISD256錄入“0,1,2,3,4,5,6,7,8,9,10,點(diǎn),度”等音符。當(dāng)單片機(jī) 2 接收到單片機(jī)串行發(fā)送過來的溫度值時(shí),就會(huì)自動(dòng)地去尋找相對(duì)應(yīng)音符的地址,并把這些音符通過揚(yáng)聲器播放出來
40、。 </p><p> ?。?)硬件電路設(shè)計(jì) </p><p> ISD 器件選用錄音時(shí)間為 60s 的 ISD2560 器件,以單片機(jī)為處理機(jī),外接控制每個(gè)語音段錄音開始與停止按鍵,外部存儲(chǔ)器 EEPROM 用于保存每個(gè)語音首地址。ISD 的外圍電路及其與單片機(jī)連接的硬件電路如圖 2-9 所示。 </p><p> ISD2560 與 AT89S52 的接口
41、部分包含輸入地址線 A0~A9、片選 CE(CE=0 選中 ISD芯片)、芯片低功耗狀態(tài)控制 PD、錄放音控制選擇 P/R(P/R=0 為錄音;P/R=1 為放音)、錄放音結(jié)束信號(hào)輸出 EOM,將它作為 AT89S51外部中斷 0的輸入信號(hào),放音時(shí)通過它告知本語音段結(jié)束,便于單片機(jī)立即播放另一個(gè)語音段。</p><p> ISD2560引腳封裝如圖 2-10所示.</p><p> 圖
42、2-10 ISD2560管腳圖 </p><p> ?。?)本方法的特點(diǎn) </p><p> 能進(jìn)行在系統(tǒng)現(xiàn)場錄音,隨錄隨放,修改語音方便。</p><p> 修改錄音內(nèi)容時(shí),可以從其中任意一段開始,修改其后的所有錄音內(nèi)容,不必從第一段開始全部修改。這對(duì)一些需要廠家固定一些語音段的系統(tǒng)很有好處,將固定的語音段放置在前面的段落中, 允許用戶錄制的放在后面,
43、用戶修改錄音內(nèi)容時(shí)只需修改后面的語音段即可,不影響廠家錄制的語音。 分段靈活。單片 ISD2560 可分1~600 個(gè)段,若多片級(jí)聯(lián)還可更多;各個(gè)錄音段的長度任意,只要總錄音時(shí)間在所用器件的總時(shí)間之內(nèi)即可。</p><p> 第3節(jié) 系統(tǒng)的軟件設(shè)計(jì)</p><p> 3.1 系統(tǒng)程序流程 </p><p> 如圖 3-1:單片機(jī) 1 為主機(jī),負(fù)責(zé)溫度
44、顯示、按鍵掃描、BCD碼轉(zhuǎn)換、串行發(fā)送數(shù)據(jù)給單片機(jī) 2。以定時(shí)器定時(shí) 1ms,每定時(shí) 100 次即1 秒鐘就啟動(dòng) A/D轉(zhuǎn)換、BCD碼轉(zhuǎn)換,串行發(fā)送 2 進(jìn)制數(shù)給單片機(jī) 2。 </p><p> 圖3-1 單片機(jī)1 程序主流程圖</p><p> 如圖 3-2,3-3所示:單片機(jī) 2 為從機(jī),只負(fù)責(zé)接收數(shù)據(jù)并播報(bào)溫度,以 T0 定時(shí)器定時(shí),結(jié)合延時(shí)程序定時(shí)1分鐘, 使每1分鐘更新一次
45、語音音素地址, 即每1分鐘更新一次溫度值,并在中斷程序處理過程度中報(bào)一次溫度。</p><p> 圖3-2 單片機(jī)2程序主流程圖 圖3-3 單片機(jī) 2的T0中斷程序流程圖</p><p><b> 3.2 程序清單</b></p><p> /**********單片機(jī)1程序***************
46、******/</p><p> #include <reg52.h> </p><p> #include <absacc.h> </p><p> #include <intrins.h> </p><p> #define uchar unsigned char </p><
47、;p> #define uint unsigned int </p><p> uchar code dis_code[10]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 </p><p> 0x99,0x92,0x82,0xf8,0x80,0x90}; // 4, 5, 6, 7, 8, 9, off </p&g
48、t;<p> uchar data set_data[3]={0x00,0x07,0x03}; //預(yù)設(shè) 37.0 度 </p><p> uchar data ad_data; //AD轉(zhuǎn)換結(jié)果 </p><p> uchar data dis_buf[3]={0x00,0x00,0x00};
49、 // 顯示緩沖區(qū) </p><p> uchar data bcd_buf[3]={0x00,0x00,0x00}; //十進(jìn)制 BCD碼轉(zhuǎn)換存放</p><p> uchar data TIMER0_NUM; </p><p> bit TIMER0_flag; </p><p> bit da
50、ta set_flag=0; </p><p> sbit ALE=P2^4; </p><p> sbit OE=P2^5; </p><p> sbit START=P2^6; </p><p> sbit EOC=P2^7; </p><p> sbit P30=P3^0; </p>&l
51、t;p> sbit select0=P3^7; </p><p> sbit select1=P3^6; </p><p> sbit select2=P3^5; </p><p> sbit K1=P2^0; </p><p> sbit K2=P2^1; </p><p> sbit K3=P2
52、^2; </p><p> sbit K4=P2^3; </p><p> sbit bep=P3^3; </p><p> sbit SET_IND=P3^4; </p><p> sbit P17=P1^7; //小數(shù)點(diǎn) </p><p&
53、gt; uint data temp; </p><p> /**********************************************/ </p><p><b> /*函數(shù)聲明 </b></p><p> /**********************************************/ </p
54、><p> void delay1ms(uchar t); </p><p> void adc(void); </p><p> void BCD(void); </p><p> void keyscan(void); </p><p> void send_str(void); </p&g
55、t;<p> void beep(void);</p><p> void display(void); </p><p> /**********************************************/ </p><p><b> /*按鍵蜂鳴函數(shù) </b></p><p>
56、 /**********************************************/ </p><p> void beep2(void) </p><p> { uchar data j,k; </p><p> for(j=26;j>0;j--) </p><p><b> { </b>
57、;</p><p> for(k=254;k>0;k--); </p><p> bep=!bep; </p><p><b> } </b></p><p><b> bep=1; </b></p><p><b> } </b><
58、;/p><p> /**********************************************/ </p><p><b> /*蜂鳴報(bào)警 </b></p><p> /**********************************************/ </p><p> void be
59、ep(void) </p><p><b> { </b></p><p> uchar data j,k; </p><p> for(j=100;j>0;j--) </p><p><b> { </b></p><p> for(k=254;k>0
60、;k--) </p><p><b> bep=0; </b></p><p><b> } </b></p><p> bep=1; //關(guān)蜂鳴器 </p><p><b> } </b&g
61、t;</p><p> /**********************************************/ </p><p> /*延時(shí)1ms 函數(shù) </p><p> /**********************************************/ </p><p> void delay1ms(uch
62、ar t) </p><p> { uchar j,k; </p><p> for(j=0;j<t;j++) </p><p> for(k=0;k<120;k++); </p><p><b> } </b></p><p> /*************
63、*********************************/ </p><p> /*AD 轉(zhuǎn)換函數(shù) </p><p> /**********************************************/ </p><p> void adc(void) </p><p> { ALE=1; </p>
64、;<p><b> _nop_(); </b></p><p><b> _nop_(); </b></p><p><b> ALE=0; </b></p><p><b> START=1;</b></p><p><b&g
65、t; _nop_(); </b></p><p><b> _nop_(); </b></p><p><b> START=0; </b></p><p> _nop_(); </p><p><b> _nop_(); </b></p>
66、<p><b> _nop_(); </b></p><p><b> _nop_(); </b></p><p> while(EOC==0); //等待轉(zhuǎn)換結(jié)束 </p><p><b> OE=1; </b><
67、/p><p> ad_data=P0; //讀入轉(zhuǎn)換數(shù)據(jù) </p><p><b> OE=0; </b></p><p><b> } </b></p><p> /*******************************
68、***************/ </p><p> /*十進(jìn)制 BCD碼轉(zhuǎn)換函數(shù) </p><p> /**********************************************/ </p><p> void BCD(void) </p><p><b> { </b></p>
69、<p> bcd_buf[2]=(ad_data/51); //十位 </p><p> temp=(ad_data%51); </p><p> temp=(temp*10); </p><p> bcd_buf[1]=(temp/51); //個(gè)位 <
70、/p><p> temp=(temp%51); </p><p> temp=temp*10; </p><p> bcd_buf[0]=(temp/51); //小數(shù)位 </p><p> if(bcd_buf[2]>set_data[2]) //報(bào)
71、警值檢測 </p><p><b> beep(); </b></p><p> else if(bcd_buf[2]==set_data[2]) </p><p><b> { </b></p><p> if(bcd_buf[1]>set_data[1]) </p>
72、<p><b> beep(); </b></p><p> else if(bcd_buf[1]==set_data[1]) </p><p><b> { </b></p><p> if(bcd_buf[0]>set_data[0]) </p><p><b>
73、; beep(); </b></p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> /******************************************
74、****/ </p><p><b> /*鍵盤掃描函數(shù) </b></p><p> /**********************************************/ </p><p> void keyscan(void) </p><p><b> { </b></
75、p><p> uchar data m; </p><p> if(K1==0) //K1 設(shè)置鍵 </p><p><b> { </b></p><p> for(m=0;m<100;m++) //延時(shí)
76、11ms</p><p> display(); </p><p> if(K1==0) </p><p> { beep2(); //按鍵時(shí)響一聲 </p><p> set_flag=!set_flag; //設(shè)置標(biāo)志位取反
77、</p><p><b> } </b></p><p><b> } </b></p><p> if(set_flag==1) //若設(shè)置鍵按下,則檢測 K2-K4 </p><p><b> { </b><
78、/p><p> SET_IND=0; //設(shè)置燈亮 </p><p> if(K2==0) //K2:十位加1 </p><p><b> { </b></p><p> for(m=0;m<1
79、00;m++) //延時(shí) 11ms </p><p> display(); </p><p> if(K2==0) </p><p><b> { </b></p><p> beep2(); //按鍵時(shí)響一聲
80、 </p><p> set_data[2]++; </p><p> if(set_data[2]==5) set_data[2]=0; </p><p><b> } </b></p><p><b> } </b></p><p> if(K3=
81、=0) //K3:個(gè)位加1 </p><p><b> { </b></p><p> for(m=0;m<100;m++) //延時(shí) 11ms </p><p> display(); </p><p&g
82、t; if(K3==0) </p><p> { beep2(); //按鍵時(shí)響一聲 </p><p> set_data[1]++; </p><p> if(set_data[1]==10) set_data[1]=0; </p><p><b>
83、 } </b></p><p><b> } </b></p><p> if(K4==0) //K4:小數(shù)位加1 </p><p><b> { </b></p><p> for(m=0;m<100;m++)
84、 //延時(shí) 11ms </p><p> display(); </p><p> if(K4==0) </p><p> { beep2(); //按鍵時(shí)響一聲 </p><p> set_data[0]++; <
85、;/p><p> if(set_data[0]==10) set_data[0]=0; </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> else SET_I
86、ND=1; </p><p><b> } </b></p><p> /**********************************************/</p><p><b> /*顯示函數(shù) </b></p><p> /**************************
87、********************/ </p><p> void display(void) </p><p><b> { </b></p><p> if(set_flag) //設(shè)置鍵按下,則顯示設(shè)置的數(shù)值 </p><p><b>
88、 { </b></p><p> dis_buf[0]=set_data[0]; </p><p> dis_buf[1]=set_data[1]; </p><p> dis_buf[2]=set_data[2]; </p><p><b> } </b></p><p>
89、 else { //否則顯示溫度值 </p><p> dis_buf[0]=bcd_buf[0]; </p><p> dis_buf[1]=bcd_buf[1]; </p><p> dis_buf[2]=bcd_buf[2]; </p><p>&l
90、t;b> } </b></p><p> P1 = 0xff; // 先關(guān)閉所有數(shù)碼管 </p><p> P1 = dis_code[dis_buf[0]]; // 小數(shù)顯示代碼傳送到 P1 口 </p><p> select2=1;select1
91、=1;select0=0; // 位選 </p><p> delay1ms(1); //延時(shí) 1ms </p><p> P1 = dis_code[dis_buf[1]]; // 個(gè)位顯示代碼傳送到 P1 口 </p><p> select2=1; <
92、;/p><p> select1=0;select0=1; </p><p><b> P17=0; </b></p><p> delay1ms(1); //延時(shí) 1ms </p><p> P1 = dis_code[d
93、is_buf[2]]; // 十位顯示代碼傳送到 P1 口 </p><p> select2=0;select1=1;select0=1; </p><p> delay1ms(1); //延時(shí) 1ms </p><p><b> } </
94、b></p><p> /**********************************************/ </p><p> /*串口發(fā)送一個(gè)字符函數(shù) </p><p> /**********************************************/ </p><p> void send_st
95、r(void) </p><p> { SBUF = ad_data; //串口發(fā)送 AD轉(zhuǎn)換溫度值 </p><p> while(TI==0); // 等待數(shù)據(jù)傳送 </p><p> TI = 0;
96、 // 清除數(shù)據(jù)傳送標(biāo)志 </p><p><b> } </b></p><p> /**********************************************/ </p><p><b> /*主函數(shù) </b></p><p> /***************
97、*******************************/ </p><p> void main(void) </p><p><b> { </b></p><p> TMOD = 0x21; //定時(shí)器 1 工作于方式 2,8 位自動(dòng)重載模式, 用于產(chǎn)生波特率 </p><p> // 定時(shí)器
98、0 工作于方式 1,產(chǎn)生 1s 的 AD 間隔時(shí)間 </p><p> TH0=15536/256; //T0定時(shí) 50ms </p><p> TL0=15536%256; </p><p> TH1 = 0xe1; // 波特率1000 </p>&l
99、t;p> TL1 = 0xe1; </p><p> SCON = 0x50; // 設(shè)定串行口工作方式 1 </p><p> PCON = 0x00; // 波特率不倍增 </p><p> TI=0;
100、 //清除發(fā)送中斷標(biāo)志 </p><p> EA = 1; // 開總中斷 </p><p> ET0 = 1; //開 T0 中斷 </p><p><b> ET1=0; </b></p>
101、;<p> TR1 = 1; // 啟動(dòng)T1 </p><p> TR0 = 1; //啟動(dòng)T0 </p><p><b> while(1) </b></p><p> { display(); <
102、/p><p> keyscan(); </p><p> if(TIMER0_flag) </p><p> { TIMER0_flag=0; </p><p><b> adc(); </b></p><p><b> BCD(); </b></p>
103、;<p> send_str(); </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p> /*************************************
104、*********/ </p><p> /*T0 中斷服務(wù)程序 </p><p> /*每秒鐘 ADC 一次,串口發(fā)送一次 </p><p> /**********************************************/ </p><p> void timer0(void) interrupt 1 </p
105、><p><b> { </b></p><p> TH0=15536/256; //重裝初值 </p><p> TL0=15536%256; </p><p> TIMER0_NUM++; </p><p> if(TIMER0_NUM==2
106、0) </p><p> { TIMER0_NUM=0; </p><p> TIMER0_flag=1; </p><p><b> } </b></p><p><b> } </b></p><p> /***************單片機(jī)2程序******
107、***************/ </p><p> #include <reg52.h> </p><p> #include <absacc.h> </p><p> #include <intrins.h> </p><p> #define uchar unsigned char </
108、p><p> #define uint unsigned int </p><p> uchar data bcd_buf[3]={0x00,0x00,0x00}; //十進(jìn)制 BCD碼轉(zhuǎn)換存放區(qū) </p><p> uchar code sound_add[13]={0x00,0x0a,0x14,0x1e,0x28,0x32,0x3c, </p&
109、gt;<p> 0x46,0x50,0x5a,0x64,0x6e,0x78}; //0,1,2,3,4,5, </p><p> //6,7,8,9,十,點(diǎn),度 存放地址 </p><p> uchar data order[6]; //"X十 X點(diǎn)</p><p> uchar ad_
110、data; //存放接收的 AD轉(zhuǎn)換數(shù)據(jù) </p><p> uint TIMER_NUM; //1 分鐘計(jì)時(shí) </p><p> sbit EOM=P2^0; </p><p> sbit PD=P2^1; </p><p&g
111、t; sbit CE=P2^2; </p><p><b> uchar i; </b></p><p> uint data temp; </p><p> /********************************************** </p><p> /*十進(jìn)制 BCD碼轉(zhuǎn)換函數(shù) &l
112、t;/p><p> /**********************************************/ </p><p> void BCD(void) </p><p><b> { </b></p><p> bcd_buf[2]=(ad_data/51);
113、//十位 </p><p> temp=(ad_data%51); </p><p> temp=(temp*10); </p><p> bcd_buf[1]=(temp/51); //個(gè)位 </p><p> temp=(temp%51); </p><p> t
114、emp=temp*10; </p><p> bcd_buf[0]=(temp/51); //小數(shù)位 </p><p><b> } </b></p><p> /**********************************************/ </p><p>
115、; /*語音芯片報(bào)溫度函數(shù) </p><p> /*調(diào)用一次報(bào)告一次溫度 </p><p> /**********************************************/ </p><p> void sound_play(void) </p><p> { _nop_(); </p><
116、p><b> _nop_(); </b></p><p> PD=0; //節(jié)電控制端接低電平,正常工作 </p><p> for(i=0;i<6;i++) </p><p> { uchar data n=0; </p><p&
117、gt; P0=sound_add[order[i]];// </p><p> CE=0; //開始播放 </p><p><b> _nop_(); </b></p><p><b> _nop_(); </b></p><
118、;p><b> CE=1; </b></p><p> while(EOM); </p><p> while(EOM==0); </p><p><b> _nop_(); </b></p><p><b> _nop_(); </b></p>
119、<p><b> } </b></p><p><b> } </b></p><p> /**********************************************/ </p><p><b> /*主函數(shù) </b></p><p> /
120、**********************************************/ </p><p> void main(void) </p><p> { TMOD = 0x21; // 定時(shí)器 1工作于方式 2,8 位自動(dòng)重載模式, </p><p> //用于產(chǎn)生波特率.定時(shí)器 0 工作與方式 1,用于 1s 定時(shí) <
121、;/p><p> TH1 = 0xe1; // 波特率為 1000 </p><p> TL1 = 0xe1; </p><p> SCON = 0x50; // 設(shè)定串行口工作方式 </p><p> PCON = 0x00; // 波特率不倍增 </p><p
122、> RI=0; //清除接收中斷標(biāo)志 </p><p> EA = 1; // 開總中斷 </p><p> ET0=1; //開 T0 中斷 </p><p> ES=1;
123、 //開串口中斷 </p><p> PT0=1; //T0 高優(yōu)先級(jí) </p><p> TR0=1; //啟動(dòng) T0 </p><p> TR1 = 1;
124、 // 啟動(dòng)定時(shí)器 1 </p><p><b> while(1) </b></p><p><b> { </b></p><p><b> BCD(); </b></p><p> order[
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能體溫計(jì)
- 基于51單片機(jī)的電子體溫計(jì)設(shè)計(jì)
- 基于單片機(jī)的數(shù)字顯示體溫計(jì)設(shè)計(jì)
- 單片機(jī)智能儀器課程設(shè)計(jì)報(bào)告
- 單片機(jī)智能藍(lán)牙小車課程設(shè)計(jì)
- 基于單片機(jī)的電子體溫計(jì)設(shè)計(jì)與制作
- 基于單片機(jī)設(shè)計(jì)與實(shí)現(xiàn)的電子體溫計(jì)
- 基于51單片機(jī)的數(shù)字體溫計(jì)設(shè)計(jì)
- 單片機(jī)智能搶答器課程設(shè)計(jì)
- 單片機(jī)智能溫控器課程設(shè)計(jì)
- 智能電子體溫計(jì)方案
- 傳感器課程設(shè)計(jì)-- 電子體溫計(jì)設(shè)計(jì)
- 基于51單片機(jī)的智能電子體溫計(jì)畢業(yè)畢業(yè)論文
- 基于51單片機(jī)的電子體溫計(jì)設(shè)計(jì)畢業(yè)論文
- 基于c語言單片機(jī)智能電子日歷課程設(shè)計(jì)
- 水銀體溫計(jì)和電子體溫計(jì),及電子感應(yīng)類體溫計(jì)的特點(diǎn)和區(qū)別!
- 電子體溫計(jì)
- 基于單片機(jī)的電子體溫計(jì)電路設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)
- 綜合課程設(shè)計(jì)--基于51單片機(jī)智能家庭小管家
- 單片機(jī)智能測厚儀設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論