【正文】
V c cR S TG N D89C 5122u F22u F22u F+5 +5 +5R E S E T R E S E T20010K22u F( a ) 上電復位 ( b ) 按鍵電平復位 ( c ) 按鍵脈沖復位 圖 上電復位和按鍵復位電路 第四章 電子時鐘 軟件 設計 C51 單片機可以應用匯編語言和 C語言進行編程。 C語言程序 可讀性高,更便于理解。 主程序設計 第一次上電,系統(tǒng)先進行初始化, LED 顯示初始時間“ 14: 28: 00”,并開始走時。 單片機依次開始調用鍵盤掃描子程序、 DS1302 子程序、 DS18B20 子程序、鬧鈴子程序,經(jīng)過延時,返回程序開頭循環(huán)運行。 開 始初 始 化顯 示 子 程 序鍵 盤 掃 描 子 程 序D S 1 3 0 2 子 程 序D S 1 8 B 2 0 子 程 序鬧 鈴 子 程 序延 時 子 程 序 圖 多功能電子鐘主程序流程圖 子程序 設計 實時時鐘日歷子程序設計 該程序主要實現(xiàn)對 DS1302 寫保護、 充電, 對 年 、 月 、 日 、 時 、 分 、 秒等寄存 器的讀寫操作。其流程圖如圖 。如果 DS1302 一直沒有掉電,則不存在此問題。當用多字節(jié)模式進行操作時,必須寫夠 8字節(jié) [18]。因此,必須采用軟件的方法來模擬單線的協(xié)議時序。 1. 初始化 單線總線上的所有操作均從初始化開始。主機釋放總線時,會產生一個上升沿。主機接收到從機的應 答脈沖后,說明有單線器件在線。共有 5位 ROM 操作命令。 表 DS18B20 的 ROM 操作命令 命令類型 命令字節(jié) 功能說明 Raed Rom 33H 此命令讀取激光 ROM中的 64位,只能用于總線上單個 DS18B20器件的情況,多掛則會發(fā)生數(shù)據(jù)沖突 Match Rom (匹配 ROM) 55H 此命令后跟 64 位 ROM序列號,尋址多掛接總線上的 DS18B20。此命令可用于單掛接或者多掛接總線。如果總線上接多個 DS18B20,并且在此命令后執(zhí)行讀命令,將會發(fā)生數(shù)據(jù)沖突。 Alarm Search (告警搜索) ECH 此命令流程圖和 Search Rom命令相同,但是 DS18B20只有在最近的一次溫度測量時滿足了告警觸發(fā)條件,才會響應此命令。主機可以提供 6種 內存操作命令,如表 。 Rrad Scratchpad (讀暫存器) BEH 此命令讀取暫存器內容,從 字節(jié) 0 一直讀取到字節(jié) 8。 Copy Scratchpad (復制暫存器) 48H 此命令將暫存器中的內容復制進 E2RAM,以便將溫度告警觸發(fā)字節(jié)存入非易失內存。 Convert T (溫度轉換) 44H 此命令開始溫度轉換操作。 Recall E2 (重調 E2存儲器) B8H 將存儲在 E2RAM 中的溫度告警觸發(fā)值和配置寄存器值重新拷貝到暫存器中。 Read Power Supply (讀供電方式) B4H 主機發(fā)起此命令后的每個讀數(shù)據(jù)時隙內, DS18B20 發(fā)信號通知它的供電方式: 0為寄生電源方式, 1為外部供電方式。在單線 DQ上,存在復位脈沖、應答脈沖、寫“ 0”、寫“ 1”、讀“ 0”和讀“ 1”幾種信號類型。而數(shù)據(jù)位的讀和寫則是通過 使用讀、寫時隙實現(xiàn)的。當主機將數(shù)據(jù)線從高電平拉至低電平時,產生寫時隙。所有寫時隙必須在 60μ s 以上(即由高拉低后持續(xù) 60μ s 以上),各個寫時隙之間必須保證最短 1μ s 的恢復時間。對于主機產生寫“ 1”時隙的情況,數(shù)據(jù)線必須先被拉低,然后釋放,在寫時隙開始后的 15μ s,允許 DQ 線拉至高電平。 再來了解讀時隙。數(shù)據(jù)線 DQ 必須保持低電平至少 1μ s,來自 DS18B20 的輸出數(shù)據(jù)在讀時隙下降沿之后 15μ s 內有效。在讀時隙結束時, DQ引腳將通過外部上拉電阻拉回至高電平。 開 始初 始 化 D S 1 8 B 2 0應 答 脈 沖 否 ?發(fā) 起 S k i p R o m 命 令發(fā) 起 C o n v e r t T 命 令延 時 1 s , 等 待 溫 度 轉 換 完 成初 始 化 D S 1 8 B 2 0應 答 脈 沖 否 ?發(fā) 起 R e s d S c r a t c h p a d 命 令讀 低 8 位 字 節(jié) T L 數(shù) 據(jù)讀 高 8 位 字 節(jié) T H 數(shù) 據(jù)溫 度T = ( ( T H 4 ) amp。在寫時序中,主機將在拉低總線 15μ s內釋放總線,并向 DS18B20 寫“ 1”。 DS18B20 僅在主機發(fā)出讀時隙時才向主機傳輸數(shù)據(jù),所以,當主機向 DS18B20 發(fā)出讀數(shù)據(jù)命令后,必須馬上產生讀時隙,以便 DS18B20 能傳輸數(shù)據(jù) [13]。 顯示子程序設計 用 74LS164 驅動 LED 數(shù)碼管靜態(tài)顯示 電路 ,編程也 很容易。關鍵之處是 要實現(xiàn)根據(jù)鍵值顯示不同 的 數(shù)字。 在隨機掃描方式中, CPU 完成某特定任務后,即執(zhí)行鍵盤掃描程序,以確定鍵盤有無按鍵輸入,然后根據(jù)按鍵功能轉去執(zhí)行相應的操作。 定時掃描方式與隨機掃描方式基本相同,只是利用 CPU 內的定時中斷,每隔一定時間掃描有無按鍵被按下,鍵盤反應速度較快,在處理按鍵功能過 程中,可以通過鍵盤命令進行干預,如取消、暫停等操作。 89C51 單片機完全有能力完成以上工作,所以采用隨機掃描鍵盤方式,系統(tǒng)也能夠正常運行。 單片機掃描完鍵盤,得到鍵值,并根據(jù)鍵值轉入執(zhí)行對應任務,以實現(xiàn)按鍵功能。 鬧鈴子程序設計 鬧鈴子程序任務是不斷用時鐘分 (min)與時 (hour)同設定的鬧鈴分 (clk_min)與鬧鈴時 (clk_hour)比較,只要滿足 min 等于 clk_min、 hour 等于 clk_hour, 響鈴啟動 5 分鐘,并根據(jù)外部按鍵執(zhí)行相應貪睡任務。 開 始初 始 時 間 顯 示送 入 f u n c t i o n _ c o u n t 值f u n c t i o n _ c o u n t = 1 否 ?調 h o u r 顯 示調 m i n 顯 示f u n c t i o n _ c o u n t = 2 否 ?f u n c t i o n _ c o u n t = 3 否 ?調 s e c 顯 示f u n c t i o n _ c o u n t = 4 否 ?調 c l k _ h o u r 顯 示調 c l k _ m i n 顯 示f u n c t i o n _ c o u n t = 5 否 ?f u n c t i o n _ c o u n t = 6 否 ?調 s e c 顯 示f u n c t i o n _ c o u n t = 7 否 ?調 y e a r 顯 示調 m o n t h 顯 示f u n c t i o n _ c o u n t = 8 否 ?f u n c t i o n _ c o u n t = 9 否 ?調 d a t e 顯 示確 認 標 志 位 = 1 否 ?時 間 顯 示繼 續(xù) 調 時 顯 示NNNNNNNNNN日 期 顯 示 標 志 位 = 1 否 ?日 期 顯 示溫 度 顯 示溫 度 顯 示 標 志 位 = 1 否 ?YYYYYYYYYNN返 回延 時AA 圖 顯示子程序流程圖 開 始掃 描 鍵 盤送 鍵 值 k e yK e y = D F 否 ?f u n t i o n _ c o n t + +K e y = E F 否 ?f u n t i o n _ c o n t 對 應 位 加 1K e y = F 7 否 ?f u n t i o n _ c o n t 對 應 位 減 1K e y = F D 否 ?鬧 鈴 開K e y = 7 F 否 ?K e y = B F 否 ?日 期 顯 示 子 程 序溫 度 顯 示 子 程 序K e y = F B 否 ?時 間 顯 示 子 程 序返 回K e y = 0YYYYYYYNNNNNNN 圖 鍵盤掃描子程序 開 始初 始 化A l a r m _ f l a g = t r u e 否 ?返 回鬧 鈴 開C l k _ m i n = m i n 否 ?B e e p r = f a l s e返 回C l k _ h o u r = h o u r 否 ?B e e p r = f a l s e返 回B e e p r = t r u e響 鈴 開 始m i n = ( C l k _ m i n + 5 分 鐘 ) 否 ?響 鈴 停響 鈴 繼 續(xù)停 止 標 志 位 = t r u e 否 ?返 回響 鈴 停返 回響 鈴 繼 續(xù)貪 睡 標 志 位 = t r u e 否 ?記 錄 該 時 刻 M I N響 鈴 停返 回響 鈴 繼 續(xù)m i n = ( M I N + 5 分 鐘 ) 否 ?響 鈴 繼 續(xù)響 鈴 繼 續(xù)B e e p r = f a l s eYNYYYYYYNNNNNN 圖 鬧鈴子程序流程圖 第五章 系統(tǒng) 調試 調試 工作 分硬件調試 和軟件調試 兩部分 ,調試方法介紹如下: 首先, 硬件調試主要是先搭建硬件平臺,然后利用萬用表等工具對電路檢查,最后應用程序進行功能調試。 然后, 可以直接應用一些編輯或仿真軟件進行 軟件調試 ,比如單片機 C51 編輯軟件 Keil。 通過編譯、運行,可以檢查程序錯誤。 在軟件調試過程中要仔細耐 心,即便是多寫或少些一兩個 字符,都無法編譯成功。 還有一種方式 ,即應用仿真軟件搭建電路的軟件平臺,再導入程序進行仿真調試。 筆者應用的仿真軟件為 Proteus。 在調試過程中,首先必須明確調試順序 。為了正確顯示時間,接下來還要確定顯示電路能 否 正常工作 。 然后 , 要 準備好 調試的工具 。 筆者根據(jù)自己實際制作該多功能電子時鐘的 經(jīng)驗,將調試過程介紹如下: 硬件調試 單片機基礎電路調試 單片機基礎電路包括 電源、 單片機、 外部時鐘震蕩電路、 復位電路和 外部 接口電路。 2. 單片 機電源要連接正確, 并且 保證 AT89C51 的 31 號 引腳接高電平。 3. 如果使用 P0口 做 I/O 口, 要接上拉電阻 。筆者在制作 外部接口電路 時使用的是排針 ,焊接時容易出現(xiàn)管腳之間 短 路,所以在上電以前必須先排查電路 。 筆者編輯 了使 一組 P1口 點亮 8個發(fā)光二極管 循環(huán)點亮的程序,程序代碼如下: include void delay(void) //延時子程序 { Unsigned char i, j, k。i0。j0。k0。 } void main() { unsigned int n。 while(1) { P1=0xFFH。n8。 delay()。在連接顯示電路 之前 要明確 共陰型 8 段 LED 的 10 個 管腳與各段 發(fā)光二極管的 對應關系, 熟悉 74LS164 管 腳位置 ,然后才能開始進行連接 [19]。 2. 因為是移位顯示,所以需要注意前一位 74LS164的 QH 腳要與下一位 74LS164的 A、 B 腳連接。本設計定義了 連接 74LS164 的 A、 B 腳 , 連接 74LS164 的 CLK 腳。 5. 編 寫 一段顯示程序, 燒錄進單片機,檢查好電源正負端和 、 連接是否正確。 以下是筆者編寫的一段顯示程序:上電后, 7 位數(shù)碼管分別顯示 0~ 6。 void sendbyte()。 sbit CLK=P1^1。 unsigned char tab[]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }。 for(。t) for(j=6245。j) {。 disp_buffer[0]=tab[0]。 disp_buffer[2]=tab[2]。 disp_buffer[4]=tab