計算機科學與技術專業(yè)畢業(yè)論文-基于avr的可調(diào)電子鐘設計_第1頁
已閱讀1頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  畢 業(yè) 論 文</b></p><p>  題 目 基于AVR的可調(diào)電子鐘設計 </p><p>  院系名稱:計算機科學與技術 </p><p>  專業(yè)班級:11專升本 </p><p>

2、;  學生姓名: </p><p>  學 號:1110211057 </p><p>  指導教師: </p><p><b>  2013-3-12</b></p>

3、<p><b>  目錄</b></p><p><b>  摘 要4</b></p><p><b>  第一章 引言5</b></p><p><b>  1.1設計任務5</b></p><p><b>  1.2設計要求

4、5</b></p><p>  第二章 總體方案論證與設計6</p><p>  第三章 系統(tǒng)硬件設置7</p><p>  3.1 ATmega16單片機簡介7</p><p>  3.2 ATmega16單片機的工作原理7</p><p>  3.2.1 I/O端口的工作原理7</p&

5、gt;<p>  3.2.2定時/計數(shù)器8</p><p>  3.2.3 中斷系統(tǒng)8</p><p>  3.2.4 振蕩器9</p><p>  3.3時鐘模塊設計10</p><p>  3.3.1 DS1302特性介紹10</p><p>  3.3.2 DS1302引腳介紹11<

6、;/p><p>  3.3.3 DS1302有關日歷,時間的寄存器12</p><p>  3.3.4 DS1302與單片機接口電路12</p><p>  3.4顯示模塊設計13</p><p>  3.4.1 LCD1602的特性介紹14</p><p>  3.4.2 LCD1602引腳介紹15</p

7、><p>  3.4.3 1602內(nèi)部功能器件及相關功能16</p><p>  3.4.4 1602液晶與單片機接口電路18</p><p>  3.5 設置模塊20</p><p>  3.6 振蕩電路21</p><p>  3.7 復位電路22</p><p>  第四章 系統(tǒng)軟件

8、設計23</p><p>  4.1 時鐘函數(shù)模塊25</p><p>  4.1.1實現(xiàn)功能25</p><p>  4.1.2 函數(shù)設計25</p><p>  4.2 顯示函數(shù)模塊30</p><p>  4.2.1實現(xiàn)功能30</p><p>  4.2.2 函數(shù)設計30&

9、lt;/p><p>  4.2.3 小結31</p><p>  4.3 按鍵函數(shù)模塊32</p><p>  4.3.1 實現(xiàn)功能32</p><p>  4.3.2 函數(shù)設計32</p><p>  4.3.3 小結32</p><p>  4.4 主函數(shù)模塊32</p>

10、<p>  第五章 心得體會33</p><p><b>  第六章 致謝33</b></p><p>  附錄 1元器件表34</p><p>  附錄2 仿真圖35</p><p><b>  附錄3 源碼36</b></p><p>  附錄4

11、參考文獻68</p><p><b>  摘 要</b></p><p>  單片機就是微控制器,是面向應用對象設計、突出控制功能的芯片。單片機接上晶振、復位電路和相應的接口電路,裝載軟件后就可以構成單片機應用系統(tǒng)。本設計就是應用單片機強大的控制功能制作而成的指針式電子鐘,該指針式電子鐘實現(xiàn)如下功能:液晶屏模擬表盤與時分秒指針顯示當前時鐘,K1鍵用于選擇調(diào)節(jié)對象,

12、K2鍵用于調(diào)整時分秒,在按下K4鍵時確定調(diào)節(jié)值,時鐘繼續(xù)運行。</p><p>  本設計采用的是AVR單片機,AVR系列的單片機不僅具有良好的集成性能,而且都具備在線編程接口,其中的Mega系列還具備JTAG仿真和下載功能;含有片內(nèi)看門狗電路、片內(nèi)程序Flash、同步串行接口SPI;多數(shù)AVR單片機還內(nèi)嵌了A/D轉(zhuǎn)換器、EEPROM、模擬比較器、PWM定時計數(shù)器等多種功能;AVR單片機的I/O接口具有很強的驅(qū)動

13、能力,灌入電流可直接驅(qū)動繼電器、LCD等元件。芯片采用DALLAS公司的涓細充電時鐘芯片DS1302,該芯片通過簡單的串行通信與單片機進行通信,時鐘/日歷電路能夠?qū)崟r提供年、月、日、時分、秒信息,采用雙電源供電,當外部電源掉電時能夠利用后備電池準確計時。</p><p>  顯示器件采用LCD1602液晶,通過相應的按鍵調(diào)整相應的值。通過此次設計能夠更加牢固的掌握單片機的應用技術,增強動手能力、硬件設計能力以及軟

14、件設計能力。</p><p>  關鍵詞 AVR單片機</p><p>  時鐘芯片DS1302 LCD1602液晶</p><p><b>  第一章 引言</b></p><p>  本例采用LCD1602液晶作為顯示元件,液晶屏顯示當前時鐘。該電子鐘實現(xiàn)如下功能:液晶屏模擬表盤與時分秒指針顯示當前時鐘,K1

15、鍵用于選擇調(diào)節(jié)對象,K2鍵用于調(diào)整時分秒,在按下K3鍵時確定調(diào)節(jié)值,時鐘繼續(xù)運行。本例程序包含控制模塊、顯示模塊、實時時間計算模塊、設置模塊(時間設置模塊)。</p><p><b>  1.1設計任務</b></p><p>  利用AVR單片機等實現(xiàn)一個簡單的基于AVR的可調(diào)電子鐘。</p><p><b>  1.2設計要求&l

