簡易萬年歷的畢業(yè)設計_第1頁
簡易萬年歷的畢業(yè)設計_第2頁
簡易萬年歷的畢業(yè)設計_第3頁
簡易萬年歷的畢業(yè)設計_第4頁
簡易萬年歷的畢業(yè)設計_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1 / 44師學院師學院 簡易萬年歷的設計系 別:物理與電子信息工程系 專 業(yè):電子信息科學與技術2013 年 6 月 目錄目錄1. 設計任務 51.1 設計任務 51.2 設計要求 62.設計方案 62 / 442.1 設計思路 62.2 方案比較與論證 62.2.1 數碼管顯示模塊 62.2.2 溫度傳感器的選擇 62.2.3 時鐘計時的選擇 72.3 系統(tǒng)結構框圖 73.各功能模塊設計 83.1 顯示模塊原理 83.2 參數計算 93.3 獨立式按鍵模塊 93.4 時鐘模塊 103.4.1 DS1302 特性介紹 103.4.2 DS1302 引腳介紹 103.4.3 DS1302 有關

2、日歷、時間的寄存器 103.4.4 DS1302 控制字介紹 113.4.5 DS1302 單字節(jié)讀寫時序介紹 113.4.6 DS1302 操作指令介紹 123.4.7 DS1302 與單片機接口電路 133.5 溫測模塊 133.5.1 單總線介紹 133.5.2 DS18B20 特性介紹 133.5.3 DS18B20 管腳介紹 143.5.4 DS18B20 部結構 143.5.5 DS18B20 溫度轉化示例 143.5.6 DS18B20 時序介紹 153.5.7 DS18B20 操作步驟 163.5.8 DS18B20 與單片機的接口電路 173.6 總系統(tǒng)原理圖 174.軟件設

3、計 184.1 I/O 口分配 184.2 按鍵掃描 185.流程圖 195.1 主程序流程圖 195.2 WORK0 模塊流程圖 195.3 WORK1 模塊流程圖 205.4 WORK2 模塊流程圖 205.5 獲取溫度子程序流程圖 215.6 按鍵掃描 225.7 中斷服務子程序 223 / 445.8 顯示方式 1225.9 初始化 DS1302 子程序流圖 235.10 溫顯模塊子程序流圖 245.11 讀取時間模塊子程序流圖 246.程序代碼 256.1 主程序部分 256.2 包含文件部分 336.3 包含文件部分 357.調試要點 437.1 硬件調試 437.2 軟件調試 4

4、37.3 結果分析與設計工作總結 438.參考文獻與附件 438.1 參考文獻 438.2 元器件清單 448.3 PCB 版圖 448.4 實物圖 正面 458.5 實物圖 背面 45摘要摘要:單片機就是微控制器,是面向應用對象設計、突出控制功能的芯片。單片機接上晶振、復位電路和相應的接口電路,裝載軟件后就可以構成單片機應用系統(tǒng)。將它嵌入到形形色色的應用系統(tǒng)中,就構成了眾多產品、設備的智能化核心。本設計就是應用單片機強大的控制功能制作而成的電子萬年歷,該電子萬年歷包括兩大功能:可顯示年、月、日、時、分;實時監(jiān)測環(huán)境溫度(具有超低溫的報警功能,且報警的上下限值可由用戶自定義設置),。關鍵字關鍵

5、字:單片機,DS18B20,DS1302,共陽數碼管.4 / 441.1. 設計任務設計任務1.11.1 設計任務設計任務 利用單片機、時鐘芯片 DS1302、溫度傳感器 DS18B20、數碼管等 實現日期、時間、溫度的顯示,即一個簡單的萬年歷。1.21.2 設計要求設計要求1. 通過 DS1302 計時,時間可調并在數碼管上顯示出來。2. 通過 DS18B20 檢測當前環(huán)境溫度,精讀為 0.5。3. 具有超溫報警功能2.設計方案2.12.1 設計思路設計思路本設計由 DS18B20 作為溫度檢測的核心,檢測一次當前溫度所耗費的時間大約在 100ms750ms 之間,隨著檢測精度的增加,耗費時

6、間在方位逐漸增加,所以利用軟件延時的方法來實現溫檢,并且具有超溫和低溫的報警功能,其溫度報警的上下限值可根據用戶喜好進行更改;時鐘部分使用專用計時芯片 DS1302,可精確顯示年、月、日、時、分、秒;2.22.2 方案比較與論證方案比較與論證2.2.12.2.1數碼管顯示模塊數碼管顯示模塊方案一:單片機輸出數據經譯碼芯片 CD4511 進行譯碼后直接驅動數碼管,數碼管公共端接 9012 三極管擴流,并通過單片機 I/O 口控制三極管的選通,實現動態(tài)顯示。方案二:有單片機的 I/O 口直接驅動數碼管的段碼,數碼管的公共端接 9012 三極管,通過灌電流的方式點亮數碼管,也需通過單片機 I/O 口

