單片機智能體溫計課程設計_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  數(shù)理與信息工程學院</b></p><p>  《單片機原理及應用》期末課程設計</p><p>  題 目: 智能體溫計 </p><p>  專 業(yè): 電子信息工程 </p><p>  班 級:

2、 電信061 </p><p>  姓 名: </p><p>  學 號: </p><p>  指導老師: </p>

3、<p>  成 績: </p><p>  ( 2008.12 )</p><p><b>  目 錄</b></p><p>  第1節(jié) 引 言……………………………………………………………………………3</p><p>  1.1 智能體

4、溫計概述 ………………………………………………………………3</p><p>  1.2 本次設計要求 …………………………………………………………………4</p><p>  1.3 系統(tǒng)主要功能 …………………………………………………………………4</p><p>  第2節(jié) 系統(tǒng)主要硬件電路設計 ………………………………………………………5</p&

5、gt;<p>  2.1 主要模塊的設計方案論證………………………………………………………5</p><p>  2.1.1 溫度傳感器的選擇……………………………………………………5</p><p>  2.1.2 A/D轉換器的選擇……………………………………………………5</p><p>  2.1.3 語音提示模塊………………………………

6、…………………………5</p><p>  2.2 總系統(tǒng)設計方案 ………………………………………………………………6</p><p>  2.2.1 系統(tǒng)設計框圖…………………………………………………………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轉換模塊…………………………………………………………9</p&g

8、t;<p>  2.3. 4 溫度設置、顯示及報警電路模塊 …………………………………10</p><p>  2.3.5 串行通信模塊 ………………………………………………………10</p><p>  2.3.6 語音播放模塊 ………………………………………………………11</p><p>  第3節(jié) 系統(tǒng)軟件設計 ………………………………

9、…………………………………13</p><p>  3.1 系統(tǒng)主程序設計………………………………………………………………13</p><p>  3.2 程序清單………………………………………………………………………14</p><p>  第4節(jié) 結束語 …………………………………………………………………………24</p><p>

10、  參考文獻…………………………………………………………………………………25</p><p><b>  智能體溫計</b></p><p><b>  引 言 </b></p><p>  隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它在日用電子產(chǎn)品中的應用越來越廣泛,給人帶來的方便也是不可否定的

11、,其中智能體溫計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設施就需要從單片機技術入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p>  傳統(tǒng)的溫度計有反應速度慢、讀數(shù)麻煩、測量精度不高、誤差大等缺點,溫度傳感器AD590具有線性優(yōu)良、性能穩(wěn)定、靈敏度高、抗干擾能力強、使用方便等優(yōu)點,廣泛應用于冰箱、空調器、糧倉等日常生活中溫度的測量和控制。本論文利用集

12、成溫度傳感器AD590設計并制作了一款基于AT89S52的3位數(shù)碼管顯示的智能體溫計,其電路簡單,軟硬件結構模塊化,易于實現(xiàn)。</p><p>  1.1 智能體溫計概述 </p><p>  隨著時代的進步和發(fā)展,單片機技術已經(jīng)普及到我們生活,工作,科研,各個領域,已經(jīng)成為一種比較成熟的技術,本文將介紹一種基于單片機控制的智能體溫。</p><p>  本智能體

13、溫計采用 AT89S52作為核心器件實現(xiàn)對系統(tǒng)的自動控制,采用雙單片機串行處理結構。外界溫度經(jīng) AD590 集成溫度傳感器采集,溫度變化轉換為線性電壓信號,再經(jīng)由 OP07 構成高精度低溫漂的放大電路處理后,作為 ADC0809 的模擬輸入信號,由ADC0809 完成 A/D轉換,得到 8位的數(shù)字信號送入單片機 1(AT89S52)。單片機 1 將采集到溫度值在 LED數(shù)碼管上顯示出來, 也通過串口通信將溫度信號傳到單片 2 (AT89

14、S52) 。此外溫度預置, 報警電路模塊功能也由單片機 1完成。 單片機2 完成溫度值的語音播放功能。通過系統(tǒng)的設計與實現(xiàn)說明本設計方案切實可以,能夠完成題目所要求的基本功能部分,并留有相應的接口,為完成擴展功能打下基礎。 </p><p><b>  本次設計要求</b></p><p>  單片機在日用電子產(chǎn)品中的應用越來越廣泛,溫度則是人們?nèi)粘I钪谐3P枰獪y量

