2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  《單片機(jī)應(yīng)用與仿真訓(xùn)練》設(shè)計(jì)報(bào)告</p><p><b>  電子萬年歷</b></p><p>  姓 名: </p><p>  學(xué) 號: </p><p>  專業(yè)班級: </p><p>  指導(dǎo)老師

2、:  </p><p>  所在學(xué)院:電氣工程與自動化學(xué)院</p><p>  2015年 1 月 20 日</p><p><b>  摘要</b></p><p>  本設(shè)計(jì)的主要內(nèi)容是設(shè)計(jì)一個電子萬年歷。電子萬年歷是一種非常廣泛日常計(jì)時(shí)工具,對現(xiàn)代社會越來越流行。它可以對年、月、日、周日、時(shí)、分

3、和秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能,。基于對課本知識的學(xué)習(xí)與研究,該設(shè)計(jì)就是對課本知識的一個利用及實(shí)踐,通過自己所學(xué)的知識,設(shè)計(jì)一個實(shí)用的、貼近生活的電子萬年歷。該電路采用AT89C52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3到5V電壓供電。因?yàn)镈S1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、周日、時(shí)、分、秒等信息,還具有時(shí)間校準(zhǔn)等功能,所以DS1302是不可或缺的。&

4、lt;/p><p>  萬年歷的設(shè)計(jì)過程在硬件與軟件方面進(jìn)行同步設(shè)計(jì)。硬件部分主要由AT89C52單片機(jī),液晶顯示電路,時(shí)鐘電路,穩(wěn)壓電路電路以及串口下載電路等組成。在單片機(jī)的選擇上使用了AT89C52單片機(jī),該單片機(jī)適合于許多較為復(fù)雜控制應(yīng)用場合。顯示器使用液晶LCD1602。軟件方面主要包括日歷程序、液晶驅(qū)動程序,顯示程序等。程序采用C語言編寫。所有程序編寫完成后,在Keil C51軟件中進(jìn)行調(diào)試,確定沒有問題后

5、,在Proteus軟件中嵌入單片機(jī)內(nèi)進(jìn)行仿真。</p><p><b>  目錄</b></p><p>  1 概述………………………………………………………………………………4</p><p>  1.1實(shí)驗(yàn)?zāi)康摹?</p><p>  1.2 實(shí)驗(yàn)原理…………………

6、…………………………………………………4</p><p>  2 系統(tǒng)總體方案及硬件設(shè)計(jì)………………………………………………………6</p><p>  2.1總體方案……………………………………………………………………6</p><p>  2.2硬件設(shè)計(jì)……………………………………………………………………7</p><p>  3 軟件設(shè)

7、計(jì)…………………………………………………………………………8</p><p>  3.1程序設(shè)計(jì)……………………………………………………………………8</p><p>  4 Proteus軟件仿真……………………………………………………………9</p><p>  4.1 proteus模擬………………………………………………………………9</p>

8、<p>  5課程設(shè)計(jì)體會……………………………………………………………………10</p><p>  參考文獻(xiàn)……………………………………………………………………………11</p><p>  附1:源程序代碼…………………………………………………………………12</p><p><b>  1概述</b></p>&

9、lt;p><b>  1.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p>  本實(shí)驗(yàn)是對課本所學(xué)知識的應(yīng)用,通過51單片機(jī)開發(fā)板對硬件及軟件的設(shè)計(jì),做出一個電子萬年歷。</p><p><b>  1.2 實(shí)驗(yàn)原理</b></p><p>  液晶(Liquid Crystal)是一種高分子材料,因?yàn)槠涮厥獾奈锢?、化學(xué)、光學(xué)特性

10、,20世紀(jì)中葉開始廣泛應(yīng)用在輕薄型顯示器上。</p><p>  液晶顯示器(Liquid Crystal Display, LCD)的主要原理是以電流刺激液晶分子產(chǎn)生點(diǎn)、線、面并配合背部燈管構(gòu)成畫面。為敘述簡便,通常把各種液晶顯示器都直接叫做液晶。</p><p>  各種型號的液晶通常是按照顯示字符的行數(shù)或液晶點(diǎn)陣的行、列數(shù)來命名的。比如:1602的意思是每行顯示16個字符,一共可以顯

11、示兩行;類似的命名還有0801, 0802, 1601等,這類液晶通常都是字符型液晶,即只能顯示ASCII碼字符,如數(shù)字、大小寫字母、各種符號等。</p><p>  LCD1602引腳功能簡述:</p><p>  3 腳:VL,液晶顯示偏壓信號,用于調(diào)整LCD1602 的顯示對比度,一般會外接電位器用以調(diào)整偏壓信號,注意此腳電壓為0 時(shí)可以得到最強(qiáng)的對比度。</p>&l

