版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 1 DS1302實(shí)時(shí)時(shí)鐘</p><p> (1) 時(shí)鐘芯片DS1302的工作原理:</p><p> DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置“0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時(shí)序圖如圖1.1所示。為DS1302的控制字,此控制字的位7必須置1,若為0則不能對DS1302進(jìn)行讀寫數(shù)據(jù)。對于位6,若對程序進(jìn)行讀/
2、寫時(shí)RAM=1,對時(shí)間進(jìn)行讀/寫時(shí),CK=0。位1至位5指操作單元的地址。位0是讀/寫操作位,進(jìn)行讀操作時(shí),該位為1;該位為0則表示進(jìn)行的是寫操作。控制字節(jié)總是從最低位開始輸入/輸出的。表-2為DS1302的日歷、時(shí)間寄存器內(nèi)容:“CH”是時(shí)鐘暫停標(biāo)志位,當(dāng)該位為1時(shí),時(shí)鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時(shí),時(shí)鐘開始運(yùn)行?!癢P”是寫保護(hù)位,在任何的對時(shí)鐘和RAM的寫操作之前,WP必須為0。當(dāng)“WP”為1時(shí),寫保護(hù)位防
3、止對任一寄存器的寫操作。</p><p> (2) DS1302的控制字節(jié)</p><p> DS1302的控制字如表-1所示??刂谱止?jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作,控制字節(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> 在控制指令字輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí),數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個(gè)SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0位到高位7。如下圖1所示</p>&l
6、t;p> 圖1.1 DS1302讀/寫時(shí)序圖</p><p> (4) DS1302的寄存器</p><p> DS1302有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時(shí)間寄存器及其控制字見表-2。</p><p> 表-2 DS1302的日歷、時(shí)間寄存器 </p><p> 此外,D
7、S1302 還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個(gè)RAM單元,共31個(gè),每個(gè)單元組態(tài)為一個(gè)8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個(gè)字節(jié),命令控制字為FEH(寫)、FFH(讀)
8、。 </p><p><b> 2 方案論證與設(shè)計(jì)</b></p><p> 2.1控制器部分方案設(shè)計(jì) </p><p> 硬件控制電路主要用了AT89C52芯片處理器、1602LCD顯示器、DS1302實(shí)時(shí)時(shí)鐘、DB18B20溫度傳感器。根據(jù)各自芯片的功能互相連接成電子萬年歷的控制電路。軟件控制程序主要有主控程序、電子萬年歷的時(shí)間控制程
9、序、時(shí)間顯示及溫度顯示程序等組成。設(shè)計(jì)框圖如圖2.1所示</p><p><b> 圖2.1 框圖設(shè)計(jì)</b></p><p> 2.2 顯示部分的方案論證</p><p> 方案一:采用8段數(shù)碼管雖經(jīng)濟(jì)實(shí)惠,但操作比液晶顯示來說略顯繁瑣。</p><p> 方案二:液晶顯示方式。液晶顯示效果出眾,可以運(yùn)用菜單項(xiàng)
10、來方便操作,比較簡單,所以,最后選擇液晶顯示方案。顯示電路圖如圖2.2所示。</p><p> 圖2.2 液晶顯示電路</p><p> 2.3 實(shí)時(shí)時(shí)鐘電路設(shè)計(jì)</p><p> 圖2.3是 DS1302與單片機(jī)的連接,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。
11、當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。</p><p> 圖2.3 DS1302時(shí)鐘電路</p><p> 2.4 溫度采集模塊設(shè)計(jì)</p><p> 如圖2.4所示,采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測
12、量精度高,電路連接簡單特點(diǎn),此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,使用P3.7與DS18B20的I/O口連接加一個(gè)上拉電阻,Vcc接電源,Vss接地。</p><p> 圖2.4 DS18B20溫度采集模塊</p><p> 2.5 功能按鈕設(shè)計(jì)</p><p> 當(dāng)按鈕被按下時(shí),該按鈕對應(yīng)的I/O口被拉為低電平,松開時(shí)按鈕對應(yīng)的I/O口由內(nèi)部的上拉電阻將該
13、I/O拉為高電平,如圖2.5所示:</p><p> 圖2.5 鍵盤電路設(shè)計(jì)</p><p><b> 2.6 總體電路圖</b></p><p><b> 3 軟件設(shè)計(jì)流程</b></p><p> 3.1 系統(tǒng)總流程圖</p><p> 系統(tǒng)總體流程圖如圖3.1
14、所示,系統(tǒng)流程圖設(shè)計(jì)分析如下:首系統(tǒng)初始化,系統(tǒng)運(yùn)行,當(dāng)有設(shè)置鍵按下時(shí)進(jìn)入時(shí)間修改模式,無按鍵按下時(shí)讀取時(shí)間溫度等數(shù)據(jù)送入顯示器顯示。在時(shí)間修改模式下設(shè)置時(shí)間完成后再將時(shí)間送入顯示器顯示。</p><p> 圖3.1 系統(tǒng)流程圖</p><p> 3.2 溫度程序流程圖</p><p> 溫度讀取程序流程圖如圖3.2所示。流程圖分析:開始進(jìn)入初始化DS18B2
15、0,就是通過主機(jī)拉低單線產(chǎn)生復(fù)位脈沖然后釋放總線,如果有應(yīng)答就發(fā)起ROM命令,當(dāng)成功執(zhí)行操作命令后,就使用溫度轉(zhuǎn)換,當(dāng)溫度轉(zhuǎn)換完成后又初始化DS18B20是否有應(yīng)答脈沖,若有就發(fā)起讀暫存器和CRC命令,同時(shí)讀出第一第二字節(jié)即溫度數(shù)據(jù)。</p><p> 圖3.2 溫度讀取程序流程圖</p><p> 3.3 DS1302時(shí)鐘程序流程圖</p><p> 時(shí)鐘流
16、程圖如圖3.3所示,流程圖分析:DS1302開始計(jì)時(shí)時(shí),首先進(jìn)行初始化,當(dāng)有中斷信號時(shí),讀取時(shí)鐘芯片的時(shí)間數(shù)據(jù)送入液晶顯示。這時(shí)若有設(shè)置鍵按下,進(jìn)行時(shí)間修改,完成后將時(shí)間數(shù)據(jù)送入1302芯片,若沒有按鍵按下,直接送入EPROM中,送入液晶顯示。</p><p> 圖3.3 時(shí)鐘程序流程圖</p><p> DS1302時(shí)鐘部分子程序</p><p> void
17、 write_byte(uchar dat)//寫一個(gè)字節(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()//讀一個(gè)字節(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)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制</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); //允許寫,禁止寫保護(hù) </p><p> write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00</p><p> write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)00</p><p>
30、 write_1302(0x84,0x12);//向DS1302內(nèi)寫小時(shí)寄存器84H寫入初始小時(shí)數(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); //打開寫保護(hù)</p><p><b> }</b>
32、;</p><p> 3.4 LCD顯示程序流程圖</p><p> 顯示流程圖如圖3.4所示,流程圖分析如下:首先對1602顯示屏進(jìn)行初始化(初始化大約持續(xù)10ms),然后檢查忙信號,若BF=0,則獲得顯示RAM地址,寫入相應(yīng)的數(shù)據(jù)顯示。若BF=1,則代表模塊正在進(jìn)行內(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è)計(jì)是我們遇到過的較大的設(shè)計(jì),所以遇到的問題也比較的多,尤其是以前沒有接觸過如此復(fù)雜的硬件電路以及軟件編程,在軟、硬件設(shè)計(jì)和調(diào)試中遇到了不少的困難,在同學(xué)的幫助才逐一克服了難題,學(xué)習(xí)到了不少的專業(yè)知識。</p><p> 在整個(gè)設(shè)計(jì)過程之前,我已經(jīng)在網(wǎng)上找了相關(guān)方面的資料,萬事開始難,一開始不知道從哪里下手。后來慢慢學(xué)會分析系統(tǒng),將系統(tǒng)模
35、塊化,各個(gè)模塊可以在軟件或者硬件上實(shí)現(xiàn)。在確保各個(gè)模塊的硬件電路和與之相搭配的程序能夠正常工作后在把它們組成一個(gè)系統(tǒng)。在今后的日子里,我會進(jìn)一步加強(qiáng)自己的動(dòng)手能力,豐富自己的知識面。</p><p><b> 參考文獻(xiàn)</b></p><p> 李朝青.單片機(jī)原理及接口技術(shù)[M],北京:北京航天航空大學(xué)出版社,2005</p><p>
36、李廣弟.單片機(jī)基礎(chǔ)[M],北京:北京航空航天大學(xué)出版社,2000</p><p> 萬光毅.單片機(jī)實(shí)驗(yàn)與實(shí)踐教程[M],北京:北京航空航天大學(xué)出版社,2003</p><p> 唐亞平、李移倫.單片機(jī)原理實(shí)訓(xùn)與學(xué)習(xí)指導(dǎo)[M],長沙:中南大學(xué)出版社,2006</p><p> 劉軍.單片機(jī)原理與接口技術(shù)[M],華東理工大學(xué)出版社,2006</p>
37、<p> 謝自美.電子線路設(shè)計(jì)、實(shí)驗(yàn)、測試[M],武漢:華中理工大學(xué)出版社,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第一行的初始位置,因?yàn)長CD1602字符地址首位D7恒定為1(100000000=80)</p><p> #define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋€(gè)字符位置地址是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時(shí)鐘芯片與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> //校時(shí)按鍵與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[]={" : : "};//時(shí)間顯示的固定字符</p><p>
44、; //延時(shí)函數(shù),后面經(jīng)常調(diào)用</p><p> void delay(uint xms)//延時(shí)函數(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;//拉高使能端,為制造有效的下降沿做準(zhǔn)備</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置高電平,為制造下降沿做準(zhǔn)備</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點(diǎn)陣,8位數(shù)據(jù)</p><p> write_1602com(0x0c);//開顯示不顯示光標(biāo)</p><p> write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移</p><p>
51、write_1602com(0x01);//清顯示</p><p> write_1602com(yh+1);//日歷顯示固定符號從第一行第1個(gè)位置之后開始顯示</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);//時(shí)間顯示固定符號寫入位置,從第2個(gè)位置后開始顯示</p><p> for(a=0;a<8;a++)</p>
53、;<p><b> {</b></p><p> write_1602dat(tab2[a]);//寫顯示時(shí)間固定符號,兩個(gè)冒號</p><p> //delay(3);</p><p><b> }</b></p><p><b> }</b><
54、/p><p> void write_byte(uchar dat)//寫一個(gè)字節(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()//讀一個(gè)字節(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)十進(jìn)制函數(shù),輸入BCD,返回十
64、進(jìn)制</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); //允許寫,禁止寫保護(hù) </p><p> write_1302(0x80,0x00); //向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00</p><p> write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分?jǐn)?shù)據(jù)0
67、0</p><p> write_1302(0x84,0x12);//向DS1302內(nèi)寫小時(shí)寄存器84H寫入初始小時(shí)數(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); //打開寫保護(hù)</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;//取得個(gè)位數(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í)分秒顯示子函數(shù)</p><p> void write_sfm(uchar add,uchar dat)//向LCD寫時(shí)分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個(gè)參數(shù)</p><p><b> {</b>
73、</p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個(gè)位數(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ù),兩個(gè)參數(shù)</p><p><b> {</b></p><p> uchar gw,sw;</p><p> gw=dat%10;//取得個(gè)位數(shù)字</p><p> sw=dat/10;//取得十位數(shù)字</p><
76、;p> write_1602com(yh+add);//設(shè)定顯示位置為第一個(gè)位置+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時(shí),顯示</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時(shí)顯示</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時(shí)顯示</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時(shí)顯示</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時(shí)顯示</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時(shí)顯示</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);//延時(shí),用于消抖動(dòng)</p><p> if(key1==0)//延時(shí)
87、后再次確認(rèn)按鍵按下</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è)置按鍵共有秒、分、時(shí)、星期、日、月、年、返回,8個(gè)功能循環(huán)</p><p> switch(key1n)</p><p><b> {</b>
89、</p><p> case 1: TR0=0;//關(guān)閉定時(shí)器</p><p><b> //TR1=0;</b></p><p> write_1602com(er+0x09);//設(shè)置按鍵按動(dòng)一次,秒位置顯示光標(biāo)</p><p> write_1602com(0x0f);//設(shè)置光標(biāo)為閃爍</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位置顯示光標(biāo)</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 3: wr
92、ite_1602com(er+3);//按動(dòng)3次,shi</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 4: write_1602com(yh+0x0e);//按動(dòng)4次,week</p><p> //write_160
93、2com(0x0f);</p><p><b> break;</b></p><p> case 5: write_1602com(yh+0x0a);//按動(dòng)5次,ri</p><p> //write_1602com(0x0f);</p><p><b> break;</b></
94、p><p> case 6: write_1602com(yh+0x07);//按動(dòng)6次,yue</p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p> case 7: write_1602com(yh+0x04);//按動(dòng)7次,nian<
95、;/p><p> //write_1602com(0x0f);</p><p><b> break;</b></p><p><b> case 8:</b></p><p> write_1602com(0x0c);//按動(dòng)到第8次,設(shè)置光標(biāo)不閃爍</p><p>
96、 TR0=1;//打開定時(shí)器</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)//當(dāng)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è)置鍵按動(dòng)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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的BCD碼</p><
102、;p> write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù) </p><p> write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護(hù)</p><p> write_1602com(er+0x09);/
103、/因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動(dòng)右移,所以要指定返回</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è)定好的分?jǐn)?shù)據(jù)</p><p> temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁
105、止寫保護(hù) </p><p> write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(er+6);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置</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í)數(shù)據(jù)</p><p> temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù) </p><p> write_1302(0x84,temp);//向DS1302內(nèi)寫小時(shí)寄存器84H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼&l
108、t;/p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(er+3);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù) </p><p> write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0
111、x80);//打開寫保護(hù)</p><p> write_1602com(yh+0x0e);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00)
113、;//允許寫,禁止寫保護(hù)</p><p> write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(yh+10);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位&
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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)</p><p> write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)
116、BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(yh+7);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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;//十進(jìn)制轉(zhuǎn)換成DS1
118、302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)</p><p> write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> w
119、rite_1602com(yh+4);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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)延時(shí),消抖動(dòng)</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時(shí)自動(dòng)變成59</p>
123、<p> write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù)</p><p> temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù) </p><p> write_1302(0x8
124、0,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80); //打開寫保護(hù)</p><p> write_1602com(er+0x09);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置</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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù) </p><p> write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼</p><p> write_1
127、302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(er+6);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置</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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù) </
129、p><p> write_1302(0x84,temp);//向DS1302內(nèi)寫小時(shí)寄存器84H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(er+3);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼</p><p> write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù) </p><p> write_1302(0x8a,te
132、mp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼</p><p> write_1302(0x8e,0x80);//打開寫保護(hù)</p><p> write_1602com(yh+0x0e);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位</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;//十進(jìn)制轉(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)萬年歷課程設(shè)計(jì)
- 單片機(jī)萬年歷課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-萬年歷
- 萬年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)—電子萬年歷
- 單片機(jī)萬年歷課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告(萬年歷)
- 單片機(jī)課程設(shè)計(jì)-電子萬年歷
- 單片機(jī)萬年歷課程設(shè)計(jì) (2)
- 單片機(jī)課程設(shè)計(jì)-- 電子萬年歷
- 單片機(jī)課程設(shè)計(jì)—萬年歷[1]
- 單片機(jī)課程設(shè)計(jì)---萬年歷顯示設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子萬年歷設(shè)計(jì)
- 基于單片機(jī)的萬年歷課程設(shè)計(jì)
- 1602數(shù)字萬年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的萬年歷
- 課程設(shè)計(jì)--單片機(jī)簡易萬年歷的設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
評論
0/150
提交評論