版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《單片機原理及應(yīng)用》</p><p><b> 課程設(shè)計報告</b></p><p><b> 電子記憶鬧鐘</b></p><p> 專 業(yè) : 電氣工程及其自動化 </p><p> 班 級 : 10電工一班 </p>
2、<p> 學(xué) 號 : </p><p> 姓 名 : </p><p> 指導(dǎo)教師 : </p><p> 提交日期 : 2013-06-13 </p><p><b> 目錄</b
3、></p><p> 一: 設(shè)計題目及要求</p><p><b> 二:設(shè)計方案</b></p><p><b> 2.1 方案論證</b></p><p> 2.2 系統(tǒng)各器件簡介</p><p> 2.3 各部分電路設(shè)計仿真</p><
4、;p><b> 2.4 成品圖片秀</b></p><p> 三:電子時鐘程序設(shè)計與調(diào)試</p><p> 3.1 程序設(shè)計思路</p><p> 3.2軟件調(diào)試及解決的問題</p><p><b> 3.3 附加功能</b></p><p><b>
5、; 四:課程設(shè)計總結(jié)</b></p><p><b> 五:參考文獻</b></p><p><b> 附錄:源程序</b></p><p> 一、設(shè)計任務(wù)和要求。</p><p> 單片機課程設(shè)計題目:電子鬧鐘。</p><p> 設(shè)計要求:1、能實
6、現(xiàn)時、分、秒的顯示;</p><p> 2、能實現(xiàn)12和24小時制的切換;</p><p><b> 3、能設(shè)定時間;</b></p><p><b> 4、能設(shè)定鬧鐘。</b></p><p><b> 二:設(shè)計方案</b></p><p>&
7、lt;b> 2.1 方案論證</b></p><p><b> 顯示電路的設(shè)計</b></p><p><b> 方案一:</b></p><p> LCD1602液晶屏:LCD1602液晶屏是16*2的字符型液晶,可以顯示英文26個字母的大小寫,阿拉伯?dāng)?shù)字0—9,及一些簡單的符號。該液晶屏操作簡
8、單,顯示功能強大。</p><p><b> 方案二:</b></p><p> 數(shù)碼管:雖然數(shù)碼管的顯示位數(shù)有限,且只能顯示一些簡單的字符。</p><p> 綜上所述,我們選擇了LCD1602作為顯示模塊。</p><p><b> 時鐘芯片:</b></p><p&
9、gt; 方案一:ds12c887</p><p> 由于DS12C887能夠自動產(chǎn)生世紀(jì)、年、月、日、時、分、秒等時間信息, DS12C887中自帶有鋰電池,外部掉電時,其內(nèi)部時間信息還能夠保持10年之久;對于一天內(nèi)的時間記錄,帶有128字節(jié) RAM.性能優(yōu)異,但價格相對較貴。</p><p> 方案二: ds1302</p><p> 美國DALLAS公司
10、推出的具有涓細(xì)電流充電能力的低功耗實時時鐘電路DS1302的結(jié)構(gòu)、工作原理及其在實時顯示時間中的應(yīng)用。它可以對年、月、日、周、日、時、分、秒進行計時,且具有閏年補償?shù)榷喾N功能,價格便宜,但是沒有鬧鐘中斷功能。</p><p> 綜上所述,我們選擇了ds12c887作為時鐘芯片。</p><p><b> 單片機芯片</b></p><p>
11、<b> 方案一:89c52</b></p><p> 基于標(biāo)準(zhǔn)的MCS-51單片機體系結(jié)構(gòu)和指令系統(tǒng),集成了時鐘輸出和向上或向下計數(shù)器等更多的功能,適合于類似馬達控制等應(yīng)用場合。89C52內(nèi)置8位中央處理單元、256字節(jié)內(nèi)部數(shù)據(jù)存儲器RAM、8k片內(nèi)程序存儲器(ROM)32個雙向輸入/輸出(I/O)口、3個16位定時/計數(shù)器和5個兩級中斷結(jié)構(gòu),一個全雙工串行通信口,片內(nèi)時鐘振蕩電路。&
12、lt;/p><p> 方案二:89c2052</p><p> 功能和89c52類似,但雙向輸入/輸出(I/O)口只有十六個。</p><p> 由于本實驗用到輸入/輸出(I/O)比較多,為了布線方便,選用89c52。</p><p> 2.2 系統(tǒng)各器件簡介</p><p><b> AT89c52&
13、lt;/b></p><p><b> 主要功能特性:</b></p><p> VCC:供電電壓。 GND:接地。</p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。</p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。</p&g
14、t;<p> XTAL2:來自反向振蕩器的輸出。</p><p> P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8個TTL門電流。當(dāng)P0口的管腳第一次寫“1”時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。</p><p
15、> lcd1602液晶顯示:</p><p> 1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用, 1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數(shù)字)。</p
16、><p> 1602采用標(biāo)準(zhǔn)的16腳接口,其中:</p><p> 第1腳:VSS為電源地</p><p> 第2腳:VCC接5V電源正極</p><p> 第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。</p>
17、<p> 第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。</p><p> 第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。</p><p> 第6腳:E(或EN)端為使能(enable)端,高電平(1)時讀取信息,負(fù)跳變時執(zhí)行指令。</p><p> 第7~14腳:D0~D7為8位雙向
18、數(shù)據(jù)端。</p><p> 第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極。</p><p><b> DS12C887</b></p><p> DS12C887實時時鐘芯片功能豐富,可以用來直接代替IBM PC上的時鐘日歷芯片DS12887,同時,它的管腳也和MC146818B、DS12887相兼容。</p>
19、;<p> 由于DS12C887能夠自動產(chǎn)生世紀(jì)、年、月、日、時、分、秒等時間信息,其內(nèi)部又增加了世紀(jì)寄存器,從而利用硬件電路解決了“千年”問題; DS12C887中自帶有鋰電池,外部掉電時,其內(nèi)部時間信息還能夠保持10年之久;對于一天內(nèi)的時間記錄,有12小時制和24小時制兩種模式。在12小時制模式中,用AM和PM區(qū)分上午和下午;時間的表示方法也有兩種,一種用二進制數(shù)表示,一種是用BCD碼表示;DS12C887中帶有12
20、8字節(jié) RAM,其中有11字節(jié)RAM用來存儲時間信息,4字節(jié)RAM用來存儲DS12C887的控制信息,稱為控制寄存器,113字節(jié)通用RAM使用戶使用;此外用戶還可對DS12C887進行編程以實現(xiàn)多種方波輸出,并可對其內(nèi)部的三路中斷通過軟件進行屏蔽。</p><p><b> 蜂鳴器</b></p><p> 壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、
21、阻抗匹配器及共鳴箱、外殼等組成。</p><p> 由于蜂鳴器的工作電流一般比較大,以致于單片機的I/O 口是無法直接驅(qū)動的*(但AVR可以驅(qū)動小功率蜂鳴器),所以要利用放大電路來驅(qū)動,一般使用三極管來放大電流就可以了。</p><p> 2.3 各部分電路設(shè)計仿真</p><p><b> 2.4 成品圖片秀</b></p>
22、<p> 三:電子時鐘程序設(shè)計與調(diào)試</p><p> 3.1 程序設(shè)計思路</p><p> 該程序整體思路是,從DS12C887寄存器中讀取時分秒,然后在1602中顯示。</p><p> 若按下K1按鍵,則進入調(diào)時模式,不斷按下K1按鍵,切換為時分秒,星期,年月日,當(dāng)按到第八下時,將設(shè)定的值寫入時鐘芯片中,按次時間走下去,從而起到設(shè)定時間
23、的目的。</p><p> K2,K3鍵,只有在K1處于調(diào)時模式時才會有用,否則無效。分別為加數(shù)值鍵,和減數(shù)值鍵。</p><p> K4鍵為鬧鐘查看鍵,用于查看鬧鐘設(shè)定的時間和設(shè)定定時時間,當(dāng)K4按下后,再按下K1鍵,則可以調(diào)節(jié)定時時間,調(diào)節(jié)時分秒依然是通過多次按下K1達到選擇的目的,第四次按下時候,設(shè)定的數(shù)值存入鬧鐘寄存器。由于鬧鐘不需要調(diào)節(jié)星期和年月日,所以按到第四次時就能存儲數(shù)
24、據(jù)。</p><p> K5按鍵是切換12/24小時模式的,當(dāng)為12小時模式時,在顯示器的第二行顯示AM,PM。以加以區(qū)分。24小時模式下,不顯示。但是調(diào)節(jié)時間和設(shè)定鬧鐘都是以24小時模式顯示。</p><p> 另外,在每次按下按鍵后,為了更加形象,加了一個蜂鳴器滴滴聲。</p><p> 電源部分則直接利用手機充電器改裝。</p><p
25、> 3.2軟件調(diào)試及解決的問題</p><p> 1:12/24小時模式切換時,1602的第二行顯示的AM,PM必須每次重寫數(shù)值,以達到清除數(shù)據(jù)的作用,</p><p> 2:蜂鳴器選用的是低電平有效,程序中得將相應(yīng)的端口置0才有效。</p><p> 3:按鍵需要加防抖延時和松手確認(rèn),不然很容易出錯。</p><p> 4:
26、51的中斷怎么打開,應(yīng)該牢記。實驗時就是不能鬧鈴,最后發(fā)現(xiàn)是開錯了中斷。</p><p><b> 3.3 附加功能</b></p><p> 顯示年月日;顯示星期;每次拿下按鍵會有一個滴提醒;查看鬧鐘時,有Ri的顯示;斷電后,時間仍可正常走。</p><p><b> 四:課程設(shè)計總結(jié)</b></p>
27、<p> 大三下學(xué)期,我們電氣工程及其自動化分方向了,大體分為電力系統(tǒng)和電氣控制方向,大多同學(xué)選擇了電力系統(tǒng),因為畢竟我們學(xué)的是電氣工程,可我卻一反常態(tài),選擇了電氣控制,一個相對不被看好的方向。</p><p> 我想,選擇這個方向,我考慮很多,一個原因是我一直是隨著大流在走動,面對大是大非我沒太多主見,這樣對以后的發(fā)展,我想是一個弊病,這次我做了一個自己的決定。</p><p
28、> 另外,并非一時沖動,在之前參加大學(xué)生科技創(chuàng)新比賽時候,我學(xué)習(xí)了相關(guān)單片機的知識,雖然制作的人體感應(yīng)智能風(fēng)扇,在目前看來確實很簡單,但當(dāng)時,能做出來確實付出了不小努力。在這期間,我才通過自己的實踐,切實掌握了很多知識,所掌握的知識也扎實了很多,回頭看課本,確實感覺完全不一樣。在這之中,我能找到自己真正所需,而非那些一紙文憑,還有空談的理論。</p><p> 科技創(chuàng)新的一些經(jīng)驗也讓我這次制作電子時鐘輕
29、松了很多,畢竟有了焊接基礎(chǔ)和閱讀和書寫程序的能力。本次的電子時鐘分為LCD1602顯示部分,按鍵部分,蜂鳴器部分,DS12C887時鐘芯片部分,最小系統(tǒng)部分,電源部分。硬件這一塊,主要是連線,1602和12C887的線比較多,鏈接復(fù)雜。其他幾個模塊就相對簡單多了。</p><p> 軟件部分,我依然用C程序,簡單、易懂,特別是對1602和12C887的控制部分,有位選,有數(shù)據(jù)地址選擇,還有讀寫控制,簡簡單單的幾
30、個寄存器既然就能實現(xiàn)相關(guān)功能,給我的感覺除了驚嘆還是驚嘆。程序部分,1602和12C887的讀寫程序我是借鑒郭天祥的那本紅寶書的,主程序的控制部分,則是看了很多相關(guān)程序,集百家之所長。雖然不一定最優(yōu),但執(zhí)行效率我想,還是蠻高的。</p><p> 至于仿真,我想我是一個比較直接的人,我先是做出了成品,然后對著硬件慢慢調(diào)試,而非在仿真軟件下畫出軟件,然后在線調(diào)試。成功后,我原不準(zhǔn)備仿真,后來想想,一則感覺少了些什
31、么,另外,如果有仿真的話,也讓我的硬件部分可以更直觀的呈現(xiàn)在別人的面前,更直觀的介紹我的產(chǎn)品。思來想去,權(quán)衡利弊,我還是仿了,用的軟件是proteus。</p><p> 本次課程設(shè)計,雖然學(xué)校給的時間是一周,但是我真正花的時間,硬件部分大概一天,軟件部分大概三天,但是前期準(zhǔn)備包括淘寶上買元件什么的,也花了不少時間。離原先的目標(biāo),三四天弄完,還是有很大差距。</p><p> 總之,本
32、次課程設(shè)計,還是有學(xué)習(xí)了很多東西,也算是自己制作的第二個小產(chǎn)品。也希望自己一步一個腳印。</p><p><b> 五:參考文獻</b></p><p> 單片機原理及應(yīng)用 ,張毅剛編,高等教育出版社;</p><p><b> 附錄:源程序</b></p><p> (為保護版權(quán),有小部分
33、修改)</p><p> #include<reg52.h></p><p> #define uchar unsigned char </p><p> #define uint unsigned int</p><p> sbit s5=P1^3;</p><p> sbit dscs=P1^
34、4;</p><p> sbit dsas=P1^5;</p><p> sbit dsrw=P1^6;</p><p> sbit dsds=P1^7;</p><p> sbit dsirq=P3^3;</p><p> sbit s1=P3^0;</p><p> sbit s
35、2=P3^1;</p><p> sbit s3=P3^2;</p><p> sbit s4=P3^4;</p><p> sbit rs=P3^5;</p><p> sbit lcden=P3^6;</p><p> sbit beep=P3^7;</p><p> bit f
36、lag1,flag_ri;</p><p> uchar flag,exch; </p><p> char s1num;</p><p> char miao,shi,fen,year,month,day,week,amiao,afen,ashi,shi_1;</p><p> uchar code table[]="
37、 - - ";</p><p> uchar code table1[]=" : : ";</p><p> void write_ds(uchar,uchar); //函數(shù)聲明</p><p> void set_alarm(uchar,uchar,uchar);
38、</p><p> uchar read_ds(uchar);void set_time();void read_alarm();</p><p> void delay(uint z)</p><p> { //延時函數(shù)</p><p><b> uint x,y;</b></p
39、><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--);</p><p><b> }</b></p><p> void didi() //蜂鳴器叫子函數(shù)</p><p><b> {</b>
40、;</p><p><b> beep=0;</b></p><p> delay(100);</p><p><b> beep=1;</b></p><p><b> }</b></p><p> void write_com(uchar
41、com)</p><p> {//1602寫地址</p><p><b> rs=0;</b></p><p><b> lcden=0;</b></p><p><b> P0=com;</b></p><p><
42、b> delay(5);</b></p><p><b> lcden=1;</b></p><p><b> delay(5);</b></p><p><b> lcden=0;</b></p><p><b> }</b>
43、;</p><p> void write_date(uchar date)//1602液晶寫數(shù)據(jù)</p><p><b> {</b></p><p><b> rs=1;</b></p><p><b> lcden=0;</b></p>&l
44、t;p><b> P0=date;</b></p><p><b> delay(5);</b></p><p><b> lcden=1;</b></p><p><b> delay(5);</b></p><p><b>
45、lcden=0;</b></p><p><b> }</b></p><p> void init()//初始化</p><p><b> {</b></p><p> uchar num;</p><p> EA=1;
46、 //外部中斷1初始化</p><p><b> EX1=1;</b></p><p><b> IT1=1;</b></p><p><b> flag1=0;</b></p><p><b> s1num=0;</b&g
47、t;</p><p><b> week=1;</b></p><p><b> lcden=0;</b></p><p><b> exch=0;</b></p><p> write_ds(0x0A,0x20);//打開振蕩器</p>&l
48、t;p> write_ds(0x0B,0x26); //設(shè)置24小時模式</p><p> //set_time();</p><p> write_com(0x38);//1602初始化</p><p> write_com(0x0c);</p><p> write_com(0x06);<
49、;/p><p> write_com(0x01);</p><p> write_com(0x80); //寫入液晶固定部分內(nèi)容</p><p> for(num=0;num<15;num++)</p><p><b> {</b></p><p> write_dat
50、e(table[num]);</p><p><b> delay(5);</b></p><p><b> }</b></p><p> write_com(0x80+0x40);</p><p> for(num=0;num<15;num++)</p><p&g
51、t;<b> {</b></p><p> write_date(table1[num]);</p><p><b> delay(5);</b></p><p><b> }</b></p><p><b> }</b></p>
52、<p> void write_sfm(uchar add,uchar date)//液晶寫入時分秒</p><p><b> {</b></p><p> uchar shi,ge;</p><p> shi=date/10;</p><p> ge=date%10;</p>&l
53、t;p> write_com(0x80+0x40+add);</p><p> write_date(0x30+shi);</p><p> write_date(0x30+ge);</p><p><b> }</b></p><p> void write_nyr(uchar add,uchar da
54、te) //液晶寫入年月日子函數(shù)</p><p><b> {</b></p><p> uchar shi,ge;</p><p> shi=date/10;</p><p> ge=date%10;</p><p> write_com(0x80+add);</p>
55、<p> write_date(0x30+shi);</p><p> write_date(0x30+ge);</p><p><b> }</b></p><p> void write_week(char we)//液晶寫入星期子函數(shù)</p><p><b> {</
56、b></p><p> write_com(0x80+12);</p><p> switch(we)</p><p><b> {</b></p><p> case 1:write_date('M');delay(5);</p><p> write_date(
57、'O');delay(5);</p><p> write_date('N');delay(5);</p><p><b> break;</b></p><p> case 2:write_date('T');delay(5);</p><p> write_da
58、te('U');delay(5);</p><p> write_date('E');delay(5);</p><p><b> break;</b></p><p> case 3:write_date('W');delay(5);</p><p> write
59、_date('E');delay(5);</p><p> write_date('D');delay(5);</p><p><b> break;</b></p><p> case 4:write_date('T');delay(5);</p><p> wr
60、ite_date('H');delay(5);</p><p> write_date('U');delay(5);</p><p><b> break;</b></p><p> case 5:write_date('F');delay(5);</p><p>
61、 write_date('R');delay(5);</p><p> write_date('I');delay(5);</p><p><b> break;</b></p><p> case 6:write_date('S');delay(5);</p><p&g
62、t; write_date('A');delay(5);</p><p> write_date('T');delay(5);</p><p><b> break;</b></p><p> case 7:write_date('S');delay(5);</p><
63、p> write_date('U');delay(5);</p><p> write_date('N');delay(5);</p><p><b> break;</b></p><p><b> }</b></p><p><b> }
64、</b></p><p> void keyscan() //掃描鍵盤</p><p><b> {</b></p><p> if(flag_ri==1) //如果鬧鈴,按任意鍵取消報警</p><p><b> {</b></p&g
65、t;<p> if((s1==0)||(s2==0)||(s3==0)||(s4==0))</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if((s1==0)||(s2==0)||(s3==0)||(s4==0))</p>
66、<p><b> {</b></p><p> while(!(s1&&s2&&s3&&s4));didi();</p><p> flag_ri=0;</p><p><b> }</b></p><p><b> }&
67、lt;/b></p><p><b> }</b></p><p> if(s1==0) //調(diào)時模式,也可以調(diào)鬧鐘時間</p><p><b> {</b></p><p><b> delay(5);</b>
68、</p><p><b> if(s1==0)</b></p><p><b> {</b></p><p> write_nyr(3,year); //重寫顯示值,防止12小時模式顯示出錯</p><p> write_nyr(6,month);</p>
69、<p> write_nyr(9,day);</p><p> write_week(week);</p><p> write_sfm(4,shi);</p><p> write_sfm(7,fen);</p><p> write_sfm(10,miao);</p><p> write_c
70、om(0x80+0x40+14);</p><p> write_date(' ');</p><p> write_date(' ');</p><p> 此處有一標(biāo)志位,根據(jù)上下文自己可推測 //調(diào)時位置標(biāo)志位</p><p> if(flag1==1)
71、 //如果調(diào)鬧鐘時間,標(biāo)志位只能調(diào)時分秒</p><p> if(s1num==4)</p><p><b> s1num=1;</b></p><p><b> flag=1;</b></p><p> while(!s1); didi();</p><p>
72、switch(s1num) //標(biāo)志位決定光標(biāo)顯示位置</p><p><b> {</b></p><p> case 1:write_com(0x80+0x40+10);</p><p> write_com(0x0f); //打開顯示光標(biāo)</p><p>&l
73、t;b> break ;</b></p><p> case 2:write_com(0x80+0x40+7);</p><p> write_com(0x0f);</p><p><b> break;</b></p><p> case 3:write_com(0x80+0x40+4);&
74、lt;/p><p> write_com(0x0f);</p><p><b> break;</b></p><p> case 4:write_com(0x80+12);</p><p> write_com(0x0f);</p><p><b> break;</b&g
75、t;</p><p> case 5:write_com(0x80+9);</p><p> write_com(0x0f);</p><p><b> break;</b></p><p> case 6:write_com(0x80+6);</p><p> write_com(0x
76、0f);</p><p><b> break;</b></p><p> case 7:write_com(0x80+3);</p><p> write_com(0x0f);</p><p><b> break;</b></p><p> case 8:s1n
77、um=0;</p><p> write_com(0x0c);</p><p><b> flag=0;</b></p><p> write_ds(0,miao);</p><p> write_ds(2,fen);</p><p> write_ds(4,shi);</p>
78、;<p> write_ds(6,week);</p><p> write_ds(7,day);</p><p> write_ds(8,month);</p><p> write_ds(9,year);</p><p><b> break;</b></p><p>
79、<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(s1num!=0) //如果處于調(diào)時模式,按鍵加減才有效</p><p><b>
80、{</b></p><p> if(s2==0) //加按鍵</p><p><b> {</b></p><p><b> delay(1);</b></p><p><b> if(s2==0)</b><
81、;/p><p><b> {</b></p><p> while(!s2); didi();</p><p> switch(s1num)</p><p><b> {</b></p><p> case 1:miao++;</p><p&g
82、t; if(miao==60)</p><p><b> miao=0;</b></p><p> write_sfm(10,miao);</p><p> write_com(0x80+0x40+10);</p><p><b> break;</b></p><p&
83、gt; case 2:fen++;</p><p> if(fen==60)</p><p><b> fen=0;</b></p><p> write_sfm(7,fen);</p><p> write_com(0x80+0x40+7);</p><p><b> br
84、eak;</b></p><p> case 3:shi++;</p><p> if(shi==24)</p><p><b> shi=0;</b></p><p> write_sfm(4,shi);</p><p> write_com(0x80+0x40+4);&l
85、t;/p><p><b> break;</b></p><p> case 4:week++;</p><p> if(week==8)</p><p><b> week=1;</b></p><p> write_week(week);</p>&l
86、t;p> write_com(0x80+12);</p><p><b> break;</b></p><p> case 5:day++;</p><p> if(day==32)</p><p><b> day=1;</b></p><p> wri
87、te_nyr(9,day);</p><p> write_com(0x80+9);</p><p><b> break;</b></p><p> case 6:month++;</p><p> if(month==13)</p><p><b> month=1;<
88、;/b></p><p> write_nyr(6,month);</p><p> write_com(0x80+6);</p><p><b> break;</b></p><p> case 7:year++;</p><p> if(year==100)</p>
89、;<p><b> year=0;</b></p><p> write_nyr(3,year);</p><p> write_com(0x80+3);</p><p><b> break;</b></p><p><b> }</b></p&
90、gt;<p><b> }</b></p><p><b> }</b></p><p> if(s3==0) //減按鍵</p><p><b> {</b></p><p><b> dela
91、y(1);</b></p><p><b> if(s3==0)</b></p><p><b> {</b></p><p> while(!s3); didi();</p><p> switch(s1num)</p><p><b>
92、{</b></p><p> case 1:miao--;</p><p> if(miao==-1)</p><p><b> miao=59;</b></p><p> write_sfm(10,miao);</p><p> write_com(0x80+0x40+10
93、);</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(7,fen);</p>
94、<p> write_com(0x80+0x40+7);</p><p><b> break;</b></p><p> case 3:shi--;</p><p> if(shi==-1)</p><p><b> shi=23;</b></p><p&
95、gt; write_sfm(4,shi);</p><p> write_com(0x80+0x40+4);</p><p><b> break;</b></p><p> case 4:week--;</p><p> if(week==0)</p><p><b> w
96、eek=7;</b></p><p> write_week(week);</p><p> write_com(0x80+12);</p><p><b> break;</b></p><p> case 5:day--;</p><p> if(day==0)</
97、p><p><b> day=31;</b></p><p> write_nyr(9,day);</p><p> write_com(0x80+9);</p><p><b> break;</b></p><p> case 6:month--;</p>
98、;<p> if(month==0)</p><p><b> month=12;</b></p><p> write_nyr(6,month);</p><p> write_com(0x80+6);</p><p><b> break;</b></p>
99、<p> case 7:year--;</p><p> if(year==-1)</p><p><b> year=99;</b></p><p> write_nyr(3,year);</p><p> write_com(0x80+3);</p><p><b&g
100、t; break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> i
101、f(s4==0) //檢測鬧鐘查看按鍵</p><p><b> {</b></p><p><b> delay(5);</b></p><p><b> if(s4==0)</b></p><p><b> {&l
102、t;/b></p><p> write_nyr(3,year); //重寫時間信息,防止12小時模式下,顯示出錯</p><p> write_nyr(6,month);</p><p> write_nyr(9,day);</p><p> write_week(week);</p><p&
103、gt; write_sfm(4,shi);</p><p> write_sfm(7,fen);</p><p> write_sfm(10,miao);</p><p> write_com(0x80+0x40+14);</p><p> write_date(' ');</p><p>
104、 write_date(' ');</p><p> flag1=~flag1; //鬧鐘標(biāo)志位取反</p><p> while(!s4);didi();</p><p> if(flag1==0) //當(dāng)退出鬧鐘查看按鍵時,寫入鬧鐘設(shè)定時間</p><p><b&
105、gt; {</b></p><p><b> flag=0;</b></p><p> write_com(0x80+0x40);</p><p> write_date(' ');</p><p> write_date(' ');</p><p
106、> write_com(0x0c);</p><p> write_ds(1,miao);</p><p> write_ds(3,fen);</p><p> write_ds(5,shi);</p><p><b> }</b></p><p> else
107、 //鬧鐘查看模式時,顯示相關(guān)信息</p><p><b> {</b></p><p> read_alarm();</p><p> miao=amiao;</p><p><b> fen=afen;</b></p><p><b>
108、 shi=ashi;</b></p><p> write_com(0x80+0x40); //顯示RI表示在查看鬧鐘</p><p> write_date('R');</p><p> write_date('i');</p><p> write_com(0x80+0x40+
109、3);</p><p> write_sfm(4,ashi);</p><p> write_sfm(7,afen);</p><p> write_sfm(10,amiao);</p><p><b> }</b></p><p><b> }</b></p
110、><p><b> }</b></p><p> if(s5==0) //檢測12、24小時切換按鍵</p><p><b> {</b></p><p><b> delay(5);</b></p><
111、p><b> if(s5==0)</b></p><p><b> {</b></p><p> exch=~exch;</p><p> while(!s5); didi();</p><p><b> }</b></p><p>
112、<b> }</b></p><p><b> }</b></p><p> void write_ds(uchar add,uchar date) //12887寫子程序</p><p><b> {</b></p><p><b> ds
113、cs=0;</b></p><p><b> dsas=1;</b></p><p><b> dsds=1;</b></p><p><b> dsrw=1;</b></p><p><b> P2=add;</b></p>
114、;<p><b> dsas=0;</b></p><p><b> dsrw=0;</b></p><p><b> P2=date;</b></p><p><b> dsrw=1;</b></p><p><b>
115、dsas=1;</b></p><p> dscs=1;</p><p><b> }</b></p><p> uchar read_ds(uchar add) //12887讀子程序</p><p><b> {</b></p&g
116、t;<p> uchar ds_date;</p><p><b> dsas=1;</b></p><p><b> dsds=1;</b></p><p><b> dsrw=1;</b></p><p><b> dscs=0;</
117、b></p><p><b> P2=add;</b></p><p><b> dsas=0;</b></p><p><b> dsds=0;</b></p><p><b> P2=0xff;</b></p><p&
118、gt; ds_date=P2;</p><p><b> dsds=1;</b></p><p><b> dsas=1;</b></p><p><b> dscs=1;</b></p><p> return ds_date;</p><p&
119、gt;<b> }</b></p><p> void read_alarm() //讀鬧鐘設(shè)定的時間子程序</p><p><b> {</b></p><p> amiao=read_ds(1);</p><p> afen=read_ds(3);&l
120、t;/p><p> ashi=read_ds(5);</p><p><b> }</b></p><p> void exter() interrupt 2 //中斷子程序</p><p> {uchar c;</p><p> flag_ri=1;</p
121、><p> c=read_ds(0x0c);</p><p><b> }</b></p><p> void main() //主函數(shù)</p><p><b> {</b></p><p><b> init();&l
122、t;/b></p><p><b> while(1)</b></p><p><b> {</b></p><p> keyscan();</p><p> if(flag_ri==1) //如果鬧鐘中斷表示為為1,則鬧鈴。</p><
123、p><b> {didi();</b></p><p> delay(100);</p><p><b> didi();</b></p><p> delay(500);</p><p><b> }</b></p><p> if
124、(讀懂程序后自己填寫此處) //不處于調(diào)時模式,不處于查看鬧鐘模式時顯示時間</p><p><b> {</b></p><p> year=read_ds(9); //讀12887寄存器中的時間</p><p> month=read_ds(8);</p><p> day=re
125、ad_ds(7);</p><p> week=read_ds(6);</p><p> miao=read_ds(0);</p><p> fen=read_ds(2);</p><p> shi=read_ds(4);</p><p> if(exch==0)
126、 //顯示24小時制</p><p><b> {</b></p><p> write_nyr(3,year);</p><p> write_nyr(6,month);</p><p> write_nyr(9,day);</p><p> write_week(week);<
127、;/p><p> write_sfm(4,shi);</p><p> write_sfm(7,fen);</p><p> write_sfm(10,miao);</p><p> write_com(0x80+0x40+14); //將1602第二行的AM,PM清除</p><p> write
128、_date(' ');</p><p> write_date(' ');</p><p><b> }</b></p><p> Else //檢測按12小時顯示</p><p><b> {</b>&l
129、t;/p><p> if(shi<13) //如果小時小于13,則按上午顯示</p><p><b> {</b></p><p> write_nyr(3,year);</p><p> write_nyr(6,month);</p><p>
130、write_nyr(9,day);</p><p> write_week(week);</p><p> write_sfm(4,shi);</p><p> write_sfm(7,fen);</p><p> write_sfm(10,miao);</p><p> write_com(0x80+0x4
131、0+14); //顯示AM</p><p> write_date('A'); </p><p> write_date('M');</p><p><b> }</b></p><p> if(shi>=13)
132、 //如果小時大于13,則按下午顯示</p><p><b> {</b></p><p> shi_1=shi;</p><p> shi_1-=12;</p><p> write_nyr(3,year);</p><p> write_nyr(6,month);&l
133、t;/p><p> write_nyr(9,day);</p><p> write_week(week);</p><p> write_sfm(4,shi_1);</p><p> write_sfm(7,fen);</p><p> write_sfm(10,miao);</p><p&
134、gt; write_com(0x80+0x40+14); //顯示PM</p><p> write_date('P');</p><p> write_date('M');</p><p><b> }</b></p><p><b> }
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計---- lcd電子定時鬧鐘設(shè)計
- 單片機定時鬧鐘課程設(shè)計
- 單片機定時鬧鐘課程設(shè)計
- 定時鬧鐘—單片機課程設(shè)計
- 單片機原理及系統(tǒng)課程設(shè)計--基于單片機的電子鬧鐘設(shè)計
- 單片機課程設(shè)計—定時鬧鐘設(shè)計
- 單片機課程設(shè)計—定時鬧鐘設(shè)計
- 單片機課程設(shè)計---定時鬧鐘設(shè)計
- 單片機課程設(shè)計--定時鬧鐘設(shè)計
- 基于單片機的電子鬧鐘設(shè)計-單片機原理及系統(tǒng)課程設(shè)計報告
- 課程設(shè)計--單片機定時鬧鐘設(shè)計報告
- 單片機課程設(shè)計---定時鬧鐘的設(shè)計
- 單片機課程設(shè)計--基于51單片機的定時鬧鐘設(shè)計
- 單片機課程設(shè)計——定時鬧鐘的設(shè)計
- 單片機課程設(shè)計-單片機課程設(shè)計---電子時鐘
- 單片機課程設(shè)計--簡單定時鬧鐘系統(tǒng)
- 基于單片機的定時鬧鐘課程設(shè)計
- 51單片機課程設(shè)計--鬧鐘程序設(shè)計
- 單片機【倒計時音樂鬧鐘】課程設(shè)計
- c51單片機課程設(shè)計定時鬧鐘
評論
0/150
提交評論