7、控制三極管的選通,實現動態(tài)顯示。由于所需 I/O 口由 AT98S52 可直接提供,無須因為 I/O 口不夠而用 CD4511 來節(jié)省I/O 口,方案二又較方案一更容易實惠,所以,我選擇方案二。2.2.22.2.2溫度傳感器的選擇溫度傳感器的選擇 方案一:采用熱敏電阻作為檢測溫度的核心元件,由于熱敏電阻會隨溫度變化而變化,進而其阻值發(fā)生變化,再經 555 振蕩器變化的脈沖5 / 44數傳遞給單片機進行處理。 方案二:采用數字式的集成溫度傳感器 DS18B20 作為溫度檢測的核心元件,由其檢測并直接輸出數字溫度信號給單片機進行處理。 對于方案一,采用熱敏電阻作為溫度檢測元件,有價格便宜,元件易購

8、的優(yōu)點,但熱敏電阻對溫度的細微變化不太敏感,并且由于熱敏電阻的 R-T 關系的非線性,其自身電阻對溫度的變化存在較大誤差,而且在人體所處環(huán)境溫度變化過程中難以檢測到小的溫度變化。但作為本次設計雖已能滿足基本要求,但為了更深入的學習,所以放棄該方案。 對于方案二,由于數字式集成溫度傳感器 DS18B20 的高度集成化,大大降低了外接放大轉化等電路的誤差因數,溫度誤差變得很小,并且由于其檢測溫度的原理與熱敏電阻檢測的原理有著本質的不同,使得其溫度分辨力極高。溫度值在器件部轉化成數字量直接輸出,簡化了系統(tǒng)程序設計,又由于該溫度傳感器采用先進的單總線技術,與單片機的接口變得非常簡潔,抗干擾能力強,雖然

9、芯片原理復雜,但是可以對時序的理解更深入一步,所以選擇此方案。2.2.32.2.3時鐘計時的選擇時鐘計時的選擇 方案一:AT89S52 單片機部帶有定時/計數功能,此定時功能是通過對外部晶振的脈沖進行計數,從而達到計時功能,只要使用 11.0592 的晶振就能實現零誤差的計時,因此可以利用此功能實現計時,但因為只有單一的計時功能要實現“萬年歷”的功能需要較復雜的程序,而且如果單片機掉電無法繼續(xù)進行計時,所以使用不便。方案二:DS1302 是美國 DALLAS 公司推出的一種高性能、低功耗的實時時鐘芯片,附加 31 字節(jié)靜態(tài) RAM,采用 SPI 三線接口與 CPU 進行通信,并可采用突發(fā)方式一

10、次傳送多個字節(jié)的時鐘信號和 RAM 數據。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與 31 天時可以自動調整,且具有閏年補償功能。工作電壓寬達 2.55.5V。采用雙電源供電(主電源和備用電源) ,可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。利用單片機強大的控制功能就可實現實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。綜合上述兩種方案,宜采用方案二實現實時計時功能。2.32.3 系統(tǒng)結構框圖系統(tǒng)結構框圖 AT89S52 單片機在模式鍵、設置鍵的控制下,由 P0 口輸出數據,通 過 P2.0 、P2.1、P2.2、P2.3 進行選通,用數碼管顯示信息。 系統(tǒng)框圖

11、:AT89S52鍵盤18B20DS1302晶振數碼管蜂鳴器LED電源6 / 44圖 2-3 系統(tǒng)總框圖3.3.各功能模塊設計各功能模塊設計3.13.1 顯示模塊顯示模塊原理原理 由單片機(AT89S52)的引腳 P0 口輸出溫度、時間等數據信息,通過片選信號 P2.0 、P2.1、P2.2、P2.3 就可在相應的數碼管進行顯示。當位選信號 P2.0 為低電平時,P1 口送出數據也為低電平就點亮數碼管,電流灌進單片機。多位 LED 顯示,為了簡化電路,降低成本,將所有位的段選線并聯在一起,由一個 8 位 I/O 口控制。而共陽極公共端分別接一個 9012,由相應的 I/O 口線控制 9012,實

12、現各位數碼管的分時選通。段選碼,位選碼每送入一次后延時 5MS,因人的視覺暫留時間為0.1S(100MS) ,所以每位顯示的時間不能超過 20MS,并保持延時一段時間,以造成視覺暫留效果,給人看上去每個數碼管總在亮。電路如(圖3-1)所示。 由于采用的是共陽極數碼管,所以要讓段碼點亮需把 I/O 口置 0,例如:段碼 a 到 h 對應的 I/O 口是 P0.0 到 P0.7,則要讓數碼管顯示 0到 9 對應的 16 進值如圖 3-2 所示Q 090 12Q 190 12Q 290 12Q 390 12abR 047 0R 147 0R 247 0R 347 0R 447 0R 547 0R 6

13、47 0R 747 0V CCV CCV CCV CCR 84K 7R 94K 7R 104K 7R 114K 7P 00P 01P 02P 03P 04P 05P 06P 07cdefghabcdefghabcdefghabcdefghC S0C S1C S2C S3位位位位位位abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u1SM 4 11 00 6abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u2SM 4 11 00 6abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u3SM 4 11 00 6abf