16、t;/b></p><p>  a.實現(xiàn)年月日時分秒指針式顯示功能</p><p>  b.用三個按鍵來實現(xiàn)調(diào)整時分秒的功能</p><p>  第二章 總體方案論證與設計</p><p>  組成框圖中包含顯示模塊,控制器,時間模塊,設置模塊。顯示模塊有LCD1602來控制顯示,整個代碼實現(xiàn)主要由控制器來實現(xiàn),時間模塊有DS1302來

17、實現(xiàn),可以顯示系統(tǒng)時間,也可自行調(diào)整,設置模塊為按鍵處理。具體模塊分析在相關的軟硬件設計中詳細介紹。</p><p>  本設計中的可調(diào)電子鐘擬采用AVR系列單片機ATMEGA16作為主控制器,以DS1302時鐘芯片和16M的外置晶振提供準確時間標準,以期實現(xiàn)對“時、分、秒”的數(shù)字顯示和校準時間的計時裝置;可調(diào)電子鐘不但可以顯示當前時間,而且可以顯示年、月、日等,給人們的生活帶來方便。另外可調(diào)電子鐘還具備日期時間

18、的調(diào)節(jié)與寫入功能。本設計將以AVR單片機為控制核心,通過與DS1302信獲取實時時間,并將得到的數(shù)據(jù)通過LCD1602液晶顯示出來,同時通過相應的按鍵調(diào)整相應的值。因此本設計可分為以下模塊:控制模塊、顯示模塊、實時時間計算模塊、設置模塊(時間設置模塊)。</p><p>  第三章 系統(tǒng)硬件設置</p><p>  3.1 ATmega16單片機簡介</p><p>

19、;  ATmega16單片機是ATmega系列AVR單片機中內(nèi)容接口豐富,功能齊全,性能價格比較高的產(chǎn)品。它具有高性能、低功耗的8位AVR微處理器,先進的RISC結構,非易失性程序和數(shù)據(jù)存儲器等。ATmega16單片機的中央處理器由32個8位通用寄存器,1個算術運算單元及狀態(tài)和控制邏輯單元組成。AVR采用了哈弗結構,具有獨立的程序總線和數(shù)據(jù)總線,程序存儲器里的指令通過一級流水線運行。它的存儲器分為獨立尋址的flash 程序存儲器,片內(nèi)S

20、RAM 數(shù)據(jù)存儲器和EEPROM 3部分,均采用線性編址。</p><p><b>  圖3-1</b></p><p>  3.2 ATmega16單片機的工作原理</p><p>  3.2.1 I/O端口的工作原理</p><p>  ATmeage16單片機具有32個通用I/O口,分為PA,PB,PC,PD,每組

21、都是八位。這些I/O都是可以通過各自的端口寄存器設置為輸入或置成輸出,有些I/O口還具有第二功能。</p><p>  所有的端口引腳都具有內(nèi)部上拉電阻,可以通過寄存器獨立選擇是否連接,復位時所有的引腳都為高阻態(tài)。ATmega16單片機的每個端口都有三個I/O寄存器地址:數(shù)據(jù)寄存器PORTx(x=A\B\C\D,下同)、方向寄存器DDRx和輸入引腳PINx。</p><p>  3.2.2

22、定時/計數(shù)器</p><p>  ATmega16單片機有三個定時/計數(shù)器:T/C0,T/C1,T/C2。其中T/C0,T/C2是兩個八位的定時/計數(shù)器,而T/C1是16位的定時/計數(shù)器。</p><p>  T/Cx(0,1,2)是一個通用的帶有輸出比較匹配和PWM波形發(fā)生器的單通道8位定時/計數(shù)器模塊。T/Cx可以選擇通過預分頻器由系統(tǒng)時鐘驅(qū)動,或通過T0引腳的外部時鐘驅(qū)動,時鐘邏輯模

23、塊控制使用哪個時鐘源及哪個邊沿來進行加或者減計數(shù)。</p><p>  T/Cx(0,1,2)的時鐘分頻器對系統(tǒng)分頻后作為T/Cx(0,1,2)的驅(qū)動時鐘。T/Cx(0,1,2)的時鐘可以是系統(tǒng)時鐘或者系統(tǒng)時鐘的8分頻、64分頻、256分頻及1024分頻,通過控制寄存器TCCRx(0,1,2)。</p><p>  T/Cx雙緩沖結構的八位輸出比較寄存器OCRx(0,1,2)一直與T/Cx

24、(0,1,2)的計數(shù)值TCNTx(0,1,2)進行比較。一旦TCNTx(0,1,2)等于OCRx(0,1,2),比較器就給出匹配信號。有4種工作模式:普通模式,CTC模式,快速PWM模式,相位修正PWM模式。</p><p>  3.2.3 中斷系統(tǒng)</p><p>  ATmega16 單片機有21個中斷源,每一個中斷源都有一個獨立的中斷向量作為中斷服務程序的入口地址,而且所有的中斷源都

25、有自己的獨立的使能位。如果全局中斷I和相應使能位都置位,則在中斷標志位置位時將執(zhí)行中斷服務程序。一個中斷產(chǎn)生后,全局中斷使能位I將被清零,后續(xù)中斷被屏蔽。</p><p>  中斷相關的寄存器:MCU控制寄存器MCUCR,MCU控制和狀態(tài)寄存器MCUCSR,通用中斷控制寄存器GICR,通用中斷狀態(tài)寄存器GIFR.</p><p><b>  3.2.4 振蕩器</b>

26、</p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。    </p><p>  XTAL2:來自反向振蕩器的輸出。</p><p>  振蕩器特性:XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2

