畢業設計(論文) (2017屆)
設計(論文)題目 基于單片機的電子時鐘系統
系 部信息與機電工程學院 專 業 班 級 學 號 姓 名 起 訖 日 期 指導教師龔偉吳學付 職稱講師 工程師
2017年 4月 18日
摘 要 在當今時代,隨著社會的進步和計算機技術的不斷發展,單片機技術在不斷的應用到各行各業,單片機具有功能強大,功耗低,體積小,價格便宜等優點,本文設計的電子時鐘系統是一個以單片機AT89C51為核心,并結合相關的電子元器件和應用程序構成的一個應用系統。本系統具有時間顯示、字符顯示和調整時間的功能,與傳統的機械表相比,它具有顯示直觀、走時精確等特點。適用于家庭、辦公室等場所。 本文詳細地論述了電子時鐘的設計方案以及各種元器件的介紹,本文主要是軟硬件相結合,以硬件為基礎,并進行各個模塊編寫。本系統以C語言進行軟件設計,并著重介紹了所使用的各個硬件接口技術以及各個接口的功能和工作過程。其次,闡述了各個程序的模塊和實現過程,最后進行了軟件仿真和調試。
關鍵詞:電子時鐘 單片機 液晶顯示 仿真
目錄 緒 論 1 第一章 設計說明 2 1.1 設計目的 2 1.2 設計方案選擇 2 1.3系統框架圖 2 第二章 系統硬件設計 3 2.1 AT89C51芯片介紹 3 2.1.1 AT89C51芯片簡介 3 2.1.2 封裝和引腳說明 3 2.2 顯示模塊 4 2.2.1 LCD1602模塊簡介 4 2.2.2 LCD1602的控制指令及操作流程 5 2.3系統電路 7 2.3.1時鐘電路 7 2.3.2復位電路 8 2.3.3按鍵電路 8 2.4系統電路圖 9 第三章 系統軟件設計 10 3.1 系統程序流程圖 10 3.2系統主要程序 11 3.3系統程序 13 第四章 系統調試 14 4.1 Keil軟件 14 4.2 Proteus軟件仿真 15 第五章 結論與展望 17 5.1 結論 17 5.2 數字時鐘的發展趨勢 17 結 語 18 參考文獻 19 致 謝 20 附錄Ⅰ 21 附錄Ⅱ 22
緒 論電子時鐘是現代社會必不可少的生活用品,隨著科學技術和經濟的發展,人們的生活水平不斷提高,因此對時鐘的要求也越來越高,時鐘的功能也越來越多。最初的時鐘利用機械式的指針來顯示時間,而在晚上的時候要通過燈光才能看到時間,而電子時鐘無論在白天還是晚上,都可以顯示時間,因此給人們帶來極大的便利,廣泛應用于家庭、辦公室等場所。 本文提出了一種基于AT89C51單片機的電子時鐘系統,以AT89C51為控制核心,和按鍵、液晶顯示等模塊組成了一個完整的硬件系統,可顯示字符和時間,還可以根據使用者的需要可以隨時對時間進行校對。 綜上所述,基于AT89C51的電子時鐘系統具有顯示直觀、成本低、功能實用、電路簡單等優點,具有廣闊的市場前景。
第一章 設計說明 1.1 設計目的本文目的為了設計出一個基于AT89C51單片機的電子時鐘系統,通過單片機和LCD液晶顯示屏來實現24小時制的時鐘顯示和調時功能。通過本次設計鞏固以前學的單片機知識,并進行一定的創新,使自己掌握單片機知識,并能將所學的知識應用到實際生活中,提高自己的動手能力。該系統電路較為簡單,易于實現,可控性好,操作簡單。 1.2 設計方案選擇(1)單片機選型 選用AT89C51單片機,指令簡單,易學易懂,外圍電路簡單,硬件設計方便,IO口操作簡單,成本低,程序燒寫簡單,對于設計開發非常實用。 (2)顯示方案 LCD液晶顯示器是一種功耗極低的顯示器件,它不僅省電,還能顯示文字、曲線、圖形等大量的信息,易于彩色化,所以采用LCD顯示器來顯示時間。 (3)計時方案 利用AT89C51內部定時/計數器進行中斷定時,配合軟件延時實現時分秒的計時。該方案可以節省硬件成本。 (4)按鍵設計 系統采用獨立式按鍵,共設計了三個按鍵,分別是“設置”、“+”、“-”,用來設置校時功能,這樣可以使電路更簡單。 1.3系統框架圖電子時鐘系統的框架圖如圖1-1所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6B.tmp.jpg 圖1-1 系統框架圖
第二章 系統硬件設計 2.1 AT89C51芯片介紹2.1.1 AT89C51芯片簡介 AT89C51單片機是美國ATMEL公司生產的一種微型計算機芯片,具有高性能、低功耗、低成本等優點。它是EPROM和EEPROM技術有機結合的產物。其既具有EPROM一樣的可編程能力,又帶有象EEPROM的電可擦除性能,而且還具有不揮發性、訪問速度快 (約 60ns)和密度高等特點。由于以上優點使AT89C51可靠性高、實時性好、速度快、系統掉電后重要數據和狀態信息不會丟失,其性能價格比遠高于同類芯片。它與MCS-51指令系統兼容,片內FPEROM允許對程序存儲器在線重復編程,也可用常規的EPROM編程器編程,可循環寫入/擦除1000次。 AT89C51芯片的主要特點:具有4K字節可編程閃爍存儲器,數據可保留10年,可進行1000寫和擦循環,RAM為128*8位,有兩個16位的定時器/計數器。
2.1.2 封裝和引腳說明 AT89C51單片機的引腳圖如圖2-1所示,其中P3口作為特殊功能口,備選功能如表2-1所示。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6C.tmp.jpg 圖2-1 AT89C51單片機引腳圖
表2-1 P3特殊功能口
2.2 顯示模塊2.2.1 LCD1602模塊簡介 LCD1602字符點陣液晶顯示器是一種功耗極低的顯示器件,工作電壓為5V,可以顯示2行16個字符,它不僅省電,而且能夠顯示文字、曲線、圖形等大量信息。其主要特點有:低壓微功耗、平板型結構、被動顯示、顯示信息量大、易于色彩化、壽命長。廣泛應用于便攜式電子產品中。LCD1602的外部引腳圖如圖2-2所示,該模塊有16個引腳,各引腳功能如表2-2所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC6D.tmp.jpg 圖2-2 LCD1602外部引腳
表2-2引腳功能 引腳號 | | | | | | | | | | | | | | 數據和指令選擇控制器,RS=0:命令/狀態;RS=1:數據 | | | | | | 數據讀寫操作控制位,E線向LCD模塊發送一個脈沖,LCD模塊與單片機之間將進行一次數據交換 | | | 數據線,可以用8位連接,也可以用高4位連接,節約單片機資源 | | | | | | |
2.2.2 LCD1602的控制指令及操作流程 LCD1602液晶顯示屏內部的控制器共11條控制指令,其控制命令如表2-3所示。它的讀寫操作、光標的操作和屏幕都是通過指令編程來實現的。(注:1為高電平、0為低電平) 表2-3 控制命令表 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC7E.tmp.jpg LCD1602可以在8根I/O線上來讀寫數據,因此LCD的控制器接口有嚴格的通信協議來保證其讀寫數據傳輸的正確性和完整性。1602字符LCD基本操作有四種: (1)讀狀態:輸入信號:RS=0,RW=1,E=1 輸出信號:D0~D7=狀態字 (2)讀數據:輸入信號:RS=1,RW=1,E=1 輸出信號:D0~D7=數據 (3)寫指令:輸入信號:RS=0,RW=0,E=1->0 輸出信號:D0~D7=指令 (4)寫數據:輸入信號:RS=1,RW=0,E=1->0 輸出信號:D0~D7=數據 其讀寫信號的操作時序如圖2-3所示,電路連接圖如2-4所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC7F.tmp.jpg 圖2-3 LCD1602的基本操作流程
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC80.tmp.jpg 圖2-4 LCD1602的電路連接圖
2.3系統電路2.3.1時鐘電路 時鐘電路為單片機的工作提供基本時鐘,在單片機內部有一個高增益反向放大器,其輸入端引腳為XTAL1,輸出端引腳為XTAL2。只要在XTAL1和XTAL2之間跨接晶體振蕩器和微調電容,就就可以構成一個穩定的自激振蕩器,產生單片機工作所需要的時鐘信號。如圖2-5所示就是振蕩電路,晶振頻率越高,系統的運行速度也就越快,本設計中選用了11.0592MHz的晶振。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC81.tmp.jpg 圖2-5 時鐘振蕩電路
2.3.2復位電路 無論是在單片機剛開始接電源的時候,還是斷電或發生故障后都要進行復位。單片機復位使CPU和系統中的其他功能器件都要恢復到一個確定的初始狀態,并從這個狀態開始工作。如圖2-6所示為按鍵復位電路,通過按鍵實現復位,在接電瞬間,按鍵端的電位與Vcc相同,隨著充電電流的減少,RET的電位逐漸下降,當按下按鍵時,電源Vcc經電阻分壓,在RST端產生一個復位高電平。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC82.tmp.jpg 圖2-6 復位電路
2.3.3按鍵電路 本系統采用的是獨立式按鍵,直接用I/O口線來構成簡單的一個按鍵電路,按鍵的開關狀態是通過一定的電路轉換為高、低電平狀態。 它也是整個系統中最簡單的部分,根據功能要求,本系統設計三個按鍵:功能選擇鍵、功能加鍵和功能減鍵(如圖2-7所示)。 P3.0口接開關K1表示功能選擇鍵,選擇要調整的時、分﹑秒; P3.1口接開關K2表示“加”鍵,按一下則對應的數字加1; P3.2口接開關K3表示“減”鍵,按一下則對應的數字減1。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC83.tmp.jpg
圖2-7 按鍵電路
2.4系統電路圖數字時鐘系統電路圖請見附件Ⅰ。
第三章 系統軟件設計 3.1 系統程序流程圖用AT89C51單片機通過程序控制的方式來產生時間信號,利用P0口將時間信息顯示在LCD1602液晶顯示屏上。剛開始的時候,程序進行標識位初始化,并且對時鐘單元初始化,開始讀取單片機上的時間信息,通過對程序的讀取,在液晶顯示器上就可以顯示時間。當有按鍵按下的時候進行鍵值的處理,如果沒有按鍵按下,程序則重新讀取時間信息。系統程序流程圖如圖3-1所示。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC94.tmp.jpg 圖3-1 系統程序流程圖 3.2系統主要程序數字電子時鐘系統是基于C語言的在LCD液晶顯示器上顯示HH.MM.SS(時分秒),按鍵1選擇調整時間,按鍵2將增加時間,按鍵3將減少時間。該系統主要通過以下函數來實現功能: 3.2.1中斷函數 函數timer0實現提供時間功能 void timer0() interrupt 1 //定時器中斷,提供時間 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } } display(5,shi); //送液晶顯示 } display(8,fen); } display(11,miao); }
3.2.2延時函數
函數delay(uint x)實現的延時功能。 delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); }
3.2.3鍵盤掃描函數
函數keyscan實現時間的調整功能 void keyscan() ///鍵盤掃描函數, { uchar num; if(key1==0) { delay(5); if(key1==0) { num++; while(key1==0); switch(num) { case 1:TR0=0;write_com(0x80+0x40+11);write_com(0x0f);break; case 2:write_com(0x80+0x40+8);break; case 3:write_com(0x80+0x40+5);break; case 4:TR0=1;num=0;write_com(0x0c);break; } } } if(num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2); switch(num) { case 1:miao++; if(miao==60)miao=0;display(11,miao); write_com(0x80+0x40+11);break; case 2:fen++; if(fen==60)fen=0;display(8,fen); write_com(0x80+0x40+8);break; case 3:shi++; if(shi==24)shi=0;display(5,shi); write_com(0x80+0x40+5);break; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); switch(num) { case 1:if(miao==0)miao=60;miao--; display(11,miao);write_com(0x80+0x40+11);break; case 2:if(fen==0)fen=60;fen--; display(8,fen);write_com(0x80+0x40+8);break; case 3:if(shi==0)shi=24;shi--; display(5,shi);write_com(0x80+0x40+5);break; } } } } }
3.2.4顯示函數
函數display實現顯示功能 void display(uchar address,uchar date) //液晶顯示函數 { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+address); write_date(0x30+shi); write_date(0x30+ge); } 3.3系統程序時鐘控制程序清單請見附件Ⅱ。
第四章 系統調試 完成了系統的硬件設計和軟件設計后,要使系統能夠按照設計思路正常運行,還必須要進行系統調試。我們將通過基于C語言的Keil軟件來進行編程,并通過Proteus軟件進行仿真測試,檢驗系統是否能夠實現顯示和調整時間的功能。 4.1 Keil軟件由于我們使用的是用C語言編寫的程序,而Proteus軟件并不能直接寫入C語言進行仿真,因此我們要使用keil軟件,步驟如下: 1.打開keil軟件,點擊菜單欄的“Project”,新建工程,會出現“Creat New Project”小窗口,我們給工程取名為“test”并點擊保存,然后在左邊的選擇欄中找到AT89C51這個型號,選中并點“確定”按鈕。 2.返回到編輯窗口,并新建一個空白文檔,出現一個程序編輯框,輸入我們寫好的C語言程序,然后另存為C語言格式。 3.返回到編輯區,右鍵工程選擇“test.c”,將其添加到工程中去。 4.配置Target,在Output界面中,勾選“Creat HEX Fi”選項,并返回到編輯窗口,單擊“運行”,就生成我們需要的“test.hex”文件。 如圖4-1和圖4-2為keil軟件和生成好的hex文件。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC95.tmp.jpg圖4-1 keil軟件 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC96.tmp.jpg圖4-2 生成好的hex文件 4.2 Proteus軟件仿真Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件,可完成從遠離布局圖、PCB設計、代碼調試到單片機與外圍電路的協同仿真,真正實現了從概念到產品的完整設計,是目前世界上唯一將電路仿真軟件、PCB設計軟件和仿真軟件三合一的設計平臺,其處理器支持8051、ARM8086等。 (1)具有強大的電路圖繪制和仿真的功能。 (2)實現了單片機仿真和SPICE電路仿真相結合。具有數字電路仿真、模擬電路仿真、單片機及其外圍電路的系統仿真等。 (3)提供軟件調試功能。具有全速、單步、設置斷點等調試功能,同時可以觀察各變量的當前狀態,并支持第三方編譯和調試環境,如Keil等軟件。 仿真步驟如下: 1.選擇好相應的電子元器件,按電路原理圖將各個元器件連接。 2.設置各個元器件的參數值。 3.將生成的hex文件添加到單片機中。 4.點擊Proteus ISIS窗口下方的Play鍵可以觀察到電路仿真結果(如圖4.3所示)。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDC97.tmp.jpg
圖4-3仿真結果
第五章 結論與展望5.1 結論本文系統的闡述了基于單片機的電子時鐘系統從理論到功能的實現的過程,該系統結構簡單清晰,操作簡單,成本低,易于實現,能夠顯示字符、時間,走時精準,還可以根據需要任意調整時間,很好的實現了其功能,滿足人們日常生活的需要。該系統也能夠很好的學習單片機的應用技術知識,滿足教學需要,是一個理想的電子產品設計,同時也擴大了單片機應用的領域。 5.2 數字時鐘的發展趨勢 單片機自問世以來,就以其高性能、低成本的特點受到人們的歡迎,廣泛應用于各個行業,目前單片機的應用已滲透到我們生活的各個領域,其應用領域也在不斷得擴展。在電子時鐘未出現之前,人們采用石英鐘,但這種石英鐘在夜間的時候無法看到時間,所以電子時鐘的出現為人們的生活提供了極大的便利,得到了社會的歡迎,在社會上占有相當一部分市場。而這種基于單片機的電子時鐘從簡單的電路實現顯示功能發展到了多功能數字顯示功能,已走過了多年的發展路程,但隨著現代計算機技術和新興產業技術的發展,電子時鐘將會融入更多的技術,使其功能更加完善,設計更加人性化,顯示的內容更加豐富。 結 語經過幾個月不懈的努力,我的畢業設計終于完成了,通過本次論文的設計,我掌握了電子時鐘系統從理論到實踐的過程,認識了一個完整的系統從最初的設計到最終的完成的過程。畢業設計不僅是對我們前面所學知識的一種檢驗,更是對自己能力的一種提高,做畢業論文的過程也是一次再系統學習的過程,通過這次畢業設計使我明白了自己原來知識還比較欠缺,自己要學習的東西還太多。學習是一個長期積累的過程,在以后的工作、生活中都應該不斷的學習,努力提高自己知識和綜合素質。 大學課堂的學習只是讓我們掌握理論知識,我們應該把學到的東西應用到我們的實際生活中,而這次的論文設計讓我從電子時鐘的理論設計成功的轉化為實踐應用,很好的鍛煉了應用能力,我也會在以后的生活、學習中不斷的磨練自己,使自己適應于以后的競爭。 畢業設計的完成,也意味著大學生活即將結束,在這三年來,我們不僅學到了專業知識,也認識了不少的同學和老師,在此感謝各位同學和老師給予我的幫助,也感謝學校給我們提供這樣一個展現自我的舞臺,提高了我們的動手實踐能力。在做畢業設計的日子里,也感謝龔偉老師給予我的悉心指導。感謝提供相關技術幫助的老師和同學,你們給了我很大的幫助和支持,我在此深表謝意。
參考文獻[1] 佟云峰.《單片機原理及運用》.北京:機械工業出版社,2013 [2] 王賢辰.《單片機應用技術》.北京:機械工業出版社,2015 [3] 王靜霞,劉俐等.《單片機應用技術》:北京.電子工業出版社,2015 [4] 孫煥銘,趙會成,王金.《51單片機C程序應用實例詳解》.北京:北京航空航天大學出版社,2011
[5] 謝龍漢,莫衍.《Proteus電子電路設計及仿真》.北京:電子工業出版社,2012
致 謝在論文完成之際,我要感謝的人很多。首先要感謝的是我的指導老師龔偉老師,沒有老師的悉心指導和寶貴的建議,這篇論文恐怕難以完成。然后我要感謝我的學校江蘇城市職業學院給我們提供這樣一個展現自我的機會,在這里我也收獲了好多。還有感謝這三年來教過我的老師,沒有這些年的積淀,我也沒有信心完成這篇論文,同時請各位老師對我的論文加以批評指正,及時完善論文的不足。 還有感謝這篇論文所涉及到的各位學者。本文引用了數位學者的研究文獻,如果沒有各位學者的研究成果的幫助和啟發,我將很難完成本篇論文的寫作。感謝我的同學和朋友,在我寫論文的過程中提供熱情的幫助與有價值的建議。 最后要感謝我的父母,沒有你們,就沒有我的今天,你們的支持與鼓勵,永遠是支撐我前進的最大動力。 謹以此致謝最后,我要向百忙之中抽時間對本論文進行審閱的各位老師表示衷心的感謝。
附錄Ⅰ 硬件系統原理圖如下圖所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDCA7.tmp.jpg
附錄Ⅱ 系統程序清單如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit rs=P2^4; sbit rw=P2^5; sbit en=P2^6; sbit key1=P3^0; sbit key2=P3^1; sbit key3=P3^2; sbit sclk=P1^3; sbit rst=P1^5; sbit io=P1^4; uchar code table[]=" ---JSCVC--- "; uchar code table1[]="Time 00:00:00 "; uint count,shi,fen,miao; //uchar num1; delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) //1602液晶寫命令 { rw=0; rs=0; P0=com; en=1; delay(5); en=0; delay(5); } void write_date(uchar date) //////1602液晶寫數據 { rs=1; rw=0; P0=date; en=1; delay(5); en=0; delay(5); } void init() //初始化函數 { uchar num; en=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++) { write_date(table[num]); delay(5); } write_com(0x80+0x40); for(num=0;num<14;num++) { write_date(table1[num]); delay(5); } TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void display(uchar address,uchar date) //液晶顯示函數 { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+address); write_date(0x30+shi); write_date(0x30+ge); } void keyscan() ///鍵盤掃描函數,實現時間的調整功能 { uchar num; if(key1==0) { delay(5); if(key1==0) { num++; while(key1==0); switch(num) { case 1:TR0=0;write_com(0x80+0x40+11);write_com(0x0f);break; case 2:write_com(0x80+0x40+8);break; case 3:write_com(0x80+0x40+5);break; case 4:TR0=1;num=0;write_com(0x0c);break; } } } if(num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2); switch(num) { case 1:miao++; if(miao==60)miao=0;display(11,miao); write_com(0x80+0x40+11);break; case 2:fen++; if(fen==60)fen=0;display(8,fen); write_com(0x80+0x40+8);break; case 3:shi++; if(shi==24)shi=0;display(5,shi); write_com(0x80+0x40+5);break; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); switch(num) { case 1:if(miao==0)miao=60;miao--; display(11,miao);write_com(0x80+0x40+11);break; case 2:if(fen==0)fen=60;fen--; display(8,fen);write_com(0x80+0x40+8);break; case 3:if(shi==0)shi=24;shi--; display(5,shi);write_com(0x80+0x40+5);break; } } } } } void main() //主函數 { init(); while(1) { keyscan(); } } void timer0() interrupt 1 //定時器中斷,提供時間 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==18) { count=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } } display(5,shi); //送液晶顯示 } display(8,fen); } display(11,miao); }
|