版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 萬年歷的設(shè)計與制作</b></p><p> 學(xué) 院_____自動化及其電氣工程______</p><p> 專業(yè)班級_____自動化091______________</p><p> 小組成員_____ __</p><p> 指導(dǎo)老師__
2、___ __________________</p><p> 2011年12月10日</p><p><b> 目錄</b></p><p> 摘要……………………………………………………………………………………3</p><p> 第一章:引言…………………………………………………………………………4<
3、;/p><p> 1.1、設(shè)計目的與意義…………………………………………………4</p><p> 1.2、芯片選擇…………………………………………………………4</p><p> ?。河布枋觥?</p><p> 2.1、時鐘芯片DS1302…………………………………………………………7
4、</p><p> 2.2、溫度傳感器DS18B20…………………………………………………… 9</p><p> 2.3、液晶12864…………………………………………………………………12</p><p> 2.4、單片機STC89C52…………………………………………………………14</p><p> :硬件結(jié)構(gòu)圖分析……………
5、………………………………………………16</p><p> 3.1、單片機………………………………………………………………………16</p><p> 3.2、單片機復(fù)位電路……………………………………………………………16</p><p> 3.3、電路振蕩部分………………………………………………………………17</p><p>
6、3.4、按鍵…………………………………………………………………………17</p><p> 3.5、鬧鐘部分……………………………………………………………………17</p><p> 3.6、溫度傳感器接口電路………………………………………………………18</p><p> 3.7、時鐘電路……………………………………………………………………18</p&
7、gt;<p> 3.8、液晶12864…………………………………………………………………18</p><p> 3.9、程序下載接口………………………………………………………………19</p><p> 3.10、電源接口電路………………………………………………………………19</p><p> 結(jié)束語………………………………………………………
8、………………………… 20</p><p> 致謝………………………………………………………………………………………20</p><p> 附1:電路原理圖………………………………………………………………………21</p><p> 附2:電路PCB圖………………………………………………………………………21</p><p> 附3:
9、實物圖演示………………………………………………………………………22</p><p> 附4:程序代碼…………………………………………………………………………29</p><p> 摘要: 隨著科技的快速發(fā)展,時間的流逝,至從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀錄。美國DALLAS公司推出的具有涓細電流充電能的低功耗實時時鐘電路DS1302。它可以對年、月、日、周日、時、
10、分、秒進行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準(zhǔn)等功能。溫度的測量用DALLAS公司的DS18B20芯片。</p><p> 電路采用STC89C52單片機作為核心,輔助于必要地外圍電路,用C語言編寫程序,并進行模塊化編程設(shè)計萬年歷,讀取并寫指令到DS1302、DS18B20
11、芯片中,并將讀出的結(jié)果顯示在LCD12864中,具有功能穩(wěn)定,精度高地特點。</p><p> 關(guān)鍵詞:單片機,STC89C52,;DS1302;DS18B20,;LCD12864</p><p><b> 第一章 引言</b></p><p> 1.1設(shè)計目的與意義</p><p> 隨著電子技術(shù)的高速發(fā)展,對
12、電子方面人才的要求越來越高,不僅要求其具備相關(guān)的專業(yè)理論知識,還要求其具有較強的設(shè)計、制作等實踐動手能力.本次課程設(shè)計正是給我們提供了一個很好的鍛煉機會,增強對專業(yè)的興趣,提高對專業(yè)的認識。</p><p><b> 1.2、芯片選擇</b></p><p> 1.2.1、時鐘芯片選擇</p><p> 方案一:不使用芯片,采用單片機的定
13、時計數(shù)器</p><p> 這種方法原理是利用單片機芯片的定時器來產(chǎn)生固定的時間,模擬時鐘的時, 分,秒。如:利用AT80C52芯片,定時器用工作方式1,每50ms產(chǎn)生一個中斷,循環(huán)20次,即1s周期。每一個周期加1,那么1min為60個周期,1h就是60*60=3600個周期,一天就是3600*24=86400個周期。</p><p> 此方法優(yōu)點是可以省去一些外圍的芯片,但這種方法
14、只能適用于一些要求不是十分精確,不做長期保留的場合。</p><p> 方案二:并行接口時鐘芯片 DS12887</p><p> 特點:采用單片機應(yīng)用系統(tǒng)并行總線(三總線)擴展的接口電路,采用這種接口電路具有操作速度快,編程方便的優(yōu)點。</p><p> 但是對于80C52單片機來說,低位地址線要通過鎖存器輸出,還要地址譯碼器,而且并行口芯片的體積相對較大,
15、DS12887管腳圖如圖1示。</p><p> 圖1 DS12887管腳</p><p> 方案三:串行接口時鐘芯片DS1302</p><p><b> 芯片主特性:</b></p><p> (1)實時時鐘具有能計算2100 年之前的秒分時日日期星期月年的能力,還有閏年調(diào)整的能力</p>&l
16、t;p> ? (2)31 8 位暫存數(shù)據(jù)存儲RAM</p><p> ?(3)串行 I/O 口方式使得管腳數(shù)量最少</p><p> ?(4)寬范圍工作電壓2.0 5.5V</p><p> ?(5)工作電流 2.0V 時,小于300nA</p><p> ?(5)讀/寫時鐘或RAM 數(shù)據(jù)時有兩種傳送方式單字節(jié)傳送和多字節(jié)傳送
17、字符組方式</p><p> ?(6)8 腳DIP 封裝或可選的8 腳SOIC 封裝根據(jù)表面裝配</p><p> ?(7)簡單 3 線接口</p><p> ?(8)與 TTL 兼容Vcc=5V</p><p> ?(9)可選工業(yè)級溫度范圍-40 +85</p><p> 優(yōu)點:串行接口的日歷時鐘芯片,使用
18、簡單,接口容易,與微型計算機連線較少等特點,在單片機系統(tǒng)尤其是手持式信息設(shè)備中己得到了廣泛的應(yīng)用。</p><p> 所以,最終選擇串行時鐘芯片DS1302,DS1302的管腳圖如圖2所示。</p><p> 圖2 DS1302管腳圖</p><p> 1.2.2、鍵盤選擇</p><p><b> 方案一:矩陣式鍵盤<
19、;/b></p><p> 矩陣式鍵盤電路圖如圖3所示。</p><p><b> 圖3 矩陣式鍵盤</b></p><p> 行列式鍵盤的原理就是每一行線與每一列線的交叉地方不相通,而是接上一個按鍵,通過按鍵來接通。</p><p> 特點: 以省出不少的I/O 口資源,程序編寫相對復(fù)雜點,適用于鍵數(shù)比較
20、多的情況。</p><p> 方案二: 獨立式鍵盤</p><p> 獨立式鍵盤電路圖如圖4所示。</p><p><b> 圖4 獨立式鍵盤</b></p><p> 獨立式鍵盤是指各個按鍵相互獨立地連接到各自的單片機的I/O 口,I/O口只需要做輸入口就能讀到所有的按鍵。</p><p&g
21、t; 特點: 電路簡單,程序容易寫,適用于按鍵數(shù)較少的情況。</p><p> 所以我們選擇獨立式鍵盤。</p><p> 1.2.3顯示模塊選擇</p><p> 方案一:LED數(shù)碼管顯示</p><p> 數(shù)碼管顯示比較常用的是采用CD4511和74LS138實現(xiàn)數(shù)碼轉(zhuǎn)換,數(shù)碼顯示分動態(tài)顯示和靜態(tài)顯示,靜態(tài)顯示具有鎖存功能,可以
22、使數(shù)據(jù)顯示得很清楚,但浪費了一些資源。目前單片機數(shù)碼管普通采用動態(tài)顯示。編程簡單,但只能顯示數(shù)字,不能顯示中文。</p><p> 方案二:LCD1602</p><p> 能夠顯示英文和數(shù)字。 1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號。</p><p> 方案
23、三:LCD12864</p><p> 作為一種輸出方式,液晶顯示最大的特點就是能夠?qū)崿F(xiàn)友好的人機界面,它己經(jīng)廣泛應(yīng)用于現(xiàn)代工業(yè)控制和智能化儀器儀表等領(lǐng)域,它己經(jīng)成為單片機就用開發(fā)領(lǐng)域典型模塊之一。能夠方便的顯示文字和數(shù)字。</p><p> 所以最終選擇LCD12864。</p><p><b> 第二章、硬件描述</b></p&
24、gt;<p> 2.1、時鐘芯片DS1302</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電
25、(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。DS1302的外部引腳分配如圖1所示及內(nèi)部結(jié)構(gòu)如圖2所示。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應(yīng)用于測量系統(tǒng)中。</p><p> 圖1 DS1302的外部引腳分配</p><p> 圖2 DS1302的內(nèi)部結(jié)構(gòu)&l
26、t;/p><p><b> 各引腳的功能為:</b></p><p> Vcc1:主電源;Vcc2:備份電源。當(dāng)Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p> SCLK:串行時鐘,輸入,控制數(shù)據(jù)的輸入與輸出; </p><
27、p> I/O:三線接口時的雙向數(shù)據(jù)線;</p><p> CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結(jié)束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p> DS1302有下列幾組寄存器:</p><p> ?、?DS1302有關(guān)日歷、時間的寄存器共有12個,其中有7個寄存器(讀
28、時81h~8Dh,寫時80h~8Ch),存放的數(shù)據(jù)格式為BCD碼形式,如圖3所示。</p><p> 圖 3 DS1302有關(guān)日歷、時間的寄存器</p><p> 小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當(dāng)為高時,選擇12小時模式。在12小時模式時,位5是 ,當(dāng)為1時,表示PM。在24小時模式時,位5是第二個10小時位。</
29、p><p> 秒寄存器(81h、80h)的位7定義為時鐘暫停標(biāo)志(CH)。當(dāng)該位置為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位置為0時,時鐘開始運行。</p><p> 控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在任何的對時鐘和RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時,寫保護位防止對任一寄存器的寫操作。</p><p
30、> ?、贒S1302有關(guān)RAM的地址</p><p> DS1302中附加31字節(jié)靜態(tài)RAM的地址如圖4所示。</p><p><b> 圖4</b></p><p> ③ DS1302的工作模式寄存器</p><p> 所謂突發(fā)模式是指一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。突發(fā)模式寄存器如圖5所示。&l
31、t;/p><p><b> 圖5</b></p><p> ④此外,DS1302還有充電寄存器等。</p><p><b> 2 讀寫時序說明</b></p><p> DS1302是SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。</p><p&
32、gt; 要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如圖6。</p><p> 圖6 控制字(即地址及命令字節(jié))</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p>
33、<p> 位5至位1(A4~A0):指示操作單元的地址;</p><p> 位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p> 控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從最低位(0位)開始。同樣,在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的
34、數(shù)據(jù),讀出的數(shù)據(jù)也是從最低位到最高位。數(shù)據(jù)讀寫時序如圖7 。</p><p> 圖7 數(shù)據(jù)讀寫時序</p><p> 具體操作見驅(qū)動程序。</p><p><b> 3 電路原理圖:</b></p><p> 電路原理圖如圖8,DS1302與單片機的連接也僅需要3條線:CE引腳、SCLK串行時鐘引腳、I/O串行
35、數(shù)據(jù)引腳,Vcc2為備用電源,外接32.768kHz晶振,為芯片提供計時脈沖。</p><p><b> 圖8</b></p><p> 2.2、溫度傳感器DS18B20</p><p> 由DALLAS半導(dǎo)體公司生產(chǎn)的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事等領(lǐng)域的溫度測量及
36、控制儀器、測控系統(tǒng)和大型設(shè)備中。它具有體積小,接口方便,傳輸距離遠等特點。 </p><p> 1、DS18B20性能特點 DS18B20的性能特點:①采用單總線專用技術(shù),既可通過串行口線,也可通過其它I/O口線與微機接口,無須經(jīng)過其它變換電路,直接輸出被測溫度值(9位二進制數(shù),含符號位),②測溫范圍為-55℃-+125℃,測量分辨率為0.0625℃,③內(nèi)含64位經(jīng)過激光修正的只讀存儲器ROM,④適配各種單
37、片機或系統(tǒng)機,⑤用戶可分別設(shè)定各路溫度的上、下限,⑥內(nèi)含寄生電源。 2、DS18B20內(nèi)部結(jié)構(gòu) DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM,溫度傳感器,非揮發(fā)的溫度報警觸發(fā)器TH和TL,高速暫存器。DS18B20的管腳排列如圖9所示。 64位光刻ROM是出廠前被光刻好的,它可以看作是該DS18B20的地址序列號。不同的器件地址序列號不同。 </p><p> 圖9
38、;DS18B20引腳分布圖 </p><p> DS18B20高速暫存器共9個存存單元,如表所示: </p><p> 以12位轉(zhuǎn)化為例說明溫度高低字節(jié)存放形式及計算:12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在18B20的兩個高低兩個8位的RAM中,二進制中的前面5位是符號位。如果測得的溫度大于0,這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這5
39、位為1,測到的數(shù)值需要取反加1再乘于0.0625才能得到實際溫度。 </p><p> 1、DS18B20控制方法 </p><p> 在硬件上,DS18B20與單片機的連接有兩種方法,一種是Vcc接外部電源,GND接地,I/O與單片機的I/O線相連;另一種是用寄生電源供電,此時UDD、GND接地,I/O接單片機I/O。無論是內(nèi)部寄生電源還是外部供電,I/O口線要接5KΩ左右的上拉電阻
40、。 </p><p> DS18B20有六條控制命令,如表所示: </p><p> CPU對DS18B20的訪問流程是:先對DS18B20初始化,再進行ROM操作命令,最后才能對存儲器操作,數(shù)據(jù)操作。DS18B20每一步操作都要遵循嚴格的工作時序和通信協(xié)議。如主機控制DS18B20完成溫度轉(zhuǎn)換這一過程,根據(jù)DS18B20的通訊協(xié)議,須經(jīng)三個步驟:每一次讀寫之前都要對DS18B20進行
41、復(fù)位,復(fù)位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預(yù)定的操作。</p><p> 2.3、液晶LCD12864</p><p> ST7920提供了用于繪圖的GDRAM(graph display RAM)。共 64×32 個字節(jié)的空間(由擴充指令設(shè)定繪圖 RAM 地址),最多可以控
42、制 256×64點陣的二維繪圖緩沖空間。在它的Datasheet給出了GDRAM的坐標(biāo)地址對照表: </p><p> 用坐標(biāo)表示,就是這樣: </p><p> 2.4、單片機STC89C52</p><p> STC89C52RC單片機是宏晶科技推出的新一代高速/低功耗/超強抗干擾的單片機,指令代碼完全兼容傳統(tǒng)8051單片機,12時鐘/
43、機器周期和6時鐘/機器周期可以任意選擇。</p><p><b> 主要特性如下:</b></p><p> 增強型8051單片機,6時鐘/機器周期和12時鐘/機器周期可以任意選擇,指令代碼完全兼容傳統(tǒng)8051.</p><p> 工作電壓:5.5V~3.3V(5V單片機)/3.8V~2.0V(3V單片機)</p><
44、p> 工作頻率范圍:0~40MHz,相當(dāng)于普通8051的0~80MHz,實際工作頻率可達48MHz</p><p> 用戶應(yīng)用程序空間為8K字節(jié)</p><p> 片上集成512字節(jié)RAM</p><p> 通用I/O口(32個),復(fù)位后為:P1/P2/P3/P4是準(zhǔn)雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口用
45、時,需加上拉電阻。</p><p> ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成一片</p><p> 具有EEPROM功能</p><p><b> 具有看門狗功能</b></p><p> 共3
46、個16位定時器/計數(shù)器。即定時器T0、T1、T2</p><p> 外部中斷4路,下降沿中斷或低電平觸發(fā)電路,Power Down模式可由外部中斷低電平觸發(fā)中斷方式喚醒</p><p> 通用異步串行口(UART),還可用定時器軟件實現(xiàn)多個UART</p><p> 工作溫度范圍:-40~+85℃(工業(yè)級)/0~75℃(商業(yè)級)</p><
47、p><b> PDIP封裝</b></p><p> STC89C52RC單片機的工作模式</p><p> 掉電模式:典型功耗<0.1μA,可由外部中斷喚醒,中斷返回后,繼續(xù)執(zhí)行原程序</p><p> 空閑模式:典型功耗2mA</p><p> 正常工作模式:典型功耗4Ma~7mA</p&
48、gt;<p> 掉電模式可由外部中斷喚醒,適用于水表、氣表等電池供電系統(tǒng)及便攜設(shè)備</p><p> STC89C52RC引腳圖</p><p> 第三章、硬件結(jié)構(gòu)圖分析</p><p><b> 3.1、單片機部分</b></p><p> 單片機IO引腳接線如上圖所示P1.0,P1.1,P1.
49、2,P1.3,P3.2,P3.3接地是6個輕觸開關(guān),</p><p> P1.6,P1.7,P3.5是時鐘芯片DS1302與單片機的接腳。XAT1,XAT2接時鐘晶振,P3.0-RXD,P3.1-TXD用于程序下載,串口通信。P2.1接蜂鳴器,用于控制鬧鐘。P2.4,P2.5,P2.6,P2.7分別是LCD12864的串并口選擇線,數(shù)據(jù)/命令選擇線,讀/寫選擇線,使能線,控制LCD12864的信號,P0口是并行
50、口數(shù)據(jù)輸入輸出線。</p><p> 3.2、單片機復(fù)位電路</p><p> 此功能是按鍵復(fù)位,平時處于低電平,電路不復(fù)位,按鍵按下,電路復(fù)位信號有效,單片機復(fù)位。</p><p> 3.3、電路晶振部分</p><p> ATX1,ATX2接單片機的18,19號引腳。晶振大小位12M,為保證晶振快速,穩(wěn)定起振,接兩個22~33pf
51、的電容。</p><p><b> 3.4、按鍵部分</b></p><p> 按鍵S2~S7按鍵功能分別是:P1.0子功能調(diào)節(jié)選項,P1.1數(shù)據(jù)加加,P1.2數(shù)據(jù)減減,P1.3確定設(shè)置,P3.2功能選擇,P3.3進入功能。</p><p><b> 3.5、鬧鐘部分</b></p><p>
52、 單片機的P2.1引腳高低電平觸發(fā)PNP三極管關(guān)斷開通,從而控制蜂鳴器的名叫與否。</p><p> 3.6、溫度傳感器DS18B20接口電路</p><p> P4的3腳接VCC,1腳接GND,2腳是信號線,連接在單片機P2.3腳,讀取單片機命令或傳送數(shù)據(jù)給單片機。2腳接了個上拉電阻,增大單片機灌電流。</p><p> 3.7、時鐘電路DS1302接法&
53、lt;/p><p> VCC2接5V電源,VCC1則是后背電源,用于特殊情況下,掉電時后背電源工作,保存數(shù)據(jù)。X1,X2接一個值為32768的晶振,準(zhǔn)確提供時鐘。第5、6、7腳分別接RES復(fù)位信號,I/O輸入輸出信號,時鐘脈沖信號,三線配合著讀寫數(shù)據(jù)指令。</p><p> 3.8液晶12864(帶中文字庫)</p><p> RS、R/W、EN分別是LCD128
54、64的串并口選擇線,數(shù)據(jù)/命令選擇線,讀/寫選擇線,使能線,配合8跟并行數(shù)據(jù)線,與單片機通信,執(zhí)行單片機指令,顯示相應(yīng)的點、字、圖等。電位器RW用于調(diào)節(jié)對比度。</p><p><b> 3.9程序下載接口</b></p><p> RXD,TXD用于下載程序、串口通信用。PC機通過MAX232將232電平轉(zhuǎn)換為TTL電平,把程序下載如單片機中。</p>
55、;<p> 3.10、電源接口電路</p><p> 由于本電路圖直接接的是5V電壓,是器件正常電壓,所以沒有設(shè)計穩(wěn)壓部分,如果涉及到穩(wěn)壓部分,可以接芯片7805,穩(wěn)壓值位5V,如果需要3、3V電壓,則需要TPS75733芯片。本電路電源由Power排陣接入。設(shè)有一個電源開關(guān),并有電源信號燈,檢測是否上電。</p><p><b> 結(jié)束語</b>
56、</p><p> 通過對單片機的研究于設(shè)計,完成了在LCD12864上顯示時鐘,,時鐘界面切換,溫度,設(shè)置鬧鐘,設(shè)置時間,設(shè)置圖片,自檢功能等。在這段課程設(shè)計期間,學(xué)習(xí)到了很多。本功能程序采用模塊化編程,加速了完成的時間,代碼量有7K左右,可以燒入STC89C52,并且顯示穩(wěn)定。代碼寫好后,就開始畫板子,先畫原理圖,在畫PCB圖。在附錄中會給出圖。</p><p> Main函數(shù)中用
57、了許多嵌套,所以可能不容易看懂,不過都作了說明。我現(xiàn)在一直在學(xué)ucOS,如果用ucOS來寫這個程序也許架構(gòu)會清晰許多。但本人能力所限,有些功能并不完善,以后還需修改。</p><p><b> 致謝</b></p><p> 感謝我小組的成員,他們給了我許多支持與幫助,還要感謝xx老師提供了許多技術(shù)支持,他豐富的教學(xué)及實際操作經(jīng)驗、嚴謹?shù)闹螌W(xué)態(tài)度,以及和藹的態(tài)度,
58、使得我投入了大量時間在實驗室中,做了許多實驗。而這,對我的幫助和影響是非常巨大的。正是因為有了這些鍛煉的機會,我才能非常順利地完成我的課程設(shè)計。</p><p><b> 參考文獻</b></p><p> [1] 周興華編著. 手把手教你學(xué)單片機C程序設(shè)計.北京:北京航空航天大學(xué)出版社,2007</p><p> [2] 侯玉寶編著.
59、基于Proteus的51系列單片機設(shè)計與仿真. 北京:電子工業(yè)出版社,2008</p><p> [3] 張義和編著. 例說51單片機(C語言). 北京:人民郵電出版社. 2008</p><p><b> 附1:電路原理圖</b></p><p><b> 附2:電路PCB圖</b></p><
60、p><b> 附3:實物圖演示</b></p><p><b> 附4:程序代碼</b></p><p> GLOBLE.H程序:</p><p> #ifndef __GLOBLE_H__</p><p> #define __GLOBLE_H__ </p>&l
61、t;p> #include <reg52.h></p><p> #define uchar unsigned char </p><p> #define uint unsigned int </p><p><b> #endif</b></p><p> DS1302.H程序:</
62、p><p> #ifndef __DS1302_H__</p><p> #define __DS1302_H__</p><p> #include "globle.h"</p><p> void DS1302_write_byte(uchar dat);</p><p> uchar D
63、S1302_read_byte(void);</p><p> void DS1302_write_data(uchar add,uchar dat);</p><p> uchar DS1302_read_data(uchar add);</p><p> extern void DS1302_init();</p><p> ex
64、tern void DS1302_process();</p><p><b> #endif</b></p><p> DS1302.C程序</p><p> #include "DS1302.h"</p><p> #include "delay.h"</p>
65、;<p> sbit SCLK=P1^6;</p><p> sbit IO=P3^5;</p><p> sbit RST=P1^7;</p><p> uchar DS1302_sec,DS1302_min,DS1302_hour,DS1302_mon,DS1302_day,DS1302_year,DS1302_week;</p>
66、;<p> extern uchar DS1302_sec1,DS1302_sec2;</p><p> extern uchar DS1302_min1,DS1302_min2;</p><p> extern uchar DS1302_hour1,DS1302_hour2;</p><p> extern uchar DS1302_mon1
67、,DS1302_mon2;</p><p> extern uchar DS1302_day1,DS1302_day2;</p><p> extern uchar DS1302_year1,DS1302_year2;</p><p> extern uchar DS1302_week1,DS1302_week2; </p><p>
68、 void DS1302_write_byte(uchar dat) //寫字節(jié)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備</p><p> delay
69、_1us(2); </p><p> for(i=0;i<8;i++) //連續(xù)寫8個二進制位數(shù)據(jù)</p><p><b> {</b></p><p> IO=dat&0x01; //取出dat的第0位數(shù)據(jù)寫入1302,低位在前,高位在后</p><p> delay_1us(2);</p&
70、gt;<p> SCLK=1; //上升沿寫入數(shù)據(jù)</p><p> delay_1us(2);</p><p> SCLK=0; //重新拉低SCLK,形成脈沖</p><p> dat>>=1; //將dat的各個數(shù)據(jù)右移1位,準(zhǔn)備寫入下一個數(shù)據(jù)</p><p><b> }<
71、;/b></p><p><b> }</b></p><p> uchar DS1302_read_byte(void) //讀字節(jié)</p><p><b> {</b></p><p> uchar i,dat;</p><p> delay_1u
72、s(2);</p><p> for(i=0;i<8;i++) //連續(xù)讀8個二進制位數(shù)據(jù)</p><p><b> {</b></p><p> dat>>=1; //將dat的各個數(shù)據(jù)右移1,因為先讀出的是字節(jié)的最低位</p><p> if(IO==1) //如果讀出的數(shù)據(jù)是1&
73、lt;/p><p> dat|=0x80; //將1取出,寫在dat的最高位</p><p> SCLK=1; //為下降沿讀出</p><p> delay_1us(2); </p><p> SCLK=0; //形成脈沖下降沿</p><p> delay_1us(2);</p>
74、<p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> void DS1302_write_data(uchar add,uchar dat) //寫數(shù)據(jù)</p><p><b> {&l
75、t;/b></p><p><b> RST=0;</b></p><p><b> SCLK=0;</b></p><p><b> RST=1;</b></p><p> DS1302_write_byte(add);</p><p>
76、 DS1302_write_byte(dat);</p><p><b> SCLK=1;</b></p><p><b> RST=0;</b></p><p><b> }</b></p><p> uchar DS1302_read_data(uchar add
77、) //讀數(shù)據(jù)</p><p><b> {</b></p><p> uchar add1;</p><p><b> RST=0;</b></p><p><b> SCLK=0;</b></p><p><b> RS
78、T=1;</b></p><p> DS1302_write_byte(add);</p><p> add1=DS1302_read_byte();</p><p><b> SCLK=1;</b></p><p><b> RST=0;</b></p><
79、p> return(add1);</p><p><b> }</b></p><p> void DS1302_init()</p><p><b> {</b></p><p> DS1302_write_data(0x8e,0x00);//關(guān)閉寫保護</p>&l
80、t;p> DS1302_write_data(0x90,0xaa);//定義充電</p><p> DS1302_write_data(0x80,0x55);//秒</p><p> DS1302_write_data(0x82,0x59);//分</p><p> DS1302_write_data(0x84,0x23);//時</p>
81、<p> DS1302_write_data(0x86,0x09);//日</p><p> DS1302_write_data(0x88,0x12);//月</p><p> DS1302_write_data(0x8a,0x05);//星期</p><p> DS1302_write_data(0x8c,0x11);//年</p>
82、<p> DS1302_write_data(0x8e,0x80);//打開寫保護 </p><p><b> }</b></p><p> void DS1302_process()</p><p><b> {</b></p><p> DS1302_sec=DS130
83、2_read_data(0x81);//從秒寄存器讀數(shù)據(jù)</p><p> DS1302_sec1=DS1302_sec&0x0f;//秒的各位</p><p> DS1302_sec2=DS1302_sec>>4;//秒的十位</p><p> DS1302_min=DS1302_read_data(0x83);//從分寄存器讀數(shù)據(jù)
84、</p><p> DS1302_min1=DS1302_min&0x0f;//分的各位</p><p> DS1302_min2=DS1302_min>>4;//分的十位</p><p> DS1302_hour=DS1302_read_data(0x85);//從小時寄存器讀數(shù)據(jù)</p><p> DS1
85、302_hour1=DS1302_hour&0x0f;//小時的各位</p><p> DS1302_hour2=DS1302_hour>>4;//小時的十位</p><p> DS1302_day=DS1302_read_data(0x87);//從日寄存器讀數(shù)據(jù)</p><p> DS1302_day1=DS1302_day&am
86、p;0x0f;//日的各位</p><p> DS1302_day2=DS1302_day>>4;//日的十位</p><p> DS1302_mon=DS1302_read_data(0x89);//從月寄存器讀數(shù)據(jù)</p><p> DS1302_mon1=DS1302_mon&0x0f;//月的各位</p>&l
87、t;p> DS1302_mon2=DS1302_mon>>4;//月的十位</p><p> DS1302_week=DS1302_read_data(0x8b);//從星期寄存器讀數(shù)據(jù)</p><p> DS1302_week1=DS1302_week&0x0f;//星期</p><p> DS1302_year=DS130
88、2_read_data(0x8d);//從年寄存器讀數(shù)據(jù)</p><p> DS1302_year1=DS1302_year&0x0f;//年的各位</p><p> DS1302_year2=DS1302_year>>4;//年的十位</p><p><b> }</b></p><p>
89、; DS18B20.H程序</p><p> #ifndef __DS18B20_H__</p><p> #define __DS18B20_h__</p><p> extern uchar temph,templ,flag;</p><p> void write_byte(uchar date);</p>&l
90、t;p> uchar read_byte();</p><p> void init_ds18b20();</p><p> extern void read_temp();</p><p><b> #endif</b></p><p> DS18B20.C程序</p><p>
91、 #include "globle.h"</p><p> #include "delay.h"</p><p> #include "ds18b20.h"</p><p> uchar temph,templ,flag;</p><p> sbit dq=P2^3;<
92、;/p><p> void write_byte(uchar date)//寫數(shù)據(jù)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<8;i++)</p><p><b>
93、{</b></p><p><b> dq=0;</b></p><p> dq=date&0x01;</p><p> delay_1us(5);</p><p><b> dq=1;</b></p><p><b> date>
94、;>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> uchar read_byte()//讀數(shù)據(jù)</p><p><b> {</b></p><p> uch
95、ar i,value=0;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> dq=0;</b></p><p> value>>=1;</p><p><b> dq=1
96、;</b></p><p> if(dq==1)value|=0x80;</p><p> delay_1us(4);</p><p><b> }</b></p><p> return value; //返回數(shù)值</p><p><b> }</b&g
97、t;</p><p> void init_ds18b20() //ds18b20初始化(復(fù)位)</p><p><b> {</b></p><p><b> uchar n;</b></p><p><b> dq=1;</b></p><p
98、> delay_1us(8);</p><p><b> dq=0;</b></p><p> delay_1us(80);</p><p><b> dq=1;</b></p><p> delay_1us(4);</p><p><b> n=
99、dq;</b></p><p> delay_1us(20);</p><p><b> }</b></p><p> extern void read_temp()</p><p><b> {</b></p><p> uchar a=0,b=0;&
100、lt;/p><p> init_ds18b20();</p><p> write_byte(0xcc);//跳過ROM</p><p> write_byte(0x44);//啟動溫度測量</p><p> delay_1us(300); //給足夠時間處理數(shù)據(jù)</p><p> init_ds18b20(
101、);</p><p> write_byte(0xcc); //跳過ROM</p><p> write_byte(0xbe); //讀溫度</p><p> delay_1us(100);</p><p> a=read_byte();//讀低8位</p><p> b=read_byte();//讀高
102、8位</p><p> flag=(b&0x80)>>7;</p><p> temph=b<<4;</p><p> temph+=((a&0xf0)>>4);//小數(shù)點前的數(shù)據(jù)</p><p> templ=0.625*(a&0x0f); //小數(shù)點后的數(shù)據(jù)&l
103、t;/p><p><b> }</b></p><p><b> DELAY.H程序</b></p><p> #ifndef __DELAY_H__</p><p> #define __DELAY_H__</p><p> extern void delay_1us
104、(uint t);</p><p><b> #endif</b></p><p><b> DELAY.C程序</b></p><p> #include "globle.h"</p><p> #include "delay.h"</p>
105、;<p> extern void delay_1us(uint t)</p><p><b> {</b></p><p> while(t--);</p><p><b> }</b></p><p> LCD12864.H程序</p><p>
106、 #ifndef __LCD12864_H__</p><p> #define __LCD12864_H__</p><p> #include <reg52.h></p><p> void LCD12864_write_com(uchar com);//寫指令</p><p> uchar LCD12864_rea
107、d_data(); //讀數(shù)據(jù)</p><p> void LCD12864_write_data(uchar dat); //寫數(shù)據(jù)</p><p> void LCD12864_init();//初始化</p><p> void LCD12864_disp_str(uchar code *s); // 可以寫數(shù)組 table[]="——4行
108、X8=32個漢子——"形似的字符</p><p> void LCD12864_halfclr_scan(uchar color); //上下半屏雙行一起掃,color=1,反白掃</p><p> void LCD12864_fullclr_scan(uchar color); //單行掃,從第一行掃到最后一行,color=1,反白掃</p><p
109、> void LCD12864_disp_pic(uchar *s); //整屏顯示圖片,字模由取模工具取得</p><p> void LCD12864_disp_word(uchar addx,uchar addy,uchar color,uchar *s);//坐標(biāo)說明:addx:0-7,addy:0-63,color=1,反白顯示</p><p> void LC
110、D12864_anyfb(uchar addx0,uchar addx1,uchar addy0,uchar addy1,uchar color); //任意反白,坐標(biāo) X:0-7,Y:0-63</p><p> void LCD12864_disp_word1(uchar addx,uchar addy,uchar color,uchar *s);//坐標(biāo)說明:addx:0-7,addy:0-63,32*3
111、2點陣字</p><p> void LCD12864_disp_word2(uchar addx,uchar addy,uchar color,uchar *s);//坐標(biāo)說明:addx:0-7,addy:0-63,16*32點陣字</p><p><b> #endif</b></p><p> LCD12864.C程序</p
112、><p> #include "globle.h"</p><p> #include "lcd12864.h"</p><p> #include "delay.h"</p><p> sbit rs=P2^5;</p><p> sbit rw=P2
113、^6;</p><p> sbit en=P2^7;</p><p> sbit psb=P2^4;</p><p> void LCD12864_write_com(uchar com)//寫指令</p><p><b> {</b></p><p> rs=0;//指令&
114、lt;/p><p> rw=0;//寫</p><p><b> en=0;</b></p><p> delay_1us(12);</p><p><b> P0=com;</b></p><p> en=1;//下降沿有效</p>
115、<p> delay_1us(12);</p><p><b> en=0;</b></p><p><b> }</b></p><p> void LCD12864_write_data(uchar dat) //寫數(shù)據(jù)</p><p><b> {</b&g
116、t;</p><p> rs=1; //數(shù)據(jù)</p><p> rw=0; //寫</p><p><b> en=0;</b></p><p><b> P0=dat;</b></p><p> delay_1us(12);</p&g
117、t;<p> en=1; //下降沿有效</p><p> delay_1us(12);</p><p><b> en=0;</b></p><p><b> }</b></p><p> void LCD12864_init()//初始化</p>
118、<p><b> {</b></p><p> delay_1us(20);</p><p> LCD12864_write_com(0x30); //功能設(shè)定,不擴充指令集動作,實現(xiàn)基本指令集動作</p><p> delay_1us(20);</p><p> LCD12864_write_c
119、om(0x30);</p><p> delay_1us(20);</p><p> LCD12864_write_com(0x0c);//開整體顯示,開游標(biāo)顯示,開游標(biāo)位子</p><p> delay_1us(20);</p><p> LCD12864_write_com(0x01);//清除顯示</p><
120、p> delay_1us(20);</p><p> LCD12864_write_com(0x06);//進入點設(shè)置,基本上寫0x06</p><p> delay_1us(20); </p><p><b> }</b></p><p> void LCD12864_disp_str(uchar co
121、de *s) // 可以寫數(shù)組 table[]="——4行X8=32個漢子——"形似的字符</p><p><b> {</b></p><p><b> uchar i;</b></p><p> LCD12864_write_com(0x30);</p><p> L
122、CD12864_write_com(0x80);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> LCD12864_write_data(*s++);</p><p><b> }</b></p><p&
123、gt; LCD12864_write_com(0x90);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> LCD12864_write_data(*s++);</p><p><b> }</b></p>
124、<p> LCD12864_write_com(0x88);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> LCD12864_write_data(*s++);</p><p><b> }</b></p
125、><p> LCD12864_write_com(0x98);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> LCD12864_write_data(*s++);</p><p><b> }</b>
126、;</p><p><b> }</b></p><p> void LCD12864_halfclr_scan(uchar color) //上下半屏雙行一起掃,color=1,反白掃</p><p><b> {</b></p><p> uchar x,y,temp;</p&
127、gt;<p> if(color%2==0) temp=0x00; </p><p> else temp=0xff;</p><p> LCD12864_write_com(0x36);</p><p> for(y=0;y<32;y++)</p><p><b> {<
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計--萬年歷電子時鐘
- java萬年歷課程設(shè)計
- 萬年歷課程設(shè)計報告
- 數(shù)字萬年歷課程設(shè)計
- java課程設(shè)計--萬年歷
- 萬年歷課程設(shè)計論文
- 課程設(shè)計-萬年歷系統(tǒng)
- 萬年歷課程設(shè)計報告
- 數(shù)碼萬年歷課程設(shè)計
- 萬年歷課程設(shè)計.doc
- java課程設(shè)計--萬年歷設(shè)計
- dsp課程設(shè)計-萬年歷設(shè)計
- 電子萬年歷設(shè)計與制作
評論
0/150
提交評論