27、應不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。</p><p><b>  3.3時鐘模塊設計</b></p><p><b>  實時時間計算模塊</b></p><p>  方案(1):AVR單片機內(nèi)部帶有定時/計數(shù)功能,此定時功能是通過對

28、外部晶振的脈沖進行計數(shù),從而達到計時功能,只要使用11.0592的晶振就能實現(xiàn)零誤差的計時,因此可以利用此功能實現(xiàn)計時,但因為只有單一的計時功能要實現(xiàn)“萬年歷”的功能需要較復雜的程序,而且如果單片機掉電無法繼續(xù)進行計時,所以使用不便。</p><p>  方案(2):DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行通信,并可采用突發(fā)方

29、式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。利用單片機強大的控制功能就可實現(xiàn)實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。</p><p>  綜合上述兩種方案,宜采用方案(2)實現(xiàn)實時計時

30、功能。</p><p>  3.3.1 DS1302特性介紹</p><p>  DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.

31、5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。利用單片機強大的控制功能就可實現(xiàn)實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。</p><p>  DS1302可以對年、月、日、星期、時、分、秒進行計時,且具有閏年補償?shù)榷喾N功能DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數(shù)據(jù)位為BCD碼形式;采用單片機計時,一方面需要采用計數(shù)器,

32、占用硬件資源,另一方面需要設置中斷、查詢等,同樣耗費單片機的資源,而采用時鐘芯片DS1302。</p><p>  3.3.2 DS1302引腳介紹</p><p><b>  圖3-2</b></p><p>  8 、Vcc1:備用電池端;</p><p>  1、Vcc2:5V電源。當Vcc2>Vcc1+0

33、.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p>  7、 SCLK:串行時鐘,輸入;  </p><p>  6、I/O:數(shù)據(jù)輸入輸出口;</p><p>  5、CE/RST:復位腳</p><p>  2 3、X1、X2 是外接晶振腳 (32.768KH

34、Z的晶振)</p><p><b>  4、地(GND)</b></p><p>  3.3.3 DS1302有關日歷,時間的寄存器</p><p><b>  表3-1</b></p><p>  3.3.4 DS1302與單片機接口電路</p><p><b>

35、  圖3-3</b></p><p>  由于DS1302是依靠外部晶振與其內(nèi)部的電容配合來產(chǎn)生時鐘脈沖,因為DS1302在芯片本身已經(jīng)集成了6pF電容。所以,為了獲得穩(wěn)定的可靠的時鐘,必須選用具有6pF負載電容的晶振。當它工作于所要求的負載電容時,所以要選用32768HZ的晶振。</p><p>  石英晶振用12M,因為一個機器周期為1/12時鐘周期,所以這樣用12M的話,

36、一個時鐘周期為12us那么定時器計一次數(shù)就是1us了,電容范圍是在20-40pf之間的都行。</p><p><b>  表3-2</b></p><p><b>  3.4顯示模塊設計</b></p><p><b>  液晶顯示模塊</b></p><p>  方案(1):

37、數(shù)碼管是利用發(fā)光二極管的特性組合而成數(shù)字顯示器件,通過控制相應的二極管的狀態(tài)顯示相應的數(shù)字。要使數(shù)碼管正常顯示就得有驅(qū)動電路驅(qū)動相應的段碼,數(shù)碼管的現(xiàn)實方式可分為靜態(tài)顯示和動態(tài)顯示,靜態(tài)顯示方式只適合顯示單個的數(shù)字,因此本設計應采用動態(tài)顯示方式。由于動態(tài)顯示方式利用的是人眼視覺暫留的特性,掃描的時間應不大于20毫秒,占用系統(tǒng)資源大,而且顯示的個數(shù)和字型有限,在本設計中不易采用。</p><p>  方案(2):L

38、CD1602是一種圖形點陣液晶顯示器,它主要由行驅(qū)動器/列驅(qū)動器及點陣液晶顯示器組成??赏瓿勺址@示,也可以顯示16*2字。該類液晶顯示模塊(即KS0108B及其兼容控制驅(qū)動器)的指令系統(tǒng)比較簡單,總共只有七種。關于行列和頁的解釋:從上向下共2行,每一行為16字,漢字占32B,分左右兩半,各占16B,根據(jù)在LCD上開始顯示的行列號及每行的列數(shù)可以找到顯示RAM對應的地址,設立光標,送上要顯示的漢字的第一個字節(jié),光標位置加一,送第二個字節(jié)

39、,換行按列對齊。</p><p>  綜合比較上述兩種方案,應采用LCD1602液晶組成本設計的顯示模塊。</p><p>  3.4.1 LCD1602的特性介紹</p><p>  PG12864LCD是像素可尋址的圖形液晶顯示屏模塊</p><p><b>  芯片特性:</b></p><p&

40、gt;  1.工作電壓為4.5-5.5V,可自帶驅(qū)動LCD所需的負電壓。</p><p>  2.全屏幕點陣,點陣數(shù)為16*2的字符的顯示。</p><p>  3.與CPU接口采用5條位控制總線和8位并行數(shù)據(jù)總線輸入輸出。</p><p>  4.內(nèi)部有顯示數(shù)據(jù)鎖存器,自帶EL驅(qū)動。</p><p>  5.簡單的操作指令,顯示開關設置,顯

41、示起始行設置,地址指針設置和數(shù)據(jù)讀/寫等指令。</p><p>  3.4.2 LCD1602引腳介紹</p><p><b>  表3-3</b></p><p>  3.4.3 1602內(nèi)部功能器件及相關功能</p><p>  1. 指令寄存器(IR)</p><p>  指令寄存器負責存放

