51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)_第1頁(yè)
51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)_第2頁(yè)
51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)_第3頁(yè)
51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)_第4頁(yè)
51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、51單片機(jī)的18B20、1602液晶顯示溫度與萬(wàn)年歷顯控制系統(tǒng)摘 要本設(shè)計(jì)以數(shù)字集成電路技術(shù)為基礎(chǔ),單片機(jī)技術(shù)為核心。軟件設(shè)計(jì)采用模塊化結(jié)構(gòu),C語(yǔ)言編程。系統(tǒng)通過LCD顯示數(shù)據(jù),可以顯示日期(年、月、日、時(shí)、分、秒)以及溫度。在內(nèi)容安排上首先描述系統(tǒng)硬件工作原理,著重介紹了各硬件接口技術(shù)和各個(gè)接口模塊的功能;其次,詳細(xì)的闡述了程序的各個(gè)模塊和實(shí)現(xiàn)過程。目 錄摘要2前沿.4 1.1設(shè)計(jì)目標(biāo).51.2設(shè)計(jì)要求52 設(shè)計(jì)方案52.1 控制器選用52.2 顯示部分設(shè)計(jì)62.3 數(shù)字溫度采集設(shè)計(jì)62.4 系統(tǒng)設(shè)計(jì)6777復(fù)位電路8883各硬件介紹.93.1 AT89S51的引腳說(shuō)明.93.2 LCD16

2、02簡(jiǎn)介93.3 DS1302 簡(jiǎn)介.103.4 DS18B20 簡(jiǎn)介124 系統(tǒng)硬件設(shè)計(jì)所需的器材155 系統(tǒng)軟件總體設(shè)計(jì)156電路原理仿真圖7 主程序流程圖178 完整程序編寫19前言 電子時(shí)鐘是實(shí)現(xiàn)對(duì)年,月,日,時(shí),分,秒數(shù)字顯示的計(jì)時(shí)裝置,廣泛用于個(gè)人家庭,車站, 碼頭,辦公室,銀行大廳等場(chǎng)所,成為人們?nèi)粘I钪械谋匦杵贰?shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度遠(yuǎn)遠(yuǎn)超過老式鐘表。鐘表的數(shù)字化給人們生產(chǎn)生活帶來(lái)了極大的方便,在此基礎(chǔ)上完成的電子時(shí)鐘精度高,功能易于擴(kuò)展。可擴(kuò)展成為諸如定時(shí)自動(dòng)報(bào)警、按時(shí)自動(dòng)打鈴、時(shí)間程序自動(dòng)控制、定時(shí)廣播、自動(dòng)起閉路燈、定時(shí)開關(guān)烘箱、

3、通斷動(dòng)力設(shè)備、甚至各種定時(shí)電氣的自動(dòng)啟用等電路。所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字時(shí)鐘及擴(kuò)大其應(yīng)用有著非?,F(xiàn)實(shí)的意義。本設(shè)計(jì)就是數(shù)字時(shí)鐘簡(jiǎn)單的擴(kuò)展應(yīng)用。1.1設(shè)計(jì)目標(biāo):利用單片機(jī)技術(shù),以及模擬電子技術(shù)和數(shù)字電子技術(shù)的理論知識(shí),設(shè)計(jì)實(shí)現(xiàn)MCS-51單片機(jī)對(duì)LCM1602液晶輸出顯示控制的這一基本要求。1.2 設(shè)計(jì)要求:本設(shè)計(jì)利用DS1302;DS18B20;LCD1602實(shí)現(xiàn)以下功能:(1) 顯示日期功能(年、月、日、時(shí)、分、秒以及星期) (2) 可通過按鍵切換年、月、日及時(shí)、分、秒的顯示狀態(tài)(3) 可隨時(shí)調(diào)校年、月、日或時(shí)、分、秒(4) 可每次增減一進(jìn)行時(shí)間調(diào)節(jié)(5) 可動(dòng)態(tài)完