15、和控制的一個量。本論文通過AT89S52單片機和溫度傳感器AD590從硬件和軟件兩方面進行了設計。   </p><p>  本次設計的設計要求:</p><p> ?。?)基本范圍0℃-50℃;</p><p> ?。?)精度誤差小于0.1℃;</p><p> ?。?)LED數(shù)碼直讀顯示;</p><

16、;p><b>  擴展功能:</b></p><p> ?。?)實現(xiàn)語音報溫功能;</p><p> ?。?)實現(xiàn)報警功能; </p><p><b>  1.3系統(tǒng)主要功能</b></p><p>  本設計完成了以下功能: </p><p> ?。?)溫度信號的采集

17、與歸一化處理; </p><p> ?。?)A/D轉換; </p><p>  (3)溫度值的顯示,顯示的誤差與實際的溫度值誤差在±0.1℃ 內(nèi); </p><p> ?。?)語音播報溫度與聲音報警功能。</p><p>  系統(tǒng)主要硬件電路設計</p><p>  2.1 主要模塊的設計方案論證 </

18、p><p>  2.1.1 溫度傳感器的選擇 </p><p>  方案一:采用熱敏電阻。熱敏電阻價格便宜,對溫度靈敏,原理簡單,但線性度不好,如不進行線性補償,對于本設計歸一化輸出的要求,難以達到設計精度;如要對非線性進行補償,則電路結構復雜,難以調整。故不采用。 </p><p>  方案二:采用熱電偶。熱電偶在測溫范圍內(nèi)熱電性質穩(wěn)定,不隨時間變化而變化,電阻溫度系

19、數(shù)小,導電率高,比熱小,但熱電偶一般體積較大,使用不方便,價格相對較高。作為一個智能體溫計的溫度傳感器,要求體積小,使用方便,便于攜帶,故此方案不合適。 </p><p>  方案三:采用集成溫度傳感器。集成溫度傳感器一般且有具有線性好、精度高、靈敏度高、體積小、使用方便等優(yōu)點。根據(jù)實驗室現(xiàn)有材料可選取 AD590。AD590 的測溫范圍為-55℃~+150℃,能滿足本設計的 0~50 度測量要求。根據(jù)相關技術

20、資料:AD590線性電流輸出為 1 µ A/K,正比于絕對溫度;AD590 的電源電壓范圍為 4V~30V,并可承受 44V正向電壓和 20V反向電壓,因而器件反接也不會被損壞。該方案能完全滿足此設計的要求,故采用此方案。 </p><p>  2.1.2 A/D 轉換器的選擇 </p><p>  方案一:選用 AD574。AD574 的數(shù)字量位數(shù)可設成 8 位也可以設為 1

21、2位,且無需外接 CLOCK時鐘,轉換時間達到 25μs,輸出模擬電壓可以是單極性的 0-10V或0-20V,也可以是雙極性的±5V或±10V之間。AD574精度高,但與 8 位的單片機接口較復雜,且價格昂貴,考慮到體溫計是對溫度的測量,其響應時間的要求不高。故不選用此方案。</p><p>  方案二:選用 ICL7135。這類芯片比較適合于低速測量儀器,適用于精度高,速度要求不高的系統(tǒng)設計

22、中。ICL7135 的輸出為動態(tài)掃描 BCD碼,與單片機的接口較復雜。且它的滿量程輸入為 2V電壓,如在本設計中使用要進行衰減,較難保證轉換精度。 </p><p>  方案三:選用 ADC0809。ADC0809數(shù)字量是 8位,轉換時間為 100μs,輸入模擬電壓為單極性的 0-5V。由于本設計的要求精度不是很高,ADC0809 可以達到要求,故選用此方案。 </p><p>  2.1

