《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)報(bào)告多點(diǎn)溫度檢測系統(tǒng)設(shè)計(jì)
《《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)報(bào)告多點(diǎn)溫度檢測系統(tǒng)設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《《微型計(jì)算機(jī)控制技術(shù)》課程設(shè)計(jì)報(bào)告多點(diǎn)溫度檢測系統(tǒng)設(shè)計(jì)(31頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、 《微型計(jì)算機(jī)控制技術(shù)》 課程設(shè)計(jì)報(bào)告 課題名稱 多點(diǎn)溫度檢測系統(tǒng)設(shè)計(jì) 專 業(yè) 自動(dòng)化(交通信息與工程) 班 級 自動(dòng)化一班 學(xué)生姓名 指導(dǎo)教師 李曙光 2015年 7月 3 日 目錄 一、設(shè)計(jì)題目 2 二、任務(wù)要求 2 三、總體設(shè)計(jì)方案 2 3.1控制模塊………………………………………………………………………………..2
2、 3.2溫度顯示模塊…………………………………………………………………………..3 3.3溫度采集模塊…………………………………………………………………………..4 3.4鍵盤控制模塊…………………………………………………………………………..6 3.5報(bào)警模塊………………………………………………………………………………..6 四、各硬件模塊電路設(shè)計(jì) 4 4.1單片機(jī)最小系統(tǒng)硬件仿真圖…………………………………………………………..8 4.2溫度顯示模塊硬件仿真圖……………………………………………………………..8 4.3溫度
3、采集模塊硬件仿真圖……………………………………………………………..9 4.4按鍵控制模塊硬件仿真圖……………………………………………………………..9 4.5報(bào)警模塊硬件仿真圖…………………………………………………………………..9 4.6硬件實(shí)現(xiàn)……………………………………………………………………………....10 五、各個(gè)軟件模塊設(shè)計(jì)和流程圖 4 5.1軟件設(shè)計(jì)總流程圖……………………………………………………………………12 5.2DS18B20初始化……………………………………………………………………...13 5.3讀DS18B20測得的溫度……………………
4、………………………………………..14 5.4數(shù)碼管顯示數(shù)據(jù)處理…………………………………………………………………15. 5.5按鍵處理………………………………………………………………………………16 六.設(shè)計(jì)總結(jié)及參考資料 4 6.1設(shè)計(jì)總結(jié)………………………………………………………………………………..16 6.2參考文獻(xiàn)………………………………………………………………………………..17 七.附件 4 附件一:完整源程序……………………………………………………………………….18 附件二:完整的器件清單及硬件電路圖………………………………………………….28
5、 一、設(shè)計(jì)題目 多點(diǎn)溫度檢測系統(tǒng)設(shè)計(jì) 二、任務(wù)要求 (1) 使用ds18b20為溫度傳感器; (2)檢測點(diǎn)數(shù)為2點(diǎn)以上,檢測溫度范圍為-40到40度之間,測量相應(yīng)時(shí)間小于1s; (3)完成溫度數(shù)據(jù)的實(shí)時(shí)顯示; (4)設(shè)計(jì)一報(bào)警電路,當(dāng)采集的溫度越限(超過鍵盤設(shè)置的上下限)時(shí)產(chǎn) 生聲光報(bào)警。 三、總體設(shè)計(jì)方案 控制模塊 鍵盤控制模塊 溫度顯示模塊 報(bào)警模塊 溫度采集模塊 3.1控制模塊 1) 主要功能 采用Atmel公司的AT89S51單片機(jī),它作為系統(tǒng)的核心部分,和溫度采集單元之
6、間,它直接對溫度傳感器進(jìn)行指令操作,獲取溫度傳感器的溫度數(shù)據(jù)后進(jìn)行各種處理,然后通過顯示模塊顯示出溫度值,工作過程中,接收來自鍵盤控制模塊的信號,并對其作出相應(yīng)的響應(yīng),同時(shí),它不斷檢測DS18B20測取的溫度值是否超過了設(shè)定的上限溫度或下限溫度,如果超過則對報(bào)警模塊發(fā)出指令令其報(bào)警。 2) 器件選擇 AT89S51是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S5
7、1在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用。 AT89S51具有完整的輸入輸出、控制端口、以及內(nèi)部程序存儲(chǔ)空間。與我們通常意義上的微機(jī)原理類似,可以通過外接A/D,D/A轉(zhuǎn)換電路及運(yùn)放芯片實(shí)現(xiàn)對傳感器傳送信息的采集,且能夠提供以點(diǎn)陣或LCD液晶及外接按鍵實(shí)現(xiàn)人機(jī)交互,能對內(nèi)部眾多I/O端口連接步進(jìn)電機(jī)對外圍設(shè)備進(jìn)行精確操控,具有強(qiáng)大的工控能力。 圖一 AT89S51管腳圖 3.2溫度顯示模塊 1) 主要功能 實(shí)時(shí)顯示兩個(gè)DS18B20溫度傳感器采集到的溫度,在按鍵的設(shè)置下顯示設(shè)定的報(bào)警溫度上、下限值。 2) 器件選擇 該模塊采用兩個(gè)四位的八段譯碼管和一塊八位鎖存
8、器74HC573組成,采用掃描顯示的方式顯示八位數(shù)據(jù)。 數(shù)碼管分為共陽型和共陰型,共陽極型就是發(fā)光管的正極都連在一起 ,作為一條引線,負(fù)極分開。八段數(shù)碼發(fā)光管就是8個(gè)發(fā)光二極管組成的,在空間排列成為8字型帶個(gè)小數(shù)點(diǎn),只要將電壓加在陽極和陰極之間相應(yīng)的筆畫就會(huì)發(fā)光。8個(gè)發(fā)光二極管的陽極并接在一起,8個(gè)陰極分開,因此稱為共陽八段數(shù)碼管。相反則為共陰八段數(shù)碼管。 圖二 數(shù)碼管顯示字段 (a)八段數(shù)碼管結(jié)構(gòu) (b)共陰型數(shù)碼管 (c)共陽型數(shù)碼管 圖三 八段LED數(shù)碼顯示管原理和結(jié)構(gòu) 3.3溫
9、度采集模塊 1) 主要功能 實(shí)時(shí)測量兩個(gè)側(cè)兩點(diǎn)的溫度 2) 器件選擇 該模塊采用DALLAS公司的DS18B20溫度傳感器,該溫度傳感器將溫度檢測與數(shù)字?jǐn)?shù)據(jù)輸出全集成于一個(gè)芯片上,它的一個(gè)工作周期分為溫度檢測和數(shù)據(jù)處理兩個(gè)部分,它采用單數(shù)據(jù)總線進(jìn)行數(shù)據(jù)傳輸,由于本設(shè)計(jì)采用兩點(diǎn)測量溫度,兩個(gè)溫度傳感器的輸出數(shù)據(jù)腳共連在單片機(jī)的數(shù)據(jù)引腳上,因此在進(jìn)行溫度檢測和數(shù)據(jù)處理中需要首先利用DS18B20的ROM操作指令對溫度傳感器的ROM—ID進(jìn)行識別,以針對特定的溫度傳感器進(jìn)行操作。(對DS18B20的操作指令見附錄文件) DS18B20的主要特征: 1) 全數(shù)字溫度轉(zhuǎn)換及輸出 2
10、) 先進(jìn)的單總線技術(shù) 3) 最高12位的分辨率時(shí)的最大工作周期為750毫秒 4) 可選擇寄生工作方式 5) 檢測溫度范圍為-55C~+125C 6) 內(nèi)置EEPROM,限溫度報(bào)警 7) 64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機(jī)掛接 8) 多種封裝形式,適應(yīng)不同硬件 圖四 DS18B20的不同封裝形式 3.4鍵盤控制模塊 1) 主要功能 通過按鍵進(jìn)行工作模式的切換,并且用按鍵進(jìn)行上限溫度和下限溫度的更改 2) 器件選擇 該模塊采用幾個(gè)按鈕開關(guān)和相應(yīng)的幾個(gè)10K電阻組成,當(dāng)按下按鈕是,得到一個(gè)低電平信號送入單片機(jī),松開開關(guān)后變回高電平信號,單片機(jī)識
11、別此信號并對此做出響應(yīng)。 圖五 按鍵 3.5報(bào)警模塊 1) 功能實(shí)現(xiàn) 當(dāng)兩個(gè)DS18B0中任意一個(gè)測取的溫度超過設(shè)定的溫度上、下限時(shí),蜂鳴器響,以此報(bào)警。 2) 器件選擇 該模塊采用蜂鳴器來實(shí)現(xiàn),蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為有源蜂鳴器和無源蜂鳴器兩種類型。 有源蜂鳴器與無源蜂鳴器的區(qū)別(注意:這里的“源”不是指電源,而是指震蕩源): 有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會(huì)叫;而無源內(nèi)部不帶震蕩源,所以如果用直流信號無法令
12、其鳴叫。必須用2K-5K的方波去驅(qū)動(dòng)它。有源蜂鳴器往往比無源的貴,就是因?yàn)槔锩娑鄠€(gè)震蕩電路。 無源蜂鳴器的優(yōu)點(diǎn)是: 1. 便宜 2. 聲音頻率可控,可以做出“多來米發(fā)索拉西”的效果 3. 在一些特例中,可以和LED復(fù)用一個(gè)控制口 有源蜂鳴器的優(yōu)點(diǎn)是:程序控制方便。 綜上所述,本實(shí)驗(yàn)采用無緣蜂鳴器。 圖六:有源和無源蜂鳴器的外觀 a)有源 b)無源 四、各硬件模塊電路設(shè)計(jì) 圖七 單片機(jī)端口分配圖 總的硬件仿真圖附于附錄中。下面是各模塊硬件仿真連線圖: 4.1單片機(jī)最小系統(tǒng)硬件仿真圖
13、 4.2溫度顯示模塊硬件仿真圖 4.3溫度采集模塊硬件仿真圖 4.4按鍵控制模塊硬件仿真圖 4.5報(bào)警模塊硬件仿真圖 4.6硬件實(shí)現(xiàn) 初始顯示界面(顯示兩點(diǎn)測量溫度) 設(shè)定溫度上限顯示界面(顯示溫度上限值30和第二點(diǎn)測量溫度) 設(shè)定溫度下限顯示界面(顯示溫度下限值0和第二點(diǎn)測量溫度) 五、各個(gè)軟件模塊設(shè)計(jì)和流程圖 5.1軟件設(shè)計(jì)總流程圖 首先,讀取第一個(gè)DS18B20測得的溫度存入數(shù)組temp_buff中,然后讀取第二個(gè)DS18B20測得的溫度存入數(shù)組temp
14、1_buff中,隨后進(jìn)行按鍵掃描和按鍵處理,對接下來要顯示的模式進(jìn)行選擇,然后對數(shù)碼要管顯示的數(shù)據(jù)進(jìn)行處理,根據(jù)選擇的不同的模式讀取相應(yīng)的緩存,經(jīng)過數(shù)碼管掃描讀出相應(yīng)的溫度,最后,依次判斷兩個(gè)點(diǎn)的測量溫度是否超過設(shè)定的溫度報(bào)警值,若超過,蜂鳴器報(bào)警,若未超過,繼續(xù)從開始處循環(huán)。 5.2 DS18B20初始化 DS18B20的通信方式屬于單總線通信方式,需按一定的通信協(xié)議。單總線的所有處理過程均從初始化開始。其中初始化序列包括一個(gè)由主機(jī)發(fā)出的復(fù)位脈沖和其后由從機(jī)發(fā)出的存在脈沖,存在脈沖讓主機(jī)知道DS18B20在總線上并且已準(zhǔn)備就緒。 5.3讀DS
15、18B20測得的溫度 首先對DS18B20進(jìn)行初始化,然后通過跳過ROM匹配指令、溫度轉(zhuǎn)換指令,將DS18B20采集到的數(shù)據(jù)轉(zhuǎn)化為溫度,再通過初始化、跳過ROM匹配指令、讀溫度暫存器指令,將得到的溫度讀取出來,最后對得到的溫度數(shù)據(jù)進(jìn)行處理,令TN=溫度整數(shù)部分,TD=溫度小數(shù)部分,以便后續(xù)進(jìn)行使用。 5.4數(shù)碼管顯示數(shù)據(jù)處理 1)前四位數(shù)碼管顯示數(shù)據(jù)處理 由于數(shù)碼管數(shù)量有限,所以用前四位顯示第一個(gè)DS18B20測得的溫度和設(shè)定的報(bào)警溫度(包括上限溫度和下限溫度),通過K1鍵進(jìn)行三種模式的切換。若無按鍵按下或者按下三次K1鍵(mode=0),將
16、第一個(gè)DS18B20測出的溫度存入temp[ ]前四位,后續(xù)對其進(jìn)行譯碼,經(jīng)過譯碼后,前四位數(shù)碼管顯示第一個(gè)DS18B20測得的溫度:若按下一次K1鍵(mode=1),將設(shè)定的報(bào)警溫度上限存入temp[ ]前四位,后續(xù)對其進(jìn)行譯碼,經(jīng)過譯碼后,前四位數(shù)碼管顯示設(shè)定的報(bào)警溫度上限:若按下兩次K1鍵(mode=2),將設(shè)定的報(bào)警溫度下限存入temp[ ]前四位,后續(xù)對其進(jìn)行譯碼,經(jīng)過譯碼后,前四位數(shù)碼管顯示設(shè)定的報(bào)警溫度下限。 2)后四位數(shù)碼管顯示數(shù)據(jù)處理 將第二個(gè)DS18B20測得的溫度存入temp[ ],后續(xù)對其進(jìn)行譯碼,譯碼后實(shí)時(shí)顯示第二點(diǎn)的測量溫度 5.5按鍵處理 檢測
17、鍵盤掃描是否有返回值,判斷是否有按鍵按下。若無按鍵按下,則進(jìn)行數(shù)碼管顯示數(shù)據(jù)處理;若有按鍵按下且為K1鍵,mode自加1 ,并判斷mode是否大于2,若大于2,mode清零后輸出,若不大于2,直接輸出mode;若有按鍵按下且為K2鍵,判斷mode 是否為1,若為1,上限報(bào)警溫度自加1(不超過125),若不為1,進(jìn)行下限報(bào)警溫度自加1(不超過125);若有按鍵按下且為K3鍵,判斷mode 是否為1,若為1,上限報(bào)警溫度自減1(不低于-50),若不為1,進(jìn)行下限報(bào)警溫度自減1(不超過-50)。 六.設(shè)計(jì)總結(jié)及參考資料 6.1設(shè)計(jì)總結(jié) 本次課程設(shè)計(jì)我們將兩個(gè)DS18B20和AT89C51單
18、片機(jī)相結(jié)合實(shí)現(xiàn)了多點(diǎn)溫度測量。對單片機(jī)的獨(dú)立控制外設(shè)而言難度不大,但由于不會(huì)用同一個(gè)I/O口控制多個(gè)DS18B20,因此用兩個(gè)獨(dú)立的I/O口分別對其控制,故編寫的程序有些繁瑣。本次設(shè)計(jì)的不足是,第二個(gè)DS18B20測得溫度的小數(shù)部分一直無法顯示,經(jīng)過多次調(diào)試仍然沒有結(jié)果,但基本功能都已實(shí)現(xiàn)。雖然課程設(shè)計(jì)結(jié)束了,但我們?nèi)詴?huì)努力將這一問題解決。 經(jīng)過本次設(shè)計(jì)實(shí)驗(yàn),充分認(rèn)識到自己實(shí)際操作方面的不足以及程序編寫不夠熟練等問題,因此需要多加練習(xí)。同時(shí)也更加明確了我們在接下來的學(xué)習(xí)中的側(cè)重方向,作為工科專業(yè)應(yīng)該更加注重理論與實(shí)際的結(jié)合,并且持之以恒地堅(jiān)持,只有這樣不斷提高自己的專業(yè)素養(yǎng)。 6.2參考文
19、獻(xiàn)
[1]李群芳. 單片機(jī)微型計(jì)算機(jī)與接口技術(shù)第三版.電子工業(yè)出版社,2010.1
[2] 謝自美.電子線路設(shè)計(jì).實(shí)驗(yàn)測試(第二版)[M].武漢:華中科技大學(xué)出版社,2000.
[3] 丘玉娟. 用串行ROM和AT89C51實(shí)現(xiàn)電子密碼鎖[J].電腦知識與技術(shù).2005,11(3):34~36
[4]李金平?電子系統(tǒng)設(shè)計(jì)?電子工業(yè)出版社?2009
七.附件
附件一:完整源程序
#include
20、/--定義使用的IO--// sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; //譯碼器 sbit DQ=P3^7; //定義第一個(gè)18B20單總線端口 sbit DQ1=P3^6; //定義第二個(gè)18B20單總線端口 sbit key1=P1^0; //模式切換(上限,下限,當(dāng)前) sbit key2=P1^1; //溫度上/下限++ sbit key3=P1^2; //溫度上/下限-- sbit BEEP=P1^5; //定義蜂鳴器接口 //--定義全局變量--// unsigned char code table[]={
21、0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x40,0x00}; //數(shù)碼管表,其中display[10]"." display[11]"-" display[12]"不顯示" unsigned char mode=0,KEY; //mode是模式切換變量,KEY=key_back(按鍵返回值) unsigned char n=0; //數(shù)碼管位數(shù) unsigned int temp_buff[9],temp1_buff[9],*p,*q,id_buff[8],id1_buff[8];
22、//利用指針和數(shù)組進(jìn)行數(shù)據(jù)傳輸 unsigned char symbol,symbol1; //正負(fù)標(biāo)志位 unsigned char sflag,tltemp; //負(fù)溫度標(biāo)志和臨時(shí)暫存變量 unsigned char TL; //存儲(chǔ)暫存器的溫度低位 unsigned char TH; //存儲(chǔ)暫存器的溫度高位 unsigned char TN,TN1; //TN:第一個(gè)DS18B20測得溫度的整數(shù)部分,TN1:第二個(gè)DS18B20測得溫度的整數(shù)部分 unsigned char TD,TD1; //TD:第一個(gè)DS18
23、B20測得溫度的小數(shù)部分,TD1:第二個(gè)DS18B20測得溫度的小數(shù)部分 char temp[8]; //溫度數(shù)據(jù)顯示的緩存 char H_temp=30; //上限報(bào)警溫度 char L_temp=0; //下限報(bào)警溫度 bit flag; //--函數(shù)聲明--// char cabs(char val); //取絕對值函數(shù) void delay(unsigned char); //短延時(shí)函數(shù) void delay1ms(unsigned in
24、t); //長延時(shí)函數(shù) bit Init18B20(void); //第一個(gè)DS18B20初始化函數(shù) bit Init118B20(void); //第二個(gè)DS18B20初始化函數(shù) void Write0neChar(unsigned char); //向第一個(gè)DS18B20寫一個(gè)字節(jié) void Write0neChar1(unsigned char); //向第二個(gè)DS18B20寫一個(gè)字節(jié) unsigned char Read0neChar(void); //從第一個(gè)DS18B20讀一個(gè)字節(jié) unsigned char Read0neChar1(v
25、oid); //從第二個(gè)DS18B20讀一個(gè)字節(jié) void Read_18B20(unsigned char); //讀第一個(gè)DS18B20 void Read1_18B20(unsigned char); //讀第二個(gè)DS18B20 ReadTemperature(void); //讀第一個(gè)DS18B20的溫度 ReadTemperature1(void); //讀第二個(gè)DS18B20的溫度 void beep(void); //蜂鳴器函數(shù) void check_alarm(void); //檢測第一個(gè)DS18
26、B20是否超過限值并報(bào)警 void check1_alarm(void); //檢測第二個(gè)DS18B20是否超過限值并報(bào)警 unsigned char key_scan(); //按鍵掃描 void key_action(key); //按鍵處理 void display_transaction(); //第一個(gè)DS18B20顯示數(shù)據(jù)處理 void display_transaction1(); //第二個(gè)DS18B20顯示數(shù)據(jù)處理 //--短延時(shí)--// void delay(unsigned char us) {
27、
while(us--);
}
//--長延時(shí)--//
void delay1ms(unsigned int x)
{ unsigned char i,j;
for(i=0;i 28、back=0;
if(!key1|!key2|!key3)
{ delay1ms(10);
if(!key1|!key2|!key3)
{ delay1ms(10);
if(!key1) key_back=1;
else if(!key2) key_back=2; //檢測哪個(gè)按鍵按下
else if(!key3) key_back=3;
while(!key1|!key2|!key3); //等待按鍵釋放
}
}
return(key_back);
}
//--按鍵處理--//
void key_acti 29、on(key_back)
{ if(key_back==1)
{ mode++;
if(mode>2)
mode=0;
}
else if(key_back==2)
{ if(mode==1)
{ H_temp++;
if(H_temp>125)
H_temp=125;
}
else
{ L_temp++;
if(L_temp>125)
L_temp=125;
}
}
else if(key_back==3)
{ if(mode==1)
{ H_temp--;
if(H_tem 30、p<-50)
H_temp=-50;
}
else
{
L_temp--;
if(L_temp<-50)
L_temp=-50;
}
}
}
//--前四位數(shù)碼管顯示數(shù)據(jù)處理--//
void display_transaction()
{
if(!mode)
{ temp[0]=TD; //顯示小數(shù)點(diǎn)
temp[1]=TN%10;
temp[2]=TN/10;
if(symbol==0) //如果溫度為正值
temp[3]=12; / 31、/不顯符號
else //if(symbol==1)溫度為負(fù)值
temp[3]=11; //顯示負(fù)號
}
else if(mode==1)
{ temp[0]=12;
temp[1]=cabs(H_temp)%10;
//此處調(diào)用求絕對值處理,是顯示負(fù)溫度的關(guān)鍵,下同
temp[2]=cabs(H_temp)/10;
if(H_temp>0||H_temp==0)
temp[3]=12;
else
temp[3]=11;
}
else if(mode==2)
{ temp[0]=12;
te 32、mp[1]=cabs(L_temp)%10;
temp[2]=cabs(L_temp)/10;
if(L_temp>0||L_temp==0)
temp[3]=12;
else //如果溫度小于0 temp[3]=11;
}
}
//--后四位數(shù)碼管顯示數(shù)據(jù)處理--//
void display_transaction1()
{
temp[7]=TD1; //顯示小數(shù)點(diǎn)
temp[6]=TN1%10; //顯示個(gè)位
temp[5]=TN1/10; //顯示十位
if(symbol1==0) //如果溫 33、度為正值
temp[4]=12; //不顯符號
else //if(symbol==1)溫度為負(fù)值
temp[4]=11; //顯示負(fù)號
}
//--檢測第一個(gè)DS18B20是否超過限值并報(bào)警--//
void check_alarm(void)
{
if((TN>H_temp)||(TN 34、emp)||(TN1 35、y(20);
_nop_();
_nop_();
return(flag);
}
//--第二個(gè)DS18B20初始化--//
bit Init118B20(void)
{
DQ1=1;
_nop_();
DQ1=0;
delay(80);
_nop_();
DQ1=1;
delay(14);
_nop_();
_nop_();
flag=DQ1;
delay(20);
_nop_();
_nop_();
return(flag);
}
//--向第一個(gè)DS18B20寫一個(gè)字節(jié)--// 36、
void Write0neChar(unsigned char m)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
DQ=m&0x01;
delay(3);
_nop_();
_nop_();
DQ=1;
m>>=1;
}
}
//--向第二個(gè)DS18B20寫一個(gè)字節(jié)--//
void Write0neChar1(unsigned char m)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ1=0;
_nop_() 37、;
DQ1=m&0x01;
delay(3);
_nop_();
_nop_();
DQ1=1;
m>>=1;
}
}
//--從第一個(gè)DS18B20讀一個(gè)字節(jié)--//
unsigned char Read0neChar(void)
{
unsigned char i=0,dat=0;
for(i=0;i<8;i++)
{ //拉低總線
DQ=0;
dat>>=1;
DQ=1; //釋放總線
if(DQ==1)
dat|=0x80;
delay(2);
_nop_ 38、();
}
return(dat);
}
//--從第二個(gè)DS18B20讀一個(gè)字節(jié)--//
unsigned char Read0neChar1(void)
{
unsigned char i=0,dat=0;
for(i=0;i<8;i++)
{
DQ1=0; //拉低總線
dat>>=1;
DQ1=1; //釋放總線
if(DQ1==1)
dat|=0x80;
delay(2); //延時(shí)等待數(shù)據(jù)穩(wěn)定
_nop_();
}
return(dat);
}
//--讀第一個(gè)DS18B20-- 39、//
void Read_18B20(unsigned char j)
{
unsigned char i;
for(i=0;i 40、oid)
{
p=id_buff;
Init18B20();
Write0neChar(0xcc); //跳過ROM操作命令
Write0neChar(0x44); //溫度轉(zhuǎn)換命令
Init18B20();
Write0neChar(0xcc);
Write0neChar(0xbe); //讀暫存器指令
p=temp_buff;
Read_18B20(9);
if((temp_buff[1]&0xf8)!=0x00)
//判斷高五位,得到溫度正負(fù)標(biāo)志,前五位為0 正值,1 負(fù)值
{ symbol= 41、1;
flag=1;
temp_buff[0]=~temp_buff[0]; //取反
temp_buff[1]=~temp_buff[1]; //取反
tltemp=temp_buff[0]+1; //低位加1
temp_buff[0]=tltemp;
if(tltemp>225)
temp_buff[1]++; //如果低8位大于225,向高8位進(jìn)1
TN=temp_buff[1]*16+temp_buff[0]/16; //溫度的整數(shù)部分
TD=(temp_buff[0]%16)*10/16;//溫度的 42、小數(shù)部分,一位小數(shù)
}
TN=temp_buff[1]*16+temp_buff[0]/16;
TD=(temp_buff[0]%16)*10/16;
}
//--從第二個(gè)18B20讀溫度--//
ReadTemperature1(void)
{
q=id1_buff;
Init118B20();
Write0neChar1(0xcc); //跳過ROM操作命令
Write0neChar1(0x44); //溫度轉(zhuǎn)換指令
Init118B20();
Write0neChar1(0xcc);
Write0neChar1(0xbe); 43、 //讀暫存器指令
q=temp1_buff;
Read1_18B20(9);
if((temp1_buff[1]&0xf8)!=0x00)
//判斷高五位,得到溫度正負(fù)標(biāo)志,前五位為1 負(fù)值,0 正值
{ symbol1=1;
flag=1;
temp1_buff[0]=~temp1_buff[0]; //取反
temp1_buff[1]=~temp1_buff[1]; //取反
tltemp=temp1_buff[0]+1; //低位加1
temp1_buff[0]=tltem 44、p;
if(tltemp>225)
temp1_buff[1]++; //如果低8位大于225,向高8位進(jìn)1
TN1=temp1_buff[1]*16+temp1_buff[0]/16; //溫度的整數(shù)部分
TD1=(temp1_buff[0]%16)*10/16;
//溫度的小數(shù)部分,一位小數(shù)
}
TN1=temp1_buff[1]*16+temp1_buff[0]/16;
TD1=(temp1_buff[0]%16)*10/16;
}
////////////////////以上對18B20操作完畢/////////////////// 45、//////
//--數(shù)碼管掃描--//
void display()
{
for(n=0;n<7;n++) //八位數(shù)碼管動(dòng)態(tài)掃描
{ if(n==1||n==6) //此處if判斷是否顯示個(gè)位小數(shù)點(diǎn)
P0=table[temp[n]]|0x80;
else
P0=table[temp[n]]; //顯示對應(yīng)的數(shù)字
switch(n)
{
case 0: LSC=0; LSB=1; LSA=1; break;
case 1: LSC=0; LSB=1; LSA=0; break;
cas 46、e 2: LSC=0; LSB=0; LSA=1; break;
case 3: LSC=0; LSB=0; LSA=0;; break;
case 4: LSC=1; LSB=0; LSA=0; break;
case 5: LSC=1; LSB=0; LSA=1; break;
case 6: LSC=1; LSB=1; LSA=0; break;
case 7: LSC=1; LSB=1; LSA=1;; break;
}
delay(1000); //此處是數(shù)碼管掃描頻率,若此數(shù)值太小,則數(shù)碼管的余輝效應(yīng)將會(huì)很明顯
}
}
main( 47、)
{
while(1)
{
ReadTemperature(); //讀第一個(gè)DS18B20的溫度
ReadTemperature1(); //讀第二個(gè)DS18B20的溫度
KEY=key_scan(); //按鍵掃描
if(KEY)
key_action(KEY); //按鍵處理
display_transaction(); //數(shù)碼管顯示數(shù)據(jù)處理
display_transaction1();
display(); //數(shù)碼管掃描
check_alarm(); //檢測報(bào)警
che 48、ck1_alarm();
}
}
附件二:完整的器件清單及硬件電路圖
Bill Of Materials For .DSN
Design Title
:
.DSN
Author
:
49、er Code
1
R9
4.7k
H1K
1
R10
18
H1K
3Capacitors
Quantity:
References
Value
Order Code
50、
2
C1, C2
30pF
Digikey 478-1088-6-ND
1
C3
100n
Maplin VM87U
5Integrated Circuits
Quantity:
References
Value
Order Code
1
51、
U1
AT89C51
1
U2
74HC573
1
U3
74HC138
2
U5, U6
DS18B20
7Miscellaneous
52、Quantity:
References
Value
Order Code
3
K1-K3
1
LS1
SOUNDER
2
RP1, RP2
RESPACK-8
1
X1
11.0592M
2015739:45:44
30
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案