版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 摘要</b></p><p> 萬年歷的功能可實現(xiàn)年、月、日、時、分、秒和星期的顯示。隨著社會的發(fā)展日歷的功能越來越強大,精確度越來越高。本次設計的日歷采用DS1302時鐘芯片,該芯片精確度高,性能可靠。用LCD12864液晶屏,既可以顯示數(shù)字又可以顯示漢字,方便了人們的生活。本設計總體分為硬件部分和軟件部分。硬件部分可分為:時鐘芯片DS1302、AT89C5
2、1和LCD12864等。本設計非常適合家庭使用。電源采用+5V電壓供電。走時精確,是現(xiàn)代家庭必備的設備之一。</p><p> 關鍵詞:單片機,萬年歷, DS1302,時鐘芯片 1引言</p><p> 可調式電子日歷與時鐘小巧便于攜帶,界面清爽,一目了然,方便的知曉當前時間,并可對時間做出修改,實在是居家旅行日常生活之必
3、備用品。在現(xiàn)今的可調式電子日歷與時鐘具有性能穩(wěn)定、精確度高、成本低、易于產(chǎn) 品化,以及方便、實用等特點。</p><p><b> 2.總體設計</b></p><p><b> 2.1基本原理</b></p><p> 硬件主要涉及到:AT89C51、DS1302、LCD12864等。軟件通過框圖編寫出程
4、序。AT89C51主要功能是存儲程序、根據(jù)程序的內容對各個端口進行判斷并做出相應的處理。LCD12864主要的功能是實現(xiàn)年、月、日、時、分、秒的顯示效果。實時時鐘DS1302可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調整,且具有閏年補償功能。</p><p> 2.2系統(tǒng)總體框圖及設計思路</p><p><b> 3.詳細設計</b><
5、/p><p><b> 3.1 硬件設計</b></p><p> 3.1.1 DS1302芯片及原理介紹</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、
6、時、日、星期、月和年,一個月小與31天時可以自動調整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。 DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應用于測量系統(tǒng)中。</p><p><b> 外部引腳分配</b><
7、;/p><p><b> 各引腳的功能為:</b></p><p> Vcc1:備用電源;Vcc2:主電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p> SCLK:串行時鐘,輸入; </p><p>
8、 I/O:三線接口時的雙向數(shù)據(jù)線;</p><p> CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p><b> 內部結構</b></p><p> DS1302是SPI總線驅動方式。它不僅要向寄存器寫入控制字,還需
9、要讀取相應寄存器的數(shù)據(jù)。</p><p> 要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如下圖。</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p>
10、 位5至位1(A4~A0):指示操作單元的地址;</p><p> 位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p> 3.1.2 LCD12864液晶屏</p><p> LCD12864使用KS0108(或其兼容芯片)作為控制器,適配M6800系列時序,具有8位標準數(shù)據(jù)總線。6條控制線及電源線可顯示各種字符及圖形。每個
11、KS0108擁有64×64位(512字節(jié))的顯示RAM,12864顯示屏上的64×64點,顯示RAM中的數(shù)據(jù)直接作為顯示驅動信號。具有操作指令簡單,低功耗的特點。</p><p> 主要技術參數(shù)和顯示特性:</p><p> 電源:VDD 3.3V~+5V(內置升壓電路,無需負壓);</p><p> 顯示內容: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> (1)讀狀態(tài)字(read status)</p><p><b> 格式</b></p><p> BUSY=1,表示KS0108正在處理計算機發(fā)來的指令或數(shù)據(jù)。此時接口電路被封鎖,不能接受除讀狀態(tài)字以外的任何操作。BUSY=0表示KS0108接口控制電路已處于“準備好”狀態(tài),等
14、待計算機的訪問。</p><p> ON/OFF:表示當前的顯示狀態(tài)。ON/OFF=1表示關顯示狀態(tài);ON/OFF=0表示開顯示狀態(tài)。</p><p> RESET表示當前KS0108的工作狀態(tài),即反映RST端的電平狀態(tài)。當RST為低電平狀態(tài)時KS0108處于復位工作狀態(tài),RESET=1。當RST為高電平狀態(tài)時,KS0108為正常工作狀態(tài),RESET=0。</p><
15、;p> 在占領設置和數(shù)據(jù)讀寫時要注意狀態(tài)字中的BUSY標志。只有在BUSY=0時,計算機對KS0108的操作才能有效。因此計算機在每次對KS0108操作之前,都要讀出狀態(tài)字判斷BUSY是否為“0”。若不為“0”,則計算機需要等待,直至BUSY=0為止。</p><p> (2)顯示開關(display on/off)</p><p><b> 格式</b>
16、</p><p> 該指令設置顯示開關/觸發(fā)器的狀態(tài),由此控制顯示數(shù)據(jù)鎖存器的工作方式,從而控制顯示上的顯示狀態(tài)。</p><p> D位為顯示開/關的控制位。當D=1為顯示設置,顯示數(shù)據(jù)鎖存器正常工作,顯示屏上呈現(xiàn)所許的效果。此時在狀態(tài)字中ON/OFF=0。當D=0為關顯示設置,顯示數(shù)據(jù)鎖存器被置零,顯示屏呈不顯示狀態(tài),但顯示存儲器并沒有被破壞,在狀態(tài)組中ON/OFF=1。</
17、p><p> ?。?)顯示起始行設置(Display start line)</p><p><b> 格式</b></p><p> 該指令設置了顯示起始行寄存器的內容。KS0108有64行顯示的管理能力,該指令中L5~L0為顯示起始行的地址,取值在00~3FH(1~64)范圍內,它規(guī)定了顯示屏上最頂一行所對應的顯示存儲器的行地址。如果定時間
18、隔地,等間距地修改(如加一或減一)顯示起始行寄存器的內容,則顯示屏將呈現(xiàn)顯示內容向上或向下平滑滾動的顯示效果。</p><p> ?。?)頁面地址設置[Set page(X address)]</p><p><b> 格式</b></p><p> 該指令設置了頁面地址-X地址寄存器的內容。KS0108將顯示存儲器分成了8頁,指令代碼中P
19、2~P0就是要確定當前所要選擇的頁面地址,取值范圍為00~07H,代表第1~8頁。該指令規(guī)定了以后的讀/寫操作將在哪一個頁面上進行。執(zhí)行本指令后,下面的讀寫操作將在指定頁內,直到重新設置。頁地址就是DDRAM 的行地址,頁地址存儲在X地址計數(shù)器中,P2-P0可表示8頁,讀寫數(shù)據(jù)對頁地址沒有影響,除本指令可改變頁地址外,復位信號(RST)可把頁地址計數(shù)器內容清零。</p><p> ?。?)列地址設置(Set Y
20、address)</p><p><b> 格式</b></p><p> 該指令設置了Y地址計數(shù)器的內容,C5~C0=0~3FH(1~64)代表某一頁面上的某一單元地址,隨后的一次讀或寫數(shù)據(jù)將在這個單元上進行。Y地址計數(shù)器具有自動加一功能,在每一次讀/寫數(shù)據(jù)后它將自動加一,所以在連續(xù)進行讀/寫數(shù)據(jù)時,Y地址計數(shù)器不必每次都設置一次。頁面地址的設置和列地址的設置將
21、顯示存儲器單元唯一地確定下來,為后來的顯示數(shù)據(jù)的讀/寫作了地址的選通。</p><p> (6)寫顯示數(shù)據(jù)(Write display data)</p><p><b> 格式</b></p><p> 該操作將8位數(shù)據(jù)寫入先前已確定的顯示存儲器的單元內,操作完成后列地址計數(shù)器自動加1。</p><p> ?。?
22、)讀顯示數(shù)據(jù)(Read display data)</p><p><b> 格式</b></p><p> 該操作將KS0108接口部的輸出寄存器內容讀出,然后列地址計數(shù)器自動加1。</p><p> 3.1.3硬件原理圖</p><p><b> 3.2軟件設計</b></p>
23、;<p> 3.2.1 程序流程圖</p><p> 3.2.2 程序代碼</p><p> LCD12864顯示驅動程序</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、 //檢查LCD是否忙</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寫入一個字節(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 // 顯示一個8×16點陣字符</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 // 顯示一個16×16點陣符 </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時鐘程序</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時鐘線</p><p> sbit RST=P1^2; // DS1302復位線</p><p> char Adjust_Index=-1; //當前調節(jié)的時間對象:秒,分,時,日,月,年</p
50、><p> uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; // 一年中每個月的天數(shù),二月//的天數(shù)由年份決定</p><p> uchar DateTime[7]; //所讀取的日期時間</p><p> void Write_Byte_TO_DS1302(uchar X);
51、 // 向DS1302寫入一個字節(jié)</p><p> uchar Read_Byte_FROM_DS1302();//從DS1302中讀取一個字節(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(); // 設置時間</p><p> void GetTime(); // 讀取當前時間</p><p> uchar Is_Leapyear(uint year);// 判斷是否為閏年<
53、;/p><p> void Write_Byte_TO_DS1302(uchar X) // 向DS1302寫入一個字節(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中讀取一個字節(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碼轉換</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寫入一個地址
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() // 設置時間</p><p><b> {</b></p><p><b> uchar i;</b></p><p> Wr
64、ite_Data_TO_DS1302(0x8E,0x00); //寫控制字,取消寫保護 </p><p> for(i=1;i<7;i++) // 分,時,日,月,年依次寫入</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); //寫控制字,加寫保護</p><p><b> }</b></p><p> void Get
66、Time() // 讀取當前時間</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) //年,月,日和時,分++/--</p><p><b> {</b></p><p> switch(Adjust_Index)</p><p><b> {</b></p><p> case 6:
73、 //年調整,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: //月調整 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: //日調整00-28或00-29或00-30或00-31</p><p> MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28
81、; //調節(jié)之前首先根據(jù)當</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: // 時調整</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: // 分調整</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、 // 秒調整</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> // 與本程序有關的數(shù)字和漢字的點陣編碼 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、//年、月、日、星期、時、分、秒等漢字點陣(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,//時</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> //一、二、三、四、五、六和天等漢字點陣(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ù)字點陣(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(); // 設置時間</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; //當前調節(jié)的時間對象:秒,分,時,日,月,年(0,1,2,3,4,6)</p>
118、<p> extern uchar MonthsDays[]; // 一年中每個月的天數(shù),二月的天數(shù)由年份決定</p><p> extern uchar DateTime[7]; //所讀取的日期時間</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屏幕上固定顯示漢字:年月日,星期,時分秒</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 // 定時器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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計--電子日歷的制作
- 單片機課程設計報告-日歷
- 單片機課程設計-單片機課程設計---電子時鐘
- 單片機課程設計實驗報告(時鐘、日歷)-基于單片機的電子鐘設計
- 單片機課程設計--電子日歷時鐘顯示器設計
- 單片機課程設計--用數(shù)碼管設計的可調式數(shù)字鐘
- 單片機課程設計---可調電子鐘溫度顯示系統(tǒng)
- 單片機課程設計報告--基于stc89c52單片機的電子時鐘(日歷)
- 單片機課程設計(電子鬧鐘)
- 單片機簡易電子琴單片機課程設計
- 基于c語言單片機智能電子日歷課程設計
- 單片機課程設計--電子門鈴
- 單片機課程設計--電子秒表
- 單片機課程設計——電子秒表
- 單片機課程設計--單片機模擬電子時鐘設計
- 單片機課程設計--單片機模擬電子時鐘設計
- 單片機課程設計---單片機電子時鐘
- 單片機課程設計---電子秒表設計
- 單片機課程設計--- 單片機電子時鐘設計
- 單片機課程設計---基于單片機的電子琴設計
評論
0/150
提交評論