23、.3 語音提示模塊 </p><p>  方案一:通過 A/D轉換器、單片機,存儲器,D\A轉換器實現(xiàn)聲音信號的采樣、處理、存儲和實現(xiàn)。首先將聲音信號放大,通過 AD轉換器采樣將語音模擬信號轉換成數(shù)字信號,并由單片機和處理存放到存儲器中,實現(xiàn)錄音操作。在錄、放音過程中由單片機控制 D/A轉換器,將存儲器中的數(shù)據(jù)轉化成聲音信號。此方案安裝調試復雜,集成度低。 </p><p>  

24、方案二:采用 ISD2560語音錄放集成電路。該芯片采用多電平直接模擬量存儲專利技術,每個采樣值可直接存儲在片內(nèi)單個 EEPROM單元中,因此能夠非常真實、自然地再現(xiàn)語音、音樂、音調和效果聲。此外,ISD2560 還省去了 A/D和 D/A轉換器。其集成度較高,內(nèi)部包括前置放大器、內(nèi)部時鐘、定時器、采樣時鐘、濾波器、自動增益控制、邏輯控制、模擬收發(fā)器、解碼器和 480K 字節(jié)的 EEPROM。ISD2560可不分段,也可按最小段長為單

25、位來任意組合分段。因此,選擇方案二。 </p><p><b>  總系統(tǒng)設計方案</b></p><p>  2.2.1系統(tǒng)設計框圖</p><p>  根據(jù)設計要求,可將系統(tǒng)分為若干模塊,以單片機為核心,完成多項功能。</p><p><b>  圖2-1 系統(tǒng)框圖</b></p>

26、<p>  系統(tǒng)框圖如圖2- 1,AD590 把采集的外部溫度信號轉換成相應的電壓,再經(jīng)過 OP07 運放放大后作為 ADC0809的模擬輸入信號,ADC0809 將此模擬信號轉換成數(shù)字信號,通過并口送入到單片機1。單片機1把這些信號處理后通過 LED 數(shù)碼管顯示出來。同時單片機1還處理按鍵、報警模塊。單片機 1把溫度值通過串行通信傳送給單片機 2,控制語音芯片報出相對應的溫度值。</p><p>

27、  2.2.2系統(tǒng)整體硬件電路 </p><p>  如圖 2-2 所示,該電路主要由電源電路,溫度檢測、放大電路,A/D轉換電路,雙單片機串行通信電路,按鍵輸入、報警電路,數(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電壓,給整個電路供電。</p><p>  2.3.2 溫度檢測、放大模塊</p><p>  圖2-4 AD590 溫度檢

29、測、放大電路圖</p><p>  如圖2-4 所示,溫度檢測、放大電路主要器件的作用:OP1、OP2:電壓跟隨器;</p><p>  OP3:差分放大電路;AD590:溫度傳感器;SVR:零位調整。 </p><p> ?。?)AD590 簡介 </p><p>  AD590 是電流輸出型的半導體溫度感測組件,主要特性如下: </

30、p><p>  1.具有線性輸出電流。 </p><p>  2.寬廣的操作溫度范圍(-55℃~150℃)。</p><p>  3.寬廣的工作電壓范圍(+4V~+30V)。 </p><p>  4.良好的隔離性。 </p><p>  AD590 的包裝與等效電路如圖 4 所示,是 TO-52 型金屬外殼包裝。他是兩端

31、子的半導體溫度感測組件,另有一端子是外殼接腳,可接地以減少噪聲干擾。 </p><p>  AD590 如同一個隨溫度而改變輸出電流的定電流源,輸出電流與外殼的開氏(K)溫度成正比。開氏溫度與攝氏溫度的單位相等,0℃等于 273.2K,100℃等于 373.2K。當溫度為 0℃時,AD590 的輸出電流是 273.2μA。而溫度為 100℃時,輸出電流是 373.2μA。溫度每升高 1℃,輸出電流增加 1μA,其