12、t;p>  4 腳:RS,數(shù)據(jù)/命令選擇端,當(dāng)此腳為高電平時(shí),可以對1602 進(jìn)行數(shù)據(jù)字節(jié)的傳輸操作,而為電平時(shí),則是進(jìn)行命令字節(jié)的傳輸操作。命令字節(jié),即是用來對LCD1602 的一些工作方式作設(shè)置的字節(jié);數(shù)據(jù)字節(jié),即使用以在1602 上顯示的字節(jié)。值得一提的是,LCD1602的數(shù)據(jù)是8 位的。</p><p>  腳:R/W,讀寫選擇端。當(dāng)此腳為高電平可對LCD1602 進(jìn)行讀數(shù)據(jù)操作,反之進(jìn)行寫數(shù)據(jù)操作

13、。筆者認(rèn)為,此腳其實(shí)用處不大,直接接地永久置為低電平也不會影響其正常工作。但是尚未經(jīng)過復(fù)雜系統(tǒng)驗(yàn)證,保留此意見。</p><p>  6 腳:E,使能信號,其實(shí)是LCD1602 的數(shù)據(jù)控制時(shí)鐘信號,利用該信號的上升沿實(shí)現(xiàn)對LCD1602 的數(shù)據(jù)傳輸。</p><p>  7~14 腳:8 位并行數(shù)據(jù)口,使得對LCD1602 的數(shù)據(jù)讀寫大為方便。</p><p>  

14、LCD1602的操作時(shí)序:</p><p> ?、?當(dāng)我們要寫指令字,設(shè)置LCD1602 的工作方式時(shí):需要把RS置為低電平,RW置為低電平,然后將數(shù)據(jù)送到數(shù)據(jù)口D0~D7,最后E引腳一個高脈沖將數(shù)據(jù)寫入。</p><p> ?、?當(dāng)我們要寫入數(shù)據(jù)字,在1602 上實(shí)現(xiàn)顯示時(shí):需要把RS置為高電平,RW置為低電平,然后將數(shù)據(jù)送到數(shù)據(jù)口D0~D7,最后E 引腳一個高脈沖將數(shù)據(jù)寫入。發(fā)現(xiàn)了么,

15、寫指令和寫數(shù)據(jù),差別僅僅在于RS的電平不一樣而已。</p><p>  DS1302 是DALLAS 公司推出的涓流充電時(shí)鐘芯片,內(nèi)含有一個實(shí)時(shí)時(shí)鐘/日歷和31 字節(jié)靜態(tài)RAM ,通過簡單的串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、周、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動調(diào)整。時(shí)鐘操作可通過AM/PM 指示決定采用24 或12 小時(shí)格式。DS1302 與單片機(jī)之間能簡單地采用同步串行的

16、方式進(jìn)行通信,僅需用到三個口線:(1)RES 復(fù)位(2)I/O 數(shù)據(jù)線(3)SCLK 串行時(shí)鐘。時(shí)鐘/RAM 的讀/寫數(shù)據(jù)以一個字節(jié)或多達(dá)31個字節(jié)的字符組方式通信。DS1302 工作時(shí)功耗很低保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí)功率小于1mW。</p><p>  VCC2:主用電源引腳</p><p>  X1、X2:DS1302外部晶振引腳</p><p><b>

17、  GND:地</b></p><p><b>  RST:復(fù)位引腳</b></p><p>  I/O:串行數(shù)據(jù)引腳,數(shù)據(jù)輸出或者輸入都從這個引腳</p><p>  SCLK:串行時(shí)鐘引腳</p><p><b>  VCC1:備用電源</b></p><p>

18、;  2 系統(tǒng)總體方案及硬件設(shè)計(jì)</p><p><b>  2.1總體方案</b></p><p>  能顯示年,月,日,時(shí),分,秒</p><p>  能設(shè)置年,月,日,時(shí),分,秒</p><p><b>  電路框圖</b></p><p><b>  2.2

19、硬件設(shè)計(jì)</b></p><p>  1. LCD1602顯示部分</p><p>  LCD1602可以顯示2行32個字符的液晶顯示屏</p><p><b>  2.復(fù)位電路</b></p><p>  通過復(fù)位電路可以對萬年歷進(jìn)行重置。</p><p><b>  3.

20、時(shí)鐘電路</b></p><p>  該電路可以產(chǎn)生萬年歷的年,月,日,時(shí),分,秒。</p><p><b>  4.晶振電路</b></p><p><b>  5.按鍵電路</b></p><p>  通過該電路可以設(shè)置萬年歷的各個參數(shù)。</p><p>&l

21、t;b>  3 軟件設(shè)計(jì)</b></p><p><b>  3.1程序設(shè)計(jì)</b></p><p>  Proteus軟件仿真</p><p>  4.1 Proteus模擬仿真</p><p><b>  課程設(shè)計(jì)體會</b></p><p>  這次課