14、cgdedpa7b6c4d2e1f9g10dp5com3com8sh u4SM 4 11 00 6abcdefgh圖 3-1 顯示電路hgfedcba16 進制0110000000XC0H7 / 44圖 3-2 碼表3.23.2 參數計算參數計算 由于 I/O 口高電平約等于 5V,使用灌電流的方式驅動數碼管,故選用 PNP 型三極管 9012;數碼管能正常工作的段電流為 3mA-10 mA,壓降為 1.7V,三極管發(fā)射極和集電極的壓降為 0.3V,因此限流電阻的壓 降為 3.0V, 所以選用限流電阻的阻值 R=470 歐.3.33.3 獨立式按鍵模塊獨立式按鍵模塊 獨立式按鍵是直接用 I/O

15、 口線構成的單個按鍵電路,其特點是每個按鍵單獨占用一根 I/O 口線,每個按鍵的工作不會影響其它 I/O 口線的狀態(tài)。獨立式按鍵的典型應用如(圖 3-3)所示。 獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一根 I/O 口線,因此,在按鍵較多時,I/O 口線浪費較大,但本設計只用到四個按鍵,顧采用獨立式按鍵電路。圖 3-3 獨立式按鍵電路3.43.4 時鐘模塊時鐘模塊DS1302 通過三根口線實現與單片機的通信,因 DS1302 功耗很小,即使電源掉電后通過 3V 的紐扣電池仍能維持 DS1302 精確走時。1111110010XF9H2101001000XA4H310110000

16、0XB0H4100110010X99H5100100100X92H6100000100X82H7111110000XF8H8100000000X80H9100100000X90Hc110001100XC6H-101111110XBFHL110001110XC7HH100010010X89H500105mAVR8 / 443.4.13.4.1DS1302DS1302 特性介紹特性介紹 DS1302 是美國 DALLAS 公司推出的一種高性能、低功耗的實時時鐘芯片,附加 31 字節(jié)靜態(tài) RAM,采用 SPI 三線接口與 CPU 進行通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和 RAM 數據。

17、實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與 31 天時可以自動調整,且具有閏年補償功能。工作電壓寬達 2.55.5V。采用雙電源供電(主電源和備用電源) ,可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。3.4.23.4.2DS1302DS1302 引腳介紹引腳介紹 各引腳的功能為:1 1、Vcc2:5V 電源。當 Vcc2Vcc1+0.2V 時,由 Vcc2 向 DS1302 供電, 當 Vcc2 Vcc1 時,由 Vcc1 向 DS1302 供電。2 2 和和 3 3、X1、X2 是外接晶振腳 (32.768KHZ 的晶振)4 4、地(GND)5 5、CE/RS

18、T:復位腳 6 6、I/O:數據輸入輸出口;7 7、SCLK:串行時鐘,輸入; 8 8、Vcc1:備用電池端;3.4.33.4.3DS1302DS1302 有關日歷、時間的寄存器有關日歷、時間的寄存器寄存器的說明如下:1、秒寄存器(81h、80h)的位 7 定義為時鐘暫停標志(CH) 。當初始上電時該位置為 1,時鐘振蕩器停止,DS1302 處于低功耗狀態(tài);只有將秒寄存器的該位置改寫為 0 時,時鐘才能開始運行。2、小時寄存器(85h、84h)的位 7 用于定義 DS1302 是運行于 12 小時模式還是 24 小時模式。當為高時,選擇 12 小時模式。在 12 小時模式時,位 5 是 ,當為

19、 1 時,表示 PM。在 24 小時模式時,位 5 是第二個 10小時位3、控制寄存器(8Fh、8Eh)的位 7 是寫保護位(WP) ,其它 7 位均置為0。在對任何的時鐘和 RAM 的寫操作之前,WP 位必須為 0。當 WP9 / 44位為 1 時,寫保護位防止對任一寄存器的寫操作。也就是說在電路上電的初始態(tài) WP 是 1,這時是不能改寫上面任何一個時間寄存器的,只有首先將 WP 改寫為 0,才能進行其它寄存器的寫操作。 3.4.43.4.4DS1302DS1302 控制字介紹控制字介紹位位 7 7:必須是邏輯 1,如果它為 0,則不能把數據寫入到 DS1302 中。位位 6 6:如果為 0

20、,則表示存取日歷時鐘數據,為 1 表示存取 RAM 數據;位位 5 5 至位至位 1 1(A4A4A0A0):):指示操作單元的地址;位位 0 0(最低有效位):(最低有效位):為 0,表示要進行寫操作,為 1 表示進行讀操作。讀數據:讀數據: 讀數據時在緊跟 8 位的控制字指令后的下一個 SCLK 脈沖的下降沿,讀出 DS1302 的數據,讀出的數據是從最低位到最高位。寫數據:寫數據:控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK 時鐘的上升沿時,數據被寫入 DS1302,數據輸入也是從最低位(0 位)開始。位 0(最低有效位):為 1 表示進行讀操作。 如為0,表示要進行寫

