版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 1 DS1302實時時鐘</p><p> (1) 時鐘芯片DS1302的工作原理:</p><p> DS1302在每次進行讀、寫程序前都必須初始化,先把SCLK端置“0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時序圖如圖1.1所示。為DS1302的控制字,此控制字的位7必須置1,若為0則不能對DS1302進行讀寫數(shù)據(jù)。對于位6,若對程序進行讀/
2、寫時RAM=1,對時間進行讀/寫時,CK=0。位1至位5指操作單元的地址。位0是讀/寫操作位,進行讀操作時,該位為1;該位為0則表示進行的是寫操作??刂谱止?jié)總是從最低位開始輸入/輸出的。表-2為DS1302的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標志位,當該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位為0時,時鐘開始運行。“WP”是寫保護位,在任何的對時鐘和RAM的寫操作之前,WP必須為0。當“WP”為1時,寫保護位防
3、止對任一寄存器的寫操作。</p><p> (2) DS1302的控制字節(jié)</p><p> DS1302的控制字如表-1所示??刂谱止?jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始
4、輸出</p><p> 表-1 DS1302的控制字格式</p><p> RAM RD</p><p> 1 A4 A3 A2 A1 A0 </p><p> / CK
5、 /WR</p><p> (3) 數(shù)據(jù)輸入輸出(I/O)</p><p> 在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。如下圖1所示</p>&l
6、t;p> 圖1.1 DS1302讀/寫時序圖</p><p> (4) DS1302的寄存器</p><p> DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間寄存器及其控制字見表-2。</p><p> 表-2 DS1302的日歷、時間寄存器 </p><p> 此外,D
7、S1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)
8、。 </p><p><b> 2 方案論證與設(shè)計</b></p><p> 2.1控制器部分方案設(shè)計 </p><p> 硬件控制電路主要用了AT89C52芯片處理器、1602LCD顯示器、DS1302實時時鐘、DB18B20溫度傳感器。根據(jù)各自芯片的功能互相連接成電子萬年歷的控制電路。軟件控制程序主要有主控程序、電子萬年歷的時間控制程
9、序、時間顯示及溫度顯示程序等組成。設(shè)計框圖如圖2.1所示</p><p><b> 圖2.1 框圖設(shè)計</b></p><p> 2.2 顯示部分的方案論證</p><p> 方案一:采用8段數(shù)碼管雖經(jīng)濟實惠,但操作比液晶顯示來說略顯繁瑣。</p><p> 方案二:液晶顯示方式。液晶顯示效果出眾,可以運用菜單項
10、來方便操作,比較簡單,所以,最后選擇液晶顯示方案。顯示電路圖如圖2.2所示。</p><p> 圖2.2 液晶顯示電路</p><p> 2.3 實時時鐘電路設(shè)計</p><p> 圖2.3是 DS1302與單片機的連接,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。
11、當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。</p><p> 圖2.3 DS1302時鐘電路</p><p> 2.4 溫度采集模塊設(shè)計</p><p> 如圖2.4所示,采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測
12、量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,使用P3.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。</p><p> 圖2.4 DS18B20溫度采集模塊</p><p> 2.5 功能按鈕設(shè)計</p><p> 當按鈕被按下時,該按鈕對應(yīng)的I/O口被拉為低電平,松開時按鈕對應(yīng)的I/O口由內(nèi)部的上拉電阻將該
13、I/O拉為高電平,如圖2.5所示:</p><p> 圖2.5 鍵盤電路設(shè)計</p><p><b> 2.6 總體電路圖</b></p><p><b> 3 軟件設(shè)計流程</b></p><p> 3.1 系統(tǒng)總流程圖</p><p> 系統(tǒng)總體流程圖如圖3.1
14、所示,系統(tǒng)流程圖設(shè)計分析如下:首系統(tǒng)初始化,系統(tǒng)運行,當有設(shè)置鍵按下時進入時間修改模式,無按鍵按下時讀取時間溫度等數(shù)據(jù)送入顯示器顯示。在時間修改模式下設(shè)置時間完成后再將時間送入顯示器顯示。</p><p> 圖3.1 系統(tǒng)流程圖</p><p> 3.2 溫度程序流程圖</p><p> 溫度讀取程序流程圖如圖3.2所示。流程圖分析:開始進入初始化DS18B2
15、0,就是通過主機拉低單線產(chǎn)生復位脈沖然后釋放總線,如果有應(yīng)答就發(fā)起ROM命令,當成功執(zhí)行操作命令后,就使用溫度轉(zhuǎn)換,當溫度轉(zhuǎn)換完成后又初始化DS18B20是否有應(yīng)答脈沖,若有就發(fā)起讀暫存器和CRC命令,同時讀出第一第二字節(jié)即溫度數(shù)據(jù)。</p><p> 圖3.2 溫度讀取程序流程圖</p><p> 3.3 DS1302時鐘程序流程圖</p><p> 時鐘流
16、程圖如圖3.3所示,流程圖分析:DS1302開始計時時,首先進行初始化,當有中斷信號時,讀取時鐘芯片的時間數(shù)據(jù)送入液晶顯示。這時若有設(shè)置鍵按下,進行時間修改,完成后將時間數(shù)據(jù)送入1302芯片,若沒有按鍵按下,直接送入EPROM中,送入液晶顯示。</p><p> 圖3.3 時鐘程序流程圖</p><p> DS1302時鐘部分子程序</p><p> void
17、 write_byte(uchar dat)//寫一個字節(jié)</p><p><b> {</b></p><p><b> ACC=dat;</b></p><p><b> RST=1;</b></p><p> for(a=8;a>0;a--)</p&g
18、t;<p><b> {</b></p><p><b> IO=ACC0;</b></p><p> SCLK=0; //產(chǎn)生上升沿寫入數(shù)據(jù),從低位寫入</p><p><b> SCLK=1;</b></p><p> ACC=ACC>>
19、1;</p><p><b> }</b></p><p><b> }</b></p><p> uchar read_byte()//讀一個字節(jié)</p><p><b> {</b></p><p><b> RST=1;<
20、/b></p><p> for(a=8;a>0;a--)</p><p><b> {</b></p><p><b> ACC7=IO;</b></p><p> SCLK=1; //產(chǎn)生下降沿輸出數(shù)據(jù),先輸出低位,保存到ACC中</p><p>&l
21、t;b> SCLK=0;</b></p><p> ACC=ACC>>1;</p><p><b> }</b></p><p> return (ACC);</p><p><b> }</b></p><p> void writ
22、e_1302(uchar add,uchar dat)//向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)</p><p><b> {</b></p><p><b> RST=0;</b></p><p><b> SCLK=0;</b></p><p><b>
23、 RST=1;</b></p><p> write_byte(add);</p><p> write_byte(dat);</p><p><b> SCLK=1;</b></p><p><b> RST=0;</b></p><p><b&g
24、t; }</b></p><p> uchar read_1302(uchar add)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址</p><p><b> {</b></p><p> uchar temp;</p><p><b> RST=0;</b></p&g
25、t;<p><b> SCLK=0;</b></p><p><b> RST=1;</b></p><p> write_byte(add);</p><p> temp=read_byte();</p><p><b> SCLK=1;</b><
26、;/p><p><b> RST=0;</b></p><p> return(temp);</p><p><b> }</b></p><p> uchar BCD_Decimal(uchar bcd)//BCD碼轉(zhuǎn)十進制函數(shù),輸入BCD,返回十進制</p><p>
27、<b> {</b></p><p> uchar Decimal;</p><p> Decimal=bcd>>4;</p><p> return(Decimal=Decimal*10+(bcd&=0x0F));</p><p><b> }</b></p&g
28、t;<p> void ds1302_init() //1302芯片初始化子函數(shù)(2012-06-18,12:00:00,week7)</p><p><b> {</b></p><p><b> RST=0;</b></p><p><b> SCLK=0;</b></
29、p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00</p><p> write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分數(shù)據(jù)00</p><p>
30、 write_1302(0x84,0x12);//向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù)12</p><p> write_1302(0x8a,0x07);//向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4</p><p> write_1302(0x86,0x17);//向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)18</p><p>
31、write_1302(0x88,0x06);//向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)06</p><p> write_1302(0x8c,0x12);//向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)12</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p><b> }</b>
32、;</p><p> 3.4 LCD顯示程序流程圖</p><p> 顯示流程圖如圖3.4所示,流程圖分析如下:首先對1602顯示屏進行初始化(初始化大約持續(xù)10ms),然后檢查忙信號,若BF=0,則獲得顯示RAM地址,寫入相應(yīng)的數(shù)據(jù)顯示。若BF=1,則代表模塊正在進行內(nèi)部操作,不接受任何外部指令和數(shù)據(jù),直到BF=0為止。</p><p> 圖3.4 LCD顯
33、示程序流程圖</p><p> 4 萬年歷的仿真與調(diào)試結(jié)果</p><p><b> 上電后的顯示</b></p><p><b> 秒調(diào)節(jié)</b></p><p> 功能按鍵,自上而下功能依次為調(diào)節(jié)按鍵、加按鍵、減按鍵</p><p><b> 5 心得
34、體會</b></p><p> 本次設(shè)計是我們遇到過的較大的設(shè)計,所以遇到的問題也比較的多,尤其是以前沒有接觸過如此復雜的硬件電路以及軟件編程,在軟、硬件設(shè)計和調(diào)試中遇到了不少的困難,在同學的幫助才逐一克服了難題,學習到了不少的專業(yè)知識。</p><p> 在整個設(shè)計過程之前,我已經(jīng)在網(wǎng)上找了相關(guān)方面的資料,萬事開始難,一開始不知道從哪里下手。后來慢慢學會分析系統(tǒng),將系統(tǒng)模
35、塊化,各個模塊可以在軟件或者硬件上實現(xiàn)。在確保各個模塊的硬件電路和與之相搭配的程序能夠正常工作后在把它們組成一個系統(tǒng)。在今后的日子里,我會進一步加強自己的動手能力,豐富自己的知識面。</p><p><b> 參考文獻</b></p><p> 李朝青.單片機原理及接口技術(shù)[M],北京:北京航天航空大學出版社,2005</p><p>
36、李廣弟.單片機基礎(chǔ)[M],北京:北京航空航天大學出版社,2000</p><p> 萬光毅.單片機實驗與實踐教程[M],北京:北京航空航天大學出版社,2003</p><p> 唐亞平、李移倫.單片機原理實訓與學習指導[M],長沙:中南大學出版社,2006</p><p> 劉軍.單片機原理與接口技術(shù)[M],華東理工大學出版社,2006</p>
37、<p> 謝自美.電子線路設(shè)計、實驗、測試[M],武漢:華中理工大學出版社,2000</p><p><b> 附件</b></p><p><b> 萬年歷源程序</b></p><p> #include<reg51.h></p><p> #include&qu
38、ot;DS18B20_3.H"</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;</p><p> //
39、flag用于讀取頭文件中的溫度值,和顯示溫度值</p><p> #define yh 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)</p><p> #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)</p><p> //液晶屏的與C5
40、1之間的引腳連接定義(顯示數(shù)據(jù)線接C51的P0口)</p><p> sbit rs=P2^6; //寄存器選擇</p><p> sbit en=P2^7; //下降沿使能</p><p> sbit rw=P2^5; //讀寫信號線</p><p> //DS1302時鐘芯片與C51之間的引腳連接定義</p><
41、;p> sbit IO=P3^4;//數(shù)據(jù)線</p><p> sbit SCLK=P3^6;</p><p> sbit RST=P3^5;</p><p> sbit ACC0=ACC^0;</p><p> sbit ACC7=ACC^7;</p><p><b> ACC累加器=A&
42、lt;/b></p><p> ACC.0=E0H </p><p> //校時按鍵與C51的引腳連接定義</p><p> sbit key1=P2^0; //設(shè)置鍵</p><p> sbit key2=P2^1; //加鍵</p><p> sbit key3=P2^2; //減鍵</
43、p><p> sbit buzzer=P1^5;//蜂鳴器,端口低電平響</p><p> uchar code tab1[]={"20 - - "}; //年顯示的固定字符</p><p> uchar code tab2[]={" : : "};//時間顯示的固定字符</p><p>
44、; //延時函數(shù),后面經(jīng)常調(diào)用</p><p> void delay(uint xms)//延時函數(shù),有參函數(shù)</p><p><b> {</b></p><p><b> uint x,y;</b></p><p> for(x=xms;x>0;x--)</p>
45、<p> for(y=120;y>0;y--);</p><p><b> }</b></p><p> void write_1602com(uchar com)//****液晶寫入指令函數(shù)****</p><p><b> {</b></p><p> rs=0;//數(shù)
46、據(jù)/指令選擇置為指令</p><p> rw=0; //讀寫選擇置為寫</p><p> P0=com;//送入數(shù)據(jù)</p><p><b> delay(1);</b></p><p> en=1;//拉高使能端,為制造有效的下降沿做準備</p><p><b> delay
47、(1);</b></p><p> en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令</p><p><b> }</b></p><p> void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****</p><p><b> {</b>&l
48、t;/p><p> rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)</p><p> rw=0; //讀寫選擇置為寫</p><p> P0=dat;//送入數(shù)據(jù)</p><p><b> delay(1);</b></p><p> en=1; //en置高電平,為制造下降沿做準備</p>
49、;<p><b> delay(1);</b></p><p> en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令</p><p><b> }</b></p><p> void lcd_init()//***液晶初始化函數(shù)****</p><p><b>
50、 {</b></p><p> write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)</p><p> write_1602com(0x0c);//開顯示不顯示光標</p><p> write_1602com(0x06);//整屏不移動,光標自動右移</p><p>
51、write_1602com(0x01);//清顯示</p><p> write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示</p><p> for(a=0;a<14;a++)</p><p><b> {</b></p><p> write_1602dat(tab1
52、[a]);//向液晶屏寫日歷顯示的固定符號部分</p><p> //delay(3);</p><p><b> }</b></p><p> write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置后開始顯示</p><p> for(a=0;a<8;a++)</p>
53、;<p><b> {</b></p><p> write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號</p><p> //delay(3);</p><p><b> }</b></p><p><b> }</b><
54、/p><p> void write_byte(uchar dat)//寫一個字節(jié)</p><p><b> {</b></p><p><b> ACC=dat;</b></p><p><b> RST=1;</b></p><p> for(
55、a=8;a>0;a--)</p><p><b> {</b></p><p><b> IO=ACC0;</b></p><p> SCLK=0; //產(chǎn)生上升沿寫入數(shù)據(jù),從低位寫入</p><p><b> SCLK=1;</b></p><
56、;p> ACC=ACC>>1;</p><p><b> }</b></p><p><b> }</b></p><p> uchar read_byte()//讀一個字節(jié)</p><p><b> {</b></p><p&g
57、t;<b> RST=1;</b></p><p> for(a=8;a>0;a--)</p><p><b> {</b></p><p><b> ACC7=IO;</b></p><p> SCLK=1; //產(chǎn)生下降沿輸出數(shù)據(jù),先輸出低位,保存到ACC中
58、</p><p><b> SCLK=0;</b></p><p> ACC=ACC>>1;</p><p><b> }</b></p><p> return (ACC);</p><p><b> }</b></p>
59、;<p> void write_1302(uchar add,uchar dat)//向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)</p><p><b> {</b></p><p><b> RST=0;</b></p><p><b> SCLK=0;</b></p&g
60、t;<p><b> RST=1;</b></p><p> write_byte(add);</p><p> write_byte(dat);</p><p><b> SCLK=1;</b></p><p><b> RST=0;</b></
61、p><p><b> }</b></p><p> uchar read_1302(uchar add)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址</p><p><b> {</b></p><p> uchar temp;</p><p><b> R
62、ST=0;</b></p><p><b> SCLK=0;</b></p><p><b> RST=1;</b></p><p> write_byte(add);</p><p> temp=read_byte();</p><p><b>
63、; SCLK=1;</b></p><p><b> RST=0;</b></p><p> return(temp);</p><p><b> }</b></p><p> uchar BCD_Decimal(uchar bcd)//BCD碼轉(zhuǎn)十進制函數(shù),輸入BCD,返回十
64、進制</p><p><b> {</b></p><p> uchar Decimal;</p><p> Decimal=bcd>>4;</p><p> return(Decimal=Decimal*10+(bcd&=0x0F));</p><p><b&g
65、t; }</b></p><p> void ds1302_init() //1302芯片初始化子函數(shù)(2012-06-18,12:00:00,week7)</p><p><b> {</b></p><p><b> RST=0;</b></p><p><b>
66、 SCLK=0;</b></p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00</p><p> write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分數(shù)據(jù)0
67、0</p><p> write_1302(0x84,0x12);//向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù)12</p><p> write_1302(0x8a,0x07);//向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4</p><p> write_1302(0x86,0x17);//向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)18
68、</p><p> write_1302(0x88,0x06);//向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)06</p><p> write_1302(0x8c,0x12);//向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)12</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p&g
69、t;<b> }</b></p><p><b> //溫度顯示子函數(shù)</b></p><p> void write_temp(uchar add,uchar dat)//向LCD寫溫度數(shù)據(jù),并指定顯示位置</p><p><b> {</b></p><p> u
70、char gw,sw;</p><p> gw=dat%10;//取得個位數(shù)字</p><p> sw=dat/10;//取得十位數(shù)字</p><p> write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40</p><p> write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LC
71、D1602顯示碼</p><p> write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼</p><p> write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字符庫的該符號地址碼</p><p> write_1602dat(0x43); //顯示"C"符號,0x43是
72、液晶屏字符庫里大寫C的地址碼 </p><p><b> }</b></p><p> //時分秒顯示子函數(shù)</p><p> void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù)</p><p><b> {</b>
73、</p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個位數(shù)字</p><p> sw=dat/10;//取得十位數(shù)字</p><p> write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40</p><p> write_1602dat(
74、0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼</p><p> write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 </p><p><b> }</b></p><p> //年月日顯示子函數(shù)</p><p> void write_nyr(uch
75、ar add,uchar dat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù)</p><p><b> {</b></p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個位數(shù)字</p><p> sw=dat/10;//取得十位數(shù)字</p><
76、;p> write_1602com(yh+add);//設(shè)定顯示位置為第一個位置+add</p><p> write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼</p><p> write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼</p><p><b> }&
77、lt;/b></p><p> void write_week(uchar week)//寫星期函數(shù)</p><p><b> {</b></p><p> write_1602com(yh+0x0c);//星期字符的顯示位置</p><p> switch(week)</p><p&g
78、t;<b> {</b></p><p> case 1:write_1602dat('M');//星期數(shù)為1時,顯示</p><p> write_1602dat('O');</p><p> write_1602dat('N');</p><p><b&g
79、t; break;</b></p><p> case 2:write_1602dat('T');//星期數(shù)據(jù)為2時顯示</p><p> write_1602dat('U');</p><p> write_1602dat('E');</p><p><b>
80、break;</b></p><p> case 3:write_1602dat('W');//星期數(shù)據(jù)為3時顯示</p><p> write_1602dat('E');</p><p> write_1602dat('D');</p><p><b> brea
81、k;</b></p><p> case 4:write_1602dat('T');//星期數(shù)據(jù)為4是顯示</p><p> write_1602dat('H');</p><p> write_1602dat('U');</p><p><b> break;&l
82、t;/b></p><p> case 5:write_1602dat('F');//星期數(shù)據(jù)為5時顯示</p><p> write_1602dat('R');</p><p> write_1602dat('I');</p><p><b> break;</b
83、></p><p> case 6:write_1602dat('S');//星期數(shù)據(jù)為6時顯示</p><p> write_1602dat('T');</p><p> write_1602dat('A');</p><p><b> break;</b>
84、</p><p> case 7:write_1602dat('S');//星期數(shù)據(jù)為7時顯示</p><p> write_1602dat('U');</p><p> write_1602dat('N');</p><p><b> break;</b><
85、/p><p><b> }</b></p><p><b> }</b></p><p> //****************鍵盤掃描有關(guān)函數(shù)**********************</p><p> void keyscan()</p><p><b>
86、 {</b></p><p> if(key1==0)//---------------key1為功能鍵(設(shè)置鍵)--------------------</p><p><b> {</b></p><p> delay(9);//延時,用于消抖動</p><p> if(key1==0)//延時
87、后再次確認按鍵按下</p><p><b> {</b></p><p> buzzer=0;//蜂鳴器短響一次</p><p> delay(20);</p><p><b> buzzer=1;</b></p><p> while(!key1);</p&
88、gt;<p><b> key1n++;</b></p><p> if(key1n==9)</p><p> key1n=1;//設(shè)置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán)</p><p> switch(key1n)</p><p><b> {</b>
89、</p><p> case 1: TR0=0;//關(guān)閉定時器</p><p><b> //TR1=0;</b></p><p> write_1602com(er+0x09);//設(shè)置按鍵按動一次,秒位置顯示光標</p><p> write_1602com(0x0f);//設(shè)置光標為閃爍</p>
90、<p> temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302</p><p> write_1302(0x8e,0x00);</p><p> write_1302(0x80,0x80|temp);//miao</p><p> write_1302(0x8e,0x80);</p><p>
91、;<b> break;</b></p><p> case 2: write_1602com(er+6);//按2次fen位置顯示光標</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 3: wr
92、ite_1602com(er+3);//按動3次,shi</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 4: write_1602com(yh+0x0e);//按動4次,week</p><p> //write_160
93、2com(0x0f);</p><p><b> break;</b></p><p> case 5: write_1602com(yh+0x0a);//按動5次,ri</p><p> //write_1602com(0x0f);</p><p><b> break;</b></
94、p><p> case 6: write_1602com(yh+0x07);//按動6次,yue</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 7: write_1602com(yh+0x04);//按動7次,nian<
95、;/p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p><b> case 8:</b></p><p> write_1602com(0x0c);//按動到第8次,設(shè)置光標不閃爍</p><p>
96、 TR0=1;//打開定時器</p><p> temp=(miao)/10*16+(miao)%10;</p><p> write_1302(0x8e,0x00);</p><p> write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302</p><p> write_1302(0x8e,0x80)
97、;</p><p> break; </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //--------------------
98、----------加鍵key2---------------------------- </p><p> if(key1n!=0)//當key1按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零)</p><p><b> {</b></p><p> if(key2==0) //上調(diào)鍵</p><p><
99、b> {</b></p><p> delay(10);</p><p> if(key2==0)</p><p><b> {</b></p><p> buzzer=0;//蜂鳴器短響一次</p><p> delay(20);</p><p&
100、gt;<b> buzzer=1;</b></p><p> while(!key2);</p><p> switch(key1n)</p><p><b> {</b></p><p> case 1:miao++;//設(shè)置鍵按動1次,調(diào)秒</p><p>
101、if(miao==60)</p><p> miao=0;//秒超過59,再加1,就歸零</p><p> write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設(shè)定好的秒數(shù)</p><p> temp=(miao)/10*16+(miao)%10;//十進制轉(zhuǎn)換成DS1302要求的BCD碼</p><
102、;p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p> write_1602com(er+0x09);/
103、/因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,光標自動右移,所以要指定返回</p><p> //write_1602com(0x0b);</p><p><b> break;</b></p><p> case 2:fen++;</p><p> if(fen==60)</p><p><b
104、> fen=0;</b></p><p> write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設(shè)定好的分數(shù)據(jù)</p><p> temp=(fen)/10*16+(fen)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁
105、止寫保護 </p><p> write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置</p&g
106、t;<p><b> break;</b></p><p> case 3:shi++;</p><p> if(shi==24)</p><p><b> shi=0;</b></p><p> write_sfm(2,shi);//令LCD在正確的位置顯示"加&
107、quot;設(shè)定好的小時數(shù)據(jù)</p><p> temp=(shi)/10*16+(shi)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼&l
108、t;/p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 4:week++;</p>
109、;<p> if(week==8)</p><p><b> week=1;</b></p><p> write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置</p><p> write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容</p><p> te
110、mp=(week)/10*16+(week)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0
111、x80);//打開寫保護</p><p> write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 5:ri++;</p><p> if(ri==32)</p>&
112、lt;p><b> ri=1;</b></p><p> write_nyr(9,ri);//令LCD在正確的位置顯示"加"設(shè)定好的日期數(shù)據(jù)</p><p> temp=(ri)/10*16+(ri)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00)
113、;//允許寫,禁止寫保護</p><p> write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位&
114、lt;/p><p><b> break;</b></p><p> case 6:yue++;</p><p> if(yue==13)</p><p><b> yue=1;</b></p><p> write_nyr(6,yue);//令LCD在正確的位置顯示&
115、quot;加"設(shè)定好的月份數(shù)據(jù)</p><p> temp=(yue)/10*16+(yue)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)
116、BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p> case 7:nian++;<
117、;/p><p> if(nian==100)</p><p><b> nian=0;</b></p><p> write_nyr(3,nian);//令LCD在正確的位置顯示"加"設(shè)定好的年份數(shù)據(jù)</p><p> temp=(nian)/10*16+(nian)%10;//十進制轉(zhuǎn)換成DS1
118、302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護</p><p> write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> w
119、rite_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&
120、lt;/b></p><p> //------------------減鍵key3,各句功能參照'加鍵'注釋---------------</p><p> if(key3==0)</p><p><b> {</b></p><p> delay(10);//調(diào)延時,消抖動</p&
121、gt;<p> if(key3==0)</p><p><b> {</b></p><p> buzzer=0;//蜂鳴器短響一次</p><p> delay(20);</p><p><b> buzzer=1;</b></p><p> wh
122、ile(!key3);</p><p> switch(key1n)</p><p><b> {</b></p><p> case 1:miao--;</p><p> if(miao==-1)</p><p> miao=59;//秒數(shù)據(jù)減到-1時自動變成59</p>
123、<p> write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù)</p><p> temp=(miao)/10*16+(miao)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護 </p><p> write_1302(0x8
124、0,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護</p><p> write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置</p><p> //write_1602com(0x0b);
125、</p><p><b> break;</b></p><p> case 2:fen--;</p><p> if(fen==-1)</p><p><b> fen=59;</b></p><p> write_sfm(5,fen);</p>&
126、lt;p> temp=(fen)/10*16+(fen)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分數(shù)據(jù)BCD碼</p><p> write_1
127、302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置</p><p><b> break;</b></p><p> case 3:shi--;</p><p> if(shi==-1)&
128、lt;/p><p><b> shi=23;</b></p><p> write_sfm(2,shi);</p><p> temp=(shi)/10*16+(shi)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </
129、p><p> write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p&g
130、t;<b> break;</b></p><p> case 4:week--;</p><p> if(week==0)</p><p><b> week=7;</b></p><p> write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置&
131、lt;/p><p> write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容</p><p> temp=(week)/10*16+(week)%10;//十進制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護 </p><p> write_1302(0x8a,te
132、mp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護</p><p> write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位</p><p><b> break;</b></p
133、><p> case 5:ri--;</p><p><b> if(ri==0)</b></p><p><b> ri=31;</b></p><p> write_nyr(9,ri);</p><p> temp=(ri)/10*16+(ri)%10;//十進制轉(zhuǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機萬年歷課程設(shè)計
- 單片機萬年歷課程設(shè)計
- 單片機課程設(shè)計-萬年歷
- 萬年歷單片機課程設(shè)計
- 單片機課程設(shè)計—電子萬年歷
- 單片機萬年歷課程設(shè)計報告
- 單片機課程設(shè)計報告(萬年歷)
- 單片機課程設(shè)計-電子萬年歷
- 單片機萬年歷課程設(shè)計 (2)
- 單片機課程設(shè)計-- 電子萬年歷
- 單片機課程設(shè)計—萬年歷[1]
- 單片機課程設(shè)計---萬年歷顯示設(shè)計
- 單片機課程設(shè)計---電子萬年歷設(shè)計
- 基于單片機的萬年歷課程設(shè)計
- 1602數(shù)字萬年歷單片機課程設(shè)計
- 單片機課程設(shè)計--基于51單片機的萬年歷
- 課程設(shè)計--單片機簡易萬年歷的設(shè)計
- 單片機電子萬年歷課程設(shè)計
- 單片機電子萬年歷課程設(shè)計
- 單片機電子萬年歷課程設(shè)計
評論
0/150
提交評論