42、單片機寫給HD144780的指令,對IR的操作如下:</p><p>  當RS=0,R/W,E引腳由1變?yōu)?,就會把D0到D7引腳的數(shù)據(jù)送入指令寄存器IR。</p><p>  2.數(shù)據(jù)寄存器(DR)</p><p>  DR負責存放單片機寫給CGRAM與DDRAM的數(shù)據(jù)或從CGRAM與DDRAM的數(shù)據(jù)。對DR的操作如下:</p><p>

43、  當RS=1,R/W=1,E=1,HD44780就會把數(shù)據(jù)送到D0到D7引腳上,供單片機讀取。當RS=1,R/W=0,E引腳信號由1變?yōu)?,HD44780就會把D0到D7引腳上的數(shù)據(jù)存入DR中</p><p><b>  3.忙標志:BF</b></p><p>  BF標志提供內(nèi)部工作情況。BF=1表示模塊在內(nèi)部操作,此時模塊不接受外部指令和數(shù)據(jù)。BF=0時,模塊

44、為準備狀態(tài),隨時可接受外部指令和數(shù)據(jù)。</p><p>  4.顯示數(shù)據(jù)RAM(DDRAM)</p><p>  DDRAM是用來存放LCD要顯示的數(shù)據(jù),只要將點陣字符圖形的代碼送入DDRAM,內(nèi)部的控制電路就會自動將數(shù)據(jù)傳送到LCD顯示屏上,如果想在第一行的第一個位置顯示字符“0”,那么只要把字符“0”的代碼送達DDRAM的0X80地址中,在顯示屏就會出現(xiàn)一個字符“0”。</p&g

45、t;<p>  5.字符發(fā)生器(CGROM)</p><p>  HD47780芯片內(nèi)含一個CGROM,存儲了160個不同的點陣字符圖形,如數(shù)字、字母、中文等。CGROM用來存儲設計者自行設計個性化字符造型代碼的RAM,共有512bit,一個5*7的字符體占用8*8bit,因此CGRAM最多只能存放8個自定義字符。</p><p>  6.地址寄存器(AC)</p>

46、;<p>  AC是負責計算送DDRAM,CGRAM讀出的地址,或者計算寫到CGRAM,DDRAM數(shù)據(jù)的地址,當單片機對CGRAM,DDRAM進行操作時,AC會依照單片機對HD47780的操作自動修改地址的計數(shù)值。</p><p>  LCD1602內(nèi)嵌芯片HD47780的控制功能</p><p><b>  表3-4</b></p>&l

47、t;p>  3.4.4 1602液晶與單片機接口電路</p><p><b>  圖3-4</b></p><p><b>  表3-5</b></p><p>  排阻的計算公式:上拉電源 /(硬件額定電流—單片機輸出電流)</p><p>  一、最大值的計算原則:要保證上拉電阻明顯小于負

48、載的阻抗,以使高電平時輸出有效。 </p><p>  例如:負載阻抗是10K,供電電壓是5V,如果要求高電平不小于4.5V,那么,上拉電阻最大值 R大5-4.5)=10:5 </p><p><b>  R大=1K </b></p><p>  也就是最大值1k,(如果超過了1k,輸出的高電平就小于4.5V了) </p><

49、;p>  二、最小值的計算原則:保證不超過管子的額定電流(如果不是場效應管而是三極管也可依照飽和電流來計算) </p><p>  例:管子的額定電流150mA,放大倍數(shù)100,基極限流電阻10k,工作在5v的系統(tǒng)中。那么,算法如下: </p><p>  Ib=U/R=(5-0.7)/10=0.47(mA) </p><p>  Ic=100*0.47=47

50、mA 小于額定的150,所以可以按飽和法來算最小值。 </p><p><b>  上拉電阻最小值 </b></p><p>  R?。?v/47mA=106歐姆 (如果小于這個電阻,管子就會過飽和而沒有意義了。如果大于這個值,管子的導體電阻就會變大一些,所以太高也不利于低電平的輸出)</p><p><b>  3.5 設置模塊&l

51、t;/b></p><p>  設置模塊采用四個按鍵與PD連接</p><p>  按鍵與單片機的接口電路</p><p><b>  圖3-5</b></p><p>  按鍵的斷開與閉合式由機械觸點的動作實現(xiàn)。由于機械的彈性作用在按鍵的斷開與閉合過程中會產(chǎn)生抖動。此抖動的脈沖會給單片機帶來誤判斷,所以必須消除。

52、消除抖動可以從軟件和硬件兩方面入手。本設計采用軟件消除抖動,從按鍵斷開到穩(wěn)定閉合,此抖動的時間一般為5ms到10ms。所以當單片機檢測到有按鍵被按下時候,就延時一段時間。</p><p>  單片機與鍵盤的連接方式可分為獨立式,編碼式,串口擴展式和矩陣式。其中較為常用的有獨立式和矩陣式。本設計采用獨立式按鍵,也就是每一個按鍵都與端口獨立連接,每一個按鍵獨立占一根輸入線,一根輸入線的工作狀態(tài)不會影響其他按鍵。獨立式

53、按鍵通過檢測電平的狀態(tài)可以很容易判斷出有沒有按鍵被按下。獨立式的電路配置靈活,軟件算法簡單。</p><p><b>  3.6 振蕩電路</b></p><p>  本設計芯片選用內(nèi)部振蕩器方式。由于本設計的時間由內(nèi)部定時器中斷與軟件計數(shù)相結合產(chǎn)生的,所以從計算方便以及系統(tǒng)的效率上考慮,本設計選用12MHz頻率的晶振,電路原理圖如下:</p><