4、整顯示年份,實(shí)現(xiàn)真正的萬(wàn)年歷顯示(6) 可顯示溫度2 設(shè)計(jì)方案2.1 控制器硬件控制電路主要用了AT89C52芯片處理器、LCD顯示器等。根據(jù)各自芯片的功能互相連接成電子萬(wàn)年歷的控制電路。軟件控制程序主要有主控程序、電子萬(wàn)年歷的時(shí)間控制程序、時(shí)間顯示及星期顯示和溫度采集程序等組成。主控程序中對(duì)整個(gè)程序進(jìn)行控制,進(jìn)行了初始化程序及計(jì)數(shù)器、還有鍵盤功能程序、以及顯示程序等工作,時(shí)間控制程序是電子萬(wàn)年歷中比較重要的部分。時(shí)間控制程序體現(xiàn)了年、月、日、時(shí)、分、秒及星期的計(jì)算方法。時(shí)間控制程序主要是定時(shí)器0計(jì)時(shí)中斷程序每隔10ms中斷一次當(dāng)作一個(gè)計(jì)數(shù),每中斷一次則計(jì)數(shù)加1,當(dāng)計(jì)數(shù)100次時(shí),則表示1秒到

5、了,秒變量加1,同理再判斷是否1分鐘到了,再判斷是否1小時(shí)到了,再判斷是否1天到了,再判斷是否1月到了,再判斷是否1年到了,若計(jì)數(shù)到了則相關(guān)變量清除0。先給出一般年份的每月天數(shù)。如果是閏年,第二個(gè)月天數(shù)不為28天,而是29天。再用公式sv1 +(y1/4(y1/100+(y1/400+ d計(jì)算當(dāng)前顯示日期是星期幾,當(dāng)調(diào)節(jié)日期時(shí),星期自動(dòng)的調(diào)整過來(lái)。閏年的判斷規(guī)則為,如果該年份是4或100的整數(shù)倍或者是400的整數(shù)倍,則為閏年;否則為非閏年。在我們的這個(gè)設(shè)計(jì)中由于只涉及100年范圍內(nèi),所以判斷是否閏年就只需要用該年份除4來(lái)判斷就行了。溫度的顯示主要是靠ds18b20采集現(xiàn)在的溫度數(shù)據(jù),CPU讀取

6、數(shù)據(jù)進(jìn)行顯示,當(dāng)各自的條件得不到滿足時(shí),對(duì)應(yīng)的顯示器狀態(tài)就不發(fā)生改變,只是在滿足條件的情況下,顯示器的狀態(tài)才變化。2.2顯示部分設(shè)計(jì)本設(shè)計(jì)采用液晶顯示方式。液晶顯示效果出眾,可以運(yùn)用菜單項(xiàng)來(lái)方便操作,比較簡(jiǎn)單。2.3 數(shù)字溫度采集設(shè)計(jì)本設(shè)計(jì)中的溫度采集部分考慮用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測(cè)溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。溫度采集電路設(shè)計(jì)如下圖所示,控制器采用單片機(jī)AT89S51,溫度傳感器采用DS18B20,用LCD1602顯示溫度2.4 系統(tǒng)設(shè)計(jì) 晶體振蕩器電路 晶

7、體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的32768Hz的方波信號(hào),可保證數(shù)字鐘的走時(shí)準(zhǔn)確及穩(wěn)定。不管是指針式的電子鐘還是數(shù)字顯示的電子鐘都使用晶體蕩器電路。圖3 DS1302電路 分頻器電路分頻器電路將高頻方波信號(hào)經(jīng)分頻后得到1Hz的方波信號(hào)供秒計(jì)數(shù)器進(jìn)行計(jì)數(shù),分頻器實(shí)際上也就是計(jì)數(shù)器。 時(shí)間計(jì)數(shù)器電路 時(shí)間計(jì)數(shù)電路由秒個(gè)位和秒十位計(jì)數(shù)器,分個(gè)位和分十位計(jì)數(shù)器及時(shí)個(gè)位和時(shí)十位計(jì)數(shù)器電路構(gòu)成,其中秒個(gè)位和秒十位計(jì)數(shù)器,分個(gè)位和分十位計(jì)數(shù)器為60進(jìn)制計(jì)數(shù)器而根據(jù)設(shè)計(jì)要求,時(shí)個(gè)位和時(shí)十位計(jì)數(shù)器為12進(jìn)制計(jì)數(shù)器。 時(shí)鐘電路內(nèi)部時(shí)鐘電路如圖所示,在XTAL1和XTAL2引腳上外接定時(shí)元件,內(nèi)部振蕩電路

8、就產(chǎn)生自激振蕩。定時(shí)元件通常石英晶體和電容組成的并聯(lián)諧振回路,晶體振蕩器選擇12MHZ,電容采用22PF。 圖4 時(shí)鐘電路 復(fù)位電路 影響單片機(jī)系統(tǒng)運(yùn)行穩(wěn)定性的因素可大體分為外因和內(nèi)因兩部分: (1)外因 射頻干擾,它是以空間電磁場(chǎng)的形式傳遞在機(jī)器內(nèi)部的導(dǎo)體(引線或零件引腳)感生出相應(yīng)的干擾,可通過電磁屏蔽和合理的布線/器件布局衰減該類干擾; 電源線或電源內(nèi)部產(chǎn)生的干擾,它是通過電源線或電源內(nèi)的部件耦合或直接傳導(dǎo),可通過電源濾波、隔離等措施來(lái)衰減該類干擾 。(2)內(nèi)因 振蕩源的穩(wěn)定性,主要由起振時(shí)間頻率穩(wěn)定度和占空比穩(wěn)定度決定 起振時(shí)間可由電路參數(shù)整定穩(wěn)定度受振蕩器類型溫度和電壓等參數(shù)影響復(fù)位

9、電路的可靠性。復(fù)位電路的可靠性設(shè)計(jì)復(fù)位是單片機(jī)的初始化操作。單片機(jī)啟運(yùn)運(yùn)行時(shí),都需要先復(fù)位,其作用是使CPU和系統(tǒng)中其他部件處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開始工作。因而,復(fù)位是一個(gè)很重要的操作方式。但單片機(jī)本身是不能自動(dòng)進(jìn)行復(fù)位的,必須配合相應(yīng)的外部電路才能實(shí)現(xiàn)。 復(fù)位電路的基本功能是:系統(tǒng)上電時(shí)提供復(fù)位信號(hào),直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號(hào)。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時(shí)才撤銷復(fù)位信號(hào),以防電源開 關(guān)或電源插頭分-合過程中引起的抖動(dòng)而影響復(fù)位。 按鍵部分本設(shè)計(jì)總的用了三個(gè)按扭開關(guān)作為鍵盤,其中一個(gè)是選擇調(diào)時(shí)鍵,另兩個(gè)分別為加和減鍵。圖6 按鍵電路3各硬件介紹3.1 AT89C5

10、1的引腳說(shuō)明AT89C51系列單片機(jī)中有PDIP,PLCC,TQFP多種封裝形式。本設(shè)計(jì)采用的是PDIP封裝40管腳的單片機(jī),各引腳如圖2-2所示。圖9 AT89C51的PDIP封裝引腳圖3.2 LCD1602簡(jiǎn)介 LCM1602采用標(biāo)準(zhǔn)的16腳接口,其中: 第1腳:VSS為地電源 第2腳:VDD接5V正電源 第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度 第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。 第5腳:RW為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫

11、操作。當(dāng)RSRW共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時(shí)可讀忙信號(hào),當(dāng)RS為高電平RW為低電平時(shí)可以寫入數(shù)據(jù).第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。 第714腳:D0D7為8位雙向數(shù)據(jù)線。 第1516腳:空腳 3.3 DS1302 簡(jiǎn)介1 DS1302 的結(jié)構(gòu)及工作原理DS13021是美國(guó)DALLAS 公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償功能,工作電壓寬達(dá)2.55.5V。采用三線接口與CPU 進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)

12、據(jù)。DS1302內(nèi)部有一個(gè)31的用于臨時(shí)性存放數(shù)據(jù)的RAM 寄存器。DS1302 是DS1202 的升級(jí)產(chǎn)品,與DS1202 兼容,但增加了主電源后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。1.1 引腳功能表及內(nèi)部結(jié)構(gòu)圖DS1302 的引腳及內(nèi)部結(jié)構(gòu)如圖1 所示,引腳功能如表1 所示。1.2 DS1302 的控制字節(jié)說(shuō)明DS1302 的控制字如圖2 所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302 中位6 如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1 表示存取RAM數(shù)據(jù);位至位1 指示操作單元的地址;最低有效位(位0)如為0 表示要進(jìn)行寫

13、操作,為1 表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。1.3 復(fù)位通過把 輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。 輸入有兩種功能:首先,接通控制邏輯,允許地址命令序列送入移位寄存器;其次, 提供了終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng) 為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中置 為低電平,則會(huì)終止此次數(shù)據(jù)傳送,并且I/O 引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc2.5V 之前, 必須保持低電平。只有在SCLK 為低電平時(shí),才能將RST 置為高電平。1.4 數(shù)據(jù)輸入輸出在控制指令字輸入后的下一個(gè)SCLK 時(shí)鐘的上升沿時(shí)數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即

14、位0 開始。同樣,在緊跟8 位的控制指令字后的下一個(gè)SCLK 脈沖的下降沿讀出DS1302 的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0 位至高位7,數(shù)據(jù)讀寫時(shí)序見圖。1.5 DS1302 的寄存器DS1302 共有12 個(gè)寄存器,其中有7 個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD 碼形式。其日歷、時(shí)間寄存器及其控制字見表2。此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。DS1302 與RAM 相關(guān)的寄存器分為兩類,一類是單個(gè)RAM單元,共31 個(gè),每個(gè)單元組態(tài)為一個(gè)8 位的字節(jié),其命令控制

15、字為COHFDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;再一類為突發(fā)方式下的RAM 寄存器,此方式下可一次性讀寫所有的RAM 的31 個(gè)字節(jié),命令控制字為FEH(寫)、FFH(讀)。3.4 DS18B20 簡(jiǎn)介.溫度傳感器DS18B20DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡(jiǎn)單的編程實(shí)現(xiàn)位的數(shù)字值讀數(shù)方式。 TO92封裝的DS18B20的引腳排列見下圖,其引腳功能描述見表1。 DS18B20底視圖表1DS18B20詳細(xì)引腳功能描述序號(hào)名稱引腳功能描述1GND地信號(hào)2DQ數(shù)據(jù)輸

16、入/輸出引腳。開漏單總線接口引腳。當(dāng)被用著在寄生電源下,也可以向器件提供電源。3VDD可選擇的VDD引腳。當(dāng)工作于寄生電源時(shí),此引腳必須接地。DS18B20的性能特點(diǎn)如下:獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)行通信;多個(gè)DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;無(wú)須外部器件;可通過數(shù)據(jù)線供電,電壓范圍為3.05.5;零待機(jī)功耗;溫度以或位數(shù)字;用戶可定義報(bào)警設(shè)置;報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常作;C64 位ROM和單線接口高速緩存存儲(chǔ)器與控制邏輯溫度傳感器高溫觸發(fā)器TH低溫觸發(fā)器TL配置寄

