版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《單片機應用與仿真訓練》設計報告</p><p><b> 電子萬年歷</b></p><p> 姓 名: </p><p> 學 號: </p><p> 專業(yè)班級: </p><p> 指導老師
2、: </p><p> 所在學院:電氣工程與自動化學院</p><p> 2015年 1 月 20 日</p><p><b> 摘要</b></p><p> 本設計的主要內(nèi)容是設計一個電子萬年歷。電子萬年歷是一種非常廣泛日常計時工具,對現(xiàn)代社會越來越流行。它可以對年、月、日、周日、時、分
3、和秒進行計時,還具有閏年補償?shù)榷喾N功能,?;趯φn本知識的學習與研究,該設計就是對課本知識的一個利用及實踐,通過自己所學的知識,設計一個實用的、貼近生活的電子萬年歷。該電路采用AT89C52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3到5V電壓供電。因為DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒等信息,還具有時間校準等功能,所以DS1302是不可或缺的。&
4、lt;/p><p> 萬年歷的設計過程在硬件與軟件方面進行同步設計。硬件部分主要由AT89C52單片機,液晶顯示電路,時鐘電路,穩(wěn)壓電路電路以及串口下載電路等組成。在單片機的選擇上使用了AT89C52單片機,該單片機適合于許多較為復雜控制應用場合。顯示器使用液晶LCD1602。軟件方面主要包括日歷程序、液晶驅(qū)動程序,顯示程序等。程序采用C語言編寫。所有程序編寫完成后,在Keil C51軟件中進行調(diào)試,確定沒有問題后
5、,在Proteus軟件中嵌入單片機內(nèi)進行仿真。</p><p><b> 目錄</b></p><p> 1 概述………………………………………………………………………………4</p><p> 1.1實驗目的……………………………………………………………………4</p><p> 1.2 實驗原理…………………
6、…………………………………………………4</p><p> 2 系統(tǒng)總體方案及硬件設計………………………………………………………6</p><p> 2.1總體方案……………………………………………………………………6</p><p> 2.2硬件設計……………………………………………………………………7</p><p> 3 軟件設
7、計…………………………………………………………………………8</p><p> 3.1程序設計……………………………………………………………………8</p><p> 4 Proteus軟件仿真……………………………………………………………9</p><p> 4.1 proteus模擬………………………………………………………………9</p>
8、<p> 5課程設計體會……………………………………………………………………10</p><p> 參考文獻……………………………………………………………………………11</p><p> 附1:源程序代碼…………………………………………………………………12</p><p><b> 1概述</b></p>&
9、lt;p><b> 1.1實驗目的</b></p><p> 本實驗是對課本所學知識的應用,通過51單片機開發(fā)板對硬件及軟件的設計,做出一個電子萬年歷。</p><p><b> 1.2 實驗原理</b></p><p> 液晶(Liquid Crystal)是一種高分子材料,因為其特殊的物理、化學、光學特性
10、,20世紀中葉開始廣泛應用在輕薄型顯示器上。</p><p> 液晶顯示器(Liquid Crystal Display, LCD)的主要原理是以電流刺激液晶分子產(chǎn)生點、線、面并配合背部燈管構成畫面。為敘述簡便,通常把各種液晶顯示器都直接叫做液晶。</p><p> 各種型號的液晶通常是按照顯示字符的行數(shù)或液晶點陣的行、列數(shù)來命名的。比如:1602的意思是每行顯示16個字符,一共可以顯
11、示兩行;類似的命名還有0801, 0802, 1601等,這類液晶通常都是字符型液晶,即只能顯示ASCII碼字符,如數(shù)字、大小寫字母、各種符號等。</p><p> LCD1602引腳功能簡述:</p><p> 3 腳:VL,液晶顯示偏壓信號,用于調(diào)整LCD1602 的顯示對比度,一般會外接電位器用以調(diào)整偏壓信號,注意此腳電壓為0 時可以得到最強的對比度。</p>&l
12、t;p> 4 腳:RS,數(shù)據(jù)/命令選擇端,當此腳為高電平時,可以對1602 進行數(shù)據(jù)字節(jié)的傳輸操作,而為電平時,則是進行命令字節(jié)的傳輸操作。命令字節(jié),即是用來對LCD1602 的一些工作方式作設置的字節(jié);數(shù)據(jù)字節(jié),即使用以在1602 上顯示的字節(jié)。值得一提的是,LCD1602的數(shù)據(jù)是8 位的。</p><p> 腳:R/W,讀寫選擇端。當此腳為高電平可對LCD1602 進行讀數(shù)據(jù)操作,反之進行寫數(shù)據(jù)操作
13、。筆者認為,此腳其實用處不大,直接接地永久置為低電平也不會影響其正常工作。但是尚未經(jīng)過復雜系統(tǒng)驗證,保留此意見。</p><p> 6 腳:E,使能信號,其實是LCD1602 的數(shù)據(jù)控制時鐘信號,利用該信號的上升沿實現(xiàn)對LCD1602 的數(shù)據(jù)傳輸。</p><p> 7~14 腳:8 位并行數(shù)據(jù)口,使得對LCD1602 的數(shù)據(jù)讀寫大為方便。</p><p>
14、LCD1602的操作時序:</p><p> ?、?當我們要寫指令字,設置LCD1602 的工作方式時:需要把RS置為低電平,RW置為低電平,然后將數(shù)據(jù)送到數(shù)據(jù)口D0~D7,最后E引腳一個高脈沖將數(shù)據(jù)寫入。</p><p> ?、?當我們要寫入數(shù)據(jù)字,在1602 上實現(xiàn)顯示時:需要把RS置為高電平,RW置為低電平,然后將數(shù)據(jù)送到數(shù)據(jù)口D0~D7,最后E 引腳一個高脈沖將數(shù)據(jù)寫入。發(fā)現(xiàn)了么,
15、寫指令和寫數(shù)據(jù),差別僅僅在于RS的電平不一樣而已。</p><p> DS1302 是DALLAS 公司推出的涓流充電時鐘芯片,內(nèi)含有一個實時時鐘/日歷和31 字節(jié)靜態(tài)RAM ,通過簡單的串行接口與單片機進行通信。實時時鐘/日歷電路提供秒、分、時、日、周、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動調(diào)整。時鐘操作可通過AM/PM 指示決定采用24 或12 小時格式。DS1302 與單片機之間能簡單地采用同步串行的
16、方式進行通信,僅需用到三個口線:(1)RES 復位(2)I/O 數(shù)據(jù)線(3)SCLK 串行時鐘。時鐘/RAM 的讀/寫數(shù)據(jù)以一個字節(jié)或多達31個字節(jié)的字符組方式通信。DS1302 工作時功耗很低保持數(shù)據(jù)和時鐘信息時功率小于1mW。</p><p> VCC2:主用電源引腳</p><p> X1、X2:DS1302外部晶振引腳</p><p><b>
17、 GND:地</b></p><p><b> RST:復位引腳</b></p><p> I/O:串行數(shù)據(jù)引腳,數(shù)據(jù)輸出或者輸入都從這個引腳</p><p> SCLK:串行時鐘引腳</p><p><b> VCC1:備用電源</b></p><p>
18、; 2 系統(tǒng)總體方案及硬件設計</p><p><b> 2.1總體方案</b></p><p> 能顯示年,月,日,時,分,秒</p><p> 能設置年,月,日,時,分,秒</p><p><b> 電路框圖</b></p><p><b> 2.2
19、硬件設計</b></p><p> 1. LCD1602顯示部分</p><p> LCD1602可以顯示2行32個字符的液晶顯示屏</p><p><b> 2.復位電路</b></p><p> 通過復位電路可以對萬年歷進行重置。</p><p><b> 3.
20、時鐘電路</b></p><p> 該電路可以產(chǎn)生萬年歷的年,月,日,時,分,秒。</p><p><b> 4.晶振電路</b></p><p><b> 5.按鍵電路</b></p><p> 通過該電路可以設置萬年歷的各個參數(shù)。</p><p>&l
21、t;b> 3 軟件設計</b></p><p><b> 3.1程序設計</b></p><p> Proteus軟件仿真</p><p> 4.1 Proteus模擬仿真</p><p><b> 課程設計體會</b></p><p> 這次課
22、程設計總的來說還是很成功的,通過這次課程設計,我對單片機的設計,我對電子萬年歷的原理有了本質(zhì)上的理解。本來我對單片機的編程很是煩惱與不解。經(jīng)過這次更深層次的學習與嘗試,我對單片機的學習有了更近一步的提高。不得不說的是,這次設計確實給了我難度,光是編程就編了很長的時間,編不出來,我就借助參考資料以及周圍同學的幫助。經(jīng)過多少個日日夜夜的學習與編程,我終于完成了課程設計。這次設計我也深入學習了KEIL4以及Proteus這兩個基本的軟件,這對
23、以后的課程設計也有了很大的幫助??偟膩碚f,這次的設計給了我很多意想不到的幫助,收獲頗豐。</p><p><b> 參考文獻</b></p><p> [1] 劉勇 編 《數(shù)字電路》 電子工業(yè)出版社 2004</p><p> [2] 陳正振 編 《電子電路設計與制作》 廣西交通職業(yè)技術學院信息工程系 2007</p>&l
24、t;p> [3] 楊子文 編 《單片機原理及應用》 西安電子科技大學出版社 2006</p><p> [4] 王法能 編 《單片機原理及應用》 科學出版社 2004</p><p><b> 附1 源程序代碼</b></p><p> /*********************************************
25、**********************************</p><p> * 實驗名 : 萬年歷實驗</p><p> * 使用的IO : </p><p> * 實驗效果 :1602顯示時鐘,按K3進入時鐘設置,按K1選擇設置的時分秒日月,按K2選擇</p><p><b>
26、*選擇設置加1。 </b></p><p> *注意 :</p><p> *******************************************************************************/</p><p> #include<reg51.h></p><p&
27、gt; #include"lcd.h"</p><p> #include"ds1302.h"</p><p> sbit K1=P3^0;</p><p> sbit K2=P3^1;</p><p> sbit K3=P3^2;</p><p> void Int
28、0Configuration();</p><p> void LcdDisplay();</p><p> unsigned char SetState,SetPlace;</p><p> void Delay10ms(void); //誤差 0us</p><p> /****************************
29、***************************************************</p><p> * 函數(shù)名 : main</p><p> * 函數(shù)功能 : 主函數(shù)</p><p> * 輸入 : 無</p><p> * 輸出 : 無</
30、p><p> *******************************************************************************/</p><p> void main()</p><p><b> {</b></p><p> unsigned char i;</p
31、><p><b> //H2=0;</b></p><p> Int0Configuration();</p><p> LcdInit();</p><p> Ds1302Init();</p><p><b> while(1)</b></p><
32、;p><b> {</b></p><p> if(SetState==0)</p><p><b> {</b></p><p> Ds1302ReadTime();</p><p><b> }</b></p><p><b&
33、gt; else</b></p><p><b> {</b></p><p> if(K1==0)//檢測按鍵L1是否按下</p><p><b> {</b></p><p> Delay10ms();//消除抖動</p><p><b&
34、gt; if(K1==0)</b></p><p><b> {</b></p><p> SetPlace++;</p><p> if(SetPlace>=7)</p><p> SetPlace=0;</p><p><b> }</b
35、></p><p> while((i<50)&&(K1==0)) //檢測按鍵是否松開</p><p><b> {</b></p><p> Delay10ms();</p><p><b> i++;</b></p><p><
36、;b> }</b></p><p><b> i=0;</b></p><p><b> }</b></p><p> if(K2==0)//檢測按鍵K2是否按下</p><p><b> {</b></p><p>
37、Delay10ms();//消除抖動</p><p><b> if(K2==0)</b></p><p><b> {</b></p><p> TIME[SetPlace]++;</p><p> if((TIME[SetPlace]&0x0f)>9) //換成
38、BCD碼。</p><p><b> {</b></p><p> TIME[SetPlace]=TIME[SetPlace]+6;</p><p><b> }</b></p><p> if((TIME[SetPlace]>=0x60)&&(SetPlace<
39、2))//分秒只能到59</p><p><b> {</b></p><p> TIME[SetPlace]=0;</p><p><b> }</b></p><p> if((TIME[SetPlace]>=0x24)&&(SetPlace==2))//小
40、時只能到23</p><p><b> {</b></p><p> TIME[SetPlace]=0;</p><p><b> }</b></p><p> if((TIME[SetPlace]>=0x32)&&(SetPlace==3))//日只能到31<
41、;/p><p><b> {</b></p><p> TIME[SetPlace]=0;</p><p><b> }</b></p><p> if((TIME[SetPlace]>=0x13)&&(SetPlace==4))//月只能到12</p>
42、<p><b> {</b></p><p> TIME[SetPlace]=0;</p><p><b> }</b></p><p> if((TIME[SetPlace]>=0x7)&&(SetPlace==5))//周只能到7</p><p>
43、<b> {</b></p><p> TIME[SetPlace]=1;</p><p><b> }</b></p><p> //if(SetPlace==5)//月只能到12</p><p><b> //{</b></p&g
44、t;<p> //TIME[SetPlace]=;</p><p><b> //}</b></p><p><b> }</b></p><p> while((i<50)&&(K2==0)) //檢測按鍵是否松開</p><p&g
45、t;<b> {</b></p><p> Delay10ms();</p><p><b> i++;</b></p><p><b> }</b></p><p><b> i=0;</b></p><p><b
46、> }</b></p><p><b> }</b></p><p> LcdDisplay();</p><p><b> }</b></p><p><b> }</b></p><p> /*******
47、************************************************************************</p><p> * 函數(shù)名 : LcdDisplay()</p><p> * 函數(shù)功能 : 顯示函數(shù)</p><p> * 輸入 : 無</p><
48、p> * 輸出 : 無</p><p> *******************************************************************************/</p><p> void LcdDisplay()</p><p><b> {</b></p>
49、;<p> LcdWriteCom(0x80+0X40);</p><p> LcdWriteData('0'+TIME[2]/16);//時</p><p> LcdWriteData('0'+(TIME[2]&0x0f)); </p><p> LcdWriteData('-&
50、#39;);</p><p> LcdWriteData('0'+TIME[1]/16);//分</p><p> LcdWriteData('0'+(TIME[1]&0x0f));</p><p> LcdWriteData('-');</p><p> LcdWri
51、teData('0'+TIME[0]/16);//秒</p><p> LcdWriteData('0'+(TIME[0]&0x0f));</p><p> LcdWriteCom(0x80);</p><p> LcdWriteData('2');</p><p> L
52、cdWriteData('0');</p><p> LcdWriteData('0'+TIME[6]/16);//年</p><p> LcdWriteData('0'+(TIME[6]&0x0f));</p><p> LcdWriteData('-');</p>
53、<p> LcdWriteData('0'+TIME[4]/16);//月</p><p> LcdWriteData('0'+(TIME[4]&0x0f));</p><p> LcdWriteData('-');</p><p> LcdWriteData('0'+T
54、IME[3]/16);//日</p><p> LcdWriteData('0'+(TIME[3]&0x0f));</p><p> LcdWriteCom(0x8D);</p><p> LcdWriteData('0'+(TIME[5]&0x07));//星期 </p><p
55、><b> }</b></p><p> /*******************************************************************************</p><p> * 函數(shù)名 : Int0Configuration()</p><p> * 函數(shù)功能
56、 : 配置外部中斷0</p><p> * 輸入 : 無</p><p> * 輸出 : 無</p><p> *******************************************************************************/</p><p> vo
57、id Int0Configuration()</p><p><b> {</b></p><p><b> //設置INT0</b></p><p> IT0=1;//跳變沿出發(fā)方式(下降沿)</p><p> EX0=1;//打開INT0的中斷允許。</p><p&g
58、t; EA=1;//打開總中斷</p><p><b> }</b></p><p> /*******************************************************************************</p><p> * 函數(shù)名 : Int0() </p>
59、<p> * 函數(shù)功能 : 外部中斷0 中斷函數(shù)</p><p> * 輸入 : 無</p><p> * 輸出 : 無</p><p> *******************************************************************************/
60、</p><p> void Int0() interrupt 0 </p><p><b> {</b></p><p> Delay10ms();</p><p><b> if(K3==0)</b></p><p><b> {</b>
61、;</p><p> SetState=~SetState;</p><p> SetPlace=0;</p><p> Ds1302Init();</p><p><b> }</b></p><p><b> }</b></p><p>
62、; /*******************************************************************************</p><p> * 函數(shù)名 : Delay10ms</p><p> * 函數(shù)功能 : 延時函數(shù),延時10ms</p><p> * 輸入 : 無&
63、lt;/p><p> * 輸出 : 無</p><p> *******************************************************************************/</p><p> void Delay10ms(void) //誤差 0us</p><p>&l
64、t;b> {</b></p><p> unsigned char a,b,c;</p><p> for(c=1;c>0;c--)</p><p> for(b=38;b>0;b--)</p><p> for(a=130;a>0;a--);</p><p><b&
65、gt; }</b></p><p> #include"lcd.h"</p><p> /*******************************************************************************</p><p> * 函 數(shù) 名 : Lcd1602_Dela
66、y1ms</p><p> * 函數(shù)功能 : 延時函數(shù),延時1ms</p><p> * 輸 入 : c</p><p> * 輸 出 : 無</p><p> * 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機的延時。</p><p
67、> *******************************************************************************/</p><p> void Lcd1602_Delay1ms(uint c) //誤差 0us</p><p><b> {</b></p><p> uchar
68、 a,b;</p><p> for (; c>0; c--)</p><p><b> {</b></p><p> for (b=199;b>0;b--)</p><p><b> {</b></p><p> for(a=1;a>0;a--)
69、;</p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> /************************************************************
70、*******************</p><p> * 函 數(shù) 名 : LcdWriteCom</p><p> * 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令</p><p> * 輸 入 : com</p><p> * 輸 出 : 無</p>
71、<p> *******************************************************************************/</p><p> #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時</p><p> void LcdWriteCom(uchar com) //寫入命令
72、</p><p><b> {</b></p><p> LCD1602_E = 0; //使能</p><p> LCD1602_RS = 0; //選擇發(fā)送命令</p><p> LCD1602_RW = 0; //選擇寫入</p><p> LCD1602_DA
73、TAPINS = com; //放入命令</p><p> Lcd1602_Delay1ms(1);//等待數(shù)據(jù)穩(wěn)定</p><p> LCD1602_E = 1; //寫入時序</p><p> Lcd1602_Delay1ms(5); //保持時間</p><p> LCD1602_E = 0;
74、</p><p><b> }</b></p><p><b> #else </b></p><p> void LcdWriteCom(uchar com) //寫入命令</p><p><b> {</b></p><p> LCD1
75、602_E = 0; //使能清零</p><p> LCD1602_RS = 0; //選擇寫入命令</p><p> LCD1602_RW = 0; //選擇寫入</p><p> LCD1602_DATAPINS = com;//由于4位的接線是接到P0口的高四位,所以傳送高四位不用改</p><p> Lcd1602_
76、Delay1ms(1);</p><p> LCD1602_E = 1; //寫入時序</p><p> Lcd1602_Delay1ms(5);</p><p> LCD1602_E = 0;</p><p> //Lcd1602_Delay1ms(1);</p><p> LCD1602_DATAPI
77、NS = com << 4; //發(fā)送低四位</p><p> Lcd1602_Delay1ms(1);</p><p> LCD1602_E = 1; //寫入時序</p><p> Lcd1602_Delay1ms(5);</p><p> LCD1602_E = 0;</p><p><
78、;b> }</b></p><p><b> #endif</b></p><p> /*******************************************************************************</p><p> * 函 數(shù) 名 : LcdWriteD
79、ata</p><p> * 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù)</p><p> * 輸 入 : dat</p><p> * 輸 出 : 無</p><p> *********************************************************
80、**********************/ </p><p> #ifndef LCD1602_4PINS </p><p> void LcdWriteData(uchar dat)//寫入數(shù)據(jù)</p><p><b> {</b></p><p> LCD1602_E = 0;/
81、/使能清零</p><p> LCD1602_RS = 1;//選擇輸入數(shù)據(jù)</p><p> LCD1602_RW = 0;//選擇寫入</p><p> LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)</p><p> Lcd1602_Delay1ms(1);</p><p> LCD1
82、602_E = 1; //寫入時序</p><p> Lcd1602_Delay1ms(5); //保持時間</p><p> LCD1602_E = 0;</p><p><b> }</b></p><p><b> #else</b></p><p>
83、 void LcdWriteData(uchar dat)//寫入數(shù)據(jù)</p><p><b> {</b></p><p> LCD1602_E = 0; //使能清零</p><p> LCD1602_RS = 1; //選擇寫入數(shù)據(jù)</p><p> LCD1602_RW = 0; //選
84、擇寫入</p><p> LCD1602_DATAPINS = dat;//由于4位的接線是接到P0口的高四位,所以傳送高四位不用改</p><p> Lcd1602_Delay1ms(1);</p><p> LCD1602_E = 1; //寫入時序</p><p> Lcd1602_Delay1ms(5);</p&g
85、t;<p> LCD1602_E = 0;</p><p> LCD1602_DATAPINS = dat << 4; //寫入低四位</p><p> Lcd1602_Delay1ms(1);</p><p> LCD1602_E = 1; //寫入時序</p><p> Lcd1602_Delay1
86、ms(5);</p><p> LCD1602_E = 0;</p><p><b> }</b></p><p><b> #endif</b></p><p> /**************************************************************
87、*****************</p><p> * 函 數(shù) 名 : LcdInit()</p><p> * 函數(shù)功能 : 初始化LCD屏</p><p> * 輸 入 : 無</p><p> * 輸 出 : 無</p><p> *********
88、**********************************************************************/ </p><p> #ifndefLCD1602_4PINS</p><p> void LcdInit() //LCD初始化子程序</p><p><b> {</b>
89、</p><p> LcdWriteCom(0x38); //開顯示</p><p> LcdWriteCom(0x0c); //開顯示不顯示光標</p><p> LcdWriteCom(0x06); //寫一個指針加1</p><p> LcdWriteCom(0x01); //清屏</p><p>
90、; LcdWriteCom(0x80); //設置數(shù)據(jù)指針起點</p><p><b> }</b></p><p><b> #else</b></p><p> void LcdInit() //LCD初始化子程序</p><p><b> {</b&g
91、t;</p><p> LcdWriteCom(0x32); //將8位總線轉為4位總線</p><p> LcdWriteCom(0x28); //在四位線下的初始化</p><p> LcdWriteCom(0x0c); //開顯示不顯示光標</p><p> LcdWriteCom(0x06); //寫一個指針加1<
92、;/p><p> LcdWriteCom(0x01); //清屏</p><p> LcdWriteCom(0x80); //設置數(shù)據(jù)指針起點</p><p><b> }</b></p><p><b> #endif</b></p><p> #include&
93、quot;ds1302.h"</p><p> //---DS1302寫入和讀取時分秒的地址命令---//</p><p> //---秒分時日月周年 最低位讀寫位;-------//</p><p> uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
94、</p><p> uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};</p><p> //---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---//</p><p> //---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//&
95、lt;/p><p> uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};</p><p> /*******************************************************************************</p><p> * 函 數(shù) 名 : D
96、s1302Write</p><p> * 函數(shù)功能 : 向DS1302命令(地址+數(shù)據(jù))</p><p> * 輸 入 : addr,dat</p><p> * 輸 出 : 無</p><p> ******************************************
97、*************************************/</p><p> void Ds1302Write(uchar addr, uchar dat)</p><p><b> {</b></p><p><b> uchar n;</b></p><p><b&
98、gt; RST = 0;</b></p><p><b> _nop_();</b></p><p> SCLK = 0;//先將SCLK置低電平。</p><p><b> _nop_();</b></p><p> RST = 1; //然后將RST(CE)置高電平。<
99、;/p><p><b> _nop_();</b></p><p> for (n=0; n<8; n++)//開始傳送八位地址命令</p><p><b> {</b></p><p> DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送</p><
100、p> addr >>= 1;</p><p> SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)</p><p><b> _nop_();</b></p><p><b> SCLK = 0;</b></p><p><b> _nop_();<
101、;/b></p><p><b> }</b></p><p> for (n=0; n<8; n++)//寫入8位數(shù)據(jù)</p><p><b> {</b></p><p> DSIO = dat & 0x01;</p><p> dat &g
102、t;>= 1;</p><p> SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)</p><p><b> _nop_();</b></p><p><b> SCLK = 0;</b></p><p><b> _nop_();</b></p
103、><p><b> }</b></p><p> RST = 0;//傳送數(shù)據(jù)結束</p><p><b> _nop_();</b></p><p><b> }</b></p><p> /**************************
104、*****************************************************</p><p> * 函 數(shù) 名 : Ds1302Read</p><p> * 函數(shù)功能 : 讀取一個地址的數(shù)據(jù)</p><p> * 輸 入 : addr</p><p> *
105、輸 出 : dat</p><p> *******************************************************************************/</p><p> uchar Ds1302Read(uchar addr)</p><p><b> {</b><
106、;/p><p> uchar n,dat,dat1;</p><p><b> RST = 0;</b></p><p><b> _nop_();</b></p><p> SCLK = 0;//先將SCLK置低電平。</p><p><b> _nop_(
107、);</b></p><p> RST = 1;//然后將RST(CE)置高電平。</p><p><b> _nop_();</b></p><p> for(n=0; n<8; n++)//開始傳送八位地址命令</p><p><b> {</b></p>
108、<p> DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送</p><p> addr >>= 1;</p><p> SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)</p><p><b> _nop_();</b></p><p> SCLK = 0;
109、//DS1302下降沿時,放置數(shù)據(jù)</p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> _nop_();</b></p><p> for(n=0; n<8; n++)//讀取8位數(shù)據(jù)</p&g
110、t;<p><b> {</b></p><p> dat1 = DSIO;//從最低位開始接收</p><p> dat = (dat>>1) | (dat1<<7);</p><p><b> SCLK = 1;</b></p><p><b&
111、gt; _nop_();</b></p><p> SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)</p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> RST = 0;</b></
112、p><p> _nop_();//以下為DS1302復位的穩(wěn)定時間,必須的。</p><p><b> SCLK = 1;</b></p><p><b> _nop_();</b></p><p><b> DSIO = 0;</b></p><p&
113、gt;<b> _nop_();</b></p><p><b> DSIO = 1;</b></p><p><b> _nop_();</b></p><p> return dat;</p><p><b> }</b></p>
114、;<p> /*******************************************************************************</p><p> * 函 數(shù) 名 : Ds1302Init</p><p> * 函數(shù)功能 : 初始化DS1302.</p><p> * 輸
115、 入 : 無</p><p> * 輸 出 : 無</p><p> *******************************************************************************/</p><p> void Ds1302Init()</p><p>
116、;<b> {</b></p><p><b> uchar n;</b></p><p> Ds1302Write(0x8E,0X00); //禁止寫保護,就是關閉寫保護功能</p><p> for (n=0; n<7; n++)//寫入7個字節(jié)的時鐘信號:分秒時日月周年</p><
117、;p><b> {</b></p><p> Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);</p><p><b> }</b></p><p> Ds1302Write(0x8E,0x80); //打開寫保護功能</p><p><b&g
118、t; }</b></p><p> /*******************************************************************************</p><p> * 函 數(shù) 名 : Ds1302ReadTime</p><p> * 函數(shù)功能 : 讀取時鐘信息</
119、p><p> * 輸 入 : 無</p><p> * 輸 出 : 無</p><p> *******************************************************************************/</p><p> void Ds1302Re
120、adTime()</p><p><b> {</b></p><p><b> uchar n;</b></p><p> for (n=0; n<7; n++)//讀取7個字節(jié)的時鐘信號:分秒時日月周年</p><p><b> {</b></p>
121、<p> TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);</p><p><b> }</b></p><p><b> }</b></p><p> #ifndef __LCD_H_</p><p> #define __LCD_H_<
122、/p><p> /**********************************</p><p> 當使用的是4位數(shù)據(jù)傳輸?shù)臅r候定義,</p><p> 使用8位取消這個定義</p><p> **********************************/</p><p> #define LCD1
123、602_4PINS</p><p> /**********************************</p><p><b> 包含頭文件</b></p><p> **********************************/</p><p> #include<reg51.h>&l
124、t;/p><p> //---重定義關鍵詞---//</p><p> #ifndef uchar</p><p> #define uchar unsigned char</p><p><b> #endif</b></p><p> #ifndef uint </p>&
125、lt;p> #define uint unsigned int</p><p><b> #endif</b></p><p> /**********************************</p><p><b> PIN口定義</b></p><p> ********
126、**************************/</p><p> #define LCD1602_DATAPINS P0</p><p> sbit LCD1602_E=P2^7;</p><p> sbit LCD1602_RW=P2^5;</p><p> sbit LCD1602_RS=P2^6;</p>
127、<p> /**********************************</p><p><b> 函數(shù)聲明</b></p><p> **********************************/</p><p> /*在51單片機12MHZ時鐘下的延時函數(shù)*/</p><p> v
128、oid Lcd1602_Delay1ms(uint c); //誤差 0us</p><p> /*LCD1602寫入8位命令子函數(shù)*/</p><p> void LcdWriteCom(uchar com);</p><p> /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/</p><p> void LcdWriteData(u
129、char dat);</p><p> /*LCD1602初始化子程序*/</p><p> void LcdInit(); </p><p><b> #endif</b></p><p> #ifndef __DS1302_H_</p><p> #define
130、__DS1302_H_</p><p> //---包含頭文件---//</p><p> #include<reg51.h></p><p> #include<intrins.h></p><p> //---重定義關鍵詞---//</p><p> #ifndef uchar&l
131、t;/p><p> #define uchar unsigned char</p><p><b> #endif</b></p><p> #ifndef uint </p><p> #define uint unsigned int</p><p><b> #endif&l
132、t;/b></p><p> //---定義ds1302使用的IO口---//</p><p> sbit DSIO=P3^4;</p><p> sbit RST=P3^5;</p><p> sbit SCLK=P3^6;</p><p> //---定義全局函數(shù)---//</p>&
133、lt;p> void Ds1302Write(uchar addr, uchar dat);</p><p> uchar Ds1302Read(uchar addr);</p><p> void Ds1302Init();</p><p> void Ds1302ReadTime();</p><p> //---加入全局
溫馨提示
- 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
提交評論