21、操作,控制字后 SCLK 下降沿 讀數據 SCLK 上升沿寫數據。3.4.53.4.5DS1302DS1302 單字節(jié)讀寫時序介紹單字節(jié)讀寫時序介紹10 / 44 DS1302 的數據讀寫是通過 I/O 串行進行的。當進行一次讀寫操作時最少得讀寫兩個字節(jié),第一個字節(jié)是控制字節(jié),就是一個命令,告訴DS1302 是讀還是寫操作,是對 RAM 還是對 CLOK 寄存器操作,以與操作的址。第二個字節(jié)就是要讀或寫的數據了。 單字節(jié)寫:在進行操作之前先得將 CE(也可說是 RST)置高電平,然后單片機將控制字的位 0 放到 I/O 上,當 I/O 的數據穩(wěn)定后,將 SCLK置高電平,DS1302 檢測到

22、SCLK 的上升沿后就將 I/O 上的數據讀取,然后單片機將 SCLK 置為低電平,再將控制字的位 1 放到 I/O 上,如此反復,將一個字節(jié)控制字的 8 個位傳給 DS1302。接下來就是傳一個字節(jié)的數據給 DS1302,當傳完數據后,單片機將 CE 置為低電平,操作結束。 單字節(jié)讀操作的一開始寫控制字的過程和上面的單字節(jié)寫操作是一樣,但是單字節(jié)讀操作在寫控制字的最后一個位,SCLK 還在高電平時,DS1302 就將數據放到 I/O 上,單片機將 SCLK 置為低電平后數據鎖存, 單機機就可以讀取 I/O 上的數據。如此反復,將一個字節(jié)的數據讀入單片機。 讀與寫操作的不同就在于,寫操作是在

23、SCLK 低電平時單片機將數據放到 IO 上,當 SCLK 上升沿時,DS1302 讀取。而讀操作是在 SCLK 高電平時 DS1302 放數據到 IO 上,將 SCLK 置為低電平后,單片機就可從 IO上讀取數據。3.4.63.4.6DS1302DS1302 操作指令介紹操作指令介紹操作說明:操作說明:1 首先要通過 8EH 將寫保護去掉,將日期,時間的初值寫時各個寄器。 2 然后就可以對 80H、82H、84H、86H、88H、8AH、8CH 進行初值的寫入。同時也通過秒寄存器將位 7 的 CH 值改成 0,這樣 DS1302 就開始走時了。3 將寫保護寄存器再寫為 80H,防止誤改寫寄存

24、器的值。 4 不斷讀取 80H8CH 的值,將它們格式化后顯示到數碼管上11 / 443.4.73.4.7DS1302DS1302 與單片機接口電路與單片機接口電路V cc21X 12X 23G ND4R ST5I/O6SC L K7V cc8U 1D S1 30 2V CCV CCX T232 76 8H ZR 145KR 155KP 32P 33P 34+1-2JP13V位位位位3.53.5 溫測模塊溫測模塊 DS18B20 通過單總線實現與單片機的通信,每個 DS18B20 都有一個唯一的序列號,可以方便的實現組網檢測。3.5.13.5.1單總線介紹單總線介紹 1.單總線即只有一根數據線

25、,系統(tǒng)中的數據交換,控制都由這根線完成。 2.單總線通常要求外接一個約為 4.7K10K 的上拉電阻,這樣,當總線 閑置時其狀態(tài)為高電平。3.5.23.5.2DS18B20DS18B20 特性介紹特性介紹 DS18B20 單線數字溫度傳感器,即“一線器件” ,其具有獨特的優(yōu)點: 1. 采用單總線的接口方式 與微處理器連接時 僅需要一條口線即可實現 微處理器與 DS18B20 的雙向通訊。 單總線具有經濟性好,抗干擾能 力強,適合于惡劣環(huán)境的現場溫度測量,使用方便等優(yōu)點,使用戶可輕 松地組建傳感器網絡,為測量系統(tǒng)的構建引入全新概念。 2. 測量溫度圍寬,測量精度高 DS18B20 的測量圍為 -

26、55 + 125 ; 在 -10+ 85C 圍,精度為 0.5C 。 3. 在使用中不需要任何外圍元件。 4. 支持多點組網功能 多個 DS18B20 可以并聯在惟一的單線上,實現多 點測溫。 5. 供電方式靈活 DS18B20 可以通過部寄生電路從數據線上獲取電 源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源, 從而使系統(tǒng)結構更趨簡單,可靠性更高。 6. 測量參數可配置 DS18B20 的測量分辨率可通過程序設定 912 位。12 / 44 7. 負壓特性電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常作。 8. 掉電保護功能 DS18B20 部含有 EEPROM ,在系統(tǒng)掉

27、電以后,它 仍可保存分辨率與報警溫度的設定值。 9. DS18B20 具有體積更小、適用電壓更寬、更經濟、可選更小的封裝方 式,更寬的電壓適用圍,適合于構建自己的經濟的測溫系統(tǒng),因此也 就被設計者們所青睞。3.5.33.5.3DS18B20DS18B20 管腳介紹管腳介紹DS18B20 的管腳排列1 . GND 為電源 地;2. DQ 為數字信號輸入輸出端;3. VDD 為外接供電電源輸入端,在寄生 電源接線方式時接地; 3.5.43.5.4 DS18B20DS18B20 部結構部結構 DS18B20 部結構主要由四部分組成: 64 位光刻 ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器 TH