17、存器8位CRC發(fā)生器VddDS18B20采用腳PR35封裝或腳SOIC封裝,其內(nèi)部結(jié)構(gòu)框圖如圖2所示。圖2 DS18B20內(nèi)部結(jié)構(gòu)64位ROM的結(jié)構(gòu)開始位是產(chǎn)品類型的編號(hào),接著是每個(gè)器件的惟一的序號(hào),共有48位,最后位是前面56位的CRC檢驗(yàn)碼,這也是多個(gè)DS18B20可以采用一線進(jìn)行通信的原因。溫度報(bào)警觸發(fā)器和,可通過軟件寫入戶報(bào)警上下限。DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器還包括一個(gè)高速暫存和一個(gè)非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為字節(jié)的存儲(chǔ)器,結(jié)構(gòu)如圖3所示。頭個(gè)字節(jié)包含測(cè)得的溫度信息,第和第字節(jié)和的拷貝,是易失的,每次上電復(fù)位時(shí)被刷新。第個(gè)字節(jié),為配置寄存器,它的內(nèi)容

18、用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時(shí)寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低位一直為,是工作模式位,用于設(shè)置DS18B20在工作模式還是在測(cè)試模式,DS18B20出廠時(shí)該位被設(shè)置為,用戶要去改動(dòng),R1和0決定溫度轉(zhuǎn)換的精度位數(shù),來(lái)設(shè)置分辨率。溫度 LSB溫度 MSBTH用戶字節(jié)1TL用戶字節(jié)2配置寄存器保留保留保留CRC 圖3 DS18B20字節(jié)定義由表1可見,DS18B20溫度轉(zhuǎn)換的時(shí)間比較長(zhǎng),而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間越長(zhǎng)。因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時(shí)間權(quán)衡考慮。高速暫存的第、字節(jié)保留未用,表現(xiàn)為全邏輯。第字節(jié)讀出前面所

