版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘要</b></p><p> 本設(shè)計(jì)是應(yīng)用MCS-51單片機(jī)的原理和控制理論設(shè)計(jì)一個(gè)多功能系統(tǒng),功能包括矩陣鍵盤(pán)輸入,鍵盤(pán)內(nèi)容顯示,溫度傳感器操縱,溫度顯示,并實(shí)現(xiàn)雙機(jī)通信以顯示同樣的內(nèi)容。硬件系統(tǒng)包括單片機(jī)最小系統(tǒng),ISP下載模塊,矩陣鍵盤(pán),獨(dú)立鍵盤(pán),溫度傳感器模塊,數(shù)碼管,流水燈等。除了課設(shè)規(guī)定的要求外,還加入一些有趣的擴(kuò)展功能,如:利用led燈指示單片
2、機(jī)工作狀態(tài),從機(jī)普通模式、空閑模式可選,用于節(jié)電。通過(guò)設(shè)計(jì),加深對(duì)51單片機(jī)的理解,掌握實(shí)際的應(yīng)用,增強(qiáng)動(dòng)手能力。</p><p> 設(shè)計(jì)包括硬件設(shè)計(jì)、軟件編程,仿真,制作實(shí)物,撰寫(xiě)報(bào)告等步驟。</p><p> 關(guān)鍵詞: 51單片機(jī) 多功能系統(tǒng)設(shè)計(jì) 單片機(jī)編程</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> 一 項(xiàng)目要求與說(shuō)明4</p><p><b> 二 方案論證5</b></p><p> 三 硬件電路設(shè)計(jì)5</p><p> 1 MCU控制器簡(jiǎn)介5</p><p> 2 單片機(jī)最小系統(tǒng)6</p><p>
8、<b> 3 矩陣鍵盤(pán)6</b></p><p> 4 DS18B20溫度檢測(cè)電路7</p><p> 4.1 DS18B20溫度傳感器特性7</p><p> 4.2 DS18B20操作時(shí)序8</p><p> 5 數(shù)碼管顯示電路10</p><p><b> 6
9、 流水燈10</b></p><p> 7 串行口電路11</p><p><b> 四 軟件設(shè)計(jì)12</b></p><p> 1 系統(tǒng)軟件開(kāi)發(fā)工具12</p><p> 2 系統(tǒng)流程圖12</p><p> 2.1 主機(jī)程序流程圖12</p>&
10、lt;p> 2.2 從機(jī)程序流程圖13</p><p><b> 3 軟件編程13</b></p><p> 4 軟件實(shí)現(xiàn)功能說(shuō)明14</p><p> 4.1 主機(jī)矩陣鍵盤(pán)功能14</p><p> 4.2 從機(jī)獨(dú)立鍵盤(pán)功能14</p><p><b> 五
11、 仿真分析15</b></p><p> 1 數(shù)據(jù)輸入與顯示功能仿真15</p><p> 2 溫度檢測(cè)與顯示功能仿真16</p><p> 3 數(shù)據(jù)通信功能16</p><p><b> 六 心得體會(huì)17</b></p><p><b> 參考文獻(xiàn)18
12、</b></p><p> 附件A 單片機(jī)系統(tǒng)原理圖19</p><p> 附件B 單片機(jī)系統(tǒng)實(shí)物20</p><p> 附件C 主機(jī)程序21</p><p> 附件D 從機(jī)程序32</p><p><b> 一 項(xiàng)目要求與說(shuō)明</b></p><
13、p> 1)完成包含如下系統(tǒng)功能組件的單片機(jī)最小系統(tǒng)的設(shè)計(jì)、焊接、調(diào)試</p><p><b> (1)鍵盤(pán)</b></p><p> 一個(gè)4X4的矩陣鍵盤(pán),其中,10個(gè)按鍵是0~9數(shù)字鍵;另外6個(gè)是功能鍵,用于功能選擇和控制。</p><p><b> (2)顯示電路</b></p><p
14、> 由6個(gè)7段LED數(shù)碼管組成的顯示電路。</p><p><b> (3)溫度檢測(cè)</b></p><p> 利用DS18B20可編程1-Wire數(shù)字溫度傳感器芯片,或利用AD590溫度傳感器芯片和A/D轉(zhuǎn)換器芯片采集溫度溫度信號(hào)。</p><p> (4)串口串行通信</p><p> 利用51的串
15、口實(shí)現(xiàn)串行通信接口電路。</p><p> 2)完成ISP下載電路的設(shè)計(jì)、焊接</p><p> 3)完成系統(tǒng)軟件的設(shè)計(jì),包括程序結(jié)構(gòu)設(shè)計(jì)、流程圖繪制、程序設(shè)計(jì),實(shí)現(xiàn)如下功能</p><p><b> ?。?)功能選擇</b></p><p> 通過(guò)功能選擇鍵,使得單片機(jī)處于不同工作狀態(tài)并通過(guò)LED顯示相應(yīng)內(nèi)容。&
16、lt;/p><p><b> ?。?)溫度顯示</b></p><p> 通過(guò)功能選擇鍵選擇溫度檢測(cè)、顯示后,LED顯示溫度值。</p><p><b> ?。?)數(shù)據(jù)輸入</b></p><p> 通過(guò)功能選擇鍵選擇數(shù)據(jù)輸入后,將通過(guò)鍵盤(pán)鍵入的0~9按鍵值顯示在LED上,其中,最后輸入的顯示在最左
17、邊,之前鍵入向右移動(dòng)一位。</p><p><b> (4)數(shù)據(jù)通信</b></p><p> 將兩個(gè)單片機(jī)最小系統(tǒng)通過(guò)串口連接起來(lái),其中一個(gè)作為主系統(tǒng),另一個(gè)作為輔系統(tǒng)。當(dāng)通過(guò)功能選擇鍵選擇數(shù)據(jù)通信后,當(dāng)在主系統(tǒng)上進(jìn)行功能(2)、功能(3)的操作時(shí),輔系統(tǒng)的LED上顯示與主系統(tǒng)同樣的內(nèi)容。</p><p> 4)利用仿真軟件完成系統(tǒng)仿真
18、工作</p><p> 5)在單片機(jī)最小系統(tǒng)硬件上實(shí)現(xiàn)任務(wù)3中規(guī)定的功能</p><p><b> 二 方案論證</b></p><p> 溫度檢測(cè)模塊方案選擇:</p><p> 方案一、采用AD590設(shè)計(jì)溫度檢測(cè)模塊,由于需要添加AD轉(zhuǎn)換電路、放大電路,電路設(shè)計(jì)比較繁瑣,成本較高。</p>&l
19、t;p> 方案二、采用Dallas公司生產(chǎn)的DS18B20作為測(cè)溫模塊,DS18B20芯片內(nèi)部自帶AD轉(zhuǎn)換電路,使用方便。它采用單總線協(xié)議傳輸技術(shù),只需占用單片機(jī)一個(gè)IO口,電路容易設(shè)計(jì),編程比較簡(jiǎn)單。溫度的分辨率可以選擇9到12位的分辨率。</p><p> 綜上所述,溫度檢測(cè)模塊選擇方案二。</p><p><b> 三 硬件電路設(shè)計(jì)</b></
20、p><p> 1 MCU控制器簡(jiǎn)介</p><p> STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門(mén)狗
21、定時(shí)器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,2個(gè)16 位 定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。最高運(yùn)作頻率35MHz,6T/12T可選。<
22、/p><p> 2 單片機(jī)最小系統(tǒng)</p><p> 單片機(jī)最小系統(tǒng)包括振蕩器電路,復(fù)位電路,單片機(jī)EA端接高電平(Vcc),P0口需要接上拉電阻(10K)。振蕩器電路選用12MHz晶振,兩個(gè)30pf電容,振蕩器電路接單片機(jī)XTAL1和XTAL2引腳。</p><p> 單片機(jī)最小系統(tǒng)原理圖如下。</p><p> 圖1 單片機(jī)最小系統(tǒng)
23、</p><p><b> 3 矩陣鍵盤(pán)</b></p><p> 矩陣鍵盤(pán)檢測(cè)的原理和方法:矩陣鍵盤(pán)每個(gè)按鍵兩端都與單片機(jī)I/O口相連,因此在檢測(cè)時(shí)需人為通過(guò)單片機(jī)I/O口送出低電平。檢測(cè)時(shí),先送一列為低電平,其余幾列全為高電平(此時(shí)確定了列數(shù)),然后立即輪流檢測(cè)一次各行是否有低電平,若檢測(cè)到某一行為低電平(這是有確定了行數(shù)),則便可以確認(rèn)當(dāng)前被按下的鍵是哪一列
24、哪一行,用同樣方法輪流送各列一次低電平,再輪流檢測(cè)一次各行是否變?yōu)榈碗娖?,這樣既可檢測(cè)完所有的按鍵,當(dāng)有鍵按下時(shí)便可判斷出按下的是哪一個(gè)鍵。</p><p> 此外還需要消除按鍵在閉合或斷開(kāi)時(shí)的抖動(dòng)。消抖的方法可采用消抖電路(RS觸發(fā)器時(shí)鎖電路硬件消除抖動(dòng)),也可采用延時(shí)方式軟件消除抖動(dòng)(延時(shí)后再重讀,以跳過(guò)抖動(dòng)期),本設(shè)計(jì)采用軟件消抖方式。</p><p> 矩陣鍵盤(pán)原理圖如下。&l
25、t;/p><p><b> 圖2 矩陣鍵盤(pán)</b></p><p> 4 DS18B20溫度檢測(cè)電路</p><p> 4.1 DS18B20溫度傳感器特性</p><p> 適應(yīng)電壓范圍寬,電壓范圍在3.0~5.5V,在寄生電源方式下可有數(shù)據(jù)線供電。</p><p> 獨(dú)特的單線接口方式,
26、它與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通信。</p><p> 支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)在唯一的三線上,實(shí)現(xiàn)組網(wǎng)多點(diǎn)測(cè)溫。</p><p> 在使用中不需要任何外圍元件,全部傳感器及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi)。</p><p> 測(cè)溫范圍-55℃~+125℃,在-10℃~+85℃時(shí)精度為
27、7;0.5℃。</p><p> 可編程分辨率為9~12位,對(duì)應(yīng)的可分辨率溫度分別為0.5℃,0.25℃,0.125℃和0.0625℃,可實(shí)現(xiàn)高精度測(cè)溫。</p><p> 4.2 DS18B20操作時(shí)序</p><p> 4.2.1 初始化操作時(shí)序</p><p> 圖3 ds18b20初始化時(shí)序</p><p&
28、gt; 4.2.2 讀取時(shí)序</p><p> 圖4 ds18b20讀數(shù)據(jù)時(shí)序</p><p> 4.2.3 寫(xiě)入時(shí)序</p><p> 圖5 ds18b2寫(xiě)數(shù)據(jù)時(shí)序</p><p> 4.2.4 DS18B20實(shí)物</p><p><b> 如圖所示。</b></p>
29、<p> 圖6 ds18b20實(shí)物</p><p> 4.2.5 DS18B20電路連接</p><p> 如下圖所示。其DQ端接單片機(jī)的P2.2端。</p><p> 圖7 ds18b20連接</p><p><b> 5 數(shù)碼管顯示電路</b></p><p> 數(shù)
30、碼管的顯示原理是靠點(diǎn)亮內(nèi)部的發(fā)光二極管來(lái)發(fā)光。本次設(shè)計(jì)中使用的是7端共陰極數(shù)碼管,數(shù)碼管的陽(yáng)極,即標(biāo)有a,b,c,d,e,f,g,h的引腳全部連在一起,與下面的U2元件(74HC573)鎖存器的數(shù)據(jù)輸出端相連,U2的數(shù)據(jù)輸入端連單片機(jī)P0口。數(shù)碼管中WE1,WE2,WE3,WE4,WE5,WE6是他們的位選端,每個(gè)數(shù)碼管對(duì)應(yīng)一個(gè)位選端,與U3元件(74HC573)數(shù)據(jù)出端低6位相連,U3的數(shù)據(jù)輸入端連單片機(jī)P0口。兩個(gè)鎖存器的鎖存端分別
31、與單片機(jī)P2.6和P2.7相連。這樣用單片機(jī)可以控制鎖存器的鎖存端,進(jìn)而控制鎖存器的數(shù)據(jù)輸出,這種分時(shí)控制的方法便可方便地控制任意數(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)鎖存器的輸出端,陽(yáng)極接一個(gè)排阻。U5的鎖存端接單片機(jī)的P2.5口,這樣就可以通過(guò)單片機(jī)對(duì)這組發(fā)光二極管的亮滅進(jìn)行控制。</p><p><b> 圖9 流水燈模塊</b></p><p><b> 7 串行口電路</b></p>
33、;<p> 單片機(jī)使用的是TTL電平,而計(jì)算機(jī)使用的是RS-232電平,要實(shí)現(xiàn)把電腦中的程序能下載到單片機(jī)上,就需要實(shí)現(xiàn)RS-232電平與TTL電平之間的轉(zhuǎn)換。實(shí)現(xiàn)這一功能的芯片有很多,本次課設(shè)所使用的芯片為MAX232及電容元件構(gòu)成RS232電平與TTL電平轉(zhuǎn)換的串行口電路。</p><p> 本次課設(shè)要完成雙機(jī)通信功能,需要兩個(gè)單片機(jī)系統(tǒng),一個(gè)單片機(jī)作為主機(jī),一個(gè)作為從機(jī)??梢允褂靡桓诰€
34、連接兩個(gè)單片機(jī)的串口即可完成課設(shè)要求的數(shù)據(jù)通信功能。串行口電路如下圖所示。</p><p><b> 圖10 串口模塊</b></p><p><b> 四 軟件設(shè)計(jì)</b></p><p> 1 系統(tǒng)軟件開(kāi)發(fā)工具</p><p> 系統(tǒng)軟件開(kāi)發(fā)工具采用C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng)Keil uVisi
35、on3。</p><p><b> 2 系統(tǒng)流程圖</b></p><p> 2.1 主機(jī)程序流程圖</p><p> 圖11 主機(jī)程序流程圖</p><p> 2.2 從機(jī)程序流程圖</p><p> 圖12 從機(jī)程序流程圖</p><p><b>
36、 3 軟件編程</b></p><p><b> 見(jiàn)附錄</b></p><p> 4 軟件實(shí)現(xiàn)功能說(shuō)明</p><p> 4.1 主機(jī)矩陣鍵盤(pán)功能</p><p> 圖13 主機(jī)鍵盤(pán)功能</p><p><b> 0~9:數(shù)字輸入。</b></p
37、><p> F1:矩陣鍵盤(pán)輸入功能選擇。</p><p> F2:溫度顯示功能選擇。</p><p> F3:雙機(jī)通信功能開(kāi)關(guān)。</p><p> 按下F1,進(jìn)行數(shù)字輸入(0~9),顯示在數(shù)碼管上。按下F2,可顯示溫度,按下F3可以開(kāi)關(guān)雙機(jī)通信功能。</p><p> 4.2 從機(jī)獨(dú)立鍵盤(pán)功能</p>
38、<p> 圖14 從機(jī)獨(dú)立鍵盤(pán)功能</p><p> Key:空閑模式/正常模式功能切換。</p><p> 選擇空閑模式時(shí),LED燈會(huì)亮起,提示工作在空閑模式。當(dāng)從機(jī)CPU檢測(cè)到在一段時(shí)間內(nèi)主機(jī)沒(méi)有發(fā)送數(shù)據(jù)給從機(jī)時(shí),從機(jī)CPU停止工作,此時(shí)可由中斷喚醒,當(dāng)主機(jī)再次給從機(jī)發(fā)送數(shù)據(jù)時(shí),從機(jī)正常工作。</p><p><b> 五 仿真分
39、析</b></p><p> Proteus是世界上著名的EDA工具(仿真軟件),它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051。在編譯方面,它支持IAR、Keil和MP
40、LAB等多種編譯器。</p><p> 1 數(shù)據(jù)輸入與顯示功能仿真</p><p> 按下矩陣鍵盤(pán)第四排第一個(gè)鍵,再順序按下440099,得到結(jié)果如圖。</p><p> 圖15 鍵盤(pán)輸入顯示仿真</p><p> 2 溫度檢測(cè)與顯示功能仿真</p><p> 按下矩陣鍵盤(pán)第四排第二個(gè)鍵,則顯示溫度如圖為9攝
41、氏度。</p><p> 圖16 溫度顯示仿真</p><p><b> 3 數(shù)據(jù)通信功能</b></p><p> 在數(shù)據(jù)輸入模式下再按下矩陣鍵盤(pán)第四排第三個(gè)鍵,則左邊從機(jī)顯示與主機(jī)相同的內(nèi)容。</p><p> 圖17 雙機(jī)通信功能仿真</p><p> 在溫度顯示模式下再按下矩陣鍵
42、盤(pán)第四排第三個(gè)鍵,則左邊從機(jī)顯示與主機(jī)相同的內(nèi)容。</p><p> 圖18 雙機(jī)通信功能仿真1</p><p><b> 六 心得體會(huì)</b></p><p> 在為期十天的單片機(jī)實(shí)習(xí)中,除了對(duì)51單片機(jī)的基礎(chǔ)知識(shí)有了深刻的理解,還增強(qiáng)了動(dòng)手的能力,硬件設(shè)計(jì),軟件設(shè)計(jì),包括報(bào)告的撰寫(xiě),每個(gè)步驟都讓我受益頗深,。</p>&
43、lt;p> 在此次設(shè)計(jì)中,我的系統(tǒng)采用了被廣泛使用的單片機(jī)STC89C52為主控芯片,配合DS18B20溫度傳感器,LED數(shù)碼管,鍵盤(pán)電路所設(shè)計(jì)的一個(gè)多功能系統(tǒng)。在報(bào)告中介紹了DS18B20的操作方法,介紹了鍵盤(pán)電路基本原理、特性及編程方法。對(duì)單片機(jī)軟硬件資源和接口擴(kuò)展也有部分的介紹和應(yīng)用。在系統(tǒng)仿真中對(duì)各功能都實(shí)現(xiàn)了仿真。</p><p> 這次課程設(shè)計(jì)使我得到了很多收獲,我不僅學(xué)到了許多了關(guān)于單片機(jī)
44、方面的知識(shí),熟悉了與單片機(jī)相關(guān)的兩款軟件Keil和Proteus,提高了實(shí)驗(yàn)技能;而且也使我的動(dòng)手能力和電路設(shè)計(jì)能力得到了極大的提高。在此次設(shè)計(jì)中,我認(rèn)為比較麻煩的是編程,本次設(shè)計(jì)使用的是C語(yǔ)言,七百行的程序?qū)懥私惶?,之后陸續(xù)地修修改改、添加新功能,過(guò)程很艱難,結(jié)果是令人欣慰的。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 李群芳. 單
45、片微型計(jì)算機(jī)與接口技術(shù)(第4版) 電子工業(yè)出版社</p><p> [2] 郭天祥 新概念51單片機(jī)C語(yǔ)言教程 電子工業(yè)出版社</p><p> [3] 謝自美.電子線路設(shè)計(jì)·實(shí)驗(yàn)·測(cè)試(第三版) 華中科技大學(xué)出版社</p><p> [4] Dallas 公司 DS18B20數(shù)據(jù)手冊(cè)
46、 Dallas公司</p><p> [5] 劉教瑜. 單片機(jī)原理及應(yīng)用 武漢理工大學(xué)出版社</p><p> [6]黃智偉. 全國(guó)大學(xué)生電子競(jìng)賽常用電路模塊制作 北京航空航天大學(xué)出版社</p><p> [7]王永生. 電子測(cè)量學(xué) 西北工業(yè)大學(xué)出版社<
47、/p><p> 附件A 單片機(jī)系統(tǒng)原理圖</p><p> 圖19 單片機(jī)系統(tǒng)原理圖</p><p> 附件B 單片機(jī)系統(tǒng)實(shí)物</p><p><b> 附件C 主機(jī)程序</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;//鍵盤(pán)輸入功能指
49、示燈</p><p> sbit led2=P1^2;//溫度顯示指示燈</p><p> sbit led3=P1^3;//雙機(jī)通信指示燈</p><p> sbit DS=P2^2;//DS18B20數(shù)據(jù)端</p><p> uchar temp1;//用于鍵盤(pán)讀取</p>
50、<p> uint key; //存儲(chǔ)按鍵值 </p><p> uchar A1,A2,A2t,A3;//三位溫度值</p><p> bit stateschange=0;//判別鍵盤(pán)輸入現(xiàn)實(shí)的值是否發(fā)生變化,控制發(fā)送程序</p><p> bit keyinput=0; //判別鍵盤(pán)輸入 作為調(diào)用鍵
51、盤(pán)顯示函數(shù)的依據(jù)</p><p> bit temdisplay=0; //判別溫度顯示 作為調(diào)用溫度顯示函數(shù)的依據(jù)</p><p> bit dualcomm=0; //判別是否進(jìn)行雙機(jī)通信</p><p> uchar s[6]; //鍵盤(pán)控制的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}; //無(wú)小數(shù)點(diǎn)</p><p> uchar code table1[]={0xbf,0x86,0xdb,0
53、xcf,</p><p> 0xe6,0xed,0xfd,0x87,</p><p> 0xff,0xef}; //帶小數(shù)點(diǎn)</p><p> uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位選</p><p> /***********
54、*********************************************</p><p><b> 延時(shí)函數(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++延時(shí)</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) //寫(xiě)一個(gè)字節(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) //寫(xiě)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; //寫(xiě)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 啟動(dòng)轉(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é)組成一個(gè)整型變量</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];//顯示個(gè)位</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án)</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> 鍵盤(pán)掃描函數(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 從機(jī)程序</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;//顯示鍵盤(pán)輸入數(shù)值指示燈</p><p> sbit led2=P1^2;//顯示溫度指示燈</p><p> sbit led3=P1^7;//顯示是否工作在省電模式</p><p> sbit key=P3^4; //獨(dú)立按鍵檢測(cè)</p>&
142、lt;p> bit recevflag=0;//判斷是否受到數(shù)據(jù)</p><p> uchar a; //存儲(chǔ)串口接收到的數(shù)據(jù)</p><p> uchar testbyte;//檢測(cè)字節(jié) 幀頭 用于判斷顯示的內(nèi)容 調(diào)用不同的顯示函數(shù)</p><p> uint m=0;//鍵盤(pán)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ī)課程設(shè)計(jì)-多功能時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)---多功能時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)----多功能秒表
- 單片機(jī)課程設(shè)計(jì)---多功能時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---多功能時(shí)鐘設(shè)計(jì)
- 多功能數(shù)字時(shí)鐘 單片機(jī)課程設(shè)計(jì)
- 基于單片機(jī)的多功能秒表系統(tǒng)課程設(shè)計(jì)
- 基于單片機(jī)多功能秒表課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)多功能測(cè)量?jī)x的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的多功能綜合應(yīng)用系統(tǒng)的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---多功能密碼鎖
- 單片機(jī)課程設(shè)計(jì)--多功能電子時(shí)鐘
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)--單片機(jī)多功能電子鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---多功能電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-基于單片機(jī)的多功能電子鐘的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--多功能數(shù)字電子鐘
- 單片機(jī)課程設(shè)計(jì)— 多功能數(shù)字電子鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告---多功能電子鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告---多功能計(jì)算器
- 基于單片機(jī)的多功能秒表的課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論