32、溫度系數(shù)為 1μA/℃。</p><p>  圖2-5 AD590 包裝與等效電路圖</p><p> ?。?)溫度檢測、放大電路原理 </p><p>  AD590的溫度系數(shù)為 1μA/℃。所以在 T(℃)時的電流I1(T)為</p><p>  I1(T)=I1(0)+1μA/℃*T

33、 (2-1)</p><p>  而溫度每變化 1℃時,V2 的電壓變化是為1μA/℃*10K=10mV/℃,即溫度每增加 1℃,V2 會增加 10mV。在 0℃時 V2就已經(jīng)有電壓存在,其值為</p><p>  V2(0)=273.2μA *10K?=2.732V (2-2)</p><p>&l

34、t;b>  則 T℃時 </b></p><p>  V2(T)=V2(0)+10mV/℃*T (2-3)</p><p>  如圖 2-3 所示,OP3 組成差動放大器,電壓增益為 </p><p>  R2/R1=100K/20K=5

35、 (2-4)</p><p>  零位調整 SVR1則用于抵補 0℃的電壓值,由差動放大器的公式</p><p>  V0=R2/R1*(V2-V1) (2-5)</p><p>  可得知,若調整 SVR1使V1的電壓為2.732V,則 0℃時,差動放大器的輸出 VO為

36、0V。也就是說,若溫度是在 0℃至50℃之間,則差動放大器的輸出電壓是在0V至5V之間,亦即每0.1V的輸出代表溫度上升 1℃。與設計要求相符合。</p><p>  2.3.3 A/D轉換模塊</p><p>  如圖 2-6:ADC0809 把從放大電路傳送過來的模擬信號轉變成數(shù)字信號,并行傳送給單片機的 P0 口,讓單片機處理。</p><p>  圖2-6

37、 A/D轉換電路圖</p><p>  2.3.4 溫度設制、顯示及報警電路模塊</p><p>  如圖 2-7:通過按鍵可以事先設定報警溫度值,當顯示的溫度值超過設定的溫度值時,單片機就會從 INT0 腳發(fā)出一連串脈沖,驅動蜂鳴器發(fā)出報警聲。</p><p>  圖2-7 溫度設制、顯示及報警電路圖</p><p>  2.3.5

38、 串行通信模塊</p><p>  如圖 2-8 所示, 單片機 1 把溫度值發(fā)送數(shù)據(jù)到單片機 2,單片機2 接收數(shù)據(jù)并控制語音芯片報出當前的溫度值。</p><p>  圖2-8 串行通信電路圖</p><p>  2.3.6 語音播放模塊</p><p>  語音播放模塊如圖 2-9所示。主要由單片機 AT89S51 與語音芯片 ISD

39、2560 組成。</p><p>  圖2-9 錄音、放音電路圖</p><p> ?。?)錄音、放音簡介 </p><p>  如圖2-9 所示,首先通過麥克風向語音ISD256錄入“0,1,2,3,4,5,6,7,8,9,10,點,度”等音符。當單片機 2 接收到單片機串行發(fā)送過來的溫度值時,就會自動地去尋找相對應音符的地址,并把這些音符通過揚聲器播放出來

40、。 </p><p> ?。?)硬件電路設計 </p><p>  ISD 器件選用錄音時間為 60s 的 ISD2560 器件,以單片機為處理機,外接控制每個語音段錄音開始與停止按鍵,外部存儲器 EEPROM 用于保存每個語音首地址。ISD 的外圍電路及其與單片機連接的硬件電路如圖 2-9 所示。 </p><p>  ISD2560 與 AT89S52 的接口