54、p>  圖3-6 atmage16的振蕩電路</p><p>  經(jīng)廠家推薦穩(wěn)定電路的電容C1,C2=22uf,C3為10uf。</p><p><b>  3.7 復位電路</b></p><p>  Atmega16有5個復位源:上電復位、外部復位、看門狗復位、掉電檢測復位及JTAG復位。復位時所有的I/O寄存器都被設置為初始值,程序

55、從復位向量開始執(zhí)行。本設計使用上電復位電路。單片機晶振為12MHz,起振時間將近1ms,單片機2個機器周期的時間為2us。</p><p>  單片機每次上電復位所需的最短延時應該不小于treset。這里,treset等于上電延時與起振延時之和。從實際上講,延遲一個treset往往還不夠,不能夠保障單片機有一個良好的工作開端。</p><p>  復位電路把單片機鎖定在復位狀態(tài)上并且維持一

56、個延時(記作TRST),以便給予電源電壓從上升到穩(wěn)定的一個等待時間;在電源電壓穩(wěn)定之后,再插入一個延時,給予時鐘振蕩器從起振到穩(wěn)定的一個等待時間;在單片機開始進入運行狀態(tài)之前,還要至少推遲2個機器周期的延時間。單片機是高電平的時候復位,一般是用電阻和電容組成的,電容充電的時RST復位端為高電平,此時單片機開始復位..電容充電完成,此時單片機復位完成。</p><p>  由此電容值可取10uf,電阻值取10KΩ。

57、詳細見附錄文件(電容充電時間的計算方法.pdf)</p><p>  圖3-7 Atmage上電復位電路</p><p>  第四章 系統(tǒng)軟件設計</p><p>  軟件設計是本設計的關鍵,軟件程序編寫的好壞直接影響著系統(tǒng)運行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設計,C語言具有編寫靈活、移植方便、便于模塊化設計的特點,所以本系統(tǒng)的軟件采用A

58、tmage16編寫。</p><p><b>  程序框圖如下:</b></p><p>  4.1 時鐘函數(shù)模塊</p><p>  具體實現(xiàn)含有向DS1302串行寫入一字節(jié)即DS1302writeByte,從DS1302讀取一字節(jié)即DS1302OreadByte,從DS1302指定位置讀數(shù)據(jù)Read1302,向DS1302某地址寫入數(shù)據(jù)Wr

59、ite1302,設置時間set_clock,從DS1302獲取時間(讀取當前時間),get_time利用這些函數(shù)來實現(xiàn)時間,最終顯示在液晶屏上,可以自行調(diào)整。</p><p>  你可以顯示系統(tǒng)時間,也可以顯示調(diào)整時間,具體實現(xiàn)是設置時間函數(shù)。</p><p><b>  4.1.1實現(xiàn)功能</b></p><p>  能夠顯示年月日時分秒和星

60、期,完成了24小時和12小時之間的切換,并設有鬧鐘,鬧鐘存放于EEPROM中,時間和星期以及鬧鐘均可調(diào)。其中鬧鐘掉電數(shù)據(jù)不會丟失。</p><p>  4.1.2 函數(shù)設計</p><p>  1:void DS1302writeByte(uchar _data)</p><p><b> ?。?)功能</b></p><p

61、>  向DS1302中寫入一字節(jié)數(shù)據(jù)。</p><p><b> ?。?)依據(jù)</b></p><p>  DS1302時序圖(詳見SD1302技術資料)可知,在啟動DS1302時每產(chǎn)生一個下降沿可向DS1302中寫入一位數(shù)據(jù)。</p><p> ?。?)右圖為流程圖:</p><p>  2:uchar DS13

62、02OreadByte(void)</p><p><b>  (1)功能</b></p><p>  從DS1302中讀取一字節(jié)數(shù)據(jù)。</p><p><b> ?。?)依據(jù)</b></p><p>  DS1302時序圖(詳見SD1302技術資料)可知,在啟動DS1302時每產(chǎn)生一個上升沿可向D

63、S1302中</p><p><b>  讀取一位數(shù)據(jù)。</b></p><p>  (3)右圖為流程圖:</p><p>  3:uchar Read1302(uchar ucAddr)</p><p><b>  功能</b></p><p>  從指定的地址中讀取一字節(jié)

64、數(shù)據(jù)。</p><p><b>  依據(jù)</b></p><p>  DS1302時序圖(詳見SD1302技術資料)可知,在啟動DS1302時每產(chǎn)生一個下降沿可向DS1302中寫入一位數(shù)據(jù)。在啟動DS1302時每產(chǎn)生一個上升沿可向DS1302中讀取一位數(shù)據(jù)。</p><p> ?。?)下圖為流程圖:</p><p>  

65、4:void Write1302(uchar ucAddr,uchar ucDa)</p><p><b> ?。?)功能</b></p><p>  向DS1302指定地址中寫入一字節(jié)數(shù)據(jù)。</p><p><b> ?。?)依據(jù)</b></p><p>  DS1302時序圖(詳見SD1302技

66、術資料)可知,在啟動DS1302時每產(chǎn)生一個下降沿可向DS1302中寫入一位數(shù)據(jù)。在啟動DS1302時每產(chǎn)生一個上升</p><p>  沿可向DS1302中讀取一位數(shù)據(jù)。</p><p> ?。?)右圖為流程圖:</p><p>  5:void affirm_data(void)</p><p><b>  功能</b&g