28、和 TL 、配置寄存器。 光刻 ROM 中的 64 位序列號是出廠前被光刻好的,它可以看作是該 DS18B20 的地址序列碼。 64 位光刻 ROM 的排列是:開始 8 位(地址: 28H )是產品類型標號,接著的 48 位是該 DS18B20 自身的序列號,并且每個 DS18B20 的序列號都不一樣,因此它可以看作是該 DS18B20 的地址序列碼;最后 8 位則是前面 56 位的循環(huán)冗余校驗碼( CRC=X8+X5+X4+1 ) 。由于每一個 DS18B20 的 ROM 數據都各不一樣,因此微控制器就可以通過單總線對多個 DS18B20 進行尋址,從而實現一根總線上掛接多個 DS18B20

29、 的目的。DS18B20 中的溫度傳感器完成對溫度的測量,用 16 位二進制形式提供,形式表達,其中 S 為符號位。3.5.53.5.5 DS18B20DS18B20 溫度轉化示例溫度轉化示例13 / 443.5.63.5.6 DS18B20DS18B20 時序介紹時序介紹DS18B20 的一線工作協議流程是:初始化ROM 操作指令存儲器操作指令數據傳輸。其工作時序包括:1. 初始化時序2. 寫時序3. 讀時序初始化時序:初始化時序: 主機首先發(fā)出一個 480960 微秒的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,并在隨后的 480 微秒時間對總線進行檢測,如果有低電平出現說明總線上有器件已做出應答

30、。若無低電平出現一直都是高電平說明總線上無器件應答。做為從器件的 DS18B20 在一上電后就一直在檢測總線上是否有480960 微秒的低電平出現,如果有,在總線轉為高電平后等待 1560微秒后將總線電平拉低 60240 微秒做出響應存在脈沖,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待。寫操作:寫操作:14 / 44 寫操作就是主機發(fā)出各種操作命令,但各種操作命令都是向DS18B20 寫 0 和寫 1 組成的命令字節(jié),接收數據時也是從 DS18B20 讀取0 或 1 的過程。寫周期最少為 60 微秒,最長不超過 120 微秒。寫周期一開始做為主機先把總線拉低 1 微秒表示寫周期開始

31、。隨后若主機想寫0,則繼續(xù)拉低電平最少 60 微秒直至寫周期結束,然后釋放總線為高電平。若主機想寫 1,在一開始拉低總線電平 1 微秒后就釋放總線為高電平,一直到寫周期結束。而做為從機的 DS18B20 則在檢測到總線被拉底后等待 15 微秒然后從 15us 到 45us 開始對總線采樣,在采樣期總線為高電平則為 1,若采樣期總線為低電平則為 0。讀操作:讀操作: 對于讀數據操作時序也分為讀 0 時序和讀 1 時序兩個過程。讀時序是從主機把單總線拉低之后,在 1 微秒之后就得釋放單總線為高電平,以讓 DS18B20 把數據傳輸到單總線上。DS18B20 在檢測到總線被拉低 1微秒后,便開始送出

32、數據,若是要送出 0 就把總線拉為低電平直到讀周期結束。若要送出 1 則釋放總線為高電平。主機在一開始拉低總線 1 微秒后釋放總線,然后在包括前面的拉低總線電平 1 微秒在的 15 微秒時間完成對總線進行采樣檢測,采樣期總線為低電平則確認為 0。采樣期總線為高電平則確認為 1。完成一個讀時序過程,至少需要 60us 才能完成。3.5.73.5.7 DS18B20DS18B20 操作步驟操作步驟1. 每次讀寫前對 DS18B20 進行復位初始化。復位要求主 CPU 將數據線下拉 500us ,然后釋放, DS18B20 收到信號后等待 16us60us 左右,然后發(fā)出 60us240us 的存在

33、低脈沖,主 CPU 收到此信號后表示復位成功。2. 發(fā)送一條 ROM 指令15 / 443. 發(fā)送存儲器指令3.5.83.5.8 DS18B20DS18B20 與單片機的接口電路與單片機的接口電路3.63.6 總系統(tǒng)原理圖總系統(tǒng)原理圖 單片機(AT89S52)9 腳為復位輸入端。上電復位,只要 RST 引腳上有大于二個機器周期以上的高電平,單片機(AT89C2051)即復位。按鍵從單片機(AT89S52)的 P2.4、P2.5、P2.6、P2.7 口接入,當按鍵被按下時,相應的輸入口就會輸入低電平 0。單片機(AT89S52)的 XTAL1 腳、XTAL2 腳接一個由 12M 晶振和 10pf

34、組成的振蕩電路。為單片機提供相應的時序。16 / 44X T112 MC 810 pfC 910 pfE 110 ufS1SW -PBR 1810 kR 1733 0V DD3I/O2G ND1U 3D S1 8B 20R 204K 7C 10.1U FR ESR ESV CCV CCV CCC S0C S3C S1C S2Q 490 12V CCR 193.3KP30V CC12+L S1R 165.1KD 1L EDQ 090 12Q 190 12Q 290 12Q 390 12123456789 10IS P1M O S IR ESSC KM ISOV CC位位位位位位位位位位位位位位位

