版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告 書</p><p> 所屬課程名稱 單片機(jī)原理及應(yīng)用 </p><p> 題 目 基于單片機(jī)的電子萬(wàn)年歷 </p><p> 分 院 </p><p> 專業(yè)班級(jí) </p>&
2、lt;p> 學(xué) 號(hào) </p><p> 學(xué)生姓名 </p><p> 指導(dǎo)教師 </p><p> 2012 年 5月 22日 </p><p> 課 程 設(shè) 計(jì)( 論 文 )任 務(wù) 書</p><p
3、> 專 業(yè) 班 級(jí) 姓名 </p><p> 一、課程設(shè)計(jì)(論文)題目 基于單片機(jī)的電子萬(wàn)年歷 </p><p> 二、課程設(shè)計(jì)(論文)工作:自 年 月 日起至 年 月 日止。</p><p> 三
4、、課程設(shè)計(jì)(論文)的內(nèi)容要求:</p><p> 一、 內(nèi)容:利用單片機(jī)、時(shí)鐘芯片、溫度傳感器、數(shù)碼管等實(shí)現(xiàn)日期、時(shí)間、溫度的顯示那一個(gè)簡(jiǎn)單的萬(wàn)年歷。 </p><p> 2 、要求 :、通過萬(wàn)年歷的設(shè)計(jì)要掌握好對(duì)Proteus仿真設(shè)計(jì)的熟練使用;
5、 </p><p> 、通過萬(wàn)年歷的設(shè)計(jì)要熟練掌握單片機(jī)的各個(gè)功能,并且能對(duì)單片機(jī)有一個(gè)總體的把握,在設(shè)計(jì)的過程中能夠憑借對(duì)單片機(jī)各功能的了解,達(dá)到理想的設(shè)計(jì)效果。 </p><p> 、掌握Proteus和Keil軟件的使用。 </p><p> 學(xué)生簽名:
6、 </p><p><b> 年 月 日</b></p><p> 課程設(shè)計(jì)(論文)評(píng)閱意見</p><p> 評(píng)閱人 職稱 </p><p> 20 年 月 日 </p><p><b> 目 錄</b>&l
7、t;/p><p> 課程設(shè)計(jì)內(nèi)容及要求.......................2 </p><p> 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn) ....................5</p><p> 系統(tǒng)的軟件設(shè)計(jì) .........................16</p><p> 程序代碼.........................
8、......18</p><p> 第5章 課程設(shè)計(jì)心得...........................25</p><p> 第6章 參考文獻(xiàn)...............................26</p><p> 第二章 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 電路設(shè)計(jì)框圖<
9、;/b></p><p> 本系統(tǒng)的電路系統(tǒng)框圖如圖1所示。AT89S51單片機(jī)對(duì)DS1302和DS18B20寫入控制字并讀取相應(yīng)的數(shù)據(jù),繼而控制LCM1602作出對(duì)應(yīng)的顯示。</p><p><b> 圖1 系統(tǒng)硬件框圖</b></p><p><b> 系統(tǒng)硬件概述</b></p><p
10、> 本電路是由AT89S51單片機(jī)作為控制核心,能在3V超低壓工作,AT89S51是一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4kBytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,功能強(qiáng)大的微型計(jì)算
11、機(jī)的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案;時(shí)鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31*8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器??僧a(chǎn)生年、月、日、周、時(shí)、分、秒,具有使用壽命長(zhǎng)
12、,精度高和低功耗等特點(diǎn),同時(shí)具有掉電自動(dòng)保存功能;溫度的采集由DS18B20完成,它具有獨(dú)特的單線接口方式,DS18B20在與微處理</p><p><b> 主要單元電路的設(shè)計(jì)</b></p><p> AT89S52單片機(jī)主控制模塊的設(shè)計(jì)</p><p> AT89S52是一個(gè)低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含4k Bytes
13、 ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲(chǔ)器,器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲(chǔ)單元,功能強(qiáng)大的微型計(jì)算機(jī)的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案。AT89S51具有如下特點(diǎn):40個(gè)引腳,4kBytes Flash片內(nèi)程序存儲(chǔ)器,1
14、28Bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),32個(gè)外部雙向輸入/輸出(I/O)口,5個(gè)中斷優(yōu)先級(jí)2層中斷嵌套中斷,2個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時(shí)鐘振蕩器。此外,AT89S51設(shè)計(jì)和配置了振蕩頻率可為0Hz并可通過軟件設(shè)置省電模式??臻e模式下,CPU暫停工作,而RAM定時(shí)計(jì)數(shù)器,串行口,外中斷系統(tǒng)可繼續(xù)工作,掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復(fù)位。同
15、時(shí)該芯片還具有PDIP、TQFP和PLCC</p><p> P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。</p><p> P1口:P1口是一
16、個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 </p><p> P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入
17、。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì),當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。 </p><p> P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口
18、,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。</p><p> I/O口作為輸入口時(shí)有兩種工作方式,即所謂的讀端口與讀引腳。讀端口時(shí)實(shí)際上并不從外部讀入數(shù)據(jù),而是把端口鎖存器的內(nèi)容讀入到內(nèi)部總線,經(jīng)過某種運(yùn)算或變換后再寫回到端口鎖存器。只有讀端口時(shí)才真正地把外部的數(shù)據(jù)讀入到內(nèi)部總線。輸入緩沖
19、器CPU將根據(jù)不同的指令分別發(fā)出讀端口或讀引腳信號(hào)以完成不同的操作。這是由硬件自動(dòng)完成的,不需要我們操心,1然后再實(shí)行讀引腳操作,否則就可能讀入出錯(cuò),如果不對(duì)端口置1,端口鎖存器原來的狀態(tài)有可能為0Q端為0Q^為1加到場(chǎng)效應(yīng)管柵極的信號(hào)為1,該場(chǎng)效應(yīng)管就導(dǎo)通對(duì)地呈現(xiàn)低阻抗,此時(shí)即使引腳上輸入的信號(hào)為1,也會(huì)因端口的低阻抗而使信號(hào)變低使得外加的1信號(hào)讀入后不一定是1。若先執(zhí)行置1操作,則可以使場(chǎng)效應(yīng)管截止引腳信號(hào)直接加到三態(tài)緩沖器中實(shí)現(xiàn)正
20、確的讀入,由于在輸入操作時(shí)還必須附加一個(gè)準(zhǔn)備動(dòng)作,所以這類I/O口被稱為準(zhǔn)雙向口。89C51的P0/P1/P2/P3口作為輸入時(shí)都是準(zhǔn)雙向口。</p><p> 單片機(jī)的最小系統(tǒng)如圖2所示:18引腳和19引腳接時(shí)鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上
21、電復(fù)位電路,20引腳為接地端,40引腳為電源端.單片機(jī)的最小系統(tǒng)如下圖所示:圖2中的晶振頻率為12MHz,復(fù)位方式為上電自動(dòng)復(fù)位[8]-[9]。</p><p><b> 單片機(jī)中斷系統(tǒng)</b></p><p> 在提及單片機(jī)的最小系統(tǒng)后,現(xiàn)對(duì)單片機(jī)的另一重要應(yīng)用系統(tǒng)即中斷系統(tǒng)做一個(gè)比較詳細(xì)的介紹。</p><p> 在CPU 與外設(shè)交換
22、信息時(shí),存在著一個(gè)快速CPU與慢速的外設(shè)之間的矛盾。為解決這個(gè)問題,發(fā)展了中斷的概念。單片機(jī)在某一時(shí)刻只能處理一個(gè)任務(wù),當(dāng)多個(gè)任務(wù)同時(shí)要求單片機(jī)處理時(shí),這一要求應(yīng)該怎么實(shí)現(xiàn)呢?通過中斷可以實(shí)現(xiàn)多個(gè)任務(wù)的資源共享。所謂的中斷就是,當(dāng)CPU正在處理某項(xiàng)事務(wù)的時(shí)候,如果外界或者內(nèi)部發(fā)生了緊急事件,要求CPU暫停正在處理工作而去處理這個(gè)緊急事件,待處理完后,再回到原來中斷的地方,繼續(xù)執(zhí)行原來被中斷的程序,這個(gè)過程稱作中斷。 </p>
23、<p> 從中斷的定義我們可以看到中斷應(yīng)具備中斷源、中斷響應(yīng)、中斷返回這樣三個(gè)要素。中斷源發(fā)出中斷請(qǐng)求,單片機(jī)對(duì)中斷請(qǐng)求進(jìn)行響應(yīng),當(dāng)中斷響應(yīng)完成后應(yīng)進(jìn)行中斷返回,返回被中斷的地方繼續(xù)執(zhí)行原來被中斷的程序。MCS-51單片機(jī)的中斷源共有兩類,它們分別是:外部中斷和內(nèi)部中斷。外部中斷0(INT0)來自P3.2引腳,通過外部中斷0觸發(fā)方式控制位IT0(TCON.0),來決定中斷輸入信號(hào)是低電平有效還是負(fù)跳變有效。一旦輸入信號(hào)有
24、效,便使IE0標(biāo)志置一,向CPU申請(qǐng)中斷;外部中斷1(INT1)來自P3.3引腳,通過外部中斷1觸發(fā)方式控制位IT1(TCON.2),來決定中斷輸入信號(hào)是低電平有效還是負(fù)跳變有效。一旦輸入信號(hào)有效,便使IE0標(biāo)志置一,向CPU申請(qǐng)中斷。內(nèi)部中斷有三個(gè):TF0,TF1,RI或TI。TF0(TCON.5),片內(nèi)定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志。當(dāng)定時(shí)/計(jì)數(shù)器T0發(fā)生溢出時(shí),置位TF0,并向CPU申請(qǐng)中斷;TF1(TCON.7),片內(nèi)定時(shí)/計(jì)
25、數(shù)器T1溢出中斷請(qǐng)求標(biāo)志。當(dāng)定時(shí)/計(jì)數(shù)器T1發(fā)生溢出時(shí),置位TF1,并向CPU申請(qǐng)中斷;RI(SCON.0)或TI(SCON.1),串行口中斷請(qǐng)求</p><p> MCS-51單片機(jī)為用戶提供了四個(gè)專用寄存器,來控制單片機(jī)的中斷系統(tǒng)。定時(shí)器控制寄存器(TCON),該寄存器用于保存外部中斷請(qǐng)求以及定時(shí)器的計(jì)數(shù)溢出。進(jìn)行字節(jié)操作時(shí),寄存器地址為88H。按位操作時(shí),各位的地址為88H~8FH,當(dāng)CPU采樣到INT0
26、(或INT1)端出現(xiàn)有效中斷請(qǐng)求時(shí),IE0(IE1)位由硬件置“1”。當(dāng)中斷響應(yīng)完成轉(zhuǎn)向中斷服務(wù)程序時(shí),由硬件把IE0(或IE1)清零, 當(dāng)計(jì)數(shù)器產(chǎn)生計(jì)數(shù)溢出時(shí),相應(yīng)的溢出標(biāo)志位由硬件置“1”。當(dāng)轉(zhuǎn)向中斷服務(wù)時(shí),再由硬件自動(dòng)清“0”。計(jì)數(shù)溢出標(biāo)志位的使用有兩種情況:采用中斷方式時(shí),作中斷請(qǐng)求標(biāo)志位來使用;采用查詢方式時(shí),作查詢狀態(tài)位來使用;串行口控制寄存器(SCON),進(jìn)行字節(jié)操作時(shí),寄存器地址為98H。按位操作時(shí),各位的地址為98H~
27、9FH,當(dāng)發(fā)送完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”,當(dāng)接收完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”。串行中斷請(qǐng)求由TI和RI的邏輯或得到。就是說,無(wú)論是發(fā)送標(biāo)志還是接收標(biāo)志,都會(huì)產(chǎn)生串行中斷請(qǐng)求;中斷允許控制寄存器(IE),進(jìn)行字節(jié)操作時(shí),寄存器地</p><p> MCS-51單片機(jī)復(fù)位后(IE)=00H,因此中斷系統(tǒng)處于禁止?fàn)顟B(tài)。單片機(jī)在中斷響
28、應(yīng)后不會(huì)自動(dòng)關(guān)閉中斷。因此在轉(zhuǎn)中斷服務(wù)程序后,應(yīng)根據(jù)需要使用有關(guān)指令禁止中斷,即以軟件方式關(guān)閉中斷。中斷優(yōu)先級(jí)控制寄存器(IP)MCS-51單片機(jī)的中斷優(yōu)先級(jí)控制比較簡(jiǎn)單,因?yàn)橄到y(tǒng)只定義了高、低2個(gè)優(yōu)先級(jí)。高優(yōu)先級(jí)用“1”表示,低優(yōu)先級(jí)用“0”表示。各中斷源的優(yōu)先級(jí)由中斷優(yōu)先級(jí)寄存器(IP)進(jìn)行設(shè)定。IP寄存器地址0B8H,位地址為0BFH~0B8H。</p><p><b> 時(shí)鐘電路模塊的設(shè)計(jì)&l
29、t;/b></p><p> DS1302 是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)
30、品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力[11]。</p><p> DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。
31、X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc>2.0V之
32、前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),SCLK為時(shí)鐘輸入端。DS1302的控制字節(jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取</p><p> 圖3 DS1302與單片機(jī)的連接</p><p><b> 溫度采集模塊設(shè)
33、計(jì)</b></p><p> 采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測(cè)量精度高,電路連接簡(jiǎn)單特點(diǎn),此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個(gè)上拉電阻,Vcc接電源,Vss接地。獨(dú)特的一線接口,只需要一條口線通信多點(diǎn)能力,簡(jiǎn)化了分布式溫度傳感應(yīng)用無(wú)需外部元件可用數(shù)據(jù)總線供電,電壓范圍為3.0V至5.5V無(wú)需備用電源 測(cè)量溫度范圍為-
34、55度至+125度。-10度至+85度范圍內(nèi)精度為±0.5度溫度傳感器可編程的分辨率為9~12位[12]。DS18B20連線如圖4所示:</p><p> 圖4 DS18B20管腳連線</p><p><b> 顯示模塊的設(shè)計(jì)</b></p><p> 如下圖5所示,采用LCM1602液晶顯示器,單片機(jī)P1口作為數(shù)據(jù)輸出口,RS
35、,R\W,E分別通過10K的上拉電阻連接到單片機(jī)的P0.0,P0.1,P0.2。VDD接5V電源,VSS接地。VEE為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度)。RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。R/W為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。E(或EN)端為使能(enable)端
36、,下降沿使能。DB0-DB7為雙向數(shù)據(jù)總線,同時(shí)最高位DB7也是忙信號(hào)檢測(cè)位。BLA、BLK分別為顯示器背光燈的正、負(fù)極[13]。</p><p> 圖5 LCM1602與單片機(jī)的連接 </p><p><b> 系統(tǒng)仿真電路</b></p><p> 本次仿真使用軟件Protues7.0,該軟件元件庫(kù)豐富,元件封裝要求相對(duì)簡(jiǎn)單且參數(shù)調(diào)整
37、方便,除此之外,程序還可進(jìn)行動(dòng)態(tài)調(diào)試。系統(tǒng)仿真截圖如圖9所示:</p><p> 圖9 系統(tǒng)仿真電路圖</p><p> 如圖,左上角為顯示模塊LCM1602,U1是時(shí)鐘芯片DS1302,U2是主控模塊AT89C51,U3為溫度傳感器DS18B20,右下角是鍵盤控制模塊。</p><p> 第三章 系統(tǒng)的軟件設(shè)計(jì)</p><
38、;p><b> 程序流程框圖</b></p><p> 圖10 主程序流程圖</p><p> 主程序流程圖如上圖10所示。由于LCM1602,DS18B20,DS1302的數(shù)據(jù)讀取及指令寫入函數(shù)均已在各自的頭文件中完成,在主程序中只須引用即可。</p><p> 由于在硬件電路方面上設(shè)計(jì)了時(shí)間調(diào)整按鍵和開關(guān),因此應(yīng)有對(duì)應(yīng)的時(shí)間調(diào)
39、整程序。時(shí)間調(diào)整程序的流程圖如圖11所示。</p><p> 圖11 時(shí)間調(diào)整程序流程圖</p><p> 第四章 程序代碼</p><p> Main.c 程序代碼如下:</p><p> #include<reg52.h></p><p> #include"l
40、ook.h"</p><p> #include"time.h"</p><p> #include"templature.h"</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p&
41、gt;<p> uint b[6];</p><p> //年、月、日、時(shí)、分、秒</p><p> uchar code row1[]={"2009-01-01"};</p><p> uchar code row2[]={"00:00:00"};</p><p> uchar
42、 year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年</p><p> uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//潤(rùn)年</p><p> uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD
43、地址</p><p> uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;</p><p> //i循環(huán)數(shù),k溫度緩存,jj地址位</p><p> uint temp;</p><p> sbit b1=P3^0;//設(shè)置</p><p> sbit b2=P3^1;/
44、/上調(diào)</p><p> sbit b3=P3^2;//下調(diào)</p><p> sbit b4=P3^3;//轉(zhuǎn)換</p><p> sbit b5=P3^4;//鬧鐘</p><p> sbit speaker=P3^5;</p><p><b> lcdscan()</b></
45、p><p> {for(i=0;i<6;i++)</p><p> { lcdwrite(j[i]);</p><p> lcdshuju(a[11-i*2]+0x30);</p><p> lcdwrite(j[i]+0x01);</p><p> lcdshuju(a[10-i*2]+0x30);&
46、lt;/p><p><b> }</b></p><p><b> }</b></p><p> void key()</p><p> {if(b1==0)</p><p> { dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80
47、);</p><p> while(b1==0)</p><p><b> {</b></p><p> for(i=0;i<6;i++)</p><p> {b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];}</p><p><b> i
48、f(b4==0)</b></p><p> { delay(3);</p><p><b> jj++;</b></p><p><b> if(jj==6)</b></p><p><b> {jj=0;}</b></p><p>
49、;<b> }</b></p><p><b> if(b2==0)</b></p><p> {delay(3);</p><p><b> b[jj]++;</b></p><p> if(b[5]==60)b[5]=0;</p><p>
50、; if(b[4]==60)b[4]=0;</p><p> if(b[3]==24)b[3]=0;</p><p> if((b[0]%4==0&&b[0]%100!=0)||b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}</p><p> else {if(b[2]>year1[b[1]
51、-1])b[2]=1;}</p><p> if(b[1]==13)b[1]=1;</p><p> if(b[0]==100)b[0]=0;</p><p><b> }</b></p><p><b> if(b3==0)</b></p><p> {de
52、lay(3);</p><p><b> b[jj]--;</b></p><p> if(b[5]==-1)b[5]=59;</p><p> if(b[4]==-1)b[4]=59;</p><p> if(b[3]==-1)b[3]=23;</p><p> if((b[0]%4=
53、=0&&b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}</p><p> else {if(b[2]<=0)b[2]=year1[b[1]-1];}</p><p> if(b[1]==0)b[1]=12;</p><p> if(b[0]==-1)b[0]=
54、99;</p><p><b> }</b></p><p> for(i=0;i<6;i++)</p><p> { a[11-i*2+clock]=b[i]/10;</p><p> a[10-i*2+clock]=b[i]%10;</p><p><b> }&
55、lt;/b></p><p> lcdwrite(j[jj]);</p><p> lcdshuju(0);</p><p> lcdwrite(j[jj]+1);</p><p> lcdshuju(0);</p><p> delay(200);</p><p> lcdw
56、rite(j[jj]);</p><p> lcdshuju(a[11-2*jj+clock]+0x30);</p><p> lcdwrite(j[jj]+1);</p><p> lcdshuju(a[10-2*jj+clock]+0x30);</p><p> delay(200);</p><p>
57、;<b> if(b1==1)</b></p><p> { dsaddshuju(0x80,(a[1]<<4)+a[0]);</p><p><b> dson();}</b></p><p> if(b5==0)clock=12;}}}</p><p> void m
58、ain()</p><p> {speaker=0;</p><p><b> lcdrw=0;</b></p><p><b> dson();</b></p><p><b> lcdon();</b></p><p> lcdwrite
59、(0x83);</p><p> for(i=0;i<10;i++)</p><p> {lcdshuju(row1[i]);</p><p><b> delay(1);</b></p><p><b> }</b></p><p> lcdwrite(0
60、x84+0x40);</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> lcdshuju(row2[i]);</p><p><b> delay(1);</b></p><p><b> }
61、</b></p><p><b> dsrst=0;</b></p><p><b> dssclk=0;</b></p><p><b> while(1)</b></p><p> {for(i=0;i<5;i++)</p><
62、p> {dsrst=1;</p><p> dswrite(0x81+i*2);</p><p> k=dsread();</p><p><b> dsrst=0;</b></p><p> a[i*2]=k&0x0f;</p><p> a[i*2+1]=(k>
63、;>4)&0x0f;</p><p><b> }</b></p><p><b> dsrst=1;</b></p><p> dswrite(0x8d);</p><p> k=dsread();</p><p><b> dsrs
64、t=0;</b></p><p> a[10]=k&0x0f;</p><p> a[11]=(k>>4)&0x0f;</p><p> delay(100);</p><p> lcdscan();</p><p><b> key();</b&g
65、t;</p><p><b> if(b5==0)</b></p><p> {for(i=0;i<12;i++)</p><p> {if(a[i+12]==a[i])num++;}</p><p> if(num==12)bigclock=1;</p><p> else
66、num=0;</p><p> lcdwrite(0x8e);</p><p> lcdshuju('&');}</p><p><b> else </b></p><p> {lcdwrite(0x8e);</p><p> lcdshuju(0x00);}
67、</p><p> if(bigclock==1)</p><p> { speaker=1;</p><p><b> c++;</b></p><p> if(c==100){bigclock=0;speaker=0;}</p><p><b> }</b>&
68、lt;/p><p> temp=readtemperature();//temp是uint型的。不然會(huì)出現(xiàn)溫度到25后回00的現(xiàn)象??赡苁怯捎谑M(jìn)制與十進(jìn)制的差異。</p><p> lcdwrite(0x8d+0x40);</p><p> lcdshuju(temp/100+0x30);</p><p> lcdwrite(0x8e
69、+0x40);</p><p> lcdshuju(temp/10%10+0x30);}}</p><p> Look.h程序代碼如下:</p><p> #include<reg52.h></p><p> #define uint unsigned int</p><p> #define
70、uchar unsigned char</p><p> sbit lcdrs=P0^0;</p><p> sbit lcdrw=P0^1;</p><p> sbit lcden=P0^2;</p><p> void delay(uint z)</p><p><b> {</b>
71、</p><p><b> uint x,y;</b></p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p> }//1毫秒左右延時(shí)</p><p> //lcdwrite() LCD寫指令</p
72、><p> void lcdwrite(uchar write)</p><p><b> {</b></p><p><b> lcdrs=0;</b></p><p><b> P1=write;</b></p><p><b> d
73、elay(1);</b></p><p><b> lcden=1;</b></p><p><b> delay(1);</b></p><p><b> lcden=0;</b></p><p><b> }</b></p&g
74、t;<p> //lcdshuju() LCD寫數(shù)據(jù)</p><p> void lcdshuju(uchar shuju)</p><p><b> {</b></p><p><b> lcdrs=1;</b></p><p><b> P1=shuju;&l
75、t;/b></p><p><b> delay(1);</b></p><p><b> lcden=1;</b></p><p><b> delay(1);</b></p><p><b> lcden=0;</b></p>
76、<p><b> }</b></p><p> //lcdon() LCD顯示初始化</p><p> void lcdon()</p><p><b> {</b></p><p><b> lcden=0;</b></p><p
77、> lcdwrite(0x38);//顯示模式</p><p> lcdwrite(0x0c);//開顯示,光標(biāo)不閃爍</p><p> lcdwrite(0x06);//光標(biāo)設(shè)置</p><p> lcdwrite(0x01);</p><p><b> }</b></p><p&g
78、t; Templature.h 代碼如下:</p><p> #include<reg52.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit dq=P0^3;</p><p&
79、gt; void sdelay(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> ds18b20on(void)//ds18b20初始化</p><p&
80、gt;<b> {</b></p><p> uchar x=0;</p><p><b> dq=1; </b></p><p> sdelay(8); </p><p><b> dq=0; </b></p><p> sdel
81、ay(80); </p><p><b> dq=1; </b></p><p> sdelay(14);</p><p> sdelay(20);</p><p><b> }</b></p><p><b> //讀一個(gè)字節(jié)</b>&l
82、t;/p><p> readds18b20(void)</p><p><b> {</b></p><p> uchar i=0,dat=0;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><
83、;p><b> dq=0;</b></p><p><b> dat>>=1;</b></p><p><b> dq=1;</b></p><p><b> if(dq)</b></p><p> dat|=0x80;<
84、/p><p> sdelay(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p><b> //寫一個(gè)字節(jié)</b></p><p>
85、 writeds18b20(uchar dat)</p><p><b> {</b></p><p> uchar i=0;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p><b> dq
86、=0;</b></p><p> dq=dat&0x01;</p><p> sdelay(5);</p><p><b> dq=1;</b></p><p><b> dat>>=1;</b></p><p><b>
87、}</b></p><p><b> }</b></p><p><b> //讀取溫度</b></p><p> readtemperature(void)</p><p><b> {</b></p><p> uchar a=
88、0,b=0;</p><p><b> uint t=0;</b></p><p> float tt=0;</p><p> ds18b20on();</p><p> writeds18b20(0xCC);//跳過ROM</p><p> writeds18b20(0x44);//開
89、啟溫度轉(zhuǎn)換</p><p> ds18b20on();</p><p> writeds18b20(0xCC); </p><p> writeds18b20(0xBE);//讀暫存器</p><p> a=readds18b20();</p><p> b=readds18b20();</p>
90、<p><b> t=b;</b></p><p><b> t<<=8;</b></p><p><b> t=t|a;</b></p><p> tt=t*0.0625; </p><p> t= tt*10+0.5;
91、 </p><p> return(t);</p><p><b> }</b></p><p> Time.h 代碼如下:</p><p> #include<reg52.h></p><p> #define uint unsigned int</p>&
92、lt;p> #define uchar unsigned char</p><p> sbit dsrst=P2^0;</p><p> sbit dssclk=P2^1;</p><p> sbit dsio=P2^2;</p><p> uint a[24]={0,0,0,0,0,0,1,0,1,0,9,0,0,0,0,0
93、,0,0,1,0,1,0,9,0};</p><p> //分別對(duì)應(yīng)秒秒分分時(shí)時(shí)日日月月年年</p><p> //后12位為鬧鐘位,用于存儲(chǔ)鬧鐘數(shù)據(jù)</p><p> //1302write DS1302寫數(shù)據(jù)</p><p> void dswrite(uchar dswrite)</p><p>&l
94、t;b> {</b></p><p> uchar i,temp;</p><p><b> delay(1);</b></p><p> temp=dswrite;</p><p> for(i=0;i<8;i++)</p><p><b> {&l
95、t;/b></p><p> dsio=temp&0x01;</p><p><b> delay(1);</b></p><p><b> dssclk=1;</b></p><p><b> delay(1);</b></p><p
96、><b> dssclk=0;</b></p><p> temp=temp>>1;</p><p><b> }</b></p><p><b> }</b></p><p> //1302read Ds1302讀數(shù)據(jù)</p>
97、<p> uchar dsread()</p><p><b> {</b></p><p> uchar i,temp;</p><p><b> delay(1);</b></p><p><b> temp=0;</b></p><
98、p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> temp=temp>>1;</p><p> if(dsio==1)temp=temp+0x80;</p><p><b> delay(1);</b></p>
99、;<p><b> dssclk=1;</b></p><p><b> delay(1);</b></p><p><b> dssclk=0;</b></p><p><b> }</b></p><p> return tem
100、p;</p><p><b> }</b></p><p> //1302addshuju DS1302向某地址寫入某數(shù)據(jù)</p><p> void dsaddshuju(uchar add,uchar dsshuju)</p><p><b> {</b></p>&l
101、t;p><b> dsrst=0;</b></p><p><b> dssclk=0;</b></p><p><b> dsrst=1;</b></p><p> dswrite(add);// 地址,命令 </p><p> dswrite(dsshuju
102、);// 寫1Byte數(shù)據(jù)</p><p><b> dssclk=1;</b></p><p><b> dsrst=0;</b></p><p><b> dsio=0;</b></p><p><b> }</b></p>&l
103、t;p> //1302on DS1302初始化</p><p> void dson()</p><p> {uchar i;</p><p> dsaddshuju(0x8c,(a[11]<<4)+a[10]);</p><p> for(i=0;i<5;i++)</p><p>
104、; {dsaddshuju(0x88-i*2,(a[9-i*2]<<4)+a[8-i*2]);}}</p><p><b> 課程設(shè)計(jì)心得</b></p><p> 對(duì)于本次課程設(shè)計(jì),我始終本著嚴(yán)謹(jǐn)認(rèn)真的態(tài)度來進(jìn)行,希望自己能夠有所收獲。因此,課程設(shè)計(jì)之初我便堅(jiān)持來機(jī)房進(jìn)行設(shè)計(jì)研究。在編程之前,我們小組詳細(xì)研讀了單片機(jī)課本關(guān)于DS1302時(shí)鐘芯片的相
105、關(guān)內(nèi)容,對(duì)其管腳、寄存器、時(shí)序、讀寫控制字都有了清楚的認(rèn)識(shí)。軟件方面選取Code Vision環(huán)境進(jìn)行編程,因?yàn)镃ode Vision軟件中自帶了函數(shù)庫(kù),其中已經(jīng)包含了DS1302、LCD1602的函數(shù),因此可在主函數(shù)中直接調(diào)用,使編程變得相對(duì)簡(jiǎn)單,同時(shí)也使我體會(huì)到了科技的強(qiáng)大。</p><p> 在調(diào)試軟硬件的過程中,也出現(xiàn)了一系列的問題,特別是時(shí)鐘不動(dòng)這個(gè)問題困擾了我很久。但我沒有氣餒,在老師的幫助下,我們
106、利用示波器查看晶振是否起振,通過網(wǎng)上查閱資料進(jìn)行改正,成功解決了相關(guān)問題,感覺很有成就感。</p><p> 第六章 參考文獻(xiàn)(資料)</p><p> [1] 王文仲 MCS-51單片機(jī)原理及應(yīng)用技術(shù)教程 [M]. 北京:人民郵電出版社,2010年8月</p><p> [2] 胡小強(qiáng) 計(jì)算機(jī)網(wǎng)絡(luò)[M] 北京:北京郵電大學(xué)出版社2005年1
107、月</p><p> [3] 趙建領(lǐng) 薛園園 零基礎(chǔ)學(xué)單片機(jī)C語(yǔ)言程序設(shè)計(jì) [M].機(jī)械工業(yè)出版社</p><p> [4] 周向紅 51單片機(jī)課程設(shè)計(jì) [M].華中科技大學(xué)出版社</p><p> [5] 郭天祥 51單片機(jī)C語(yǔ)言教程-入門,提高,開發(fā),拓展全攻略 [M].電子工業(yè)出版社</p><p> [6] 趙亮 侯國(guó)銳.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)僅提供信息存儲(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ī)萬(wàn)年歷課程設(shè)計(jì)
- 單片機(jī)萬(wàn)年歷課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-萬(wàn)年歷
- 萬(wàn)年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)—電子萬(wàn)年歷
- 單片機(jī)萬(wàn)年歷課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告(萬(wàn)年歷)
- 單片機(jī)課程設(shè)計(jì)-電子萬(wàn)年歷
- 單片機(jī)萬(wàn)年歷課程設(shè)計(jì) (2)
- 單片機(jī)課程設(shè)計(jì)-- 電子萬(wàn)年歷
- 單片機(jī)課程設(shè)計(jì)—萬(wàn)年歷[1]
- 單片機(jī)課程設(shè)計(jì)---萬(wàn)年歷顯示設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子萬(wàn)年歷設(shè)計(jì)
- 基于單片機(jī)的萬(wàn)年歷課程設(shè)計(jì)
- 1602數(shù)字萬(wàn)年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的萬(wàn)年歷
- 課程設(shè)計(jì)--單片機(jī)簡(jiǎn)易萬(wàn)年歷的設(shè)計(jì)
- 單片機(jī)電子萬(wàn)年歷課程設(shè)計(jì)
- 單片機(jī)電子萬(wàn)年歷課程設(shè)計(jì)
- 單片機(jī)電子萬(wàn)年歷課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論