版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)設計(論文)</b></p><p> 題目: 基于單片機的多功能萬年歷</p><p> 專業(yè)名稱 電氣自動化</p><p> 班級學號 </p><p> 學生姓名 </p>&
2、lt;p> 指導教師 </p><p> 二O一二年 五 月 </p><p><b> 目 錄</b></p><p> 1 設計任務與要求</p><p> 2 方案設計與論證</p><p> 2.1方案一 ………………………………………………
3、…………………3</p><p> 2.2 方案二………………………………………………………………… 4</p><p> 2.3 方案三………………………………………………………………… 4</p><p> 2.4 方案論證……………………………………………………………… 5</p><p> 3 硬件單元電路設計與參數(shù)計算&l
4、t;/p><p> 3.1 主控制系統(tǒng)……………………………………………………………6</p><p> 3.2時鐘振蕩電路………………………………………………………… 7</p><p> 3.3復位電路……………………………………………………………… 8</p><p> 3.4 DS1302時鐘電路……………………………………………
5、…………9</p><p> 3.5按鍵電路………………………………………………………………10</p><p> 3.6 顯示電路………………………………………………………………10</p><p> 3.7蜂鳴器電路…………………………………………………………… 11</p><p> 4 流程圖與各模塊的程序</p>
6、;<p> 4.1 流程圖…………………………………………………………………12</p><p> 4.2 部分子程序……………………………………………………………13</p><p><b> 5 電路仿真調(diào)試</b></p><p> 5.1 總原理圖………………………………………………………………18</p&
7、gt;<p> 5.2 整體電路仿真圖以及仿真結(jié)果分析…………………………………19</p><p> 5.3 調(diào)試……………………………………………………………………20</p><p> 參考文獻…………………………………………………………………21</p><p> 致謝…………………………………………………………………………22<
8、/p><p> 附錄…………………………………………………………………………23</p><p><b> 參考文獻</b></p><p> [1]朱月秀 冷祖祁,單片機基礎(第3版):北京航航天大學出版社</p><p> [2] 華成英 童詩白, 模擬電子技術基礎(第四版):高等教育出版社</p>
9、<p> [3}趙建領 薛園園 ,零基礎學單片機C語言程序設計:機械工業(yè)出版社</p><p> [4]樓然苗 李光飛. 單片機課程設計指導:北京航航天大學出版社</p><p> [5]李鳳霞. C語言程序設計教程(第二版):北京理工大學出版社</p><p> [6]趙亮 侯國銳. 單片機C語言編程與實例:人民郵電出版社</p>
10、<p> [7]張義和 王敏男 許宏昌 余春長 . 例說5單片機(C語言版):人民郵電出版社</p><p> [8]郭天祥編.新概念51單片機C語言教程.北京:電子工業(yè)出版社,2009.</p><p> [9]周興華編.手把手教你學單片機C程序設計.北京:北京航空航天大學出版社,2008.6. </p><p> [10] 譚浩強編.C程序設
11、計:清華大學出版社,2008.7.</p><p> 信息工程 系 自動化 專業(yè)類 0882021班</p><p> 學生(簽名): </p><p> 填寫日期: 2012 年 5 月 20日</p><p> 指導教師(簽名): </p
12、><p> 助理指導教師(并指出所負責的部分):</p><p> 信息工程 系主任(簽名):</p><p> 附注:任務書應該附在已完成的畢業(yè)設計說明書首頁。</p><p> 美國DALLAS公司推出的具有涓細電流充電能的低功耗實時時鐘電路DS1302。它可以對年、月、日、周日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能
13、,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準等功能。該電路采用AT89S52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。</p><p> 綜上所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。</p&g
14、t;<p> 本設計是基于51系列的單片機進行的電子萬年歷設計,可以顯示年月日時分秒及周信息,具有可調(diào)整日期和時間功能。在設計的同時對單片機的理論基礎和外圍擴展知識進行了比較全面準備。在硬件與軟件設計時,沒有良好的基礎知識和實踐經(jīng)驗會受到很大限制,每項功能實現(xiàn)時需要那種硬件,程序該如何編寫,算法如何實現(xiàn)等,沒有一定的基礎就不可能很好的實現(xiàn)。</p><p> 關鍵詞:單片機;實時時鐘;DS130
15、2 AT89C52</p><p> 學士學位論文原創(chuàng)性聲明</p><p> 本人聲明,所呈交的論文是本人在導師的指導下獨立完成的研究成果。除了文中特別加以標注引用的內(nèi)容外,本論文不包含法律意義上已屬于他人的任何形式的研究成果,也不包含本人已用于其他學位申請的論文或成果。對本文的研究作出重要貢獻的個人和集體,均已在文中以明確方式表明。本人完全意識到本聲明的法律后果由本人承擔。<
16、/p><p> 作者簽名: 日期:2012年5月20日</p><p> 學位論文版權使用授權書</p><p> 本學位論文作者完全了解學校有關保留、使用學位論文的規(guī)定,同意學校保留并向國家有關部門或機構(gòu)送交論文的復印件和電子版,允許論文被查閱和借閱。本人授權南昌航空大學科技學院可以將本論文的全部或部分內(nèi)容編入有關數(shù)據(jù)
17、庫進行檢索,可以采用影印、縮印或掃描等復制手段保存和匯編本學位論文。</p><p> 作者簽名: 日期:</p><p> 導師簽名: 日期</p><p> 1 設計任務與要求</p><p> 能夠顯示年、月、日、時、分 秒 。&
18、lt;/p><p> 可以人為校正年、月、日、時、分、秒。</p><p><b> 具有鬧鐘功能。</b></p><p> 能夠進行整點的提醒。</p><p><b> 按鍵顯示溫度。</b></p><p><b> 2、方案設計與論證</b&g
19、t;</p><p><b> 2.1方案一</b></p><p> 按照系統(tǒng)設計的功能的要求,初步確定系統(tǒng)由主控模塊、時鐘模塊、顯示模塊各鍵盤接口模塊共4個模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1所示。主控芯片使用52系列AT89S52單片機,時鐘芯片使用美國DALLAS公司推出的一款高性能、低功耗、帶RAM的實時時鐘DS1302。采用DS1302作為計時芯片,可以做
20、到計時準確。更重要的是,DS1302可以在很小電流的后備電源(2.5V--5.5V電源,在2。5V時耗電小于300nA)下繼續(xù)計時,而且DS1302可以編程選擇多種充電電流來對后備電源進行慢速充電,可以 保證后備電源基本功不耗電。顯示模塊采用普通的共陽LED數(shù)碼管,鍵輸入采用查詢法實現(xiàn)功能調(diào)整。</p><p> 圖1 電子萬年歷電路系統(tǒng)構(gòu)成框圖</p><p><b>
21、2.2方案二</b></p><p> 按照系統(tǒng)設計的要求和功能,將系統(tǒng)分為主控模塊、時鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復位電路、晶振電路幾個模塊,系統(tǒng)框圖如圖2所示。主控模塊采用AT89S52單片機,按鍵模塊用四個按鍵,用于調(diào)整時間和設定鬧鐘,顯示模塊采用LCD1602,時鐘電路模塊采用DS1302實時時鐘實現(xiàn)對時間,日期的操作。</p><p> 圖
22、2 基于AT89C52單片機的電子萬年歷系統(tǒng)框圖</p><p><b> 2.3方案三</b></p><p> 按照系統(tǒng)設計的要求和功能,將系統(tǒng)分為主控制器模塊、顯示模塊、按鍵開關模塊、蜂鳴器電路模塊。系統(tǒng)框圖如圖3所示,主控制模塊采用AT89S52單片機為控制中心,顯示模塊采用液晶LCD1602顯示,計時使用AT89S52單片機自帶的定時器功能,實現(xiàn)對時間、
23、日期的操作,通過按鍵盤開關實現(xiàn)對時間、日期的調(diào)整。</p><p> 圖3 基于AT89C52單片機的電子萬年歷總體設計框圖</p><p><b> 2.4方案論證</b></p><p> 上面提到的三個方案中,在電路原理方面大致相同,都能夠達到設計任務與要求,在方案一款方案三中使用外部的時鐘芯片DS1302來實現(xiàn)日期和時間的操作,方
24、案二中則利用了單片機自身的定時器功能;在方案二和方案三在顯示模塊上都使用液晶顯示屏LCD1602作為顯示,方案一則使用LED數(shù)碼管作為顯示,采用LED數(shù)碼管動態(tài)掃描,數(shù)碼管的價格適中,對于顯示數(shù)字較好,而且使用單片機的端口也較少;采用LCD1602液晶顯示屏,液晶顯示屏的顯示功能強大,可以顯示大量文字、圖形,清晰可見,價格相對LED數(shù)碼管來說要昂貴些,但是基于本設計顯示的東西較多,若采用LED數(shù)碼管的話,所需數(shù)碼管較多,價格也相應的會提
25、高,而且不利于控制,對于LCD1602,它所使用的端口也不很多,能夠清晰的顯示,比較適合顯示大量的數(shù)字,因此選擇LCD1602作為顯示模塊。DS1302是一款高性能的實時時鐘芯片,以計時準確、接口簡單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點,得到廣泛的應用,而且在掉電時能夠在外部紐扣電池的供電下繼續(xù)工作,不會因為掉電后,其時間就要重新設置,方案二中使用定時器的功能,當在掉電的時候就會使時間和日期回到原來設定的初</p>&
26、lt;p> 通過對上述方案的論證分析,本次設計選擇方案三,采用AT89C52作為主控制系統(tǒng),DS1302提供時鐘,LCD1602液晶作為顯示模塊</p><p> 3硬件單元電路設計與參數(shù)計算</p><p><b> 3.1主控制系統(tǒng)</b></p><p> 單片機中央處理系統(tǒng)的方案設計,我們選用具有ATMEL公司的AT89C
27、52單片機作為中央處理器,如圖4所示。該單片機除了擁有MCS-51系列單片機的所有優(yōu)點外,內(nèi)部還具有8K的在系統(tǒng)可編程FLASH存儲器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時器、程序存儲器、數(shù)據(jù)存儲器等硬件,其硬件能符合整個控制系統(tǒng)的要求,不需要外接其他存儲器芯片和定時器件,方便地構(gòu)成一個最小系統(tǒng)。整個系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強,性價比高。是比較合適的方案。</p><p> 圖4 AT8
28、9C52主控制系統(tǒng)</p><p><b> 3.2時鐘振蕩電路</b></p><p> 時鐘振蕩電路圖5所示,時鐘振蕩電路用于產(chǎn)生單片機正常工作時所需要的時鐘信號,電路由兩個22pF的瓷片電容和一個12MHz的晶振組成,并接入到單片機的XTAL1和XTAL2引腳處,使單片機工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為
29、3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率決定。電路中兩個電容C1、C2的作用使電路快速起振,提高電路的運行速度,對于AT89C52其工作頻率為0至33MHz,在這個范圍內(nèi)單片機能夠正常的工作。</p><p> 圖5 AT89S52時鐘振蕩電路</p><p><b> 3.3復位電路</b></p><p> 復位電路由
30、電阻和極性電容組成,如圖6所示,通過高電平使單片機復位,在時鐘電路開始工作后,當高電平的時間超過大約2us時,即可實現(xiàn)復位。此復位電路同時具備了上電復位和手動復位的功能,上電復位發(fā)生在開機加電時,由系統(tǒng)自動完成,手動復位通過一個按鍵來實現(xiàn),在程序運行時,若遇到死機,死循環(huán)或程序“跑飛”等情況,通過手動復位就可以實現(xiàn)重新啟動的操作。手動按鈕復位需要人為在復位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕和
31、一個電阻,如圖所示,當人為按下按鈕時,則Vcc 的+5V電平就會直接加到RST端,由于人的動作再快也會使按鈕保持接通達數(shù)十毫秒,所以,完全能夠滿足復位的時間要求。上電復位的工作過程是在加電時,復位電路通過電容加給RST端一個短暫的高電平信號,此高電平信號隨著Vcc對電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時間取決于電容的充電時間,由圖可知充電時間為:T=2.3RC=2.3*10*10-6*5.1*103=0.1173s ,保證系
32、統(tǒng)能夠可靠地復位。</p><p> 圖6 AT89C52復位電路</p><p> 3.4、DS1302時鐘電路</p><p> 時鐘電路主要由時鐘芯片DS1302、備用電池、晶振等幾部分組成,如圖7所示。DS1302采用3線串行接口,占用引腳少,內(nèi)部集成了可編程日歷時鐘,用戶可以根據(jù)需要通過單片機的控制來自行設置,支持雙電源供電,可以使用外部主電源和備用
33、電源,備份電源能夠使時鐘芯片繼續(xù)工作。</p><p> 圖7 DS1302時鐘電路</p><p><b> 3.5、按鍵電路</b></p><p> 按鍵電路由四個輕觸開關組成,如圖8所示。按鍵用來調(diào)整時間和設定鬧鐘,其一端直接接到單片機的端口,另一端接地,當按下按鍵時,相應的端口變?yōu)榈碗娖剑ㄟ^檢測這一低電平就可以判斷是哪個鍵按下
34、,從而作相應的操作。</p><p><b> 圖8 按鍵電路</b></p><p><b> 3.6、顯示電路</b></p><p> 顯示電路采用LCD1602液晶顯示,圖中只畫出了其相應的接口,如圖9所示。3腳用于調(diào)節(jié)LCD1602的背光,4、5、6為LCD1602的控制口,用于控制其寫入或是讀出指令,7至
35、14腳為LCD1602的數(shù)據(jù)口,將數(shù)傳送到LCD1602中。</p><p> 圖9 LCD1602接口電路</p><p><b> 3.7、蜂鳴器電路</b></p><p> 蜂鳴器電路由一個220歐的電阻,三極管8550,及蜂鳴器組成,如圖10所示。通過控制三極管的導通和截止來實現(xiàn)蜂鳴器的響與不響。</p><
36、p><b> 圖10 蜂鳴器電路</b></p><p><b> 4軟件設計與流程圖</b></p><p><b> 4.1序流程圖</b></p><p> 主程序首先初始化定時器、LCD1602及DS1302,然后就開始查詢按鍵,有鍵按下則開始調(diào)整時間和設置鬧鐘,若沒有按下,則執(zhí)
37、行下面的時間、日期及鬧鐘時間的顯示,最后依次循環(huán)這些相同的操作,相應流程圖如圖11所示:</p><p> 圖11 程序主流程圖</p><p><b> 4.2 部分序</b></p><p> DS1302子程序:</p><p> void DS1302InputByte(unsigned char d)
38、//實時時鐘寫入一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsigned char i;</p><p><b> ACC = d;</b></p><p> for(i=8; i>0; i--)</p><p><
39、b> {</b></p><p> DS1302_IO = ACC0; //相當于匯編中的 RRC</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p> ACC = ACC >> 1; </p><
40、p><b> } </b></p><p><b> }</b></p><p> unsigned char DS1302OutputByte(void) //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsi
41、gned char i;</p><p> for(i=8; i>0; i--)</p><p><b> {</b></p><p> ACC = ACC >>1; //相當于匯編中的 RRC </p><p> ACC7 = DS1302_IO;</p>
42、<p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p><b> } </b></p><p> return(ACC); </p><p><b> }</b></p><p> void Write
43、1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)</p><p><b> {</b></p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p>
44、 DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr); // 地址,命令 </p><p> DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0
45、;</p><p><b> } </b></p><p> unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b> {</b></p><p> unsigned char ucData;<
46、/p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p> ucData = DS1302Out
47、putByte(); // 讀1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p> return(ucData);</p><p><b> }</b></p><p> void DS130
48、2_GetTime(SYSTEMTIME *Time) //獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組</p><p><b> {</b></p><p> unsigned char ReadValue;</p><p> ReadValue = Read1302(DS1302_SECOND);</p><p&g
49、t; Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MINUTE);</p><p> Time->Minute = ((ReadValue&0x70)>>4)*10 + (Re
50、adValue&0x0F);</p><p> ReadValue = Read1302(DS1302_HOUR);</p><p> Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS13
51、02_DAY);</p><p> Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_WEEK);</p><p> Time->Week = ((ReadValue&0x7
52、0)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MONTH);</p><p> Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> R
53、eadValue = Read1302(DS1302_YEAR);</p><p> Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b> }</b></p><p> DS18B20子程序</p>&
54、lt;p> void delay_18B20(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> /**********ds18b20初始化函數(shù)************
55、**********/</p><p> void Init_DS18B20(void) </p><p><b> {</b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復位</p><p> delay_18B
56、20(8); //稍做延時</p><p> DQ = 0; //單片機將DQ拉低</p><p> delay_18B20(80); //精確延時 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay_18B20(14);</p><
57、p> x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p><p><b> }</b></p><p> /***********ds18b20讀一個字節(jié)**************/ </p><p>
58、 unsigned char ReadOneChar(void)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b>
59、 {</b></p><p> DQ = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號</p><p><b> if(DQ)</b></p><p> dat
60、|=0x80;</p><p> delay_18B20(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> /*************ds18b20寫一個字節(jié)*****
61、***********/ </p><p> void WriteOneChar(uchar dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b
62、> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p> delay_18B20(5);</p><p><b> DQ = 1;</b></p><p><b
63、> dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> /**************讀取ds18b20當前溫度************/</p><p> void ReadTemp(voi
64、d)</p><p><b> {</b></p><p> unsigned char a=0;</p><p> unsigned char b=0;</p><p> unsigned char t=0;</p><p> Init_DS18B20();</p>&l
65、t;p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p> delay_18B20(100); // this message is wery important</p><p> Init_DS18B20();<
66、;/p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> delay_18B20(100);</p><p> a=ReadOneChar(); //讀取溫度值低位&l
67、t;/p><p> b=ReadOneChar(); //讀取溫度值高位</p><p> temp_value=b<<4;</p><p> temp_value+=(a&0xf0)>>4; </p><p><b> }</b></p>
68、;<p> void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b> {</b></p><p> TempBuffer[0]=temp_value/10+'0'; //十位</p><p> TempBuffer[1]=temp_value%10+'0&
69、#39;; //個位</p><p> TempBuffer[2]=0xdf; //溫度符號</p><p> TempBuffer[3]='C';</p><p> TempBuffer[4]='\0';</p><p><b> }</b></p><
70、p> void Delay1ms(unsigned int count)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0;i<count;i++)</p><p> for(j=0;j<120;j++);</p
71、><p><b> }</b></p><p><b> 5 電路仿真調(diào)試</b></p><p><b> 5.1總原理圖</b></p><p> 基于AT89S52單片機的電子萬年歷硬件電路圖如圖13所示,系統(tǒng)由AT89S52單片機,按鍵掃描電路、顯示電路、時鐘電路
72、、晶振電路、復位電路、電源指示電路及蜂鳴器輸出電路。</p><p> 圖13 基于AT89S52的電子萬年歷電路原理圖</p><p> 5.2 整體電路仿真圖以及仿真結(jié)果分析</p><p> 圖15 電子萬年歷仿真圖</p><p><b> 仿真結(jié)果分析</b></p><p>
73、; 仿真正確顯示了時間,在LCD1602中正確顯示了當前日期、時間并可以顯示鬧鐘時間,通過按按鍵K2就可以開始設置時間,依次按K2次在年、月、日、時、分之間切換,并且相應的調(diào)整的位會閃爍,按K3用于加1操作,K4用于減1操作。按K3則可以設置鬧鐘時間,依次按K2以在時和分之間切換,按K3,可以增加值,按K4,可以減小值。鬧鐘開啟設置:先按住K2然后再按K3可以開啟鬧鐘功能,當設置好鬧鐘后并開啟鬧鐘功能后,就可以有鬧鐘功能,按k1可以顯
74、示溫度。要達到的要求,符合了我們設計的要求。</p><p><b> 5.3 調(diào)試</b></p><p> 在軟件調(diào)試過程中,當按下按鍵調(diào)節(jié)時間和日期后,時間不能繼續(xù)在加,后來分析了程序才發(fā)現(xiàn),是在設置好時間和日期時我們暫停了時鐘,在設置完后沒有啟動時鐘,所以時間和日期就不能夠繼續(xù)走,在那里停止了,發(fā)現(xiàn)這個原因后,我在設置完時間后就開啟時鐘,時間和日期就能夠正
75、確顯示了。</p><p> 上電測試,LCD1602能夠正確顯示時間和日期,第一次K2鈕,開始設置秒,再按K4秒減1,按K3秒加1,按二次K2設置分,按K4分減1 按K3分加1,按三次K2,設置時,按K4減1,按K3加1,按四次K2設置星期,按K4減1 ,按K3分加1,按五次K2.設置天,按K4減1 ,按K3加1,按六次K2,設置月,按K4減1 ,按K3分加1,按七次K2,設置年,按K4減1 ,按K3分加1
76、,在對電路測試后,電路達到了所需的功能。</p><p> 通過對電路的多次的反復測試與分析,可以對電路的原理及功能更加熟悉,同時提高了設計能力及對電路的分析能力,同時在軟件的編程方面得到了更高的提高,對編程能力得到加強,同時對所學的知識得到了大的提高與鞏固。</p><p><b> 附錄</b></p><p> #include &
77、lt;REG51.H></p><p> #include <intrins.h></p><p> //#include "LCD1602.h"</p><p> //#include "DS1302.h"</p><p> #define uint unsigned int
78、</p><p> #define uchar unsigned char</p><p> sbit DS1302_CLK = P1^7; //實時時鐘時鐘線引腳 </p><p> sbit DS1302_IO = P1^6; //實時時鐘數(shù)據(jù)線引腳 </p><p> s
79、bit DS1302_RST = P1^5; //實時時鐘復位線引腳</p><p> sbit ACC0 = ACC^0;</p><p> sbit ACC7 = ACC^7;</p><p> char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hi
80、de_year,set_menu,a,flag_1=1; //秒,分,時到日,月,年位閃的計數(shù)</p><p> sbit Set =P1^4; //模式切換鍵</p><p> sbit Up = P1^3; //加法按鈕</p><p> sbit Down = P1^2; //減法按鈕</p><
81、p> sbit out = P1^1; //立刻跳出調(diào)整模式按鈕</p><p> sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p> sbit BEEP=P3^2; //蜂鳴器輸出口</p><p> sbit led=P2^0;</p><p> sbit xs=P2
82、^1;</p><p> char done,count,temp,flag,up_flag,down_flag ,flag_led;</p><p> uchar temp_value,j; //溫度值</p><p><b> uint b;</b></p><p> uchar TempBuff
83、er[5],week_value[2],Alarmtime[9],alarm[3],Alarm_time[3];</p><p> unsigned char code SONG[] ={ </p><p><b> //祝你平安</b></p><p> 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0
84、x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,</p><p> 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,</p><p> 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,
85、0x10,0x2b,0x80,0x26,0x20,</p><p> 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10</p><p> 0x26,0x20,</p><p> 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x
86、80,0x26,0x20,0x2b,0x10,0x2b,0x10,</p><p> 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,</p><p> 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0
87、x18,0x20,0x26,0x20,</p><p> 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,</p><p> 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,
88、0x10,</p><p> 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,</p><p> 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,</p>
89、;<p> 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,</p><p> 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,</p><p>
90、0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00 </p><p><b> };</b></p><p> void Time_Init()</p><p><b> {</b></p><p>
91、; TMOD = 0x11;</p><p> IE = 0x8a;</p><p> TH0 = 0xDC;</p><p> TL0 = 0x00;</p><p> TH1 = 0xDC;</p><p> TL1 = 0x00;</p><p><b>
92、 }</b></p><p> void Time0_Int() interrupt 1</p><p><b> {</b></p><p> TH0 = 0xDC;</p><p> TL0 = 0x00;</p><p> a++;//長度加1</p>
93、;<p><b> }</b></p><p> void Time1_Int() interrupt 3</p><p><b> {</b></p><p> TH1 = 0xDC;</p><p> TL1 = 0x00;</p><p> b
94、++;//長度加1</p><p> if(b==255)</p><p><b> { </b></p><p><b> TR1=0; </b></p><p><b> b=0;</b></p><p> flag_led=1;
95、</p><p><b> }</b></p><p><b> }</b></p><p> void Delay_xMs(uint x)</p><p><b> {</b></p><p><b> uint i,j;</
96、b></p><p> for(i=0; i<x; i++)</p><p><b> {</b></p><p> for(j=0; j<3; j++);</p><p><b> }</b></p><p><b> }</b&
97、gt;</p><p> void Play_Song(uchar i)</p><p><b> {</b></p><p> uchar Temp1,Temp2;</p><p> uint Addr;</p><p> a = 0;//中斷計數(shù)器清0</p>
98、;<p> Addr = i * 217;</p><p> while(flag_1)</p><p><b> {</b></p><p> if(out==0)</p><p><b> {</b></p><p><b> flag
99、_1=0;</b></p><p><b> }</b></p><p> Temp1 = SONG[Addr++];</p><p> if (Temp1 == 0xFF) //休止符</p><p><b> {</b></p><p&g
100、t;<b> TR0 = 0;</b></p><p> Delay_xMs(100);</p><p><b> }</b></p><p> else if (Temp1 == 0x00) //歌曲結(jié)束符</p><p><b> {</b></p&g
101、t;<p><b> return;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> Temp2 = SONG[Addr++];&l
102、t;/p><p><b> TR0 = 1;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> BEEP = ~BEEP;</p><p> Delay_xMs(Temp1);<
103、;/p><p> if(Temp2 ==a)</p><p><b> {</b></p><p><b> a = 0;</b></p><p><b> break;</b></p><p><b> }</b></
104、p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void show_time(); //液晶顯示程序&l
105、t;/p><p> /***********1602液晶顯示部分子程序****************/</p><p> //Port Definitions**********************************************************</p><p> sbit LcdRs= P2^5;</p><
106、p> sbit LcdRw= P2^6;</p><p> sbit LcdEn = P2^7;</p><p> sfr DBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p> //內(nèi)部等待函數(shù)*************************************
107、*************************************</p><p> unsigned char LCD_Wait(void)</p><p><b> {</b></p><p><b> LcdRs=0;</b></p><p> LcdRw=1;_nop_()
108、;</p><p> LcdEn=1;_nop_();</p><p><b> LcdEn=0;</b></p><p> return DBPort;</p><p><b> }</b></p><p> //向LCD寫入命令或數(shù)據(jù)***********
109、*************************************************</p><p> #define LCD_COMMAND0 // Command</p><p> #define LCD_DATA1 // Data</p><p> #define LCD_CLEAR_SCREEN0x01
110、 // 清屏</p><p> #define LCD_HOMING 0x02 // 光標返回原點</p><p> void LCD_Write(bit style, unsigned char input)</p><p><b> {</b></p><p><b> Lc
111、dEn=0;</b></p><p> LcdRs=style;</p><p> LcdRw=0;_nop_();</p><p> DBPort=input; _nop_();//注意順序</p><p> LcdEn=1;_nop_();//注意順序</p><p
112、> LcdEn=0;_nop_();</p><p> LCD_Wait();</p><p><b> }</b></p><p> //設置顯示模式************************************************************</p><p> #def
113、ine LCD_SHOW0x04 //顯示開</p><p> #define LCD_HIDE0x00 //顯示關 </p><p> #define LCD_CURSOR0x02 //顯示光標</p><p> #define LCD_NO_CURSOR0x00 //無光標 </p>
114、<p> #define LCD_FLASH0x01 //光標閃動</p><p> #define LCD_NO_FLASH0x00 //光標不閃動</p><p> void LCD_SetDisplay(unsigned char DisplayMode)</p><p><b> {</b><
115、;/p><p> LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><p><b> }</b></p><p> //設置輸入模式************************************************************</p><p> #
116、define LCD_AC_UP0x02</p><p> #define LCD_AC_DOWN0x00 // default</p><p> #define LCD_MOVE0x01 // 畫面可平移</p><p> #define LCD_NO_MOVE0x00 //default</p&g
117、t;<p> void LCD_SetInput(unsigned char InputMode)</p><p><b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x04|InputMode);</p><p><b> }</b></p><
118、;p> //初始化LCD************************************************************</p><p> void LCD_Initial()</p><p><b> {</b></p><p><b> LcdEn=0;</b></p>
119、<p> LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點陣</p><p> LCD_Write(LCD_COMMAND,0x38);</p><p> LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標</p><p>
120、 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動</p><p><b> }</b></p><p> void LCD_clear()</p>
121、<p><b> {</b></p><p><b> LcdEn=0;</b></p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p><b> }</b></p><p> //
122、液晶字符輸入的位置************************</p><p> void GotoXY(unsigned char x, unsigned char y)</p><p><b> {</b></p><p><b> if(y==0)</b></p><p> LCD
123、_Write(LCD_COMMAND,0x80|x);</p><p><b> if(y==1)</b></p><p> LCD_Write(LCD_COMMAND,0x80|(x-0x40));</p><p><b> }</b></p><p> //將字符輸出到液晶顯示</
124、p><p> void Print(unsigned char *str)</p><p><b> {</b></p><p> while(*str!='\0')</p><p><b> {</b></p><p> LCD_Write(LCD_D
125、ATA,*str);</p><p><b> str++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /**********************蜂鳴器函數(shù)************************/
126、</p><p> di(unsigned long t)</p><p><b> {</b></p><p> unsigned long c;</p><p> unsigned int n;</p><p> for(c=0;c<t;c++)</p><
127、p><b> {</b></p><p> for(n=0;n<50;n++);//延時</p><p> BEEP=~BEEP; //取反輸出到喇叭的信號</p><p><b> }</b></p><p><b> }</b></p
128、><p> /*****************DS1302時鐘部分子程序************************/</p><p> typedef struct __SYSTEMTIME__</p><p><b> {</b></p><p> unsigned char Second;</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 萬年歷設計畢業(yè)論文
- 電子萬年歷畢業(yè)論文
- 畢業(yè)論文-基于tft彩屏的多功能萬年歷設計
- 萬年歷設計制作【畢業(yè)論文】
- 畢業(yè)論文——電子萬年歷設計
- 電子萬年歷設計-畢業(yè)論文
- 數(shù)字萬年歷設計畢業(yè)論文
- 畢業(yè)論文——電子萬年歷設計
- 多功能數(shù)字萬年歷課程設計
- 多功能電子萬年歷課程設計
- 基于proteus多功能電子萬年歷的設計與實現(xiàn)畢業(yè)論文
- 數(shù)字電子萬年歷的畢業(yè)論文
- 電子萬年歷的設計畢業(yè)論文
- 單片機電子萬年歷畢業(yè)論文
- 基于javascript的萬年歷設計【畢業(yè)論文】
- 單片機電子萬年歷畢業(yè)論文
- 萬年歷畢業(yè)論文---基于at89s52單片機的電子萬年歷設計
- c語言課程設計--多功能萬年歷
- 單片機電子萬年歷畢業(yè)論文
- 數(shù)字萬年歷設計論文
評論
0/150
提交評論