版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計報告</b></p><p> 課程名稱: 萬年歷 </p><p> 姓 名: </p><p> 學 號: </p><p> 班 級:
2、 </p><p> 目 錄</p><p> 前言--------------------------------------------------------------------------2</p><p> 課程設計的目的和要求----------------------------------
3、--------------------2</p><p> 課程設計的目的-----------------------------------------------------2</p><p> 課程設計的基本要求-------------------------------------------------2</p><p> 系統(tǒng)設計------
4、------------------------------------------------------------2</p><p> 2.1基本工作原理-----------------------------------------------------------2</p><p> 2.2系統(tǒng)設計-------------------------------------
5、----------------------2</p><p> 2.2.1系統(tǒng)組成方案---------------------------------------------------3</p><p> 2.2.2 正常工作時按鍵、顯示功能的定義----------------------------------3</p><p> 2.2.3定時系統(tǒng)
6、的功能及按鍵的定義------------------------------------3</p><p> 2.3 軟件總體設計-----------------------------------------------------3 2.3.1主程序框圖及清單--------------------------
7、---------------------3</p><p> 硬件設計------------------------------------------------------------------4</p><p> 3.1主控制器---------------------------------------------------------------4</p>
8、<p> 3.1.1STC89C52引腳封裝與功能表-----------------------------------4</p><p> 3.1.2振蕩電路及復位電路----------------------------------------------5</p><p> 3.2 DS1302原理及引腳介紹--------------------------
9、------------------------6</p><p> 3.3 LCD顯示驅(qū)動電路-------------------------------------------------------9</p><p> 4 軟件設計------------------------------------------------------------------11</
10、p><p> 4.1DS1302時間產(chǎn)生軟件設計------------------------------------------------11</p><p> 4.2數(shù)據(jù)處理顯示程序設計--------------------------------------------------13</p><p> 5 系統(tǒng)操作說明---------------
11、----------------------------------------------15</p><p> 6 結束語-------------------------------------------------------------------15</p><p> 7 參考文獻--------------------------------------------
12、---------------------15</p><p> 8 系統(tǒng)原理圖---------------------------------------------------------------16</p><p> 附錄1-----------------------------------------------------------------------16&l
13、t;/p><p><b> 前言</b></p><p> 萬年歷是大學本科階段經(jīng)典的課程設計題目,題目更加貼近實際生活,課程設計本身就使我們對單片機的軟硬件結合有更深的理解,所以本次課程設計會讓我們更加熟練的使用單片機</p><p> 1 課程設計的目的和要求</p><p> 1.1 課程設計的目的</
14、p><p> 通過顯示年日歷程序的設計,培養(yǎng)學生綜合利用C語言或匯編語言進行程序設計的能力,加強學生對軟件工程方法的初步認識,提高軟件系統(tǒng)分析能力和程序文檔建立、歸納總結的能力。 </p><p> 通過本項課程設計,可以培養(yǎng)獨立思考、 綜合運用所學有關相應知識的能力,能更好的鞏固《單片機程序設計》課程學習的內(nèi)容,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結
15、合的難關!同時增加了同學之間的團隊合作精神!更加也體會到以后在工作中團隊合作的重要性和必要性!</p><p> 通過本次課程設計,可以使同學們更熟練的使用單片機的軟件仿真,如使用protues,keilC,wave等軟件,同時也使同學們學會電子器件的基本焊接技術,對單片機的使用有更深的理解。</p><p> 1.2課程設計的要求</p><p> 1、能夠
16、顯示時分秒、星期;</p><p> 2、能夠顯示年月日;</p><p> 3、能夠自動清除屏幕以前的廢棄信息;</p><p><b> 4、能夠修改時間;</b></p><p><b> 5、能夠定時;</b></p><p> 6、要求劃分功能模塊,各個功
17、能分別使用函數(shù)來完成;</p><p> 7、源代碼程序要有必要的注釋;</p><p> 8、能夠半點報時和整點報時。</p><p><b> 2 系統(tǒng)設計</b></p><p><b> 2.1基本工作原理</b></p><p> 該系統(tǒng)主要是通過時鐘芯
18、片DS1302產(chǎn)生穩(wěn)定的日期和時間,然后通過單片機控制時鐘芯片和顯示器LCD,從而輸出穩(wěn)定的時間,改系統(tǒng)的仿真圖如圖:</p><p><b> 圖1</b></p><p> 從圖1 可知,該系統(tǒng)主要由到單片機控制系統(tǒng),時鐘產(chǎn)生系統(tǒng)和顯示系統(tǒng)構成。</p><p><b> 2.2系統(tǒng)設計</b></p>
19、;<p> 2.2.1系統(tǒng)組成方案</p><p> 該系統(tǒng)主要由單片機控制系統(tǒng),顯示系統(tǒng)及時間信號產(chǎn)生系統(tǒng)構成。控制系統(tǒng)有單片機機保證單片機工作的外圍元件構成;顯示系統(tǒng)主要由16*2雙排顯示LCD構成;時間產(chǎn)生系統(tǒng)主要由DS1302產(chǎn)生。此外系統(tǒng)還有正常工作時的調(diào)時按鍵,定時時的調(diào)時按鍵以及復位按鍵,還有報時所需的蜂鳴器等。</p><p> 2.2.2 正常工作時按
20、鍵、顯示功能的定義</p><p> 正常工作時,共用到四個鍵,一個為接到RST端的復位鍵,一個為接到P1.0端的功能鍵另外;兩個未分別接至P1.1、P1.2端的調(diào)時增減鍵。正常工作時能調(diào)節(jié)時分秒,年月日及星期的時間,可加可減。調(diào)時時光標閃爍。</p><p> 2.2.3定時系統(tǒng)的功能及按鍵的定義</p><p> 啟動定時模式時,第一排首先顯示“Dings
21、hi!”第二排顯示日期和時間,此時共用到三個鍵,一個為功能鍵,選擇調(diào)節(jié)對象,另外兩個為加減鍵,對調(diào)節(jié)對象進行加減。</p><p><b> 2.3系統(tǒng)總體設計</b></p><p> 2.3.1主程序框圖及清單</p><p> 清單:STC89C52,DS1302,LCD1602,排阻,5V電源,3V鋰電池,蜂鳴器,6M晶振,32.
22、768M晶振各一個;33pF電容兩個;10pF電容一個;100k電阻一個;10k電阻一個。</p><p><b> 3 硬件設計</b></p><p><b> 3.1主控制器</b></p><p> 3.1.1 STC89C52引腳封裝與功能表</p><p> STC89C52
23、與我們學過的AT89C51相似,但硬件配置更高,且更容易導入程序,所以使用比AT系列更廣泛。</p><p><b> 功能特性描述</b></p><p> STC89C52 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。使用高密度非易失性存儲器技術制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲
24、器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在線系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應用系統(tǒng)提供高靈活、超有效的解決方案。 STC89C52具有以下標準功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結構,全雙工串行口,片內(nèi)晶振及時鐘電路。另外,STC89C52可降至0Hz靜態(tài)邏輯操作,支
25、持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。8 位微控制器 8K字節(jié)在系統(tǒng)可編程 Flash</p><p> 3.1.2振蕩電路及復位電路</p><p> 振蕩電路及復位電路原理圖</p><p>
26、3.2DS1302原理及引腳介紹</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設置
27、備用電源充電方式,提供了對后背電源進行涓細電流充電的能力。DS1302的外部引腳分配如圖1所示及內(nèi)部結構如圖2所示。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與出現(xiàn)該數(shù)據(jù)的時間同時記錄,因此廣泛應用于測量系統(tǒng)中。</p><p> 圖1 DS1302的外部引腳分配</p><p> 圖2 DS1302的內(nèi)部結構</p><
28、p><b> 各引腳的功能為:</b></p><p> Vcc1:主電源;Vcc2:備份電源。當Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p> SCLK:串行時鐘,輸入,控制數(shù)據(jù)的輸入與輸出; </p><p> I/O:三線接
29、口時的雙向數(shù)據(jù)線;</p><p> CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次,CE提供結束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒ā?lt;/p><p> DS1302有下列幾組寄存器:</p><p> ?、?DS1302有關日歷、時間的寄存器共有12個,其中有7個寄存器(讀時81h~8Dh,寫時80h
30、~8Ch),存放的數(shù)據(jù)格式為BCD碼形式,如圖3所示。</p><p> 圖 3 DS1302有關日歷、時間的寄存器</p><p> 小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當為高時,選擇12小時模式。在12小時模式時,位5是 ,當為1時,表示PM。在24小時模式時,位5是第二個10小時位。</p><p&g
31、t; 秒寄存器(81h、80h)的位7定義為時鐘暫停標志(CH)。當該位置為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位置為0時,時鐘開始運行。</p><p> 控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在任何的對時鐘和RAM的寫操作之前,WP位必須為0。當WP位為1時,寫保護位防止對任一寄存器的寫操作。</p><p> ?、贒S1302有
32、關RAM的地址</p><p> DS1302中附加31字節(jié)靜態(tài)RAM的地址如圖4所示。</p><p><b> 圖4</b></p><p> ?、?DS1302的工作模式寄存器</p><p> 所謂突發(fā)模式是指一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。突發(fā)模式寄存器如圖5所示。</p><
33、p><b> 圖5</b></p><p> ?、艽送猓珼S1302還有充電寄存器等。</p><p><b> 2 讀寫時序說明</b></p><p> DS1302是SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應寄存器的數(shù)據(jù)。</p><p> 要想與DS1302
34、通信,首先要先了解DS1302的控制字。DS1302的控制字如圖6。</p><p> 圖6 控制字(即地址及命令字節(jié))</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p> 位
35、5至位1(A4~A0):指示操作單元的地址;</p><p> 位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p> 控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從最低位(0位)開始。同樣,在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的數(shù)據(jù)也是從最低位
36、到最高位。數(shù)據(jù)讀寫時序如圖7 。</p><p> 圖7 數(shù)據(jù)讀寫時序</p><p> 具體操作見驅(qū)動程序。</p><p> 3.3LCD顯示驅(qū)動電路</p><p> 字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。下面以長沙太陽人電子有限公司的16
37、02字符型液晶顯示器為例,介紹其用法。一般1602字符型液晶顯示器實物如圖10-53:</p><p> 圖10-53 1602字符型液晶顯示器實物圖</p><p> 10.8.2.1 1602LCD的基本參數(shù)及引腳功能</p><p> 1602LCD分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應用中并無差
38、別,兩者尺寸差別如下圖10-54所示:</p><p> 圖10-54 1602LCD尺寸圖</p><p> 1602LCD主要技術參數(shù):</p><p> 顯示容量:16×2個字符</p><p> 芯片工作電壓:4.5—5.5V</p><p> 工作電流:2.0mA(5.0V)</p&
39、gt;<p> 模塊最佳工作電壓:5.0V</p><p> 字符尺寸:2.95×4.35(W×H)mm</p><p><b> 引腳功能說明</b></p><p> 1602LCD采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表10-13所示:</p><p
40、> 表10-13:引腳接口說明表</p><p> 第1腳:VSS為地電源。</p><p> 第2腳:VDD接5V正電源。</p><p> 第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。</p><p> 第4腳:RS為
41、寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p> 第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。</p><p> 第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。<
42、/p><p> 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。</p><p> 第15腳:背光源正極。</p><p> 第16腳:背光源負極。</p><p> 10.8.2.3 1602LCD的指令說明及時序</p><p> 1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表10-14所示:</p&g
43、t;<p><b> 4軟件設計</b></p><p> 4.1DS1302時間產(chǎn)生軟件設計</p><p> /************************************</p><p><b> DS1302模塊</b></p><p> ********
44、****************************/</p><p> //地址數(shù)據(jù)發(fā)送子程序</p><p> void w1302sj(unsigned char addr,unsigned char dat)</p><p><b> {</b></p><p> unsigned char i,te
45、mp;</p><p> rst1302=0;</p><p> sclk1302=0; </p><p> rst1302=1;</p><p> for (i=8;i>0;i--)</p><p><b> {</b>
46、</p><p> sclk1302=0;</p><p> temp=addr;</p><p> io1302=(bit)(temp&0x01);</p><p><b> addr>>=1;</b></p><p> sclk1302=1;</p>
47、<p><b> }</b></p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> sclk1302=0;</p><p><b> temp=dat;</b></p><p
48、> io1302=(bit)(temp&0x01);</p><p><b> dat>>=1;</b></p><p> sclk1302=1;</p><p><b> }</b></p><p> rst1302=0;</p><p>
49、;<b> }</b></p><p><b> //數(shù)據(jù)讀取子程序</b></p><p> unsigned char r1302sj(unsigned char addr)</p><p><b> {</b></p><p> unsigned char i,
50、temp,dat1;</p><p> rst1302=0;</p><p> sclk1302=0;</p><p> rst1302=1;</p><p> for (i=8;i>0;i--)</p><p><b> { </b></p><p>
51、sclk1302=0;</p><p> temp=addr;</p><p> io1302=(bit)(temp&0x01);</p><p><b> addr>>=1;</b></p><p> sclk1302=1; //上升沿寫入</p><p>&
52、lt;b> }</b></p><p> for (i=8;i>0;i--)</p><p> { sclk1302=0;</p><p> ACC>>=1; //一定要加在前邊才行,最后一次io輸出直接輸?shù)紸CC.7上 </p><p> ACC7=io1302; //仍然是上升沿輸
53、出</p><p> sclk1302=1; </p><p><b> }</b></p><p> rst1302=0;</p><p><b> dat1=ACC;</b></p><p> return(dat1);</p><p&g
54、t;<b> }</b></p><p><b> //初始化1302</b></p><p> void c1302cs(void)</p><p><b> {</b></p><p> w1302sj(xie_baohu,0x00); //允許寫</p&g
55、t;<p> w1302sj(xie_miao,0x00); //開始計時</p><p><b> }</b></p><p> 4.2數(shù)據(jù)處理顯示程序設計</p><p> /************************************</p><p><b> LCD1
56、602模塊</b></p><p> ************************************/</p><p><b> //@寫命令子程序</b></p><p> void w1602zl(uchar zl)</p><p><b> {</b></p
57、><p> rs1602=0; //寫命令時rs1602=0;</p><p><b> P0=zl;</b></p><p><b> delay(1);</b></p><p> e1602=1; //拉高使能端</p><p><b> delay
58、(1);</b></p><p> e1602=0; //降低使能端,下降沿寫入數(shù)據(jù)</p><p><b> }</b></p><p><b> //@寫數(shù)據(jù)子程序</b></p><p> void w1602sj(uchar sj)</p><p&
59、gt;<b> {</b></p><p> rs1602=1; //寫數(shù)據(jù)時rs1602=1;</p><p><b> P0=sj;</b></p><p><b> delay(1);</b></p><p> e1602=1; //拉高使能端<
60、/p><p><b> delay(1);</b></p><p> e1602=0; //降低使能端,下降沿寫入數(shù)據(jù)</p><p><b> }</b></p><p><b> //年月日顯示程序</b></p><p> void w
61、nyr(uchar dz,uchar sj)</p><p><b> {</b></p><p> uchar ge,shi;</p><p><b> ge=sj%10;</b></p><p> shi=sj/10;</p><p> w1602zl(one+
62、dz); //第一行首地址+要寫入的地址</p><p> w1602sj(0x30+shi);</p><p> w1602sj(0x30+ge); //0的顯示碼為0x30</p><p><b> }</b></p><p><b> //時分秒顯示程序</b></p>
63、<p> void wsfm(uchar dz,uchar sj)</p><p><b> {</b></p><p> uchar ge,shi;</p><p><b> ge=sj%10;</b></p><p> shi=sj/10;</p><
64、p> w1602zl(tw0+dz); //第二行首地址+要寫入的地址</p><p> w1602sj(0x30+shi);</p><p> w1602sj(0x30+ge);</p><p><b> }</b></p><p><b> //星期天寫入函數(shù)</b><
65、/p><p> void wxq(uchar xq)</p><p><b> {</b></p><p> w1602zl(one+0x0f);</p><p> w1602sj(0x30+xq);</p><p><b> }</b></p><
66、p> //LCD初始化函數(shù)</p><p> void lcdcs()</p><p><b> {</b></p><p><b> uchar k;</b></p><p> w1602zl(0x38); //16*2,5*7點陣,8位數(shù)據(jù)</p><p&g
67、t; w1602zl(0x0c); //開顯示,不顯示光標,不閃爍</p><p> w1602zl(0x06); //顯示光標,光標右移</p><p> w1602zl(0x01); //清屏</p><p> w1602zl(one); //寫入第一行不改變的部分</p><p> for (k=0;k<16;
68、k++)</p><p><b> {</b></p><p> w1602sj(xian1[k]);</p><p><b> }</b></p><p> w1602zl(tw0+4); //寫入第二行不改變的部分</p><p> for (k=0;k<
69、;8;k++)</p><p><b> {</b></p><p> w1602sj(xian2[k]);</p><p><b> }</b></p><p><b> }</b></p><p> //LCD1初始化函數(shù)</p>
70、;<p> void lcdcs1()</p><p><b> {</b></p><p><b> uchar k;</b></p><p> w1602zl(0x38); //16*2,5*7點陣,8位數(shù)據(jù)</p><p> w1602zl(0x0c); //開顯示
71、,不顯示光標,不閃爍</p><p> w1602zl(0x06); //顯示光標,光標右移</p><p> w1602zl(0x01); //清屏</p><p> w1602zl(one); //寫入第一行不改變的部分</p><p> for (k=0;k<9;k++)</p><p>&
72、lt;b> {</b></p><p> w1602sj(xian3[k]);</p><p><b> }</b></p><p> w1602zl(tw0+4); //寫入第二行不改變的部分</p><p> for (k=0;k<8;k++)</p><p&g
73、t;<b> {</b></p><p> w1602sj(xian2[k]);</p><p><b> }</b></p><p><b> }</b></p><p><b> 5 系統(tǒng)操作說明</b></p><p&
74、gt; 最后成型的萬年歷操作比較怕簡單,總共7個按鍵,分三個模塊,正常調(diào)時有功能鍵,加減鍵;定時模式有三個鍵,分別是所調(diào)對象,以及對所條對象的加減鍵;復位模式有一個復位鍵。此外還有一個調(diào)節(jié)液晶顯示亮度的可調(diào)電阻。界面比較簡單易懂。</p><p><b> 6 結束語</b></p><p> 課程設計的目的并不只是為了讓我們做出一個簡單的硬件出來,我們首先要
75、完善我們的軟件系統(tǒng),這樣做出來的硬件才會更見完美。當然,完善的軟件首先建立在我們對硬件的了解。軟硬件結合,加上過硬的焊工,我相信,我們做出來的課程設計一定最完美。課程設計讓我們更加貼近生活,了解我們所學的知識在生活中的應用,增加學習的興趣,同時吧我們這一學期所學的知識做一個總結,也為我們下學期所要學的嵌入式打下基礎。</p><p><b> 7 參考文獻</b></p>&
76、lt;p> 1.鄭峰等編著.51單片機應用系統(tǒng)典型開發(fā)大全(第二版).[M]中國鐵道出版社,2011.3</p><p> 2.張毅剛,彭喜元編著.單片機原理與應用設計.[M]北京:電子工業(yè)出版社,2008.4</p><p> 3.張義和等編著.例說51單片機(C語言版)(第3版).[M]北京:人民郵電出版社,2010.6</p><p><b&
77、gt; 8 系統(tǒng)原理圖</b></p><p><b> 附錄1</b></p><p><b> 程序清單</b></p><p><b> //聲明變量</b></p><p> #include <reg51.h></p>
78、<p> #define uint unsigned int</p><p> #define uchar unsigned char </p><p> #define one 0x80 </p><p> #define tw0 0xc0</p><p> #define du_miao 0x81</p>
79、<p> #define du_fen 0x83</p><p> #define du_shi 0x85</p><p> #define xie_miao 0x80</p><p> #define xie_fen 0x82</p><p> #define xie_shi 0x84</p><
80、p> #define xie_baohu 0x8e</p><p> uchar miao,fen,shi,ri,yue,nian,xingqi;</p><p> uchar dmiao,dfen,dshi,Count;</p><p> uchar code xian1[]={"20 - - week"};</p&
81、gt;<p> uchar code xian2[]={" : : "};</p><p> uchar code xian3[]={"Ding Shi!"};</p><p> sbit rs1602=P2^0;</p><p> sbit e1602=P2^1;</p><p
82、> sbit rst1302=P2^2;</p><p> sbit sclk1302=P2^4;</p><p> sbit io1302=P2^3;</p><p> sbit gongneng=P1^0;</p><p> sbit zeng=P1^1;</p><p> sbit jian=P
83、1^2;</p><p> sbit dingshi=P1^3;</p><p> sbit zeng1=P1^4;</p><p> sbit jian1=P1^5;</p><p> sbit ACC7=ACC^7;</p><p> //聲明函數(shù) 主程序在子函數(shù)上邊的話,就應該聲明函數(shù);在子函數(shù)下邊的
84、話不需要聲明函數(shù)</p><p> void lcdcs(); //LCD初始化</p><p> void lcdcs1(); //LCD初始化1</p><p> void w1602zl(uchar zl); //LCD寫指令</p><p&
85、gt; void w1602sj(uchar sj); //LCD寫數(shù)據(jù)</p><p> void wsfm(uchar dz,uchar sj);//寫時分秒</p><p> void wnyr(uchar dz,uchar sj); //寫年月日</p><p> void wxq(uchar xq);//寫星期<
86、/p><p> void c1302cs(); //DS1302初始化</p><p> void w1302zj(uchar dat); //寫1302指令</p><p> void w1302sj(uchar dz,uchar dat); //寫1302數(shù)據(jù)</p><p> uchar r1302zj();
87、 //讀1302指令</p><p> uchar r1302sj(uchar); //讀1302數(shù)據(jù)</p><p> void t0();</p><p> void t_0();</p><p> void keyscan();</p><p> void keyscan1();</
88、p><p> uchar bcdz16(uchar bcd);</p><p> uchar s16zbcd(uchar s16);</p><p> void delay(uint x);</p><p> sbit xiang=P2^7;</p><p> void Delay_xMs(unsigned in
89、t x); //控制頻率常數(shù)</p><p><b> //主函數(shù)</b></p><p><b> main()</b></p><p><b> {</b></p><p><b> uchar i;</b></p><p&
90、gt;<b> lcdcs();</b></p><p> c1302cs();</p><p><b> t0();</b></p><p><b> while(1)</b></p><p><b> { </b></p>&
91、lt;p> keyscan();</p><p> keyscan1();</p><p><b> //半點報時</b></p><p> if (fen==30&&miao==0)</p><p><b> {</b></p><p>
92、xiang=~xiang;</p><p> delay(400);</p><p> xiang=~xiang;</p><p> delay(300);</p><p><b> }</b></p><p><b> //整點報時</b></p>
93、<p> if (fen==0&&miao==0)</p><p><b> {</b></p><p> xiang=~xiang;</p><p> delay(500);</p><p> xiang=~xiang;</p><p> delay(300
94、);</p><p><b> }</b></p><p><b> //鬧鐘響鈴</b></p><p> if (shi==dshi&&fen==dfen&&miao==0)</p><p><b> {</b></p>
95、<p> for (i=0;i<=10;i++)</p><p><b> {</b></p><p> xiang=~xiang;</p><p> delay(500);</p><p> xiang=~xiang;</p><p> delay(300);<
96、;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /***************************
97、*********</p><p><b> LCD1602模塊</b></p><p> ************************************/</p><p><b> //@寫命令子程序</b></p><p> void w1602zl(uchar zl)<
98、/p><p><b> {</b></p><p> rs1602=0; //寫命令時rs1602=0;</p><p><b> P0=zl;</b></p><p><b> delay(1);</b></p><p> e1602=1;
99、 //拉高使能端</p><p><b> delay(1);</b></p><p> e1602=0; //降低使能端,下降沿寫入數(shù)據(jù)</p><p><b> }</b></p><p><b> //@寫數(shù)據(jù)子程序</b></p><p&
100、gt; void w1602sj(uchar sj)</p><p><b> {</b></p><p> rs1602=1; //寫數(shù)據(jù)時rs1602=1;</p><p><b> P0=sj;</b></p><p><b> delay(1);</b>&
101、lt;/p><p> e1602=1; //拉高使能端</p><p><b> delay(1);</b></p><p> e1602=0; //降低使能端,下降沿寫入數(shù)據(jù)</p><p><b> }</b></p><p><b> //年
102、月日顯示程序</b></p><p> void wnyr(uchar dz,uchar sj)</p><p><b> {</b></p><p> uchar ge,shi;</p><p><b> ge=sj%10;</b></p><p>
103、shi=sj/10;</p><p> w1602zl(one+dz); //第一行首地址+要寫入的地址</p><p> w1602sj(0x30+shi);</p><p> w1602sj(0x30+ge); //0的顯示碼為0x30</p><p><b> }</b></p><
104、p><b> //時分秒顯示程序</b></p><p> void wsfm(uchar dz,uchar sj)</p><p><b> {</b></p><p> uchar ge,shi;</p><p><b> ge=sj%10;</b><
105、/p><p> shi=sj/10;</p><p> w1602zl(tw0+dz); //第二行首地址+要寫入的地址</p><p> w1602sj(0x30+shi);</p><p> w1602sj(0x30+ge);</p><p><b> }</b></p>
106、<p><b> //星期天寫入函數(shù)</b></p><p> void wxq(uchar xq)</p><p><b> {</b></p><p> w1602zl(one+0x0f);</p><p> w1602sj(0x30+xq);</p>&l
107、t;p><b> }</b></p><p> //LCD初始化函數(shù)</p><p> void lcdcs()</p><p><b> {</b></p><p><b> uchar k;</b></p><p> w1602zl
108、(0x38); //16*2,5*7點陣,8位數(shù)據(jù)</p><p> w1602zl(0x0c); //開顯示,不顯示光標,不閃爍</p><p> w1602zl(0x06); //顯示光標,光標右移</p><p> w1602zl(0x01); //清屏</p><p> w1602zl(one); //寫入第一行不
109、改變的部分</p><p> for (k=0;k<16;k++)</p><p><b> {</b></p><p> w1602sj(xian1[k]);</p><p><b> }</b></p><p> w1602zl(tw0+4); //寫入
110、第二行不改變的部分</p><p> for (k=0;k<8;k++)</p><p><b> {</b></p><p> w1602sj(xian2[k]);</p><p><b> }</b></p><p><b> }</b&g
111、t;</p><p> //LCD1初始化函數(shù)</p><p> void lcdcs1()</p><p><b> {</b></p><p><b> uchar k;</b></p><p> w1602zl(0x38); //16*2,5*7點陣,8位數(shù)
112、據(jù)</p><p> w1602zl(0x0c); //開顯示,不顯示光標,不閃爍</p><p> w1602zl(0x06); //顯示光標,光標右移</p><p> w1602zl(0x01); //清屏</p><p> w1602zl(one); //寫入第一行不改變的部分</p><p>
113、; for (k=0;k<9;k++)</p><p><b> {</b></p><p> w1602sj(xian3[k]);</p><p><b> }</b></p><p> w1602zl(tw0+4); //寫入第二行不改變的部分</p><p
114、> for (k=0;k<8;k++)</p><p><b> {</b></p><p> w1602sj(xian2[k]);</p><p><b> }</b></p><p><b> }</b></p><p> /
115、************************************</p><p><b> DS1302模塊</b></p><p> ************************************/</p><p> //地址數(shù)據(jù)發(fā)送子程序</p><p> void w1302sj(unsi
116、gned char addr,unsigned char dat)</p><p><b> {</b></p><p> unsigned char i,temp;</p><p> rst1302=0;</p><p> sclk1302=0; &l
117、t;/p><p> rst1302=1;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> sclk1302=0;</p><p> temp=addr;</p><p> io1302=(bit)(
118、temp&0x01);</p><p><b> addr>>=1;</b></p><p> sclk1302=1;</p><p><b> }</b></p><p> for (i=8;i>0;i--)</p><p><b&g
119、t; {</b></p><p> sclk1302=0;</p><p><b> temp=dat;</b></p><p> io1302=(bit)(temp&0x01);</p><p><b> dat>>=1;</b></p>&
120、lt;p> sclk1302=1;</p><p><b> }</b></p><p> rst1302=0;</p><p><b> }</b></p><p><b> //數(shù)據(jù)讀取子程序</b></p><p> unsign
121、ed char r1302sj(unsigned char addr)</p><p><b> {</b></p><p> unsigned char i,temp,dat1;</p><p> rst1302=0;</p><p> sclk1302=0;</p><p> rst
122、1302=1;</p><p> for (i=8;i>0;i--)</p><p><b> { </b></p><p> sclk1302=0;</p><p> temp=addr;</p><p> io1302=(bit)(temp&0x01);</p&g
123、t;<p><b> addr>>=1;</b></p><p> sclk1302=1; //上升沿寫入</p><p><b> }</b></p><p> for (i=8;i>0;i--)</p><p> { sclk1302=0;
124、</p><p> ACC>>=1; //一定要加在前邊才行,最后一次io輸出直接輸?shù)紸CC.7上 </p><p> ACC7=io1302; //仍然是上升沿輸出</p><p> sclk1302=1; </p><p><b> }</b></p><p>
125、 rst1302=0;</p><p><b> dat1=ACC;</b></p><p> return(dat1);</p><p><b> }</b></p><p><b> //初始化1302</b></p><p> void
126、c1302cs(void)</p><p><b> {</b></p><p> w1302sj(xie_baohu,0x00); //允許寫</p><p> w1302sj(xie_miao,0x00); //開始計時</p><p><b> }</b></p><
127、;p> /************************************</p><p><b> 按鍵處理子程序</b></p><p> ************************************/</p><p> /////////////////////////////////////調(diào)時間<
128、;/p><p> /////////////////////////////////</p><p> void keyscan()</p><p><b> {</b></p><p> uchar keycs; </p><p> if (gongneng==0)</p>
129、<p><b> {</b></p><p><b> delay(5);</b></p><p> if (gongneng==0)</p><p><b> {</b></p><p> while (!gongneng); //功能鍵按下,keyc
130、s加1</p><p><b> keycs++;</b></p><p> switch (keycs)</p><p><b> {</b></p><p><b> case 1:</b></p><p> w1602zl(tw0+0x0
131、b); //寫入光標位置</p><p> w1602zl(0x0f); //設置光標閃爍,則在關閉之前都是閃爍的</p><p> //按下功能鍵1次時,是為了調(diào)節(jié)秒,所以讓1302時鐘不再走等待調(diào)整,且停止刷新時間</p><p> TR0=0; //功能鍵按下后停止刷新時間</p>
132、;<p> w1302sj(0x8e,0x00); //允許寫1302</p><p> w1302sj(0x80,0x80|s16zbcd(miao));//停止1302時鐘,并保存此時的秒值</p><p><b> break;</b></p><p> //按下功能鍵2次或2次以上時,1302時鐘繼續(xù)走,
133、定時器繼續(xù)刷新時間</p><p> case 2:w1602zl(tw0+8);break;</p><p> case 3:w1602zl(tw0+5);break;</p><p> case 4:w1602zl(one+0x0f);break;</p><p> case 5:w1602zl(one+0x09);break;&
134、lt;/p><p> case 6:w1602zl(one+0x06);break;</p><p> case 7:w1602zl(one+0x03);break;</p><p> case 8:w1602zl(0x0c); //設置光標不閃爍</p><p> w1302sj(0x80,0x00|s16zbcd(mi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論