41、部分包含輸入地址線 A0~A9、片選 CE(CE=0 選中 ISD芯片)、芯片低功耗狀態(tài)控制 PD、錄放音控制選擇 P/R(P/R=0 為錄音;P/R=1 為放音)、錄放音結束信號輸出 EOM,將它作為 AT89S51外部中斷 0的輸入信號,放音時通過它告知本語音段結束,便于單片機立即播放另一個語音段。</p><p>  ISD2560引腳封裝如圖 2-10所示.</p><p>  圖

42、2-10 ISD2560管腳圖 </p><p> ?。?)本方法的特點 </p><p>  能進行在系統(tǒng)現(xiàn)場錄音,隨錄隨放,修改語音方便。</p><p>  修改錄音內(nèi)容時,可以從其中任意一段開始,修改其后的所有錄音內(nèi)容,不必從第一段開始全部修改。這對一些需要廠家固定一些語音段的系統(tǒng)很有好處,將固定的語音段放置在前面的段落中, 允許用戶錄制的放在后面,

43、用戶修改錄音內(nèi)容時只需修改后面的語音段即可,不影響廠家錄制的語音。 分段靈活。單片 ISD2560 可分1~600 個段,若多片級聯(lián)還可更多;各個錄音段的長度任意,只要總錄音時間在所用器件的總時間之內(nèi)即可。</p><p>  第3節(jié) 系統(tǒng)的軟件設計</p><p>  3.1 系統(tǒng)程序流程 </p><p>  如圖 3-1:單片機 1 為主機,負責溫度

44、顯示、按鍵掃描、BCD碼轉換、串行發(fā)送數(shù)據(jù)給單片機 2。以定時器定時 1ms,每定時 100 次即1 秒鐘就啟動 A/D轉換、BCD碼轉換,串行發(fā)送 2 進制數(shù)給單片機 2。 </p><p>  圖3-1 單片機1 程序主流程圖</p><p>  如圖 3-2,3-3所示:單片機 2 為從機,只負責接收數(shù)據(jù)并播報溫度,以 T0 定時器定時,結合延時程序定時1分鐘, 使每1分鐘更新一次

45、語音音素地址, 即每1分鐘更新一次溫度值,并在中斷程序處理過程度中報一次溫度。</p><p>  圖3-2 單片機2程序主流程圖 圖3-3 單片機 2的T0中斷程序流程圖</p><p><b>  3.2 程序清單</b></p><p>  /**********單片機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}; //預設 37.0 度 </p><p>  uchar data ad_data; //AD轉換結果 </p><p>  uchar data dis_buf[3]={0x00,0x00,0x00};

49、 // 顯示緩沖區(qū) </p><p>  uchar data bcd_buf[3]={0x00,0x00,0x00}; //十進制 BCD碼轉換存放</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ù)點 </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></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; //關蜂鳴器 </p><p><b>  } </b&g

61、t;</p><p>  /**********************************************/ </p><p>  /*延時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 轉換函數(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); //等待轉換結束 </p><p><b>  OE=1; </b><

67、/p><p>  ad_data=P0; //讀入轉換數(shù)據(jù) </p><p><b>  OE=0; </b></p><p><b>  } </b></p><p>  /*******************************

68、***************/ </p><p>  /*十進制 BCD碼轉換函數(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); //個位 <

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]) //報

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 設置鍵 </p><p><b>  { </b></p><p>  for(m=0;m<100;m++) //延時

76、11ms</p><p>  display(); </p><p>  if(K1==0) </p><p>  { beep2(); //按鍵時響一聲 </p><p>  set_flag=!set_flag; //設置標志位取反

77、</p><p><b>  } </b></p><p><b>  } </b></p><p>  if(set_flag==1) //若設置鍵按下,則檢測 K2-K4 </p><p><b>  { </b><

78、/p><p>  SET_IND=0; //設置燈亮 </p><p>  if(K2==0) //K2:十位加1 </p><p><b>  { </b></p><p>  for(m=0;m<1

79、00;m++) //延時 11ms </p><p>  display(); </p><p>  if(K2==0) </p><p><b>  { </b></p><p>  beep2(); //按鍵時響一聲

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:個位加1 </p><p><b>  { </b></p><p>  for(m=0;m<100;m++) //延時 11ms </p><p>  display(); </p><p&g

82、t;  if(K3==0) </p><p>  { beep2(); //按鍵時響一聲 </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、 //延時 11ms </p><p>  display(); </p><p>  if(K4==0) </p><p>  { beep2(); //按鍵時響一聲 </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ù)值 </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; // 先關閉所有數(shù)碼管 </p><p>  P1 = dis_code[dis_buf[0]]; // 小數(shù)顯示代碼傳送到 P1 口 </p><p>  select2=1;select1

91、=1;select0=0; // 位選 </p><p>  delay1ms(1); //延時 1ms </p><p>  P1 = dis_code[dis_buf[1]]; // 個位顯示代碼傳送到 P1 口 </p><p>  select2=1; <

92、;/p><p>  select1=0;select0=1; </p><p><b>  P17=0; </b></p><p>  delay1ms(1); //延時 1ms </p><p>  P1 = dis_code[d

93、is_buf[2]]; // 十位顯示代碼傳送到 P1 口 </p><p>  select2=0;select1=1;select0=1; </p><p>  delay1ms(1); //延時 1ms </p><p><b>  } </

94、b></p><p>  /**********************************************/ </p><p>  /*串口發(fā)送一個字符函數(shù) </p><p>  /**********************************************/ </p><p>  void send_st