19、有字節(jié)的CRC碼,可用來(lái)檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開始啟動(dòng)轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲(chǔ)在高速暫存存儲(chǔ)器的第、字節(jié)。單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時(shí)低位在先,高位在后,數(shù)據(jù)格式以0.0625LSB形式表示。當(dāng)符號(hào)位時(shí),表示測(cè)得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號(hào)位時(shí),表示測(cè)得的溫度值為負(fù)值,要先將補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制數(shù)值。表2是一部分溫度值對(duì)應(yīng)的二進(jìn)制溫度數(shù)據(jù)。表1 DS18B20溫度轉(zhuǎn)換時(shí)間表 DS18B20完成溫度轉(zhuǎn)換后,就把測(cè)得的溫度值與RAM中的TH、T字節(jié)內(nèi)容作比較。若

20、TH或TTL,則將該器件內(nèi)的報(bào)警標(biāo)志位置位,并對(duì)主機(jī)發(fā)出的報(bào)警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時(shí)測(cè)量溫度并進(jìn)行報(bào)警搜索。在64位ROM的最高有效字節(jié)中存儲(chǔ)有循環(huán)冗余檢驗(yàn)碼(CRC)。主機(jī)ROM的前56位來(lái)計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。DS18B20的測(cè)溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給減法計(jì)數(shù)器;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號(hào)作為減法計(jì)數(shù)器的脈沖輸入。器件中還有一個(gè)計(jì)數(shù)門,當(dāng)計(jì)數(shù)門打開時(shí),DS18B20就對(duì)低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘

21、脈沖進(jìn)行計(jì)數(shù)進(jìn)而完成溫度測(cè)量。計(jì)數(shù)門的開啟時(shí)間由高溫度系數(shù)振蕩器來(lái)決定,每次測(cè)量前,首先將55所對(duì)應(yīng)的一個(gè)基數(shù)分別置入減法計(jì)數(shù)器、溫度寄存器中,計(jì)數(shù)器和溫度寄存器被預(yù)置在55所對(duì)應(yīng)的一個(gè)基數(shù)值。減法計(jì)數(shù)器對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器的預(yù)置值減到時(shí),溫度寄存器的值將加,減法計(jì)數(shù)器的預(yù)置將重新被裝入,減法計(jì)數(shù)器重新開始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器計(jì)數(shù)到時(shí),停止溫度寄存器的累加,此時(shí)溫度寄存器中的數(shù)值就是所測(cè)溫度值。其輸出用于修正減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)器門仍未關(guān)閉就重復(fù)上述過程,直到溫度寄存器值大致被測(cè)溫度值。4 系統(tǒng)硬件設(shè)計(jì)所需的

22、器材5V電源 3V電源AT89S51單片機(jī)1個(gè)液晶顯示器1個(gè)DS1302 1個(gè)DS18B20 一個(gè)8550三極管晶振12M的一個(gè) 32768K的一個(gè)電容(30P的兩個(gè))LED二極管1個(gè)22f電容2個(gè)輕觸開關(guān)4個(gè)5 系統(tǒng)軟件總體設(shè)計(jì) 系統(tǒng)的軟件設(shè)計(jì)采用C語(yǔ)言,對(duì)單片機(jī)進(jìn)行編程實(shí)現(xiàn)各項(xiàng)功能。程序在WindowsXP環(huán)境下采用Keil軟件編寫。軟件控制程序主要有主控程序、電子時(shí)鐘的時(shí)間控制程序h和溫度顯示程序組成。主控程序中對(duì)整個(gè)程序進(jìn)行控制,進(jìn)行了初始化程序還有鍵盤功能程序、以及顯示程序和時(shí)間控制程序是電子時(shí)鐘中比較重要的部分。時(shí)間控制程序體現(xiàn)了年、月、日、時(shí)、分、秒的計(jì)算方法。6 電路原理仿真圖

23、:7 主程序流程圖 開始單片機(jī)讀DS1302數(shù)據(jù)單片機(jī)送數(shù)據(jù)到LCD1602單片機(jī)判斷按鍵單片機(jī)處理按鍵調(diào)顯示數(shù)據(jù)結(jié)束主程序流程圖如上圖10所示。由于LCM1602,DS18B20,DS1302的數(shù)據(jù)讀取及指令寫入函數(shù)均已在各自的頭文件中完成,在主程序中只須引用即可。由于在硬件電路方面上設(shè)計(jì)了時(shí)間調(diào)整按鍵和開關(guān),因此應(yīng)有對(duì)應(yīng)的時(shí)間調(diào)整程序。時(shí)間調(diào)整程序的流程圖如圖11所示。#include#includeDS18B20.H /注意這個(gè)調(diào)用文件不在這里!#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen

24、,ri,yue,nian,week,key1n,temp;uint flag;/flag用于讀取頭文件中的溫度值,和顯示溫度值#define yh 0x80 /LCD第一行的初始位置,因?yàn)長(zhǎng)CD1602字符地址首位D7恒定為1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因?yàn)榈诙械谝粋€(gè)字符位置地址是0x40)/液晶屏的與C51之間的引腳連接定義(顯示數(shù)據(jù)線接C51的P0口)sbit rs=P26;/寄存器選擇sbit en=P27; /下降沿使能sbit rw=P25; /讀寫信號(hào)線/DS1302時(shí)鐘芯片與C51之間的引腳連接定義sbit IO

25、=P34;/數(shù)據(jù)線sbit SCLK=P36;sbit RST=P35;sbit ACC0=ACC0;sbit ACC7=ACC7;/ACC累加器=A/ACC.0=E0H /校時(shí)按鍵與C51的引腳連接定義sbit key1=P10; /設(shè)置鍵sbit key2=P11; /加鍵sbit key3=P12; /減鍵sbit buzzer=P15;/蜂鳴器,端口低電平響uchar code tab1=20 - - ; /年顯示的固定字符uchar code tab2= : : ;/時(shí)間顯示的固定字符uchar code wendu=0123456789; /利用一個(gè)溫度表解決溫度顯示亂碼/延時(shí)函數(shù)

