版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 摘要</b></p><p> 本設(shè)計是應(yīng)用MCS-51單片機的原理和控制理論設(shè)計一個多功能系統(tǒng),功能包括矩陣鍵盤輸入,鍵盤內(nèi)容顯示,溫度傳感器操縱,溫度顯示,并實現(xiàn)雙機通信以顯示同樣的內(nèi)容。硬件系統(tǒng)包括單片機最小系統(tǒng),ISP下載模塊,矩陣鍵盤,獨立鍵盤,溫度傳感器模塊,數(shù)碼管,流水燈等。除了課設(shè)規(guī)定的要求外,還加入一些有趣的擴展功能,如:利用led燈指示單片
2、機工作狀態(tài),從機普通模式、空閑模式可選,用于節(jié)電。通過設(shè)計,加深對51單片機的理解,掌握實際的應(yīng)用,增強動手能力。</p><p> 設(shè)計包括硬件設(shè)計、軟件編程,仿真,制作實物,撰寫報告等步驟。</p><p> 關(guān)鍵詞: 51單片機 多功能系統(tǒng)設(shè)計 單片機編程</p><p><b> Abstract</b></p>
3、<p> This design is the application of the principle of the MCS-51 microcontroller and control theory to design a multi-functional system features include the matrix keyboard input, keyboard content display and man
4、ipulation of temperature sensor, temperature display, and dual-machine communication in order to display the same content. The hardware system including the minimum microcontroller system,ISP download module, matrix keyb
5、oard, separate keyboard, the temperature sensor module, digital tube, L</p><p> The design includes hardware design, software programming, simulation, making hardware, writing reports and other steps.</p
6、><p> Keywords: 51 microcontroller, multi-functional system design,microcontroller programming目錄</p><p><b> 摘要I</b></p><p> AbstractII</p><p><b> 目
7、錄3</b></p><p> 一 項目要求與說明4</p><p><b> 二 方案論證5</b></p><p> 三 硬件電路設(shè)計5</p><p> 1 MCU控制器簡介5</p><p> 2 單片機最小系統(tǒng)6</p><p>
8、<b> 3 矩陣鍵盤6</b></p><p> 4 DS18B20溫度檢測電路7</p><p> 4.1 DS18B20溫度傳感器特性7</p><p> 4.2 DS18B20操作時序8</p><p> 5 數(shù)碼管顯示電路10</p><p><b> 6
9、 流水燈10</b></p><p> 7 串行口電路11</p><p><b> 四 軟件設(shè)計12</b></p><p> 1 系統(tǒng)軟件開發(fā)工具12</p><p> 2 系統(tǒng)流程圖12</p><p> 2.1 主機程序流程圖12</p>&
10、lt;p> 2.2 從機程序流程圖13</p><p><b> 3 軟件編程13</b></p><p> 4 軟件實現(xiàn)功能說明14</p><p> 4.1 主機矩陣鍵盤功能14</p><p> 4.2 從機獨立鍵盤功能14</p><p><b> 五
11、 仿真分析15</b></p><p> 1 數(shù)據(jù)輸入與顯示功能仿真15</p><p> 2 溫度檢測與顯示功能仿真16</p><p> 3 數(shù)據(jù)通信功能16</p><p><b> 六 心得體會17</b></p><p><b> 參考文獻18
12、</b></p><p> 附件A 單片機系統(tǒng)原理圖19</p><p> 附件B 單片機系統(tǒng)實物20</p><p> 附件C 主機程序21</p><p> 附件D 從機程序32</p><p><b> 一 項目要求與說明</b></p><
13、p> 1)完成包含如下系統(tǒng)功能組件的單片機最小系統(tǒng)的設(shè)計、焊接、調(diào)試</p><p><b> ?。?)鍵盤</b></p><p> 一個4X4的矩陣鍵盤,其中,10個按鍵是0~9數(shù)字鍵;另外6個是功能鍵,用于功能選擇和控制。</p><p><b> (2)顯示電路</b></p><p
14、> 由6個7段LED數(shù)碼管組成的顯示電路。</p><p><b> ?。?)溫度檢測</b></p><p> 利用DS18B20可編程1-Wire數(shù)字溫度傳感器芯片,或利用AD590溫度傳感器芯片和A/D轉(zhuǎn)換器芯片采集溫度溫度信號。</p><p> ?。?)串口串行通信</p><p> 利用51的串
15、口實現(xiàn)串行通信接口電路。</p><p> 2)完成ISP下載電路的設(shè)計、焊接</p><p> 3)完成系統(tǒng)軟件的設(shè)計,包括程序結(jié)構(gòu)設(shè)計、流程圖繪制、程序設(shè)計,實現(xiàn)如下功能</p><p><b> (1)功能選擇</b></p><p> 通過功能選擇鍵,使得單片機處于不同工作狀態(tài)并通過LED顯示相應(yīng)內(nèi)容。&
16、lt;/p><p><b> ?。?)溫度顯示</b></p><p> 通過功能選擇鍵選擇溫度檢測、顯示后,LED顯示溫度值。</p><p><b> ?。?)數(shù)據(jù)輸入</b></p><p> 通過功能選擇鍵選擇數(shù)據(jù)輸入后,將通過鍵盤鍵入的0~9按鍵值顯示在LED上,其中,最后輸入的顯示在最左
17、邊,之前鍵入向右移動一位。</p><p><b> ?。?)數(shù)據(jù)通信</b></p><p> 將兩個單片機最小系統(tǒng)通過串口連接起來,其中一個作為主系統(tǒng),另一個作為輔系統(tǒng)。當(dāng)通過功能選擇鍵選擇數(shù)據(jù)通信后,當(dāng)在主系統(tǒng)上進行功能(2)、功能(3)的操作時,輔系統(tǒng)的LED上顯示與主系統(tǒng)同樣的內(nèi)容。</p><p> 4)利用仿真軟件完成系統(tǒng)仿真
18、工作</p><p> 5)在單片機最小系統(tǒng)硬件上實現(xiàn)任務(wù)3中規(guī)定的功能</p><p><b> 二 方案論證</b></p><p> 溫度檢測模塊方案選擇:</p><p> 方案一、采用AD590設(shè)計溫度檢測模塊,由于需要添加AD轉(zhuǎn)換電路、放大電路,電路設(shè)計比較繁瑣,成本較高。</p>&l
19、t;p> 方案二、采用Dallas公司生產(chǎn)的DS18B20作為測溫模塊,DS18B20芯片內(nèi)部自帶AD轉(zhuǎn)換電路,使用方便。它采用單總線協(xié)議傳輸技術(shù),只需占用單片機一個IO口,電路容易設(shè)計,編程比較簡單。溫度的分辨率可以選擇9到12位的分辨率。</p><p> 綜上所述,溫度檢測模塊選擇方案二。</p><p><b> 三 硬件電路設(shè)計</b></
20、p><p> 1 MCU控制器簡介</p><p> STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗
21、定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,2個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35MHz,6T/12T可選。<
22、/p><p> 2 單片機最小系統(tǒng)</p><p> 單片機最小系統(tǒng)包括振蕩器電路,復(fù)位電路,單片機EA端接高電平(Vcc),P0口需要接上拉電阻(10K)。振蕩器電路選用12MHz晶振,兩個30pf電容,振蕩器電路接單片機XTAL1和XTAL2引腳。</p><p> 單片機最小系統(tǒng)原理圖如下。</p><p> 圖1 單片機最小系統(tǒng)
23、</p><p><b> 3 矩陣鍵盤</b></p><p> 矩陣鍵盤檢測的原理和方法:矩陣鍵盤每個按鍵兩端都與單片機I/O口相連,因此在檢測時需人為通過單片機I/O口送出低電平。檢測時,先送一列為低電平,其余幾列全為高電平(此時確定了列數(shù)),然后立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電平(這是有確定了行數(shù)),則便可以確認當(dāng)前被按下的鍵是哪一列
24、哪一行,用同樣方法輪流送各列一次低電平,再輪流檢測一次各行是否變?yōu)榈碗娖?,這樣既可檢測完所有的按鍵,當(dāng)有鍵按下時便可判斷出按下的是哪一個鍵。</p><p> 此外還需要消除按鍵在閉合或斷開時的抖動。消抖的方法可采用消抖電路(RS觸發(fā)器時鎖電路硬件消除抖動),也可采用延時方式軟件消除抖動(延時后再重讀,以跳過抖動期),本設(shè)計采用軟件消抖方式。</p><p> 矩陣鍵盤原理圖如下。&l
25、t;/p><p><b> 圖2 矩陣鍵盤</b></p><p> 4 DS18B20溫度檢測電路</p><p> 4.1 DS18B20溫度傳感器特性</p><p> 適應(yīng)電壓范圍寬,電壓范圍在3.0~5.5V,在寄生電源方式下可有數(shù)據(jù)線供電。</p><p> 獨特的單線接口方式,
26、它與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通信。</p><p> 支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,實現(xiàn)組網(wǎng)多點測溫。</p><p> 在使用中不需要任何外圍元件,全部傳感器及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi)。</p><p> 測溫范圍-55℃~+125℃,在-10℃~+85℃時精度為
27、7;0.5℃。</p><p> 可編程分辨率為9~12位,對應(yīng)的可分辨率溫度分別為0.5℃,0.25℃,0.125℃和0.0625℃,可實現(xiàn)高精度測溫。</p><p> 4.2 DS18B20操作時序</p><p> 4.2.1 初始化操作時序</p><p> 圖3 ds18b20初始化時序</p><p&
28、gt; 4.2.2 讀取時序</p><p> 圖4 ds18b20讀數(shù)據(jù)時序</p><p> 4.2.3 寫入時序</p><p> 圖5 ds18b2寫數(shù)據(jù)時序</p><p> 4.2.4 DS18B20實物</p><p><b> 如圖所示。</b></p>
29、<p> 圖6 ds18b20實物</p><p> 4.2.5 DS18B20電路連接</p><p> 如下圖所示。其DQ端接單片機的P2.2端。</p><p> 圖7 ds18b20連接</p><p><b> 5 數(shù)碼管顯示電路</b></p><p> 數(shù)
30、碼管的顯示原理是靠點亮內(nèi)部的發(fā)光二極管來發(fā)光。本次設(shè)計中使用的是7端共陰極數(shù)碼管,數(shù)碼管的陽極,即標有a,b,c,d,e,f,g,h的引腳全部連在一起,與下面的U2元件(74HC573)鎖存器的數(shù)據(jù)輸出端相連,U2的數(shù)據(jù)輸入端連單片機P0口。數(shù)碼管中WE1,WE2,WE3,WE4,WE5,WE6是他們的位選端,每個數(shù)碼管對應(yīng)一個位選端,與U3元件(74HC573)數(shù)據(jù)出端低6位相連,U3的數(shù)據(jù)輸入端連單片機P0口。兩個鎖存器的鎖存端分別
31、與單片機P2.6和P2.7相連。這樣用單片機可以控制鎖存器的鎖存端,進而控制鎖存器的數(shù)據(jù)輸出,這種分時控制的方法便可方便地控制任意數(shù)碼管顯示任意數(shù)字。</p><p> 數(shù)碼管顯示電路下圖所示。</p><p> 圖8 數(shù)碼管顯示模塊</p><p><b> 6 流水燈</b></p><p> 流水燈用于反映
32、系統(tǒng)當(dāng)前工作狀態(tài)。流水燈是一組發(fā)光二極管,如下圖所示。這組發(fā)光二極管的陰極端連接U5元件(74HC573)鎖存器的輸出端,陽極接一個排阻。U5的鎖存端接單片機的P2.5口,這樣就可以通過單片機對這組發(fā)光二極管的亮滅進行控制。</p><p><b> 圖9 流水燈模塊</b></p><p><b> 7 串行口電路</b></p>
33、;<p> 單片機使用的是TTL電平,而計算機使用的是RS-232電平,要實現(xiàn)把電腦中的程序能下載到單片機上,就需要實現(xiàn)RS-232電平與TTL電平之間的轉(zhuǎn)換。實現(xiàn)這一功能的芯片有很多,本次課設(shè)所使用的芯片為MAX232及電容元件構(gòu)成RS232電平與TTL電平轉(zhuǎn)換的串行口電路。</p><p> 本次課設(shè)要完成雙機通信功能,需要兩個單片機系統(tǒng),一個單片機作為主機,一個作為從機??梢允褂靡桓诰€
34、連接兩個單片機的串口即可完成課設(shè)要求的數(shù)據(jù)通信功能。串行口電路如下圖所示。</p><p><b> 圖10 串口模塊</b></p><p><b> 四 軟件設(shè)計</b></p><p> 1 系統(tǒng)軟件開發(fā)工具</p><p> 系統(tǒng)軟件開發(fā)工具采用C語言軟件開發(fā)系統(tǒng)Keil uVisi
35、on3。</p><p><b> 2 系統(tǒng)流程圖</b></p><p> 2.1 主機程序流程圖</p><p> 圖11 主機程序流程圖</p><p> 2.2 從機程序流程圖</p><p> 圖12 從機程序流程圖</p><p><b>
36、 3 軟件編程</b></p><p><b> 見附錄</b></p><p> 4 軟件實現(xiàn)功能說明</p><p> 4.1 主機矩陣鍵盤功能</p><p> 圖13 主機鍵盤功能</p><p><b> 0~9:數(shù)字輸入。</b></p
37、><p> F1:矩陣鍵盤輸入功能選擇。</p><p> F2:溫度顯示功能選擇。</p><p> F3:雙機通信功能開關(guān)。</p><p> 按下F1,進行數(shù)字輸入(0~9),顯示在數(shù)碼管上。按下F2,可顯示溫度,按下F3可以開關(guān)雙機通信功能。</p><p> 4.2 從機獨立鍵盤功能</p>
38、<p> 圖14 從機獨立鍵盤功能</p><p> Key:空閑模式/正常模式功能切換。</p><p> 選擇空閑模式時,LED燈會亮起,提示工作在空閑模式。當(dāng)從機CPU檢測到在一段時間內(nèi)主機沒有發(fā)送數(shù)據(jù)給從機時,從機CPU停止工作,此時可由中斷喚醒,當(dāng)主機再次給從機發(fā)送數(shù)據(jù)時,從機正常工作。</p><p><b> 五 仿真分
39、析</b></p><p> Proteus是世界上著名的EDA工具(仿真軟件),它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051。在編譯方面,它支持IAR、Keil和MP
40、LAB等多種編譯器。</p><p> 1 數(shù)據(jù)輸入與顯示功能仿真</p><p> 按下矩陣鍵盤第四排第一個鍵,再順序按下440099,得到結(jié)果如圖。</p><p> 圖15 鍵盤輸入顯示仿真</p><p> 2 溫度檢測與顯示功能仿真</p><p> 按下矩陣鍵盤第四排第二個鍵,則顯示溫度如圖為9攝
41、氏度。</p><p> 圖16 溫度顯示仿真</p><p><b> 3 數(shù)據(jù)通信功能</b></p><p> 在數(shù)據(jù)輸入模式下再按下矩陣鍵盤第四排第三個鍵,則左邊從機顯示與主機相同的內(nèi)容。</p><p> 圖17 雙機通信功能仿真</p><p> 在溫度顯示模式下再按下矩陣鍵
42、盤第四排第三個鍵,則左邊從機顯示與主機相同的內(nèi)容。</p><p> 圖18 雙機通信功能仿真1</p><p><b> 六 心得體會</b></p><p> 在為期十天的單片機實習(xí)中,除了對51單片機的基礎(chǔ)知識有了深刻的理解,還增強了動手的能力,硬件設(shè)計,軟件設(shè)計,包括報告的撰寫,每個步驟都讓我受益頗深,。</p>&
43、lt;p> 在此次設(shè)計中,我的系統(tǒng)采用了被廣泛使用的單片機STC89C52為主控芯片,配合DS18B20溫度傳感器,LED數(shù)碼管,鍵盤電路所設(shè)計的一個多功能系統(tǒng)。在報告中介紹了DS18B20的操作方法,介紹了鍵盤電路基本原理、特性及編程方法。對單片機軟硬件資源和接口擴展也有部分的介紹和應(yīng)用。在系統(tǒng)仿真中對各功能都實現(xiàn)了仿真。</p><p> 這次課程設(shè)計使我得到了很多收獲,我不僅學(xué)到了許多了關(guān)于單片機
44、方面的知識,熟悉了與單片機相關(guān)的兩款軟件Keil和Proteus,提高了實驗技能;而且也使我的動手能力和電路設(shè)計能力得到了極大的提高。在此次設(shè)計中,我認為比較麻煩的是編程,本次設(shè)計使用的是C語言,七百行的程序?qū)懥私惶欤箨懤m(xù)地修修改改、添加新功能,過程很艱難,結(jié)果是令人欣慰的。</p><p><b> 參考文獻</b></p><p> [1] 李群芳. 單
45、片微型計算機與接口技術(shù)(第4版) 電子工業(yè)出版社</p><p> [2] 郭天祥 新概念51單片機C語言教程 電子工業(yè)出版社</p><p> [3] 謝自美.電子線路設(shè)計·實驗·測試(第三版) 華中科技大學(xué)出版社</p><p> [4] Dallas 公司 DS18B20數(shù)據(jù)手冊
46、 Dallas公司</p><p> [5] 劉教瑜. 單片機原理及應(yīng)用 武漢理工大學(xué)出版社</p><p> [6]黃智偉. 全國大學(xué)生電子競賽常用電路模塊制作 北京航空航天大學(xué)出版社</p><p> [7]王永生. 電子測量學(xué) 西北工業(yè)大學(xué)出版社<
47、/p><p> 附件A 單片機系統(tǒng)原理圖</p><p> 圖19 單片機系統(tǒng)原理圖</p><p> 附件B 單片機系統(tǒng)實物</p><p><b> 附件C 主機程序</b></p><p> #include<reg51.h></p><p> #
48、define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit dula=P2^6;//段選</p><p> sbit wela=P2^7;//位選</p><p> sbit led1=P1^1;//鍵盤輸入功能指
49、示燈</p><p> sbit led2=P1^2;//溫度顯示指示燈</p><p> sbit led3=P1^3;//雙機通信指示燈</p><p> sbit DS=P2^2;//DS18B20數(shù)據(jù)端</p><p> uchar temp1;//用于鍵盤讀取</p>
50、<p> uint key; //存儲按鍵值 </p><p> uchar A1,A2,A2t,A3;//三位溫度值</p><p> bit stateschange=0;//判別鍵盤輸入現(xiàn)實的值是否發(fā)生變化,控制發(fā)送程序</p><p> bit keyinput=0; //判別鍵盤輸入 作為調(diào)用鍵
51、盤顯示函數(shù)的依據(jù)</p><p> bit temdisplay=0; //判別溫度顯示 作為調(diào)用溫度顯示函數(shù)的依據(jù)</p><p> bit dualcomm=0; //判別是否進行雙機通信</p><p> uchar s[6]; //鍵盤控制的6位數(shù)碼管顯示內(nèi)容 </p><p> ucha
52、r code table[]={0x3f,0x06,0x5b,0x4f,</p><p> 0x66,0x6d,0x7d,0x07,</p><p> 0x7f,0x6f,0x00,0x39}; //無小數(shù)點</p><p> uchar code table1[]={0xbf,0x86,0xdb,0
53、xcf,</p><p> 0xe6,0xed,0xfd,0x87,</p><p> 0xff,0xef}; //帶小數(shù)點</p><p> uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位選</p><p> /***********
54、*********************************************</p><p><b> 延時函數(shù)</b></p><p> /********************************************************/</p><p> void delay(uint count) &
55、lt;/p><p><b> {</b></p><p><b> uint i;</b></p><p> while(count)</p><p><b> {</b></p><p><b> i=50;</b><
56、/p><p> while(i>0)</p><p><b> i--;</b></p><p><b> count--;</b></p><p><b> }</b></p><p><b> }</b></p
57、><p> /********************************************************</p><p><b> 初始化函數(shù)</b></p><p> /********************************************************/</p><p&
58、gt; void init()</p><p><b> {</b></p><p><b> dula=0;</b></p><p><b> wela=0;</b></p><p> TMOD=0x20;</p><p><b>
59、; TH1=0xfd;</b></p><p><b> TL1=0xfd;</b></p><p><b> TR1=1;</b></p><p><b> SM0=0;</b></p><p><b> SM1=1;</b><
60、;/p><p><b> }</b></p><p> /********************************************************</p><p><b> 發(fā)送函數(shù)</b></p><p> /******************************
61、**************************/</p><p> void send()</p><p><b> {</b></p><p> stateschange=0;</p><p> if(keyinput==1)</p><p><b> {</b&
62、gt;</p><p><b> uint i=0;</b></p><p> SBUF=0xff;</p><p> while(!TI);</p><p><b> TI=0;</b></p><p> for(i=0;i<6;i++)</p>
63、<p><b> {</b></p><p> SBUF=s[i];</p><p> while(!TI);</p><p><b> TI=0;</b></p><p><b> }</b></p><p><b>
64、 }</b></p><p> else if(temdisplay==1)</p><p><b> {</b></p><p> SBUF=0xaa;</p><p> while(!TI);</p><p><b> TI=0;</b></
65、p><p><b> SBUF=A1;</b></p><p> while(!TI);</p><p><b> TI=0;</b></p><p><b> SBUF=A2;</b></p><p> while(!TI);</p>
66、<p><b> TI=0;</b></p><p><b> SBUF=A3;</b></p><p> while(!TI);</p><p><b> TI=0;</b></p><p><b> }</b></p&g
67、t;<p><b> }</b></p><p> /********************************************************</p><p> 以下是溫度傳感器相關(guān)函數(shù)</p><p> /**********************************************
68、**********/</p><p> void dsreset(void) //發(fā)送復(fù)位和初始化指令</p><p><b> {</b></p><p><b> uint i;</b></p><p><b> DS=0;</b></p>
69、<p><b> i=103;</b></p><p> while(i>0)i--;</p><p><b> DS=1;</b></p><p><b> i=4;</b></p><p> while(i>0)i--;</p>
70、<p><b> }</b></p><p> bit tmpreadbit(void) //讀取一位</p><p><b> {</b></p><p><b> uint i;</b></p><p><b> bit da
71、t;</b></p><p> DS=0;i++; //i++延時</p><p> DS=1;i++;i++;</p><p><b> dat=DS;</b></p><p> i=8;while(i>0)i--;</p><p> return
72、 (dat);</p><p><b> }</b></p><p> uchar tmpread(void) //讀取一字節(jié)數(shù)據(jù)</p><p><b> {</b></p><p> uchar i,j,dat;</p><p><b> da
73、t=0;</b></p><p> for(i=1;i<=8;i++)</p><p><b> {</b></p><p> j=tmpreadbit();</p><p> dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面</p>
74、<p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> void tmpwritebyte(uchar dat) //寫一個字節(jié)到 ds18b20</p><p><b> {</b
75、></p><p><b> uint i;</b></p><p><b> uchar j;</b></p><p> bit testb;</p><p> for(j=1;j<=8;j++)</p><p><b> {</b&g
76、t;</p><p> testb=dat&0x01;</p><p> dat=dat>>1;</p><p> if(testb) //寫1</p><p><b> {</b></p><p><b> DS=0;</b></
77、p><p><b> i++;i++;</b></p><p><b> DS=1;</b></p><p> i=8;while(i>0)i--;</p><p><b> }</b></p><p><b> else</
78、b></p><p><b> {</b></p><p> DS=0; //寫0</p><p> i=8;while(i>0)i--;</p><p><b> DS=1;</b></p><p><b> i++;i++;&l
79、t;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void tmpchange(void) //DS18B20 啟動轉(zhuǎn)換</p><p><
80、;b> {</b></p><p> dsreset();</p><p><b> delay(1);</b></p><p> tmpwritebyte(0xcc); </p><p> tmpwritebyte(0x44); </p><p><b>
81、 }</b></p><p> void gettmp() //獲取溫度</p><p><b> { </b></p><p> uint temp;</p><p><b> float tt;</b></p><p>
82、 uchar a,b;</p><p> dsreset();</p><p><b> delay(1);</b></p><p> tmpwritebyte(0xcc);</p><p> tmpwritebyte(0xbe);</p><p> a=tmpread();</p
83、><p> b=tmpread();</p><p><b> temp=b;</b></p><p> temp<<=8; //兩字節(jié)組成一個整型變量</p><p> temp=temp|a;</p><p> tt=temp*0.0625;</
84、p><p> temp=tt*10+0.5;</p><p> A1=temp/100;</p><p> A2t=temp%100;</p><p> A2=A2t/10;</p><p> A3=A2t%10;</p><p><b> }</b></p&
85、gt;<p> /********************************************************</p><p> 顯示函數(shù)1 用于溫度顯示</p><p> /********************************************************/</p><p> void dis
86、play()</p><p><b> {</b></p><p> P0=table[A1];//顯示百位</p><p><b> dula=1;</b></p><p><b> dula=0;</b></p><p><
87、b> P0=0x7e;</b></p><p><b> wela=1;</b></p><p><b> wela=0;</b></p><p><b> delay(1);</b></p><p><b> wela=1;</b&
88、gt;</p><p><b> P0=0xff;</b></p><p><b> wela=0;</b></p><p> P0=table1[A2];//顯示十位</p><p><b> dula=1;</b></p><p><
89、;b> dula=0;</b></p><p><b> P0=0x7d;</b></p><p><b> wela=1;</b></p><p><b> wela=0;</b></p><p><b> delay(1);</b
90、></p><p><b> wela=1;</b></p><p><b> P0=0xff;</b></p><p><b> wela=0;</b></p><p> P0=table[A3];//顯示個位</p><p><
91、;b> dula=1;</b></p><p><b> dula=0;</b></p><p><b> P0=0x7b;</b></p><p><b> wela=1;</b></p><p><b> wela=0;</b&g
92、t;</p><p><b> delay(1);</b></p><p><b> wela=1;</b></p><p><b> P0=0xff;</b></p><p><b> wela=0;</b></p><p&g
93、t; P0=table[11];//顯示C</p><p><b> dula=1;</b></p><p><b> dula=0;</b></p><p><b> P0=0xf7;</b></p><p><b> wela=1;</b>
94、;</p><p><b> wela=0;</b></p><p><b> delay(1);</b></p><p><b> wela=1;</b></p><p><b> P0=0xff;</b></p><p>
95、;<b> wela=0;</b></p><p><b> }</b></p><p> /********************************************************</p><p> 顯示函數(shù)2 用于鍵盤</p><p> /***********
96、*********************************************/</p><p> void display2()</p><p><b> {</b></p><p><b> uint u;</b></p><p> for(u=0;u<6;u++)&
97、lt;/p><p><b> {</b></p><p> P0=table[s[u]];</p><p><b> dula=1;</b></p><p><b> dula=0;</b></p><p> P0=wei[u];</p&g
98、t;<p><b> wela=1;</b></p><p><b> wela=0;</b></p><p><b> delay(1);</b></p><p><b> wela=1;</b></p><p><b>
99、 P0=0xff;</b></p><p><b> wela=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*****************************************
100、***************</p><p><b> 鍵盤掃描函數(shù)</b></p><p> /********************************************************/</p><p> void keyscan()</p><p><b> {</b
101、></p><p><b> P3=0xfe;</b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p> if(temp1!=0xf0)</p><p><b> {
102、</b></p><p> delay(80);</p><p> if(temp1!=0xf0)</p><p><b> {</b></p><p><b> temp1=P3;</b></p><p> switch(temp1)</p>
103、;<p><b> {</b></p><p> case 0xee:</p><p> key=0;stateschange=1;</p><p><b> break;</b></p><p> case 0xde:</p><p> key=1
104、;stateschange=1;</p><p><b> break;</b></p><p> case 0xbe:</p><p> key=2;stateschange=1;</p><p><b> break;</b></p><p> case 0x7
105、e:</p><p> key=3;stateschange=1;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp1!=0xf0)</p><p><b> {</b>
106、;</p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</
107、b></p><p><b> P3=0xfd;</b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p> if(temp1!=0xf0)</p><p><b>
108、{</b></p><p> delay(40);</p><p> if(temp1!=0xf0)</p><p><b> {</b></p><p><b> temp1=P3;</b></p><p> switch(temp1)</p&g
109、t;<p><b> {</b></p><p> case 0xed:</p><p> key=4;stateschange=1;</p><p><b> break;</b></p><p> case 0xdd:</p><p> key=
110、5;stateschange=1;</p><p><b> break;</b></p><p> case 0xbd:</p><p> key=6;stateschange=1;</p><p><b> break;</b></p><p> case 0x
111、7d:</p><p> key=7;stateschange=1;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp1!=0xf0)</p><p><b> {</b&g
112、t;</p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }<
113、/b></p><p><b> P3=0xfb;</b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p> if(temp1!=0xf0)</p><p><b>
114、 {</b></p><p> delay(40);</p><p> if(temp1!=0xf0)</p><p><b> {</b></p><p><b> temp1=P3;</b></p><p> switch(temp1)</p&
115、gt;<p><b> {</b></p><p> case 0xeb:</p><p> key=8;stateschange=1;</p><p><b> break;</b></p><p> case 0xdb:</p><p> key
116、=9;stateschange=1;</p><p><b> break;</b></p><p> case 0xbb:</p><p> key=10;stateschange=1;</p><p><b> break;</b></p><p> case
117、0x7b:</p><p> key=11;stateschange=1;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp1!=0xf0)</p><p><b> {</
118、b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }&
119、lt;/b></p><p><b> P3=0xf7;</b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p> if(temp1!=0xf0)</p><p><b&g
120、t; {</b></p><p> delay(40 );</p><p> if(temp1!=0xf0)</p><p><b> {</b></p><p><b> temp1=P3;</b></p><p> switch(temp1)<
121、;/p><p><b> {</b></p><p> case 0xe7:</p><p> key=12;stateschange=1;</p><p><b> break;</b></p><p> case 0xd7:</p><p>
122、 key=13;stateschange=1;</p><p><b> break;</b></p><p> case 0xb7:</p><p> key=14;stateschange=1;</p><p><b> break;</b></p><p>
123、 case 0x77:</p><p> key=15;stateschange=1;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp1!=0xf0)</p><p><b>
124、{</b></p><p><b> temp1=P3;</b></p><p> temp1=temp1&0xf0;</p><p><b> }</b></p><p><b> }</b></p><p><b&g
125、t; }</b></p><p><b> }</b></p><p> /********************************************************</p><p> 按鍵判斷函數(shù) 控制功能選擇以及數(shù)據(jù)顯示內(nèi)容</p><p> /**************
126、******************************************/</p><p> void keydeal()</p><p><b> {</b></p><p> if(keyinput==1&&key>=0&&key<=9)</p><p>
127、<b> {</b></p><p> s[5]=s[4];</p><p> s[4]=s[3];</p><p> s[3]=s[2];</p><p> s[2]=s[1];</p><p> s[1]=s[0];</p><p><b> s
128、[0]=key;</b></p><p><b> }</b></p><p> else if (key==12)</p><p><b> {</b></p><p><b> uint i;</b></p><p> key
129、input=1;</p><p> temdisplay=0;</p><p><b> led1=0;</b></p><p><b> led2=1;</b></p><p> for(i=0;i<6;i++)</p><p><b> s[i
130、]=10;</b></p><p><b> }</b></p><p> else if (key==13)</p><p><b> {</b></p><p> keyinput=0;</p><p> temdisplay=1;</p&g
131、t;<p><b> led1=1;</b></p><p><b> led2=0;</b></p><p><b> }</b></p><p> else if (key==14)</p><p><b> {</b><
132、/p><p> dualcomm=~dualcomm;</p><p> led3=~led3;</p><p><b> }</b></p><p><b> key=16;</b></p><p><b> }</b></p>&
133、lt;p> /********************************************************</p><p><b> 主函數(shù)</b></p><p> /********************************************************/</p><p> void
134、 main()</p><p><b> {</b></p><p><b> init();</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> keys
135、can();</p><p> keydeal();</p><p> if(keyinput==1)</p><p><b> {</b></p><p> display2();</p><p> if(dualcomm==1)</p><p><b&g
136、t; {</b></p><p> if(stateschange==1)</p><p><b> send();</b></p><p><b> }</b></p><p><b> }</b></p><p> if(te
137、mdisplay==1)</p><p><b> {</b></p><p><b> uchar a;</b></p><p> tmpchange();</p><p><b> gettmp();</b></p><p> for(a=
138、5;a>0;a--)</p><p> display();</p><p> if(dualcomm==1)</p><p><b> {</b></p><p><b> send();</b></p><p><b> }</b>&
139、lt;/p><p><b> }</b></p><p> } </p><p><b> }</b></p><p><b> 附件D 從機程序</b></p><p> #include<reg51.h>
140、</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> sbit dula=P2^6;//段選</p><p> sbit wela=P2^7;//位選</p><p>
141、 sbit led1=P1^1;//顯示鍵盤輸入數(shù)值指示燈</p><p> sbit led2=P1^2;//顯示溫度指示燈</p><p> sbit led3=P1^7;//顯示是否工作在省電模式</p><p> sbit key=P3^4; //獨立按鍵檢測</p>&
142、lt;p> bit recevflag=0;//判斷是否受到數(shù)據(jù)</p><p> uchar a; //存儲串口接收到的數(shù)據(jù)</p><p> uchar testbyte;//檢測字節(jié) 幀頭 用于判斷顯示的內(nèi)容 調(diào)用不同的顯示函數(shù)</p><p> uint m=0;//鍵盤
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計-多功能時鐘
- 單片機課程設(shè)計---多功能時鐘
- 單片機課程設(shè)計----多功能秒表
- 單片機課程設(shè)計---多功能時鐘設(shè)計
- 單片機課程設(shè)計---多功能時鐘設(shè)計
- 多功能數(shù)字時鐘 單片機課程設(shè)計
- 基于單片機的多功能秒表系統(tǒng)課程設(shè)計
- 基于單片機多功能秒表課程設(shè)計
- 單片機課程設(shè)計--單片機多功能測量儀的設(shè)計
- 單片機課程設(shè)計--基于單片機的多功能綜合應(yīng)用系統(tǒng)的設(shè)計
- 單片機課程設(shè)計---多功能密碼鎖
- 單片機課程設(shè)計--多功能電子時鐘
- 單片機數(shù)字時鐘課程設(shè)計--單片機多功能電子鐘設(shè)計
- 單片機課程設(shè)計---多功能電子時鐘設(shè)計
- 單片機課程設(shè)計-基于單片機的多功能電子鐘的設(shè)計
- 單片機課程設(shè)計--多功能數(shù)字電子鐘
- 單片機課程設(shè)計— 多功能數(shù)字電子鐘
- 單片機課程設(shè)計報告---多功能電子鐘
- 單片機課程設(shè)計報告---多功能計算器
- 基于單片機的多功能秒表的課程設(shè)計
評論
0/150
提交評論