67、t;</p><p>  輸入數(shù)據(jù)入轉(zhuǎn)換函數(shù)、將十進制轉(zhuǎn)換成BCD碼</p><p><b>  依據(jù)</b></p><p><b>  轉(zhuǎn)換公式。</b></p><p> ?。?)下圖為流程圖:</p><p>  6:void get_time(uchar *time

68、)</p><p><b> ?。?)功能</b></p><p>  讀取當前時間,并判斷當前是12小時顯示還是24小時顯示。</p><p><b> ?。?)依據(jù)</b></p><p>  通過對標志位的判斷來確定當前為12小時制還是24小時制,如果為12小時時要將DS1302寄存器內(nèi)相應位

69、置1。</p><p>  (3)右圖為流程圖:</p><p>  7:void set_clock(void)</p><p><b>  功能</b></p><p>  向DS1302中寫入初始時間,啟動DS1302振蕩器,判斷上下午。</p><p><b>  依據(jù)</

70、b></p><p>  DS1302時序圖(詳見SD1302技術資料)。</p><p>  8:void format_datetime(uchar d,uchar *a)</p><p><b>  功能</b></p><p><b>  將數(shù)字轉(zhuǎn)換成字符。</b></p>

71、<p><b>  依據(jù)</b></p><p><b>  ASII碼表。</b></p><p>  9:void init_1302(void)</p><p><b>  功能</b></p><p>  啟動DS1302振蕩器。</p>&

72、lt;p><b>  依據(jù)</b></p><p>  由DS1302的技術資料知,DS1302的秒寄存器的最高位為振蕩器控制位,向該位置一即可啟動振蕩器</p><p>  4.2 顯示函數(shù)模塊</p><p>  檢測LCD是否忙rd_bf( ),向LCD發(fā)送命令wr_dictate( )向lcd發(fā)送數(shù)據(jù)wr_data( )初始化16

73、02顯示init_lcd( ),初始化1602顯示屏show_function (通用顯示函數(shù))。</p><p>  顯示字符和漢字的字模是用相應的軟件導出的,根據(jù)液晶顯示屏的要求對時鐘進行調(diào)整。</p><p><b>  4.2.1實現(xiàn)功能</b></p><p>  通過1602顯示電子時鐘</p><p>  

74、4.2.2 函數(shù)設計</p><p>  1:void rd_bf(void)</p><p><b> ?。?)功能</b></p><p><b>  檢測LCD是否忙碌</b></p><p><b> ?。?)依據(jù)</b></p><p>  通

75、過判斷HD47780內(nèi)部是否處于空閑狀態(tài)等待單片機進行讀寫操作</p><p>  2:void wr_dictate(uchar dictate)</p><p><b>  功能</b></p><p>  寫指令函數(shù),dictate 是要寫入的指令</p><p><b>  依據(jù)</b>&l

76、t;/p><p>  通過判斷LCD是否忙碌,是讀/寫指令</p><p>  3:void wr_data(uchar dat)</p><p><b> ?。?)功能</b></p><p><b>  寫入數(shù)據(jù)</b></p><p><b>  (2)依據(jù)<

77、;/b></p><p>  通過判斷狀態(tài)位rd_bf(),是指令還是數(shù)據(jù)寄存器</p><p>  4:void init_lcd(void)</p><p><b> ?。?)功能</b></p><p><b>  初始化lcd</b></p><p><b

78、> ?。?)依據(jù)</b></p><p>  通過寫wr_dictate(0x38)來完成文本顯示區(qū)首地址,寫單參數(shù)函數(shù)實現(xiàn)光標形狀,和顯示方式設置。</p><p><b> ?。?)流程圖</b></p><p><b>  4.2.3 小結</b></p><p>  通過L

79、CD想顯示,LCD是很有用的,要牢牢掌握才行。</p><p>  4.3 按鍵函數(shù)模塊</p><p>  按鍵實現(xiàn)通過中斷來進行調(diào)整,鍵盤中斷(INT1)T1_INT,定時器1每秒刷新LCD顯示T0_INT。中斷時,系統(tǒng)會調(diào)用一段特定的函數(shù),即我們設置的中斷函數(shù),一般稱為中斷服務函數(shù),一般的函數(shù)的調(diào)用在程序中是固定的,二中斷服務函數(shù)的執(zhí)行完全是隨機的。</p><p

80、>  4.3.1 實現(xiàn)功能</p><p><b>  通過按鍵調(diào)整</b></p><p>  4.3.2 函數(shù)設計</p><p>  鍵盤中斷(INT1)</p><p><b>  4.3.3 小結</b></p><p>  通過對電子時鐘調(diào)整函數(shù)的編寫,是我

81、認識到,不管做什么,都要有明確的思路,對于本函數(shù)來說,大部分的內(nèi)容都是相同的不同的只是標志位的賦值不同唯一,此時變成人員就要有高度清晰的思路,只要有一個賦值不對,整個函數(shù)都會受到影響,而且這種錯誤是非常不易檢查的,同樣在作別的編程的時候也是一樣,只有有了高度清晰的思路,我們在變成過程中才不會被絆倒。</p><p><b>  4.4 主函數(shù)模塊</b></p><p&g

82、t;  通過初始化,對各個端口進行設置初值,如按鍵輸入端口PD,數(shù)據(jù)輸入輸出端口,控制端口等。對1302的初始化,lcd的初始化等完成主控制器的應用。</p><p><b>  第五章 心得體會</b></p><p>  單片機的學習已即將結束,我對自己的專業(yè)有了更深的體會。非常感謝老師們的辛勤教導,以企業(yè)的要求對我們進行培訓,開拓我們的思維,改變我們的思維方式,