26、,后面經(jīng)常調(diào)用void delay(uint xms)/延時(shí)函數(shù),有參函數(shù)uint x,y;for(x=xms;x0;x-) for(y=120;y0;y-);void write_1602com(uchar com)/*液晶寫入指令函數(shù)*rs=0;/數(shù)據(jù)/指令選擇置為指令rw=0; /讀寫選擇置為寫P0=com;/送入數(shù)據(jù)delay(1);en=1;/拉高使能端,為制造有效的下降沿做準(zhǔn)備delay(1);en=0;/en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令void write_1602dat(uchar dat)/*液晶寫入數(shù)據(jù)函數(shù)*rs=1;/數(shù)據(jù)/指令選擇置為數(shù)據(jù)rw=0; /讀寫選擇置為

27、寫P0=dat;/送入數(shù)據(jù)delay(1);en=1; /en置高電平,為制造下降沿做準(zhǔn)備delay(1);en=0; /en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令void lcd_init()/*液晶初始化函數(shù)*write_1602com(0x38);/設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)write_1602com(0x0c);/開顯示不顯示光標(biāo)write_1602com(0x06);/整屏不移動(dòng),光標(biāo)自動(dòng)右移write_1602com(0x01);/清顯示write_1602com(yh+1);/日歷顯示固定符號(hào)從第一行第1個(gè)位置之后開始顯示for(a=0;a14;a+

28、)write_1602dat(tab1a);/向液晶屏寫日歷顯示的固定符號(hào)部分/delay(3);write_1602com(er+2);/時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開始顯示for(a=0;a0;a-) IO=ACC0; SCLK=0; /產(chǎn)生上升沿寫入數(shù)據(jù),從低位寫入 SCLK=1; ACC=ACC1;uchar read_byte()/讀一個(gè)字節(jié)RST=1;for(a=8;a0;a-) ACC7=IO; SCLK=1; /產(chǎn)生下降沿輸出數(shù)據(jù),先輸出低位,保存到ACC中 SCLK=0; ACC=ACC1;return (ACC);void write_1302(uchar ad

29、d,uchar dat)/向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來(lái)源地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制uchar Decimal;D

30、ecimal=bcd4;return(Decimal=Decimal*10+(bcd&=0x0F);void ds1302_init() /1302芯片初始化子函數(shù)(2012-06-18,12:00:00,week7)RST=0;SCLK=0;write_1302(0x8e,0x00); /允許寫,禁止寫保護(hù) write_1302(0x80,0x00); /向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00write_1302(0x82,0x00);/向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00write_1302(0x84,0x12);/向DS1302內(nèi)寫小時(shí)寄存器84H寫入初始小時(shí)數(shù)

31、據(jù)12write_1302(0x8a,0x07);/向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4write_1302(0x86,0x17);/向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)18write_1302(0x88,0x06);/向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)06write_1302(0x8c,0x12);/向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)12write_1302(0x8e,0x80); /打開寫保護(hù)/溫度顯示子函數(shù)void display()uint num; /定義的時(shí)候用uchar宏定義就會(huì)出錯(cuò)uint shi,ge,xiaoshu;

32、 /這里的num,shi,ge,xiaoshu 必須用uint無(wú)符號(hào)整數(shù)來(lái)表示,用uchar字符型則顯示錯(cuò)誤num=Readtemp();shi=num/100;ge=num/10%10;xiaoshu=num%10;write_1602com(0x80+0x40+10);write_1602dat(wendushi);write_1602com(0x80+0x40+11);write_1602dat(wenduge);write_1602com(0x80+0x40+12);write_1602dat(0x2e);write_1602com(0x80+0x40+13);write_1602da

33、t(wenduxiaoshu);write_1602com(0x80+0x40+14);write_1602dat(0xdf);write_1602com(0x80+0x40+15);write_1602dat(0x43);void write_temp(uint add,uint dat)/向LCD寫溫度數(shù)據(jù),并指定顯示位置uint gw,sw;/dat=Readtemp();gw=dat/10%10;/取得個(gè)位數(shù)字sw=dat/100;/取得十位數(shù)字write_1602com(er+add);/er是頭文件規(guī)定的值0x80+0x40write_1602dat(wendusw);/數(shù)字+30

34、得到該數(shù)字的LCD1602顯示碼write_1602dat(wendugw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0xdf);/顯示溫度的小圓圈符號(hào),0xdf是液晶屏字符庫(kù)的該符號(hào)地址碼 write_1602dat(0x43); /顯示C符號(hào),0x43是液晶屏字符庫(kù)里大寫C的地址碼 /時(shí)分秒顯示子函數(shù)void write_sfm(uchar add,uchar dat)/向LCD寫時(shí)分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個(gè)參數(shù)uchar gw,sw;gw=dat%10;/取得個(gè)位數(shù)字sw=dat/10;/取得十位數(shù)字write_1602com(er+add);/

35、er是頭文件規(guī)定的值0x80+0x40write_1602dat(0x30+sw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼write_1602dat(0x30+gw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼 /年月日顯示子函數(shù)void write_nyr(uchar add,uchar dat)/向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個(gè)參數(shù)uchar gw,sw;gw=dat%10;/取得個(gè)位數(shù)字sw=dat/10;/取得十位數(shù)字write_1602com(yh+add);/設(shè)定顯示位置為第一個(gè)位置+addwrite_1602dat(0x30+sw);/數(shù)字+30得到該數(shù)字

36、的LCD1602顯示碼write_1602dat(0x30+gw);/數(shù)字+30得到該數(shù)字的LCD1602顯示碼void write_week(uchar week)/寫星期函數(shù)write_1602com(yh+0x0c);/星期字符的顯示位置switch(week) case 1:write_1602dat(M);/星期數(shù)為1時(shí),顯示 write_1602dat(O); write_1602dat(N); break; case 2:write_1602dat(T);/星期數(shù)據(jù)為2時(shí)顯示 write_1602dat(U); write_1602dat(E); break; case 3:wr

37、ite_1602dat(W);/星期數(shù)據(jù)為3時(shí)顯示 write_1602dat(E); write_1602dat(D); break; case 4:write_1602dat(T);/星期數(shù)據(jù)為4是顯示 write_1602dat(H); write_1602dat(U); break; case 5:write_1602dat(F);/星期數(shù)據(jù)為5時(shí)顯示 write_1602dat(R); write_1602dat(I); break; case 6:write_1602dat(S);/星期數(shù)據(jù)為6時(shí)顯示 write_1602dat(T); write_1602dat(A); brea

38、k; case 7:write_1602dat(S);/星期數(shù)據(jù)為7時(shí)顯示 write_1602dat(U); write_1602dat(N); break;/*鍵盤掃描有關(guān)函數(shù)*void keyscan()if(key1=0)/-key1為功能鍵(設(shè)置鍵)-delay(9);/延時(shí),用于消抖動(dòng)if(key1=0)/延時(shí)后再次確認(rèn)按鍵按下 buzzer=0;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key1);key1n+;if(key1n=9) key1n=1;/設(shè)置按鍵共有秒、分、時(shí)、星期、日、月、年、返回,8個(gè)功能循環(huán)switch(key1n)case 1

39、: TR0=0;/關(guān)閉定時(shí)器 /TR1=0; write_1602com(er+0x09);/設(shè)置按鍵按動(dòng)一次,秒位置顯示光標(biāo) write_1602com(0x0f);/設(shè)置光標(biāo)為閃爍 temp=(miao)/10*16+(miao)%10;/秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80); break;case 2: write_1602com(er+6);/按2次fen位置顯示光標(biāo) /write_1602com(0x0f); break;case 3: wri

40、te_1602com(er+3);/按動(dòng)3次,shi /write_1602com(0x0f); break;case 4: write_1602com(yh+0x0e);/按動(dòng)4次,week /write_1602com(0x0f); break;case 5: write_1602com(yh+0x0a);/按動(dòng)5次,ri /write_1602com(0x0f); break;case 6: write_1602com(yh+0x07);/按動(dòng)6次,yue /write_1602com(0x0f); break;case 7: write_1602com(yh+0x04);/按動(dòng)7次,n

41、ian /write_1602com(0x0f); break;case 8: write_1602com(0x0c);/按動(dòng)到第8次,設(shè)置光標(biāo)不閃爍 TR0=1;/打開定時(shí)器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);/miao數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x80); break; /-加鍵key2- if(key1n!=0)/當(dāng)key1按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零)if(key2=0) /上調(diào)鍵delay(10);if(key2=0)

42、 buzzer=0;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key2);switch(key1n)case 1:miao+;/設(shè)置鍵按動(dòng)1次,調(diào)秒 if(miao=60) miao=0;/秒超過59,再加1,就歸零 write_sfm(0x08,miao);/令LCD在正確位置顯示加設(shè)定好的秒數(shù) temp=(miao)/10*16+(miao)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的BCD碼 write_1302(0x8e,0x00); /允許寫,禁止寫保護(hù) write_1302(0x80,temp); /向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD

43、碼 write_1302(0x8e,0x80); /打開寫保護(hù) write_1602com(er+0x09);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動(dòng)右移,所以要指定返回 /write_1602com(0x0b); break;case 2:fen+; if(fen=60) fen=0; write_sfm(0x05,fen);/令LCD在正確位置顯示加設(shè)定好的分?jǐn)?shù)據(jù) temp=(fen)/10*16+(fen)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x82,temp);/向DS1302內(nèi)寫分

44、寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(er+6);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來(lái)的位置 break;case 3:shi+; if(shi=24) shi=0; write_sfm(2,shi);/令LCD在正確的位置顯示加設(shè)定好的小時(shí)數(shù)據(jù) temp=(shi)/10*16+(shi)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x84,temp);/向DS1302內(nèi)寫小時(shí)寄存器8

45、4H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(er+3);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位 break;case 4:week+; if(week=8) week=1; write_1602com(yh+0x0C);/指定加后的周數(shù)據(jù)顯示位置 write_week(week);/指定周數(shù)據(jù)顯示內(nèi)容 temp=(week)/10*16+(week)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8a

46、,temp);/向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(yh+0x0e);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位 break;case 5:ri+; if(ri=32) ri=1; write_nyr(9,ri);/令LCD在正確的位置顯示加設(shè)定好的日期數(shù)據(jù) temp=(ri)/10*16+(ri)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x86,temp);/向DS

47、1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(yh+10);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位 break;case 6:yue+; if(yue=13) yue=1; write_nyr(6,yue);/令LCD在正確的位置顯示加設(shè)定好的月份數(shù)據(jù) temp=(yue)/10*16+(yue)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x88,temp);/向DS1302內(nèi)

48、寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(yh+7);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位 break;case 7:nian+; if(nian=100) nian=0; write_nyr(3,nian);/令LCD在正確的位置顯示加設(shè)定好的年份數(shù)據(jù) temp=(nian)/10*16+(nian)%10;/十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼 write_1302(0x8e,0x00);/允許寫,禁止寫保護(hù) write_1302(0x8c,temp);/向DS1302

49、內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);/打開寫保護(hù) write_1602com(yh+4);/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位 break;/-減鍵key3,各句功能參照加鍵注釋-if(key3=0)delay(10);/調(diào)延時(shí),消抖動(dòng)if(key3=0) buzzer=0;/蜂鳴器短響一次 delay(20); buzzer=1;while(!key3);switch(key1n) case 1:miao-; if(miao=-1) miao=59;/秒數(shù)據(jù)減到-1時(shí)自動(dòng)變成59 write_sfm(0x08,miao)

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論