95、r(void) </p><p>  { SBUF = ad_data; //串口發(fā)送 AD轉換溫度值 </p><p>  while(TI==0); // 等待數(shù)據(jù)傳送 </p><p>  TI = 0;

96、 // 清除數(shù)據(jù)傳送標志 </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; //定時器 1 工作于方式 2,8 位自動重載模式, 用于產(chǎn)生波特率 </p><p>  // 定時器

98、0 工作于方式 1,產(chǎn)生 1s 的 AD 間隔時間 </p><p>  TH0=15536/256; //T0定時 50ms </p><p>  TL0=15536%256; </p><p>  TH1 = 0xe1; // 波特率1000 </p>&l

99、t;p>  TL1 = 0xe1; </p><p>  SCON = 0x50; // 設定串行口工作方式 1 </p><p>  PCON = 0x00; // 波特率不倍增 </p><p>  TI=0;

100、 //清除發(fā)送中斷標志 </p><p>  EA = 1; // 開總中斷 </p><p>  ET0 = 1; //開 T0 中斷 </p><p><b>  ET1=0; </b></p>

101、;<p>  TR1 = 1; // 啟動T1 </p><p>  TR0 = 1; //啟動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 中斷服務程序 </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>  /***************單片機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}; //十進制 BCD碼轉換存放區(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,十,點,度 存放地址 </p><p>  uchar data order[6]; //"X十 X點</p><p>  uchar ad_

110、data; //存放接收的 AD轉換數(shù)據(jù) </p><p>  uint TIMER_NUM; //1 分鐘計時 </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>  /*十進制 BCD碼轉換函數(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); //個位 </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、;  /*語音芯片報溫度函數(shù) </p><p>  /*調用一次報告一次溫度 </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; // 定時器 1工作于方式 2,8 位自動重載模式, </p><p>  //用于產(chǎn)生波特率.定時器 0 工作與方式 1,用于 1s 定時 <

121、;/p><p>  TH1 = 0xe1; // 波特率為 1000 </p><p>  TL1 = 0xe1; </p><p>  SCON = 0x50; // 設定串行口工作方式 </p><p>  PCON = 0x00; // 波特率不倍增 </p><p

122、>  RI=0; //清除接收中斷標志 </p><p>  EA = 1; // 開總中斷 </p><p>  ET0=1; //開 T0 中斷 </p><p>  ES=1;

123、 //開串口中斷 </p><p>  PT0=1; //T0 高優(yōu)先級 </p><p>  TR0=1; //啟動 T0 </p><p>  TR1 = 1;

124、 // 啟動定時器 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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論