83、讓我們自主發(fā)揮,讓我們在以后工作中少走很多彎路,并在此過程中讓我們自己找到了自身的種種缺點,讓我們受益非淺。也許現(xiàn)階段的學習還存在諸多不足,在以后的工作中,會勤于總結,認真學好自己的一切課程。</p><p><b>  第六章 致謝</b></p><p>  感謝吳老師的批閱和幫助,希望能達到你的要求,在你的幫助下我們的論文會愈來愈好的。</p>&

84、lt;p><b>  附錄 1元器件表</b></p><p><b>  附錄2 仿真圖</b></p><p>  注:代碼暫時還不能與protuse連接,</p><p><b>  附錄3 源碼</b></p><p><b>  /*</b>

85、;</p><p>  * dianzizhong.c</p><p><b>  *</b></p><p>  * Created: 2013-3-15 9:21:25</p><p>  * Author: Administrator</p><p><b>  */ </

86、b></p><p>  #include <avr/io.h>//單片機寄存器的頭文件</p><p>  #include <avr/pgmspace.h></p><p>  #include <util/delay.h></p><p>  #include <avr/interrupt

87、.h></p><p>  //a為要操作的寄存器,b為要操作的位數(shù)</p><p>  #define SET_1(a,b) a|=(1<<b)</p><p>  #define CLE_0(a,b) a&=~(1<<b)</p><p>  #define dataport PORTB</p&

88、gt;<p>  #define NOP()asm("nop")</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define RS_SET_1 SET_1(PORTC,PC0)</p><

89、p>  #define RS_CLE_0 CLE_0(PORTC,PC0)</p><p>  #define RW_SET_1 SET_1(PORTC,PC1)</p><p>  #define RW_CLE_0 CLE_0(PORTC,PC1)</p><p>  #define E_SET_1 SET_1(PORTC,PC2)</p>&

90、lt;p>  #define E_CLE_0 CLE_0(PORTC,PC2)</p><p>  #define SCLK_SET_1 SET_1(PORTD,PD4)</p><p>  #define SCLK_CLE_0 CLE_0(PORTD,PD4) </p><p>  #define DIO_SET_1 SET_1(PORTD,PD5)<

91、;/p><p>  #define DIO_CLE_0 CLE_0(PORTD,PD5) </p><p>  #define RST_SET_1 SET_1(PORTD,PD6)</p><p>  #define RST_CLE_0 CLE_0(PORTD,PD6) </p><p>  #define LED_bicker PORTD^

92、=(1<<PD3)</p><p>  #define WRITE_SECOND 0x80 //秒</p><p>  #define READ_SECOND 0x81 </p><p>  #define WRITE_MINUTE 0x82 //分</p><p>  #define

93、READ_MINUTE 0x83 </p><p>  #define WRITE_HOUR 0x84 //時</p><p>  #define READ_HOUR 0x85 </p><p>  #define WRITE_DAY 0x86 //日</p><p>

94、  #define READ_DAY 0x87 </p><p>  #define WRITE_MONTH 0x88 //月</p><p>  #define READ_MONTH0x89</p><p>  #define WRITE_YEAR0x8c</p><p>  #define

95、 READ_YEAR0x8d //年</p><p>  #define WRITE_PROTECT0X8E</p><p>  #define T1_CLOSE CLE_0(TCCR1B,CS11)</p><p>  #define T1_OPEN SET_1(TCCR1B,CS11)</p><p>  #define T1_

96、INIT_CLOSE CLE_0(TIMSK,TOIE1)</p><p>  #define T1_INIT_OPEN SET_1(TIMSK,TOIE1)</p><p>  uchar time[6];//存放年月日時分秒</p><p>  volatile uchar lcd_show[10];</p><p>  volatile

97、 uchar count =10;</p><p>  volatile uchar place = 0x80,value;</p><p>  uchar number[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};</p><p>  //檢測LCD是否忙碌</p><p>