35、位位位位P 24P 25P 26P 27P 10P 11P 12P 13P 14P 15P 16P 17K 0K 1K 2K 3P 24P 25P 26P 27位位位位V CCV CCP 10P 11P 12P 13P 14P 15P 16P 17R 132KR 1210 0V CCP 30P 31P 36P 37V cc21X 12X 23G ND4R ST5I/O6SC L K7V cc8U 1D S1 30 2V CCV CCX T232 76 8H ZR 145KR 155KP 35P 36P 37P 32P 33P 34+1-2JP13V位位位位位位位位位位位位位位USB位位P 00

36、P 01P 02P 03P 04P 05P 06P 071234JP2帽帽D 2L EDD 3L EDabR 047 0R 147 0R 247 0R 347 0R 447 0R 547 0R 647 0R 747 0V CCV CCV CCV CCR 84K 7R 94K 7R 104K 7R 114K 7P 00P 01P 02P 03P 04P 05P 06P 07cdefghabcdefghabcdefghabcdefghC S0C S1C S2C S3位位位位位位CPU位位位位位abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u1SM 4 11 00 6a

37、bfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u2SM 4 11 00 6abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u3SM 4 11 00 6abfcgdedpa7b6c4d2e1f9g10dp5com3com8sh u4SM 4 11 00 6abcdefghM O S IM ISOSC KV CC1G ND2POW E RR 214.7KG ND1V CC2V O3R S4R W5E6D B07D B18D B29D B310D B411D B512D B613D B714B G V C C15B G G N D16LCD 1

38、602L CDL CD 16 02P 32P 33P 34P 35E A/V PP31X 119X 218R ES ET9R D/P3 717W R/P3 616P32/IN T012P33/IN T113P34/T014P35/T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSE N29A LE /PRD G30P31/TX D11P30/RX D10V CC40G ND20IC 6A T8 9C 524.4

39、.軟件設計軟件設計主程序主要起到一個導向和決策功能,控制程序的走向。本系統(tǒng)在主程序中運用模塊化結構,所有控制量集中處理,提高了處理效率,并在RAM 建立各控制量的映射,方便各功能模塊的編程與修改。運用散轉結構,可實現無擾動重入。本設計主要有以下幾個模塊:溫顯模塊、時鐘顯示模塊、時鐘修改模塊。操作說明:上電復位后進入溫顯模塊,按 K1 鍵可進入溫度報警值上下限的設置;按 K0 可進行模塊間的轉換,按一次 K0 進入時鐘模塊,按K0 兩次進入時鐘修改模塊。4.14.1 I/OI/O 口分配口分配1、P2.0、P2.1、P2.2、P2.3 作為個位、十位、百位、千位數碼管片選。2、P2.4、P2.5

40、、P2.6、P2.7 作為按鍵接口。3、P0.0 到 P0.7 作為段碼 a 到 g 的輸出口。17 / 444.24.2 按鍵掃描按鍵掃描本設計采用定時器中斷延時去抖的方法來進行按鍵的有效掃描判斷5.5.流程圖流程圖5.15.1 主程序流程圖主程序流程圖5.25.2 work0work0 模塊流程圖模塊流程圖mode=0mode=1獲取溫度根據鍵狀態(tài)進行功能散轉Work0,溫顯和溫報模塊,同時置位延時方式標志位Work1,時間顯示,同時清零延時方式標志位Work2,調時模塊,在調整完畢后進入Work1按鍵掃描顯示方式 1清定時標志位 重裝定時初值按鍵掃描顯示方式 2初始化 DS1302讀取時

41、間開始初始化延時方式標志位=1?NYN5ms 到?Ymode=2入口根據鍵狀態(tài)值進行功能散轉溫顯模式修改高溫報警值修改低溫報警值返回cnt1=0cnt1=1cnt1=218 / 445.35.3 work1work1 模塊流程圖模塊流程圖5.45.4 work2work2 模塊流程圖模塊流程圖msta=0msta=1月份顯示模塊msta=2時間顯示模塊星期顯示模塊入口年份顯示模塊返回根據鍵狀態(tài)值進行功能散轉msta=3設置時間預處理,即將當前時間值送給修改緩沖單元入口根據鍵狀態(tài)值進行功能散轉msta1=2msta1=3msta1=0msta1=1返回修改小時,高兩位數碼管位閃,按 K2 與 K

42、3 鍵修改修改分鐘,低兩位數碼管位閃,按 K2 與 K3 鍵修改修改月份,高兩位數碼管位閃,按 K2 與 K3 鍵修改修改日,低兩位數碼管位閃,按 K2 與 K3 鍵修改修改年份,高兩位顯示 20低兩位數碼管位閃,按 K2與 K3 鍵修改修改星期,低兩位數碼管位閃,按 K2 與 K3 鍵修改修改完畢,將修改信息寫入到 DS1302 芯片中msta1=4msta1=5msta1=6msta1=719 / 445.55.5 獲取溫度子程序流程圖獲取溫度子程序流程圖入口初始化 DS18B20跳過 ROM溫度轉換初始化 DS18B20跳過 ROM讀取溫度讀低 8 位讀高 8 位將取出的數據轉換成溫度值