22、程設(shè)計(jì)總的來說還是很成功的,通過這次課程設(shè)計(jì),我對單片機(jī)的設(shè)計(jì),我對電子萬年歷的原理有了本質(zhì)上的理解。本來我對單片機(jī)的編程很是煩惱與不解。經(jīng)過這次更深層次的學(xué)習(xí)與嘗試,我對單片機(jī)的學(xué)習(xí)有了更近一步的提高。不得不說的是,這次設(shè)計(jì)確實(shí)給了我難度,光是編程就編了很長的時(shí)間,編不出來,我就借助參考資料以及周圍同學(xué)的幫助。經(jīng)過多少個日日夜夜的學(xué)習(xí)與編程,我終于完成了課程設(shè)計(jì)。這次設(shè)計(jì)我也深入學(xué)習(xí)了KEIL4以及Proteus這兩個基本的軟件,這對

23、以后的課程設(shè)計(jì)也有了很大的幫助。總的來說,這次的設(shè)計(jì)給了我很多意想不到的幫助,收獲頗豐。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 劉勇 編 《數(shù)字電路》 電子工業(yè)出版社 2004</p><p>  [2] 陳正振 編 《電子電路設(shè)計(jì)與制作》 廣西交通職業(yè)技術(shù)學(xué)院信息工程系 2007</p>&l

24、t;p>  [3] 楊子文 編 《單片機(jī)原理及應(yīng)用》 西安電子科技大學(xué)出版社 2006</p><p>  [4] 王法能 編 《單片機(jī)原理及應(yīng)用》 科學(xué)出版社 2004</p><p><b>  附1 源程序代碼</b></p><p>  /*********************************************

25、**********************************</p><p>  * 實(shí)驗(yàn)名 : 萬年歷實(shí)驗(yàn)</p><p>  * 使用的IO : </p><p>  * 實(shí)驗(yàn)效果 :1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒日月,按K2選擇</p><p><b>  

26、*選擇設(shè)置加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、時(shí)只能到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);//時(shí)</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>  //設(shè)置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í)函數(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í)函數(shù),延時(shí)1ms</p><p>  * 輸 入 : c</p><p>  * 輸 出 : 無</p><p>  * 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。</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 //當(dāng)沒有定義這個LCD1602_4PINS時(shí)</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; //寫入時(shí)序</p><p>  Lcd1602_Delay1ms(5); //保持時(shí)間</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; //寫入時(shí)序</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; //寫入時(shí)序</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; //寫入時(shí)序</p><p>  Lcd1602_Delay1ms(5); //保持時(shí)間</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; //寫入時(shí)序</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; //寫入時(shí)序</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); //開顯示不顯示光標(biāo)</p><p>  LcdWriteCom(0x06); //寫一個指針加1</p><p>  LcdWriteCom(0x01); //清屏</p><p>

90、;  LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)</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位總線轉(zhuǎn)為4位總線</p><p>  LcdWriteCom(0x28); //在四位線下的初始化</p><p>  LcdWriteCom(0x0c); //開顯示不顯示光標(biāo)</p><p>  LcdWriteCom(0x06); //寫一個指針加1<

92、;/p><p>  LcdWriteCom(0x01); //清屏</p><p>  LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn)</p><p><b>  }</b></p><p><b>  #endif</b></p><p>  #include&

93、quot;ds1302.h"</p><p>  //---DS1302寫入和讀取時(shí)分秒的地址命令---//</p><p>  //---秒分時(shí)日月周年 最低位讀寫位;-------//</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時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//</p><p>  //---存儲順序是秒分時(shí)日月周年,存儲格式是用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ù)在上升沿時(shí),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ù)在上升沿時(shí),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ù)結(jié)束</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ù)在上升沿時(shí),DS1302讀取數(shù)據(jù)</p><p><b>  _nop_();</b></p><p>  SCLK = 0;

109、//DS1302下降沿時(shí),放置數(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í),放置數(shù)據(jù)</p><p><b>  _nop_();</b></p><p><b>  }</b></p><p><b>  RST = 0;</b></

112、p><p>  _nop_();//以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。</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); //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能</p><p>  for (n=0; n<7; n++)//寫入7個字節(jié)的時(shí)鐘信號:分秒時(shí)日月周年</p><

117、;p><b>  {</b></p><p>  Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);</p><p><b>  }</b></p><p>  Ds1302Write(0x8E,0x80); //打開寫保護(hù)功能</p><p><b&g

118、t;  }</b></p><p>  /*******************************************************************************</p><p>  * 函 數(shù) 名 : Ds1302ReadTime</p><p>  * 函數(shù)功能 : 讀取時(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é)的時(shí)鐘信號:分秒時(shí)日月周年</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>  當(dāng)使用的是4位數(shù)據(jù)傳輸?shù)臅r(shí)候定義,</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>  //---重定義關(guān)鍵詞---//</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單片機(jī)12MHZ時(shí)鐘下的延時(shí)函數(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>  //---重定義關(guān)鍵詞---//</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)系上傳者。文件的所有權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論