計算機(jī)科學(xué)與技術(shù)專業(yè)專升本論文.doc
1 畢 業(yè) 論 文 題題 目目 基于基于 AVR 的可調(diào)電子鐘設(shè)計的可調(diào)電子鐘設(shè)計 院系名稱:院系名稱:計算機(jī)科學(xué)與技術(shù)計算機(jī)科學(xué)與技術(shù) 專業(yè)班級:專業(yè)班級:1111 專升本專升本 學(xué)生姓名:學(xué)生姓名: 學(xué)學(xué) 號:號: 指導(dǎo)教師:指導(dǎo)教師: 2 目錄目錄 摘摘 要要4 4 第一章第一章 引言引言5 5 1.11.1 設(shè)計任務(wù)設(shè)計任務(wù)5 1.21.2 設(shè)計要求設(shè)計要求5 第二章第二章 總體方案論證與設(shè)計總體方案論證與設(shè)計總體方案論證與設(shè)計總體方案論證與設(shè)計6 6 第三章第三章 系統(tǒng)硬件設(shè)置系統(tǒng)硬件設(shè)置7 7 3.13.1 ATmega16ATmega16 單片機(jī)簡介單片機(jī)簡介.7 3.23.2 ATmega16ATmega16 單片機(jī)的工作原理單片機(jī)的工作原理.7 3.2.13.2.1 I/OI/O 端口的工作原理端口的工作原理 7 3.2.23.2.2 定時定時/ /計數(shù)器計數(shù)器 .8 3.2.33.2.3 中斷系統(tǒng)中斷系統(tǒng)8 3.2.43.2.4 振蕩器振蕩器9 3.33.3 時鐘模塊設(shè)計時鐘模塊設(shè)計.10 3.3.13.3.1 DS1302DS1302 特性介紹特性介紹 10 3.3.23.3.2 DS1302DS1302 引腳介紹引腳介紹 11 3.3.33.3.3 DS1302DS1302 有關(guān)日歷,時間的寄存器有關(guān)日歷,時間的寄存器 12 3.3.43.3.4 DS1302DS1302 與單片機(jī)接口電路與單片機(jī)接口電路 12 3.43.4 顯示模塊設(shè)計顯示模塊設(shè)計.13 3.4.13.4.1 LCD1602LCD1602 的特性介紹的特性介紹 .14 3.4.23.4.2 LCD1602LCD1602 引腳介紹引腳介紹 .15 3.4.33.4.3 16021602 內(nèi)部功能器件及相關(guān)功能內(nèi)部功能器件及相關(guān)功能 16 3.4.43.4.4 16021602 液晶與單片機(jī)接口電路液晶與單片機(jī)接口電路 18 3.53.5 設(shè)置模塊設(shè)置模塊 20 3.63.6 振蕩電路振蕩電路 21 3.73.7 復(fù)位電路復(fù)位電路 22 第四章第四章 系統(tǒng)軟件設(shè)計系統(tǒng)軟件設(shè)計2323 4.14.1 時鐘函數(shù)模塊時鐘函數(shù)模塊 25 4.1.14.1.1 實現(xiàn)功能實現(xiàn)功能 .25 3 4.1.24.1.2 函數(shù)設(shè)計函數(shù)設(shè)計.25 4.24.2 顯示函數(shù)模塊顯示函數(shù)模塊 30 4.2.14.2.1 實現(xiàn)功能實現(xiàn)功能 .30 4.2.24.2.2 函數(shù)設(shè)計函數(shù)設(shè)計.30 4.2.34.2.3 小結(jié)小結(jié).31 4.34.3 按鍵函數(shù)模塊按鍵函數(shù)模塊 32 4.3.14.3.1 實現(xiàn)功能實現(xiàn)功能.32 4.3.24.3.2 函數(shù)設(shè)計函數(shù)設(shè)計.32 4.3.34.3.3 小結(jié)小結(jié).32 4.44.4 主函數(shù)模塊主函數(shù)模塊 32 第五章第五章 心得體會心得體會3333 第六章第六章 致謝致謝3333 附錄附錄 1 1 元器件表元器件表 3434 附錄附錄 2 2 仿真圖仿真圖 3535 附錄附錄 3 3 源碼源碼 3636 附錄附錄 4 4 參考文獻(xiàn)參考文獻(xiàn) 6868 4 摘摘 要要 單片機(jī)就是微控制器,是面向應(yīng)用對象設(shè)計、突出控制功能的芯片。單片機(jī) 接上晶振、復(fù)位電路和相應(yīng)的接口電路,裝載軟件后就可以構(gòu)成單片機(jī)應(yīng)用系統(tǒng)。 本設(shè)計就是應(yīng)用單片機(jī)強(qiáng)大的控制功能制作而成的指針式電子鐘,該指針式電子 鐘實現(xiàn)如下功能:液晶屏模擬表盤與時分秒指針顯示當(dāng)前時鐘,K1 鍵用于選擇 調(diào)節(jié)對象,K2 鍵用于調(diào)整時分秒,在按下 K4 鍵時確定調(diào)節(jié)值,時鐘繼續(xù)運行。 本設(shè)計采用的是 AVR 單片機(jī),AVR 系列的單片機(jī)不僅具有良好的集成性能, 而且都具備在線編程接口,其中的 Mega 系列還具備 JTAG 仿真和下載功能;含有 片內(nèi)看門狗電路、片內(nèi)程序 Flash、同步串行接口 SPI;多數(shù) AVR 單片機(jī)還內(nèi)嵌 了 AD 轉(zhuǎn)換器、EEPROM、模擬比較器、PWM 定時計數(shù)器等多種功能;AVR 單片機(jī) 的 IO 接口具有很強(qiáng)的驅(qū)動能力,灌入電流可直接驅(qū)動繼電器、LCD 等元件。 芯片采用 DALLAS 公司的涓細(xì)充電時鐘芯片 DS1302,該芯片通過簡單的串行通 信與單片機(jī)進(jìn)行通信,時鐘/日歷電路能夠?qū)崟r提供年、月、日、時分、秒信息, 采用雙電源供電,當(dāng)外部電源掉電時能夠利用后備電池準(zhǔn)確計時。 顯示器件采用 LCD1602 液晶,通過相應(yīng)的按鍵調(diào)整相應(yīng)的值。通過此次設(shè) 計能夠更加牢固的掌握單片機(jī)的應(yīng)用技術(shù),增強(qiáng)動手能力、硬件設(shè)計能力以及軟 件設(shè)計能力。 關(guān)鍵詞關(guān)鍵詞 AVR 單片機(jī) 時鐘芯片 DS1302 LCD1602 液晶 5 第一章第一章 引言引言 本例采用 LCD1602 液晶作為顯示元件,液晶屏顯示當(dāng)前時鐘。該電子鐘實 現(xiàn)如下功能:液晶屏模擬表盤與時分秒指針顯示當(dāng)前時鐘,K1 鍵用于選擇調(diào)節(jié) 對象,K2 鍵用于調(diào)整時分秒,在按下 K3 鍵時確定調(diào)節(jié)值,時鐘繼續(xù)運行。本例 程序包含控制模塊、顯示模塊、實時時間計算模塊、設(shè)置模塊(時間設(shè)置模塊) 。 1.11.1 設(shè)計任務(wù)設(shè)計任務(wù) 利用 AVR 單片機(jī)等實現(xiàn)一個簡單的基于 AVR 的可調(diào)電子鐘。 1.21.2 設(shè)計要求設(shè)計要求 a實現(xiàn)年月日時分秒指針式顯示功能 b用三個按鍵來實現(xiàn)調(diào)整時分秒的功能 6 第二章第二章 總體方案論證與設(shè)計總體方案論證與設(shè)計總體方案論證與設(shè)計總體方案論證與設(shè)計 組成框圖中包含顯示模塊,控制器,時間模塊,設(shè)置模塊。顯示模塊有 LCD1602 來控制顯示,整個代碼實現(xiàn)主要由控制器來實現(xiàn),時間模塊有 DS1302 來實現(xiàn),可以顯示系統(tǒng)時間,也可自行調(diào)整,設(shè)置模塊為按鍵處理。具體模塊分 析在相關(guān)的軟硬件設(shè)計中詳細(xì)介紹。 本設(shè)計中的可調(diào)電子鐘擬采用 AVR 系列單片機(jī) ATMEGA16 作為主控制器, 以 DS1302 時鐘芯片和 16M 的外置晶振提供準(zhǔn)確時間標(biāo)準(zhǔn),以期實現(xiàn)對“時、分、 秒”的數(shù)字顯示和校準(zhǔn)時間的計時裝置;可調(diào)電子鐘不但可以顯示當(dāng)前時間,而 且可以顯示年、月、日等,給人們的生活帶來方便。另外可調(diào)電子鐘還具備日期 時間的調(diào)節(jié)與寫入功能。本設(shè)計將以 AVR 單片機(jī)為控制核心,通過與 DS1302 信獲取實時時間,并將得到的數(shù)據(jù)通過 LCD1602 液晶顯示出來,同時通過相應(yīng) 的按鍵調(diào)整相應(yīng)的值。因此本設(shè)計可分為以下模塊:控制模塊、顯示模塊、實時 時間計算模塊、設(shè)置模塊(時間設(shè)置模塊) 。 7 第三章第三章 系統(tǒng)硬件設(shè)置系統(tǒng)硬件設(shè)置 3.13.1 ATmega16 單片機(jī)簡介單片機(jī)簡介 ATmega16 單片機(jī)是 ATmega 系列 AVR 單片機(jī)中內(nèi)容接口豐富,功能齊全,性 能價格比較高的產(chǎn)品。它具有高性能、低功耗的 8 位 AVR 微處理器,先進(jìn)的 RISC 結(jié)構(gòu),非易失性程序和數(shù)據(jù)存儲器等。ATmega16 單片機(jī)的中央處理器由 32 個 8 位通用寄存器,1 個算術(shù)運算單元及狀態(tài)和控制邏輯單元組成。AVR 采用了 哈弗結(jié)構(gòu),具有獨立的程序總線和數(shù)據(jù)總線,程序存儲器里的指令通過一級流水 線運行。它的存儲器分為獨立尋址的 flash 程序存儲器,片內(nèi) SRAM 數(shù)據(jù)存儲器 和 EEPROM 3 部分,均采用線性編址。 圖 3-1 3.23.2 ATmega16ATmega16 單片機(jī)的工作原理單片機(jī)的工作原理 3.2.13.2.1 I/OI/O 端口的工作原理端口的工作原理 8 ATmeage16 單片機(jī)具有 32 個通用 I/O 口,分為 PA,PB,PC,PD,每組都是八位。 這些 I/O 都是可以通過各自的端口寄存器設(shè)置為輸入或置成輸出,有些 I/O 口還 具有第二功能。 所有的端口引腳都具有內(nèi)部上拉電阻,可以通過寄存器獨立選擇是否連接, 復(fù)位時所有的引腳都為高阻態(tài)。ATmega16 單片機(jī)的每個端口都有三個 I/O 寄存 器地址:數(shù)據(jù)寄存器 PORTx(x=ABCD,下同)、方向寄存器 DDRx 和輸入引腳 PINx。 3.2.23.2.2 定時定時/ /計數(shù)器計數(shù)器 ATmega16 單片機(jī)有三個定時/計數(shù)器:T/C0,T/C1,T/C2。其中 T/C0,T/C2 是兩個八位的定時/計數(shù)器,而 T/C1 是 16 位的定時/計數(shù)器。 T/Cx(0,1,2)是一個通用的帶有輸出比較匹配和 PWM 波形發(fā)生器的單通道 8 位定時/計數(shù)器模塊。T/Cx 可以選擇通過預(yù)分頻器由系統(tǒng)時鐘驅(qū)動,或通過 T0 引腳的外部時鐘驅(qū)動,時鐘邏輯模塊控制使用哪個時鐘源及哪個邊沿來進(jìn)行加或 者減計數(shù)。 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)。 T/Cx 雙緩沖結(jié)構(gòu)的八位輸出比較寄存器 OCRx(0,1,2)一直與 T/Cx(0,1,2)的計數(shù)值 TCNTx(0,1,2)進(jìn)行比較。一旦 TCNTx(0,1,2)等于 OCRx(0,1,2),比較器就給出匹配信號。有 4 種工作模式:普通模式,CTC 模式, 快速 PWM 模式,相位修正 PWM 模式。 3.2.33.2.3 中斷系統(tǒng)中斷系統(tǒng) ATmega16 單片機(jī)有 21 個中斷源,每一個中斷源都有一個獨立的中斷向量作 為中斷服務(wù)程序的入口地址,而且所有的中斷源都有自己的獨立的使能位。如果 全局中斷 I 和相應(yīng)使能位都置位,則在中斷標(biāo)志位置位時將執(zhí)行中斷服務(wù)程序。 9 一個中斷產(chǎn)生后,全局中斷使能位 I 將被清零,后續(xù)中斷被屏蔽。 中斷相關(guān)的寄存器:MCU 控制寄存器 MCUCR,MCU 控制和狀態(tài)寄存器 MCUCSR,通用中斷控制寄存器 GICR,通用中斷狀態(tài)寄存器 GIFR. 3.2.43.2.4 振蕩器振蕩器 XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 振蕩器特性:XTAL1 和 XTAL2 分別為反向放大器的輸入和輸出。該反向放大 器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū) 動器件,XTAL2 應(yīng)不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因 此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。 10 3.33.3 時鐘模塊設(shè)計時鐘模塊設(shè)計 實時時間計算模塊 方案(1):AVR 單片機(jī)內(nèi)部帶有定時/計數(shù)功能,此定時功能是通過對外部 晶振的脈沖進(jìn)行計數(shù),從而達(dá)到計時功能,只要使用 11.0592 的晶振就能實現(xiàn)零 誤差的計時,因此可以利用此功能實現(xiàn)計時,但因為只有單一的計時功能要實現(xiàn) “萬年歷”的功能需要較復(fù)雜的程序,而且如果單片機(jī)掉電無法繼續(xù)進(jìn)行計時, 所以使用不便。 方案(2):DS1302 是美國 DALLAS 公司推出的一種高性能、低功耗的實 時時鐘芯片,附加 31 字節(jié)靜態(tài) RAM,采用 SPI 三線接口與 CPU 進(jìn)行通信,并 可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和 RAM 數(shù)據(jù)。實時時鐘可提供秒、 分、時、日、星期、月和年,一個月小與 31 天時可以自動調(diào)整,且具有閏年補(bǔ) 償功能。工作電壓寬達(dá) 2.55.5V。采用雙電源供電(主電源和備用電源) ,可設(shè) 置備用電源充電方式,提供了對后備電源進(jìn)行涓細(xì)電流充電的能力。利用單片機(jī) 強(qiáng)大的控制功能就可實現(xiàn)實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。 綜合上述兩種方案,宜采用方案(2)實現(xiàn)實時計時功能。 3.3.13.3.1 DS1302DS1302 特性介紹特性介紹 DS1302 是美國 DALLAS 公司推出的一種高性能、低功耗的實時時鐘芯片, 附加 31 字節(jié)靜態(tài) RAM,采用 SPI 三線接口與 CPU 進(jìn)行通信,并可采用突發(fā)方 式一次傳送多個字節(jié)的時鐘信號和 RAM 數(shù)據(jù)。實時時鐘可提供秒、分、時、日、 星期、月和年,一個月小與 31 天時可以自動調(diào)整,且具有閏年補(bǔ)償功能。工作 電壓寬達(dá) 2.55.5V。采用雙電源供電(主電源和備用電源) ,可設(shè)置備用電源充 電方式,提供了對后備電源進(jìn)行涓細(xì)電流充電的能力。利用單片機(jī)強(qiáng)大的控制功 能就可實現(xiàn)實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。 11 DS1302 可以對年、月、日、星期、時、分、秒進(jìn)行計時,且具有閏年補(bǔ)償 等多種功能 DS1302 有 12 個寄存器,其中有 7 個寄存器與日歷、時鐘相關(guān),存 放的數(shù)據(jù)位為 BCD 碼形式;采用單片機(jī)計時,一方面需要采用計數(shù)器,占用硬 件資源,另一方面需要設(shè)置中斷、查詢等,同樣耗費單片機(jī)的資源,而采用時鐘 芯片 DS1302。 3.3.23.3.2 DS1302DS1302 引腳介紹引腳介紹 圖 3-2 8 、Vcc1:備用電池端; 1、Vcc2:5V 電源。當(dāng) Vcc2Vcc1+0.2V 時,由 Vcc2 向 DS1302 供電, 當(dāng) Vcc2/單片機(jī)寄存器的頭文件 #include #include #include /a 為要操作的寄存器,b 為要操作的位數(shù) #define SET_1(a,b) a|=(10; i-) if(_data else DIO_CLE_0; SCLK_SET_1;/時鐘信號 _delay_us(2); SCLK_CLE_0; _data=1;/移位,準(zhǔn)備好下次要寫的數(shù)據(jù) 43 /向 DS1302 讀取一個字節(jié) uchar DS1302OreadByte(void) uchar i; uchar d_data=0; CLE_0(DDRD,PD5); for(i=8; i0; i-) d_data=1;/移位,以便下次存放讀出的數(shù)據(jù) if(PIND SCLK_SET_1; _delay_us(2); SCLK_CLE_0; SET_1(DDRD,PD5); return (d_data);/返回讀到的數(shù)據(jù) 44 /*寫 ds1302 寄存器*/ void Write1302(uchar ucAddr,uchar ucDa) RST_CLE_0; SCLK_CLE_0; RST_SET_1; DS1302writeByte(ucAddr);/地址 DS1302writeByte(ucDa);/寫 1byte 數(shù)據(jù) SCLK_SET_1; RST_CLE_0; /*讀 ds1302 的寄存器*/ uchar Read1302(uchar ucAddr) uchar ucData; RST_CLE_0; SCLK_CLE_0; RST_SET_1; 45 DS1302writeByte(ucAddr|0X01);/地址,命令 ucData = DS1302OreadByte(); SCLK_SET_1; RST_CLE_0; return (ucData); void get_time(uchar *time) *(time+5) = Read1302(READ_SECOND); *(time+4) = Read1302(READ_MINUTE); *(time+3) = Read1302(READ_HOUR); *(time+2) = Read1302(READ_DAY); *(time+1) = Read1302(READ_MONTH); *(time+0) = Read1302(READ_YEAR); /*void Initial(void) Write1302(WRITE_PROTECT,0 x00); Write1302(WRITE_SECOND,0 x45); 46 Write1302(WRITE_MINUTE,0 x24); Write1302(WRITE_HOUR,0 x09); Write1302(WRITE_DAY,0 x13); Write1302(WRITE_MONTH,0 x04); Write1302(WRITE_PROTECT,0 x80); void adopt_data(uchar n,uchar *show_data) *show_data = n4; *(show_data +1) = n */ void T1_int(void) TCCR1B = 0 x00;/控制寄存器,停止定時 TIMSK |= 0 x04;/中斷屏蔽寄存器,中斷允許 TCNT1 = 0 xcf2c;/100ms 溢出一次 TCCR1B = 0 x02; sei();/使能全局中斷 47 void init_1302(void) Write1302(WRITE_PROTECT,0 x00);/禁止寫保護(hù) Write1302(WRITE_SECOND,time4);/秒位初始化 Write1302(WRITE_MINUTE,time3);/分鐘 Write1302(WRITE_HOUR,time2);/小時 Write1302(WRITE_DAY,time1);/日 Write1302(WRITE_MONTH,time0);/月 Write1302(WRITE_PROTECT,0 x80);/允許寫保護(hù) /*按鍵函數(shù)*/ uchar get_key(void) uchar i=0; PORTD |= 0 x0f; DDRD = 0 xf0;/設(shè)置為輸出 NOP(); NOP(); if(PIND/消除抖動 switch(PINDbreak;/選擇鍵 case 0 x0d:i = 3;break;/減值鍵 case 0 x0b:i = 2;break;/增值鍵 case 0 x07:i = 1;break;/確定鍵 while(PIND/等待按鍵松開 else i = 0;/沒有按鍵被按下 DDRD = 0 xff;/設(shè)置為輸出 return i;/返回按鍵值 /*轉(zhuǎn)換為 lcd 要顯示的數(shù)據(jù)*/ 49 void adopt_data() uchar i,j=0; for (i=0;i4; lcd_showj+1 = timei j += 2; /*轉(zhuǎn)換為 ds1302 的時間*/ void affirm_data(void) uchar i ,j = 0 ; for (i=0;i0) lcd_shown-; else if(lcd_shown=max) lcd_shown=0; 51 else lcd_shown=max; value=lcd_shown; /*功能顯示函數(shù)*/ void show_function(void) uchar i; uchar function25=0 x43,0 x4c,0 x4f,0 x43,0 x4b, 0 x41,0 x4c,0 x41,0 x52,0 x4d, ; wr_dictate(0 x01); display_lcd(0 x84,0 x7e); for (i=0;i6;i+) display_lcd(0 x85+i,function0i);/顯示時間 display_lcd(0 xc5+i,function1i); /*設(shè)置時間*/ 52 void set_clock(void) uchar cursor = 0;/光標(biāo) uchar i,j; wr_dictate(0 x01);/清屏 Write1302(WRITE_PROTECT,0 x00); Write1302(WRITE_SECOND,time4|0 x80);/暫時停止時鐘的 運行 Write1302(WRITE_PROTECT,0 x80); display_lcd(0 x82,0 x00);/顯示年 display_lcd(0 x85,0 x01);/月 display_lcd(0 x88,0 x02);/日 display_lcd(0 xc2,0 x03);/時 display_lcd(0 xc5,0 x03);/分 display_lcd(0 xc8,0 x03);/秒 for (i=0,j=0;i10;i+=2) display_lcd(0 x80+j,numberlcd_showi); display_lcd(0 x80+j+1,numberlcd_showi+1); 53 j = j+3; wr_dictate(0 x02); wr_dictate(0 x0e); j = 0; while(1) NOP(); switch(get_key() case 1:/確認(rèn) cursor+; j+; if (cursor%2=0) j+; wr_dictate(0 x14); wr_dictate(0 x14); 54 else wr_dictate(0 x14); if (cursor=10) j = 0; cursor = 0; wr_dictate(0 x02);/光標(biāo)歸位 place = 0 x80+j; break; case 2:/加 switch(cursor) /*一下的 case 成功選擇項為光標(biāo)對應(yīng)的調(diào) 55 整位數(shù)*/ case 0:add_d(cursor,1);break; case 1: if(lcd_show0=1) add_d(cursor,2); else add_d(cursor,9); break; case 2:add_d(cursor,3);break; case 3: if(lcd_show2=3) add_d(cursor,0); else add_d(cursor,9); break; 56 case 4:add_d(cursor,2);break; case 5: if(lcd_show4=2) add_d(cursor,3); else add_d(cursor,9); break; case 6:add_d(cursor,5);break; case 7:add_d(cursor,9);break; case 8:add_d(cursor,5);break; case 9:add_d(cursor,9);break; display_lcd(place,numbervalue);/顯示在 液晶屏的相應(yīng)的位置 wr_dictate(0 x10); break; 57 case 3:/減 switch(cursor) /*一下的 case 成功選擇項為光標(biāo)對應(yīng)的調(diào) 整位數(shù)*/ case 0:dec_d(cursor,1);break; case 1: if(lcd_show0=1) dec_d(cursor,2); else dec_d(cursor,9); break; case 2:dec_d(cursor,3);break; case 3: if(lcd_show2=3) 58 dec_d(cursor,0); else dec_d(cursor,9); break; case 4:add_d(cursor,2);break; case 5: if(lcd_show4=2) dec_d(cursor,3); else dec_d(cursor,9); break; case 6:dec_d(cursor,5);break; case 7:dec_d(cursor,9);break; case 8:dec_d(cursor,5);break; case 9:dec_d(cursor,9);break; 59 display_lcd(place,numbervalue);/顯示在 液晶屏的相應(yīng)的位置 wr_dictate(0 x10); break; case 4:/退格 affirm_data(); init_1302(); T1_OPEN; goto OUT; default: break; OUT:NOP(); /*補(bǔ)充顯示*/ void allowance(void) 60 uchar i,j; display_lcd(0 x82,0 x00);/顯示月 display_lcd(0 x85,0 x01);/日 display_lcd(0 x88,0 x02);/時 display_lcd(0 x8b,0 x03);/分 get_time(time); adopt_data(); for (i=0,j=0;i10;i+=2) display_lcd(0 x80+j,numberlcd_showi); display_lcd(0 x80+j+1,numberlcd_showi+1); j = j+3; int main(void) uchar chinese58 = 61 0 x08,0 x0f,0 x12,0 x0f,0 x0a,0 x1f,0 x02,0 x02, 0 x0f,0 x09,0 x0f,0 x0,0 x0f,0 x09,0 x13,0 x00, 0 x1f,0 x11,0 x11,0 x1f,0 x11,0 x11,0 x11,0 x1f,0 x00, 0 x01,0 x1d,0 x17,0 x1d,0 x17,0 x1d,0 x03,0 x01, 0 x04,0 x0a,0 x11,0 x0e,0 x02,0 x0a,0 x16,0 x00,; uchar i,j; uchar key_Enter = 0;/確認(rèn)鍵被按下的次數(shù) /控制線 DDRC = 0 xff;/方向寄存器 PORTC = 0 xff;/數(shù)據(jù)寄存器 /數(shù)據(jù)端 DDRB = 0 xff;/端口 B 設(shè)置為輸出 PORTB = 0 xff; DDRD = 0 xff;/按鍵設(shè)為輸入 PORTD = 0 xff; 62 init_1302(); init_lcd(); T1_int(); wr_dictate(0 x40); for (j=0;j5;j+) for (i=0;i8;i+) wr_data(chineseji);/利用循環(huán)語句把點陣字 符寫進(jìn) CGRAM 中 allowance();/補(bǔ)充顯示 while(1) NOP(); i=get_key(); if (i=1)/所有的功能以確認(rèn)鍵按下才開始操作 63 while (1) NOP(); switch(i) case 1:/確認(rèn)鍵 T1_CLOSE;/確認(rèn)鍵按下,停止顯示數(shù)字 key_Enter+; switch(key_Enter) case 1: show_function();/顯示功能 break; case 2: set_clock();/設(shè)置時間 64 goto OUT; break; case 2:/加值鍵 display_lcd(0 x84,0 x20);/清除上行的 箭頭 display_lcd(0 xc4,0 x7e);/顯示一個箭 頭 break; case 3:/減值鍵 display_lcd(0 xc4,0 x20);/消除下行的 箭頭 display_lcd(0 x84,0 x7e);/顯示一個箭 頭 break; 65 case 4:/確定鍵 OUT: wr_dictate(0 x01); key_Enter =0; allowance(); wr_dictate(0 x0c); T1_OPEN;/繼續(xù)顯示 break; default:break; i = get_key(); if(key_Enter=0)/操作完成,退出 break; 66 return 0; /*利用中斷程序來訪問 ds1302*/ SIGNAL(TIMER1_OVF_vect)/T1 中斷程序,執(zhí)行中斷程序時將關(guān) 閉全局中斷使能位,不能響應(yīng)其他中斷 uchar i,j; TCNT1 = 0 xcf2c;/16 位計數(shù)寄存器 T1_INIT_CLOSE; count-; if (count=0) count=10; T1_CLOSE; get_time(time); adopt_data();/轉(zhuǎn)化為 lcd 顯示的數(shù)據(jù) for (i=0,j=0;i10;i +=2) display_lcd(0 x80+j,numberlcd_showi); 67 display_lcd(0 x80+j+1,numberlcd_showi+1); T1_INIT_OPEN;/再次開定時中斷 68 附錄附錄 4 4 參考文獻(xiàn)參考文獻(xiàn) 1 沈文,Eagle lee,詹衛(wèi)前. AVR 單片機(jī) C 語言開發(fā)入門指 導(dǎo)M.北京:清華大學(xué)出版社, 2003. 2 Richard Barnett 等.嵌入式 C 編程與 Atmel AVRM.北京: 清華大學(xué)出版社,2003. 3 Ying HuangSanthosh KumaranJen-Yao Chung.A model- driven framework for enterprise service managementJ.IseB,2005,3:201-217 4 耿德根等.AVR 高速嵌入式單片機(jī)原理與應(yīng)用M.北京: 航空航天大學(xué)出版社,2001. 5 Mohamadi, T. Real Time Operating System for AVR microcontrollers. Design & Test Symposium (EWDTS),2011 9th East- West,9-12 Sept. 2011:376-380 6金春林等.AVR 系列單片機(jī) C 語言編程與應(yīng)用實例M.北 京:清華大學(xué)出版社,2003. 7 張軍,宋濤.AVR 單片機(jī) C 語言程序設(shè)計實例精粹M.北 京:電子工業(yè)出版社,2009 8 Von Dhananjay V. Gadre .Programming And Customizing the AVR MicrocontrollerM. McGraw-Hill Companies,2008 9 丁化成等.AVR 單片機(jī)應(yīng)用設(shè)計M.北京:航空航天大學(xué)出 版社,2002. 10 丁正林等.AVR 單片機(jī)原理及應(yīng)用M.北京:國防工業(yè)出 版社,2009.