43、,分為整數部分和小數部分將整數部分送顯緩存將小數部分按 0.5 精度處理將溫度值轉換為BCDma3,yongyu 溫度報警時溫度比較實用返回20 / 445.65.6 按鍵掃描按鍵掃描5.75.7 中斷服務子程序中斷服務子程序5.85.8 顯示方式顯示方式 1 1入口讀鍵,保存鍵值有鍵?開定時中斷延時去抖提取鍵前沿關定時中斷返回NY入口重裝中斷定時初值保存變化的鍵狀態(tài)返回顯示個位,dsw=1關數碼管i3?根據狀態(tài)字進行散轉入口i=0返回顯示十位,dsw=2顯示百位,dsw=3顯示千位,dsw=0dsw=0dsw=1dsw=2dsw=321 / 445.95.9 初始化初始化 DS1302DS1

44、302 子程序流圖子程序流圖YN入口允許初始化標志位=1?寫保護關寫入年份寫入月份寫入日寫入小時寫入分鐘寫保護開允許初始化標志位清零返回NY22 / 445.105.10 溫顯模塊子程序流圖溫顯模塊子程序流圖5.115.11 讀取時間模塊子程序流圖讀取時間模塊子程序流圖入口將溫度值送顯緩溫度值比較,超過上下限值,則報警返回讀取分鐘,將數據轉換為十進制數據入口變量定義返回讀取小時,將數據轉換為十進制數據讀取日,將數據轉換為十進制數據讀取月份,將數據轉換為十進制數據讀取星期,將數據轉換為十進制數據讀取年份,將數據轉換為十進制數據23 / 446.6.程序代碼程序代碼6.16.1 主程序部分主程序部

45、分#include /52 單片機頭文件#include /52 單片機頭文件#include#include /52 單片機頭文件#define SM_PORT P0 /輸出口定義#define uint unsigned int#define uchar unsigned charuchar code table=0 xc0,0 xf9,0 xa4,0 xb0,0 x99, /0,1,2,3.數碼管 /斷碼表,16 關,17H,18,19L0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1, 0 x86,0 x8e,0 xff,0 x

46、89,0 xbf,0 xc7; uchar LBJ_buf0,LBJ_buf1,HBJ_buf0,HBJ_buf1;uchar H2_weishan,L2_weishan;uchar r0,DELAY_mode;uchar msta,BJ_L,BJ_H,cnt1,cnt;void RDKEY() P2=0 xff; /掃描第 0 行(ROW0),即 k0-k3 鍵 r0=P2; r0=r0; r0&=0 xf0; /將讀取到的 k0-k3 鍵值保存于 KEY0 的低四位 if(r0!=KEY0) /判斷是否有鍵按下 24 / 44 TR0=1; EKEY0=KEY0; /時間未到,沿用

47、原來保留的鍵值 else /未有鍵按下 TR0=0; EKEY0=0 x00; EKEY0=r0&(KEY0r0); /提取鍵前沿 KEY0=r0; void disp () uchar i; for(i=0;i3;i+) P2=0 xff; switch(dsw) case 0:CS0=0; SM_PORT=tablebuf0; /顯示個位 dsw=1; break; case 1:CS1=0; SM_PORT=tablebuf1; /顯示十位 dsw=2; break; case 2:if(!fh_300) CS2=0; else CS2=1; SM_PORT=tablebuf2;

48、 /顯示百位 if(point_flag) point=0; else point=1; dsw=3; break; case 3: if(!fh_300) CS3=0; else CS3=1; SM_PORT=tablebuf3; /顯示千位 dsw=0; break; default:break; 25 / 44void disp1 () SM_PORT=0 xff; P2=0 xff; switch(dsw) case 0: if(!fl_300) CS0=0; else CS0=1; SM_PORT=tablebuf0; /顯示個位 dsw=1; break; case 1: if(!

49、fl_300) CS1=0; else CS1=1; SM_PORT=tablebuf1; /顯示十位 dsw=2; break; case 2: if(!fh_300) CS2=0; else CS2=1; SM_PORT=tablebuf2; /顯示百位 if(point_flag) point=0; else point=1; dsw=3; break; case 3: if(!fh_300) CS3=0; else CS3=1; SM_PORT=tablebuf3; /顯示千位 dsw=0; break; default:break; void Init() TMOD=0 x11;/設

50、置定時器的工作方式 TH0=(65536-20000)/256; /為定時器 0 裝載初值,用中斷方式進行 /按鍵的去抖 TL0=(65536-20000)%256; TH1=(65536-5000)/256;/為定時器 1 裝載初值 TL1=(65536-5000)%256;26 / 44 EA=1; /開總中斷 ET0=1; /開定時器 0 中斷 TR1=1; /開定時器 0 LBJ_buf1=2; /為低溫報警值賦初值 22 度,在主程 /序中可修改 LBJ_buf0=2; HBJ_buf1=3; /為高溫報警值賦初值 35 度,在主程 /序中可修改 HBJ_buf0=5; FMQ=1;

