版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 摘要</b></p><p> 萬年歷的功能可實(shí)現(xiàn)年、月、日、時(shí)、分、秒和星期的顯示。隨著社會(huì)的發(fā)展日歷的功能越來越強(qiáng)大,精確度越來越高。本次設(shè)計(jì)的日歷采用DS1302時(shí)鐘芯片,該芯片精確度高,性能可靠。用LCD12864液晶屏,既可以顯示數(shù)字又可以顯示漢字,方便了人們的生活。本設(shè)計(jì)總體分為硬件部分和軟件部分。硬件部分可分為:時(shí)鐘芯片DS1302、AT89C5
2、1和LCD12864等。本設(shè)計(jì)非常適合家庭使用。電源采用+5V電壓供電。走時(shí)精確,是現(xiàn)代家庭必備的設(shè)備之一。</p><p> 關(guān)鍵詞:?jiǎn)纹瑱C(jī),萬年歷, DS1302,時(shí)鐘芯片 1引言</p><p> 可調(diào)式電子日歷與時(shí)鐘小巧便于攜帶,界面清爽,一目了然,方便的知曉當(dāng)前時(shí)間,并可對(duì)時(shí)間做出修改,實(shí)在是居家旅行日常生活之必
3、備用品。在現(xiàn)今的可調(diào)式電子日歷與時(shí)鐘具有性能穩(wěn)定、精確度高、成本低、易于產(chǎn) 品化,以及方便、實(shí)用等特點(diǎn)。</p><p><b> 2.總體設(shè)計(jì)</b></p><p><b> 2.1基本原理</b></p><p> 硬件主要涉及到:AT89C51、DS1302、LCD12864等。軟件通過框圖編寫出程
4、序。AT89C51主要功能是存儲(chǔ)程序、根據(jù)程序的內(nèi)容對(duì)各個(gè)端口進(jìn)行判斷并做出相應(yīng)的處理。LCD12864主要的功能是實(shí)現(xiàn)年、月、日、時(shí)、分、秒的顯示效果。實(shí)時(shí)時(shí)鐘DS1302可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。</p><p> 2.2系統(tǒng)總體框圖及設(shè)計(jì)思路</p><p><b> 3.詳細(xì)設(shè)計(jì)</b><
5、/p><p><b> 3.1 硬件設(shè)計(jì)</b></p><p> 3.1.1 DS1302芯片及原理介紹</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、
6、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。 DS1302用于數(shù)據(jù)記錄,特別是對(duì)某些具有特殊意義的數(shù)據(jù)點(diǎn)的記錄上,能實(shí)現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時(shí)間同時(shí)記錄,因此廣泛應(yīng)用于測(cè)量系統(tǒng)中。</p><p><b> 外部引腳分配</b><
7、;/p><p><b> 各引腳的功能為:</b></p><p> Vcc1:備用電源;Vcc2:主電源。當(dāng)Vcc2>Vcc1+0.2V時(shí),由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時(shí),由Vcc1向DS1302供電。</p><p> SCLK:串行時(shí)鐘,輸入; </p><p>
8、 I/O:三線接口時(shí)的雙向數(shù)據(jù)線;</p><p> CE:輸入信號(hào),在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個(gè)功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結(jié)束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p><b> 內(nèi)部結(jié)構(gòu)</b></p><p> DS1302是SPI總線驅(qū)動(dòng)方式。它不僅要向寄存器寫入控制字,還需
9、要讀取相應(yīng)寄存器的數(shù)據(jù)。</p><p> 要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如下圖。</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p>
10、 位5至位1(A4~A0):指示操作單元的地址;</p><p> 位0(最低有效位):如為0,表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作。</p><p> 3.1.2 LCD12864液晶屏</p><p> LCD12864使用KS0108(或其兼容芯片)作為控制器,適配M6800系列時(shí)序,具有8位標(biāo)準(zhǔn)數(shù)據(jù)總線。6條控制線及電源線可顯示各種字符及圖形。每個(gè)
11、KS0108擁有64×64位(512字節(jié))的顯示RAM,12864顯示屏上的64×64點(diǎn),顯示RAM中的數(shù)據(jù)直接作為顯示驅(qū)動(dòng)信號(hào)。具有操作指令簡(jiǎn)單,低功耗的特點(diǎn)。</p><p> 主要技術(shù)參數(shù)和顯示特性:</p><p> 電源:VDD 3.3V~+5V(內(nèi)置升壓電路,無需負(fù)壓);</p><p> 顯示內(nèi)容:128列× 64行
12、</p><p> 與MCU接口:8位或4位并行/3位串行</p><p><b> 配置LED背光</b></p><p><b> 模塊引腳說明:</b></p><p><b> 12864引腳說明</b></p><p><b>
13、; 指令功能詳解:</b></p><p> ?。?)讀狀態(tài)字(read status)</p><p><b> 格式</b></p><p> BUSY=1,表示KS0108正在處理計(jì)算機(jī)發(fā)來的指令或數(shù)據(jù)。此時(shí)接口電路被封鎖,不能接受除讀狀態(tài)字以外的任何操作。BUSY=0表示KS0108接口控制電路已處于“準(zhǔn)備好”狀態(tài),等
14、待計(jì)算機(jī)的訪問。</p><p> ON/OFF:表示當(dāng)前的顯示狀態(tài)。ON/OFF=1表示關(guān)顯示狀態(tài);ON/OFF=0表示開顯示狀態(tài)。</p><p> RESET表示當(dāng)前KS0108的工作狀態(tài),即反映RST端的電平狀態(tài)。當(dāng)RST為低電平狀態(tài)時(shí)KS0108處于復(fù)位工作狀態(tài),RESET=1。當(dāng)RST為高電平狀態(tài)時(shí),KS0108為正常工作狀態(tài),RESET=0。</p><
15、;p> 在占領(lǐng)設(shè)置和數(shù)據(jù)讀寫時(shí)要注意狀態(tài)字中的BUSY標(biāo)志。只有在BUSY=0時(shí),計(jì)算機(jī)對(duì)KS0108的操作才能有效。因此計(jì)算機(jī)在每次對(duì)KS0108操作之前,都要讀出狀態(tài)字判斷BUSY是否為“0”。若不為“0”,則計(jì)算機(jī)需要等待,直至BUSY=0為止。</p><p> ?。?)顯示開關(guān)(display on/off)</p><p><b> 格式</b>
16、</p><p> 該指令設(shè)置顯示開關(guān)/觸發(fā)器的狀態(tài),由此控制顯示數(shù)據(jù)鎖存器的工作方式,從而控制顯示上的顯示狀態(tài)。</p><p> D位為顯示開/關(guān)的控制位。當(dāng)D=1為顯示設(shè)置,顯示數(shù)據(jù)鎖存器正常工作,顯示屏上呈現(xiàn)所許的效果。此時(shí)在狀態(tài)字中ON/OFF=0。當(dāng)D=0為關(guān)顯示設(shè)置,顯示數(shù)據(jù)鎖存器被置零,顯示屏呈不顯示狀態(tài),但顯示存儲(chǔ)器并沒有被破壞,在狀態(tài)組中ON/OFF=1。</
17、p><p> ?。?)顯示起始行設(shè)置(Display start line)</p><p><b> 格式</b></p><p> 該指令設(shè)置了顯示起始行寄存器的內(nèi)容。KS0108有64行顯示的管理能力,該指令中L5~L0為顯示起始行的地址,取值在00~3FH(1~64)范圍內(nèi),它規(guī)定了顯示屏上最頂一行所對(duì)應(yīng)的顯示存儲(chǔ)器的行地址。如果定時(shí)間
18、隔地,等間距地修改(如加一或減一)顯示起始行寄存器的內(nèi)容,則顯示屏將呈現(xiàn)顯示內(nèi)容向上或向下平滑滾動(dòng)的顯示效果。</p><p> (4)頁面地址設(shè)置[Set page(X address)]</p><p><b> 格式</b></p><p> 該指令設(shè)置了頁面地址-X地址寄存器的內(nèi)容。KS0108將顯示存儲(chǔ)器分成了8頁,指令代碼中P
19、2~P0就是要確定當(dāng)前所要選擇的頁面地址,取值范圍為00~07H,代表第1~8頁。該指令規(guī)定了以后的讀/寫操作將在哪一個(gè)頁面上進(jìn)行。執(zhí)行本指令后,下面的讀寫操作將在指定頁內(nèi),直到重新設(shè)置。頁地址就是DDRAM 的行地址,頁地址存儲(chǔ)在X地址計(jì)數(shù)器中,P2-P0可表示8頁,讀寫數(shù)據(jù)對(duì)頁地址沒有影響,除本指令可改變頁地址外,復(fù)位信號(hào)(RST)可把頁地址計(jì)數(shù)器內(nèi)容清零。</p><p> (5)列地址設(shè)置(Set Y
20、address)</p><p><b> 格式</b></p><p> 該指令設(shè)置了Y地址計(jì)數(shù)器的內(nèi)容,C5~C0=0~3FH(1~64)代表某一頁面上的某一單元地址,隨后的一次讀或?qū)憯?shù)據(jù)將在這個(gè)單元上進(jìn)行。Y地址計(jì)數(shù)器具有自動(dòng)加一功能,在每一次讀/寫數(shù)據(jù)后它將自動(dòng)加一,所以在連續(xù)進(jìn)行讀/寫數(shù)據(jù)時(shí),Y地址計(jì)數(shù)器不必每次都設(shè)置一次。頁面地址的設(shè)置和列地址的設(shè)置將
21、顯示存儲(chǔ)器單元唯一地確定下來,為后來的顯示數(shù)據(jù)的讀/寫作了地址的選通。</p><p> ?。?)寫顯示數(shù)據(jù)(Write display data)</p><p><b> 格式</b></p><p> 該操作將8位數(shù)據(jù)寫入先前已確定的顯示存儲(chǔ)器的單元內(nèi),操作完成后列地址計(jì)數(shù)器自動(dòng)加1。</p><p> ?。?
22、)讀顯示數(shù)據(jù)(Read display data)</p><p><b> 格式</b></p><p> 該操作將KS0108接口部的輸出寄存器內(nèi)容讀出,然后列地址計(jì)數(shù)器自動(dòng)加1。</p><p> 3.1.3硬件原理圖</p><p><b> 3.2軟件設(shè)計(jì)</b></p>
23、;<p> 3.2.1 程序流程圖</p><p> 3.2.2 程序代碼</p><p> LCD12864顯示驅(qū)動(dòng)程序</p><p> #include <reg52.h></p><p> #include <intrins.h></p><p> #defin
24、e uchar unsigned char</p><p> #define uint unsigned int</p><p> #define LCD_DB_PORT P0 // 液晶數(shù)據(jù)線端口DB0-DB7</p><p> #define LCD_START_ROW 0xc0 //起始行命令</p><p> #defi
25、ne LCD_PAGE 0xB8 // 頁指令</p><p> #define LCD_COL 0x40 // 列指令</p><p> bit Reverse_Display=0; //是否反相顯示(白底黑字/黑底白字)</p><p> sbit DI=P2^0; //液晶引腳定義<
26、/p><p> sbit RW=P2^1;</p><p> sbit E=P2^2;</p><p> sbit CS1=P2^3;</p><p> sbit CS2=P2^4;</p><p> sbit RST=P2^5;</p><p> bit LCD_IS_BUSY()
27、 //檢查L(zhǎng)CD是否忙</p><p><b> {</b></p><p> LCD_DB_PORT=0xFF;</p><p><b> RW=1;</b></p><p><b> _nop_();</b></p><p>&
28、lt;b> DI=0;</b></p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b> E=0;</b></p><p> return (bit)(P0&0x80);<
29、/p><p><b> }</b></p><p> void Write_Byte_To_LCD(uchar comand) //向LCD寫入一個(gè)字節(jié)(一般用于發(fā)送命令)</p><p><b> {</b></p><p> while(LCD_IS_BUSY()); </p&g
30、t;<p> LCD_DB_PORT=0xFF;</p><p><b> RW=0;</b></p><p><b> _nop_();</b></p><p><b> DI=0;</b></p><p> LCD_DB_PORT=comand;&l
31、t;/p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b> E=0;</b></p><p><b> }</b></p><p> void Write_Dat
32、a_To_LCD(uchar dat) //向LCD寫入數(shù)據(jù)</p><p><b> {</b></p><p> while(LCD_IS_BUSY()); </p><p> LCD_DB_PORT=0xFF;</p><p><b> RW=0;</b></p>
33、<p><b> _nop_();</b></p><p><b> DI=1;</b></p><p> if(!Reverse_Display) //根據(jù)Reverse_Display決定是否反相顯示</p><p> LCD_DB_PORT=dat;</p><p>
34、<b> else </b></p><p> LCD_DB_PORT=~dat;</p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b> E=0;</b></p>
35、<p><b> }</b></p><p> void LCD12864_Initialization() //初始化LCD</p><p><b> {</b></p><p><b> CS1=1;</b></p><p><b>
36、 CS2=1;</b></p><p> Write_Byte_To_LCD(0x38);</p><p> Write_Byte_To_LCD(0x0F);</p><p> Write_Byte_To_LCD(0x01);</p><p> Write_Byte_To_LCD(0x06);</p><
37、;p> Write_Byte_To_LCD(LCD_START_ROW);</p><p><b> }</b></p><p> void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant //通用顯示函數(shù)</p><p><b> {</b>&l
38、t;/p><p><b> uchar i;</b></p><p><b> if(L<64)</b></p><p><b> {</b></p><p><b> CS1=1;</b></p><p><b&g
39、t; CS2=0;</b></p><p> Write_Byte_To_LCD(LCD_PAGE+P);</p><p> Write_Byte_To_LCD(LCD_COL+L);</p><p> if(L+W<64)</p><p><b> { </b></p><
40、;p> for(i=0;i<W;i++)</p><p> Write_Data_To_LCD(r[i]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>&l
41、t;p> for(i=0;i<64-L;i++)</p><p> Write_Data_To_LCD(r[i]);</p><p><b> CS1=0;</b></p><p><b> CS2=1;</b></p><p> Write_Byte_To_LCD(LCD_P
42、AGE+P);</p><p> Write_Byte_To_LCD(LCD_COL);</p><p> for(i=64-L;i<W;i++)</p><p> Write_Data_To_LCD(r[i]);</p><p><b> }</b></p><p><b&g
43、t; }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> CS1=0;</b></p><p><b> CS2=1;</b></p><p>
44、; Write_Byte_To_LCD(LCD_PAGE+P);</p><p> Write_Byte_To_LCD(LCD_COL+L-64);</p><p> for(i=0;i<W;i++)</p><p> Write_Data_To_LCD(r[i]);</p><p><b> }</b>
45、</p><p><b> }</b></p><p> void Display_char(uchar P1,uchar L1,uchar *M) reentrant // 顯示一個(gè)8×16點(diǎn)陣字符</p><p><b> {</b></p><p> LCD_Show(P
46、1,L1,8,M);</p><p> LCD_Show(P1+1,L1,8,M+8); </p><p><b> }</b></p><p> void Display_Word(uchar P2,uchar L2,uchar *M) reentrant // 顯示一個(gè)16×16點(diǎn)陣符 </p><p&
47、gt; { </p><p> LCD_Show(P2,L2,16,M); </p><p> LCD_Show(P2+1,L2,16,M+16); </p><p><b> }</b></p><p> DS1302時(shí)鐘程序</p><p> #include
48、 <reg51.h></p><p> #include <string.h></p><p> #include <intrins.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p>
49、;<p> sbit SDA=P1^0; //DS1302數(shù)據(jù)線</p><p> sbit CLK=P1^1; //DS1302時(shí)鐘線</p><p> sbit RST=P1^2; // DS1302復(fù)位線</p><p> char Adjust_Index=-1; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:秒,分,時(shí),日,月,年</p
50、><p> uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; // 一年中每個(gè)月的天數(shù),二月//的天數(shù)由年份決定</p><p> uchar DateTime[7]; //所讀取的日期時(shí)間</p><p> void Write_Byte_TO_DS1302(uchar X);
51、 // 向DS1302寫入一個(gè)字節(jié)</p><p> uchar Read_Byte_FROM_DS1302();//從DS1302中讀取一個(gè)字節(jié)</p><p> uchar Read_Data_FROM_DS1302(uchar addr); //從DS1302指定位置讀取數(shù)據(jù), 讀數(shù)據(jù)</p><p> void Write_Data_TO_D
52、S1302(uchar addr,uchar dat); //向DS1302指定位置寫入數(shù)據(jù),寫數(shù)據(jù)</p><p> void SET_DS1302(); // 設(shè)置時(shí)間</p><p> void GetTime(); // 讀取當(dāng)前時(shí)間</p><p> uchar Is_Leapyear(uint year);// 判斷是否為閏年<
53、;/p><p> void Write_Byte_TO_DS1302(uchar X) // 向DS1302寫入一個(gè)字節(jié)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<8;i++)</p>
54、<p><b> {</b></p><p><b> SDA=X&1;</b></p><p><b> CLK=1;</b></p><p><b> CLK=0;</b></p><p><b> X>&
55、gt;=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> uchar Read_Byte_FROM_DS1302()//從DS1302中讀取一個(gè)字節(jié)</p><p><b> {</b></
56、p><p> uchar i,byte,t;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> byte>>=1;</b></p><p><b> t=SDA;</b&
57、gt;</p><p> byte|=t<<7;</p><p><b> CLK=1;</b></p><p><b> CLK=0;</b></p><p><b> }</b></p><p> return byte/16*
58、10+byte%16; //BCD碼轉(zhuǎn)換</p><p><b> }</b></p><p> uchar Read_Data_FROM_DS1302(uchar addr) //從DS1302指定位置讀取數(shù)據(jù), 讀數(shù)據(jù)</p><p><b> {</b></p><p> u
59、char dat;</p><p><b> RST=0;</b></p><p><b> CLK=0;</b></p><p><b> RST=1;</b></p><p> Write_Byte_TO_DS1302(addr); //向DS1302寫入一個(gè)地址
60、</p><p> dat=Read_Byte_FROM_DS1302(); //在上面寫入的地址中讀取數(shù)據(jù)</p><p><b> CLK=1;</b></p><p><b> RST=0;</b></p><p> return dat;</p><p>&l
61、t;b> }</b></p><p> void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位置寫入數(shù)據(jù),寫數(shù)據(jù)</p><p><b> {</b></p><p><b> CLK=0;</b></p><
62、;p><b> RST=1;</b></p><p> Write_Byte_TO_DS1302(addr);</p><p> Write_Byte_TO_DS1302(dat);</p><p><b> CLK=1;</b></p><p><b> RST=0;&l
63、t;/b></p><p><b> }</b></p><p> void SET_DS1302() // 設(shè)置時(shí)間</p><p><b> {</b></p><p><b> uchar i;</b></p><p> Wr
64、ite_Data_TO_DS1302(0x8E,0x00); //寫控制字,取消寫保護(hù) </p><p> for(i=1;i<7;i++) // 分,時(shí),日,月,年依次寫入</p><p><b> {</b></p><p> Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/
65、10<<4)|(DateTime[i]%10));</p><p><b> }</b></p><p> Write_Data_TO_DS1302(0x8E,0x80); //寫控制字,加寫保護(hù)</p><p><b> }</b></p><p> void Get
66、Time() // 讀取當(dāng)前時(shí)間</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<7;i++)</p><p><b> {</b></p><p>
67、 DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i);</p><p><b> }</b></p><p><b> }</b></p><p> uchar Is_Leapyear(uint year) // 判斷是否為閏年</p><p><
68、;b> {</b></p><p> return (year%4==0&&year%100!=0)||(year%400==0) ;</p><p><b> }</b></p><p> void Refresh_Week_Day() // 求自2000.1.1開始的任何一天是星期幾?</
69、p><p><b> {</b></p><p> uint i,d,w=5; //已知1999年12.31是星期五</p><p> for(i=2000;i<2000+DateTime[6];i++)</p><p><b> {</b></p>&
70、lt;p> d=Is_Leapyear(i)?366:365;</p><p> w=(w+d)%7;</p><p><b> }</b></p><p><b> d=0;</b></p><p> for (i=1;i<DateTime[4];i++)</p>
71、<p> {d+=MonthsDays[i];}</p><p> d+=DateTime[3];</p><p> DateTime[5]=(w+d)%7+1; //保存星期,0-6表示星期日,星期一至星期六,為了與//DS1302的星期格式匹配,返回值需要加1</p><p><b> }</b></p>
72、;<p> void Datetime_Adjust(char X) //年,月,日和時(shí),分++/--</p><p><b> {</b></p><p> switch(Adjust_Index)</p><p><b> {</b></p><p> case 6:
73、 //年調(diào)整,00-99</p><p> if(X==1&&DateTime[6]<99)</p><p><b> { </b></p><p> DateTime[6]++;</p><p><b> }</b>&
74、lt;/p><p> if(X==-1&&DateTime[6]>0)</p><p><b> { </b></p><p> DateTime[6]--;</p><p><b> }</b></p><p> MonthsDays[2]=Is
75、_Leapyear(2000+DateTime[6])?29:28; //獲取2月天數(shù)</p><p> if(DateTime[3]>MonthsDays[DateTime[4]])</p><p><b> {</b></p><p> DateTime[3]=MonthsDays[DateTime[4]];</p>
76、;<p><b> }</b></p><p> Refresh_Week_Day(); //刷新星期</p><p><b> break;</b></p><p> case 4: //月調(diào)整 01-12</p>&
77、lt;p> if(X==1&&DateTime[4]<12)</p><p><b> { </b></p><p> DateTime[4]++;</p><p><b> }</b></p><p> if(X==-1&&DateTime[4
78、]>1)</p><p><b> { </b></p><p> DateTime[4]--;</p><p><b> }</b></p><p> MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //獲取2月天數(shù)</p
79、><p> if(DateTime[3]>MonthsDays[DateTime[4]])</p><p><b> {</b></p><p> DateTime[3]=MonthsDays[DateTime[4]];</p><p><b> }</b></p><
80、p> Refresh_Week_Day(); //刷新星期</p><p><b> break;</b></p><p> case 3: //日調(diào)整00-28或00-29或00-30或00-31</p><p> MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28
81、; //調(diào)節(jié)之前首先根據(jù)當(dāng)</p><p> //前年份得出該年中2月的天數(shù)</p><p> if(X==1&&DateTime[3]<MonthsDays[DateTime[4]])</p><p><b> { </b></p><p> DateTime[3]++;</p>
82、;<p><b> }</b></p><p> if(X==-1&&DateTime[3]>0)</p><p><b> { </b></p><p> DateTime[3]--;</p><p><b> }</b><
83、/p><p> Refresh_Week_Day(); //刷新星期</p><p><b> break;</b></p><p> case 2: // 時(shí)調(diào)整</p><p> if(X==1&&DateTime[2]<2
84、3)</p><p><b> { </b></p><p> DateTime[2]++;</p><p><b> }</b></p><p> if(X==-1&&DateTime[4]>0)</p><p><b> { &l
85、t;/b></p><p> DateTime[2]--;</p><p><b> }</b></p><p><b> break;</b></p><p> case 1: // 分調(diào)整</p><p>
86、 if(X==1&&DateTime[1]<59)</p><p><b> { </b></p><p> DateTime[1]++;</p><p><b> }</b></p><p> if(X==-1&&DateTime[4]>0)&
87、lt;/p><p><b> { </b></p><p> DateTime[1]--;</p><p><b> }</b></p><p><b> break;</b></p><p> case 0:
88、 // 秒調(diào)整</p><p> if(X==1&&DateTime[1]<59)</p><p><b> { </b></p><p> DateTime[0]++;</p><p><b> }</b></p><p> if(
89、X==-1&&DateTime[4]>0)</p><p><b> { </b></p><p> DateTime[0]--;</p><p><b> }</b></p><p><b> break;</b></p><
90、p><b> }</b></p><p><b> }</b></p><p><b> 字符漢字顯示程序</b></p><p> // 與本程序有關(guān)的數(shù)字和漢字的點(diǎn)陣編碼 DotMatrix.c</p><p> #include <reg51.h&g
91、t;</p><p> #include <string.h></p><p> #include <intrins.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p>
92、//年、月、日、星期、時(shí)、分、秒等漢字點(diǎn)陣(16×16)</p><p> uchar code DATE_TIME_WORDS[]={</p><p> 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年</p><p> 0x0
93、4,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,</p><p> 0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月</p><p> 0x00,0x40,0x20
94、,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,</p><p> 0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日</p><p> 0x00,0x00,0x00,0x3F,0x10,
95、0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,</p><p> 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,</p><p> 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F
96、,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,</p><p> 0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期</p><p> 0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,
97、0x02,0x22,0x42,0x3F,0x00,0x00,</p><p> 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//時(shí)</p><p> 0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0
98、x00,0x00,0x00,0x00,</p><p> 0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分</p><p> 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x
99、00,0x00,</p><p> 0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒</p><p> 0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00<
100、/p><p><b> };</b></p><p> //一、二、三、四、五、六和天等漢字點(diǎn)陣(16×16)</p><p> uchar code WEEK_WORDS[]={</p><p> 0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42
101、,0x42,0x42,0x42,0x40,0x00,//天</p><p> 0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,</p><p> 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
102、0xC0,0xC0,0x00,//一</p><p> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,</p><p> 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0
103、x00,//二</p><p> 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,</p><p> 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三<
104、/p><p> 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,</p><p> 0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四</p><
105、;p> 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,</p><p> 0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五</p><p> 0x2
106、0,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,</p><p> 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六</p><p> 0x00,0x40,0x20
107、,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,</p><p><b> };</b></p><p> //0-9等數(shù)字點(diǎn)陣(8×16)</p><p> uchar code Digits[]={ </p><p>
108、; 0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0</p><p> 0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00, //1</p><p> 0x
109、00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, //2</p><p> 0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3</p><p> 0x00,0x
110、00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4</p><p> 0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5</p><p> 0x00,0xC0,0xE0,
111、0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6</p><p> 0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7</p><p> 0x00,0x70,0xF8,0xC8,0x8
112、8,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8</p><p> 0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9</p><p><b> };</b></p>
113、<p><b> 主程序</b></p><p> #include <reg51.h></p><p> #include <string.h></p><p> #include <intrins.h></p><p> #define uchar unsi
114、gned char</p><p> #define uint unsigned int</p><p> extern void LCD12864_Initialization();</p><p> extern void Display_char(uchar P1,uchar L1,uchar *M) reentrant;</p><
115、p> extern void Display_Word(uchar P2,uchar L2,uchar *M) reentrant;</p><p> extern void Datetime_Adjust(char X);</p><p> extern void SET_DS1302(); // 設(shè)置時(shí)間</p><p> extern Ge
116、tTime();</p><p> void Initialization();//初始化函數(shù)</p><p> extern bit Reverse_Display;//是否反相顯示(白底黑字/黑底白字)</p><p> extern uchar code Digits[];</p><p> extern uchar code
117、WEEK_WORDS[];</p><p> extern uchar code Digits[];</p><p> extern uchar code DATE_TIME_WORDS[];</p><p> extern char Adjust_Index; //當(dāng)前調(diào)節(jié)的時(shí)間對(duì)象:秒,分,時(shí),日,月,年(0,1,2,3,4,6)</p>
118、<p> extern uchar MonthsDays[]; // 一年中每個(gè)月的天數(shù),二月的天數(shù)由年份決定</p><p> extern uchar DateTime[7]; //所讀取的日期時(shí)間</p><p> sbit k1=P3^4; // 選擇按鍵</p><p> sbit k2=P3^5; // 加&
119、lt;/p><p> sbit k3=P3^6; //減</p><p> sbit k4=P3^7; //確定</p><p> uchar tcount=0;</p><p> uchar H_Offset=10;//水平與垂直偏移</p><p> uchar V_page_Offse
120、t=0;</p><p> void main()</p><p><b> {</b></p><p> Initialization();</p><p><b> while(1)</b></p><p><b> {</b></p
121、><p> if(Adjust_Index==-1) GetTime();</p><p><b> }</b></p><p><b> }</b></p><p> void Initialization() //初始化函數(shù)</p><p><b>
122、 {</b></p><p><b> IE=0x83;</b></p><p><b> IP=0x01;</b></p><p><b> IT0=0X01;</b></p><p> TH0=-50000/256; // 寫入初值</p&
123、gt;<p> TL0=-50000%256; // 寫入初值</p><p><b> TR0=1;</b></p><p> LCD12864_Initialization(); //液晶初始化函數(shù)</p><p> Display_char(V_page_Offset,0+H_Offset,Digits+2
124、*16); //顯示年的前面固定的兩位</p><p> Display_char(V_page_Offset,8+H_Offset,Digits);</p><p> //在12864屏幕上固定顯示漢字:年月日,星期,時(shí)分秒</p><p> Display_Word(V_page_Offset,32+H_Offset,DATE_TIME_WORDS+0
125、*32);</p><p> Display_Word(V_page_Offset,64+H_Offset,DATE_TIME_WORDS+1*32);</p><p> Display_Word(V_page_Offset,96+H_Offset,DATE_TIME_WORDS+2*32);</p><p> Display_Word(V_page_Offs
126、et+3,56+H_Offset,DATE_TIME_WORDS+3*32);</p><p> Display_Word(V_page_Offset+3,72+H_Offset,DATE_TIME_WORDS+4*32);</p><p> Display_Word(V_page_Offset+6,32+H_Offset,DATE_TIME_WORDS+5*32);</p>
127、;<p> Display_Word(V_page_Offset+6,64+H_Offset,DATE_TIME_WORDS+6*32);</p><p> Display_Word(V_page_Offset+6,96+H_Offset,DATE_TIME_WORDS+7*32);</p><p><b> }</b></p>&l
128、t;p> void T0_INT()interrupt 1 // 定時(shí)器0刷新LCD顯示函數(shù)</p><p><b> {</b></p><p> TH0=-50000/256; // 寫入初值</p><p> TL0=-50000%256; // 寫入初值</p><p>
129、 if(++tcount!=2) return;</p><p><b> tcount=0;</b></p><p> Reverse_Display=Adjust_Index==6; //年(后兩位)</p><p> Display_char(V_page_Offset,16+H_Offset,Digits+DateTime[
130、6]/10*16);</p><p> Display_char(V_page_Offset,24+H_Offset,Digits+DateTime[6]%10*16);</p><p> Reverse_Display=Adjust_Index==5; //星期</p><p> Display_Word(V_page_Offset+3,96+H_Off
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ī)課程設(shè)計(jì)--電子日歷的制作
- 單片機(jī)課程設(shè)計(jì)報(bào)告-日歷
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(時(shí)鐘、日歷)-基于單片機(jī)的電子鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--電子日歷時(shí)鐘顯示器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--用數(shù)碼管設(shè)計(jì)的可調(diào)式數(shù)字鐘
- 單片機(jī)課程設(shè)計(jì)---可調(diào)電子鐘溫度顯示系統(tǒng)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--基于stc89c52單片機(jī)的電子時(shí)鐘(日歷)
- 單片機(jī)課程設(shè)計(jì)(電子鬧鐘)
- 單片機(jī)簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
- 基于c語言單片機(jī)智能電子日歷課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--電子門鈴
- 單片機(jī)課程設(shè)計(jì)--電子秒表
- 單片機(jī)課程設(shè)計(jì)——電子秒表
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)模擬電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)模擬電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)---電子秒表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--- 單片機(jī)電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的電子琴設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論