98、;  void rd_bf(void)</p><p><b>  {</b></p><p>  dataport = 0xff;//數(shù)據(jù)端口選高電平</p><p>  RS_CLE_0;//指令寄存器</p><p>  RW_SET_1;//讀操作</p><p>  E_SET_1;//

99、E為高電平</p><p>  DDRB = 0x00;//設置為輸入,準備讀端口數(shù)據(jù)</p><p>  NOP();//適當?shù)难訒r</p><p><b>  NOP();</b></p><p>  while(PINB&0x80);//判斷數(shù)據(jù)端口的D7是否為1,假如為1則等待</p>&l

100、t;p>  E_CLE_0;//讀取數(shù)據(jù)完成</p><p>  DDRB = 0xff;</p><p><b>  }</b></p><p>  //寫指令函數(shù),dictate 為要寫入的指令</p><p>  void wr_dictate(uchar dictate)</p><p&

101、gt;<b>  {</b></p><p>  rd_bf();//每次寫數(shù)據(jù)之前,檢測LCD是否忙碌</p><p>  RW_CLE_0;//寫操作</p><p>  RS_CLE_0;//選擇指令寄存器</p><p>  E_SET_1;//E為高電平</p><p>  NOP();

102、//為等待點評穩(wěn)定</p><p><b>  NOP();</b></p><p>  dataport = dictate;//把指令寫入液晶顯示器</p><p>  E_CLE_0;//當E由高電平變?yōu)榈碗娖綍r指令被寫入寄存器</p><p><b>  }</b></p>&

103、lt;p>  //寫數(shù)據(jù)函數(shù),dat 為要寫入的數(shù)據(jù)</p><p>  void wr_data(uchar dat)</p><p><b>  {</b></p><p><b>  rd_bf();</b></p><p><b>  RW_CLE_0;</b>&

104、lt;/p><p>  RS_SET_1;//選擇數(shù)據(jù)寄存器</p><p><b>  E_SET_1;</b></p><p><b>  NOP();</b></p><p><b>  NOP();</b></p><p>  dataport =

105、dat;//寫入液晶顯示器</p><p><b>  E_CLE_0;</b></p><p><b>  }</b></p><p>  //初始化LCD函數(shù)</p><p>  void init_lcd(void)</p><p><b>  {</b

106、></p><p>  wr_dictate(0x38);//設置數(shù)據(jù)總線為8位,字符字體為5*7,顯示兩行</p><p>  wr_dictate(0x01);//清屏;</p><p>  wr_dictate(0x0c);//開顯示</p><p>  wr_dictate(0x06);//字符進入模式,屏幕不動,字符后移<

107、;/p><p><b>  }</b></p><p>  void display_lcd(uchar address,uchar ch_data)</p><p><b>  {</b></p><p>  wr_dictate(address);//寫地址</p><p>

108、  wr_data(ch_data);//寫數(shù)據(jù)</p><p><b>  }</b></p><p>  //向DS1302寫入一個字節(jié)</p><p>  void DS1302writeByte(uchar _data) </p><p><b>  { </b></p>&

109、lt;p>  uchar i; </p><p>  for(i=8; i>0; i--) </p><p><b>  { </b></p><p>  if(_data&0x01) </p><p><b>  { </b></p>&l

110、t;p>  DIO_SET_1;</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  DIO_CLE_0; </p><p>&

111、lt;b>  } </b></p><p>  SCLK_SET_1;//時鐘信號 </p><p>  _delay_us(2);</p><p>  SCLK_CLE_0; </p><p>  _data>>=1;//移位,準備好下次要寫的數(shù)據(jù)</p><p><b> 

112、 } </b></p><p><b>  } </b></p><p>  //向DS1302讀取一個字節(jié)</p><p>  uchar DS1302OreadByte(void)</p><p><b>  { </b></p><p>  uchar

113、i; </p><p>  uchar d_data=0; </p><p>  CLE_0(DDRD,PD5); </p><p>  for(i=8; i>0; i--) </p><p><b>  { </b></p><p>  d_data>>=1

114、;//移位,以便下次存放讀出的數(shù)據(jù) </p><p>  if(PIND&0X20) </p><p>  d_data|=0x80; </p><p>  SCLK_SET_1; </p><p>  _delay_us(2); </p><p>  SCLK_CLE_0

115、; </p><p><b>  } </b></p><p>  SET_1(DDRD,PD5); </p><p>  return (d_data);//返回讀到的數(shù)據(jù)</p><p><b>  } </b></p><p>  /*寫ds1302寄存器*

116、/</p><p>  void Write1302(uchar ucAddr,uchar ucDa)</p><p><b>  {</b></p><p>  RST_CLE_0;</p><p>  SCLK_CLE_0;</p><p>  RST_SET_1;</p>&l

117、t;p>  DS1302writeByte(ucAddr);//地址</p><p>  DS1302writeByte(ucDa);//寫1byte數(shù)據(jù)</p><p>  SCLK_SET_1;</p><p>  RST_CLE_0;</p><p><b>  }</b></p><p&

118、gt;  /*讀ds1302 的寄存器*/</p><p>  uchar Read1302(uchar ucAddr)</p><p><b>  {</b></p><p>  uchar ucData;</p><p>  RST_CLE_0;</p><p>  SCLK_CLE_0;&l

119、t;/p><p>  RST_SET_1;</p><p>  DS1302writeByte(ucAddr|0X01);//地址,命令</p><p>  ucData = DS1302OreadByte();</p><p>  SCLK_SET_1;</p><p>  RST_CLE_0;</p>&

120、lt;p>  return (ucData);</p><p><b>  }</b></p><p>  void get_time(uchar *time)</p><p><b>  {</b></p><p>  *(time+5) = Read1302(READ_SECOND);&l

121、t;/p><p>  *(time+4) = Read1302(READ_MINUTE);</p><p>  *(time+3) = Read1302(READ_HOUR);</p><p>  *(time+2) = Read1302(READ_DAY);</p><p>  *(time+1) = Read1302(READ_MONTH);

122、</p><p>  *(time+0) = Read1302(READ_YEAR);</p><p><b>  }</b></p><p>  /*void Initial(void)</p><p><b>  {</b></p><p>  Write1302(WRI

123、TE_PROTECT,0x00);</p><p>  Write1302(WRITE_SECOND,0x45);</p><p>  Write1302(WRITE_MINUTE,0x24);</p><p>  Write1302(WRITE_HOUR,0x09);</p><p>  Write1302(WRITE_DAY,0x13);

124、</p><p>  Write1302(WRITE_MONTH,0x04);</p><p>  Write1302(WRITE_PROTECT,0x80);</p><p><b>  }</b></p><p>  void adopt_data(uchar n,uchar *show_data)</p>

125、;<p><b>  {</b></p><p>  *show_data = n>>4;</p><p>  *(show_data +1) = n & 0x0f;</p><p><b>  }*/</b></p><p>  void T1_int(void)

126、</p><p><b>  {</b></p><p>  TCCR1B = 0x00;//控制寄存器,停止定時</p><p>  TIMSK |= 0x04;//中斷屏蔽寄存器,中斷允許</p><p>  TCNT1 = 0xcf2c;//100ms溢出一次</p><p>  TCCR1

127、B = 0x02;</p><p>  sei();//使能全局中斷</p><p><b>  }</b></p><p>  void init_1302(void)</p><p><b>  {</b></p><p>  Write1302(WRITE_PROTEC

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論