51、 /關閉蜂鳴器和 LED DELAY_mode=1; /工作模式賦初值 1(其中/mode=1 表示,程序使用軟件延時,此時使用 DS18B20 進行溫度測量, /作為溫度計使用;mode=0 時,使用/定時器延時,程序每隔 5ms 執(zhí)行一次,此時作為時鐘 TZtime_flag1=0; Second_buf=0 x00; Minute_buf=0 x00; Hour_buf=0 x12; Day_buf=0 x16; Week_buf=0 x01; Month_buf=0 x06; Year_buf=0 x13;void wenxian() DELAY_mode=1; BJ_L=LBJ_bu

52、f1; BJ_L=4; BJ_L&=0 xf0; BJ_L+=LBJ_buf0&0 x0f; BJ_H=HBJ_buf1; BJ_H=BJ_H|temp16h=BJ_L)27 / 44 t+; if(cnt=50) FMQ=FMQ;cnt=0; else FMQ=1;void XG_LBJ() /修改低溫報警值 DELAY_mode=1; point_flag=0; buf3=19; buf2=18; buf1=LBJ_buf1; buf0=LBJ_buf0; fl_300=0; H2_weishan+; if(H2_weishan=60) H2_weishan=0; fh_3

53、00=fh_300; if(EK2) if(LBJ_buf0) -LBJ_buf0; else if(LBJ_buf1) -LBJ_buf1;LBJ_buf0=9; if(EK3) if(LBJ_buf0!=9) +LBJ_buf0; else if(LBJ_buf1!=9) +LBJ_buf1;LBJ_buf0=0; void XG_HBJ() /修改高溫報警值 DELAY_mode=1; point_flag=0; buf3=17; buf2=18; buf1=HBJ_buf1; buf0=HBJ_buf0; fl_300=0;28 / 44 H2_weishan+; if(H2_weis

54、han=60) H2_weishan=0; fh_300=fh_300; if(EK2) if(HBJ_buf0) -HBJ_buf0; else if(HBJ_buf1) -HBJ_buf1;HBJ_buf0=9; if(EK3) if(HBJ_buf0!=9) +HBJ_buf0; else if(HBJ_buf1!=9) +HBJ_buf1;HBJ_buf0=0; void work0() if(EK1) t1+; if(cnt1=3)cnt1=0; switch(cnt1) case 0:fh_300=0; wenxian(); /溫度顯示子程序,具有超溫和低溫報警功能 break;

55、case 1:XG_LBJ(); /修改低溫報警值 break; case 2:XG_HBJ(); /修改高溫報警值 break; default:break; void work1() if(EK1) msta+; if(msta=4) msta=0; 29 / 44 fh_300=0; fl_300=0; switch(msta) case 0: time_show(); break; case 1: month_show(); break; case 2: year_show(); break; case 3: week_show(); break; default:break; voi

56、d work2() if(EK1) msta1+; if(msta1=8) msta1=0; f300+; switch(msta1) case 0: set_begin(); break; case 1: Hour_set(); break; case 2: Minute_set(); break; case 3: Month_set(); break; case 4: Day_set(); break; case 5: Year_set(); break; case 6: Week_set(); break; case 7: set_over(); break; default:break

57、; 30 / 44void main() Init(); /程序的初始化 while(1) if(DELAY_mode) get_temperature(); RDKEY(); disp(); /獲得溫度 else while(!TF1); TF1=0; TH1=(65536-5000)/256; TL1=(65536-5000)%256; RDKEY(); disp1(); Initial_DS1302(); DS1302_GetTime(); if(EK0) mode+; if(mode=3) mode=0; switch(mode) case 0:work0();break; case

58、1:msta1=0; DELAY_mode=0;point_flag=0; work1(); break; case 2:work2(); DELAY_mode=0; break; default:break; 31 / 44void exter0() interrupt 1 / 定時器 0 中斷 TH0=(65536-20000)/256; /送初值 TL0=(65536-20000)%256; KEY0=r0; /時間到,保存鍵值于 KEY0,和 KEY16.26.2 包含文件包含文件部分部分#ifndef _DS18B20_H_#define _DS18B20_H_#define uin

59、t unsigned int /宏定義#define uchar unsigned char /宏定義sbit DS18B20_DQ=P31;uchar a1,a2,a3;uchar Temp_L,Temp_H; /用于讀取 18B20 中溫度 /的高 8 位和低八位數值uchar tempint,tempdf,temp16h; /溫度整數部分和小數部分void delay_us(uchar i) /延時時間為 2*i 微秒; while(-i);void Init_DS18B20() DS18B20_DQ=1; /先將數據線置高電平 1 delay_us(1); /稍微延時 DS18B20_

60、DQ=0; /先將數據線置低電平 0 delay_us(250); /延時 500us,該時間圍可以在480960us /之間 DS18B20_DQ=1; /數據線拉到高電平 1 delay_us(30); /延時等待,如果初始化成功則在1560us /由 18B20 產生一個低電平 0 if(DS18B20_DQ=0) /如果 18B20 存在 delay_us(240); /再延時 480us 32 / 44void WRITE_DS18B20_DATA(uchar value) uchar i; for(i=0;i=1; /數據右移位 DS18B20_DQ=1; uchar READ_DS18B20_DATA()uchar i;uchar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論