單片機課程設(shè)計---智能電子鐘_第1頁
已閱讀1頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  單片機原理及接口技術(shù)</p><p><b>  課程設(shè)計</b></p><p><b>  智能電子鐘</b></p><p><b>  摘 要</b></p><p>  本設(shè)計采用單片機AT89S52芯片以及相關(guān)的芯片來實現(xiàn)多功能的數(shù)字鐘。該設(shè)

2、計選用一線制溫度計DS18B20 作為溫度傳感器,實時時鐘芯片DS1302提供當(dāng)前日期和時間數(shù)據(jù),并將實時的日期和溫度數(shù)據(jù)在字符型液晶顯示器LCD1602上顯示出來。本文設(shè)計了一種基AT89S52單片機,使用Dallas的一線制數(shù)字溫度計DS18B20作為溫度傳感器,實時時鐘芯片DS1302提供當(dāng)前日期和時間數(shù)據(jù),并將實時的日期和溫度數(shù)據(jù)字符型液晶顯示器LCD1602上顯示,本次設(shè)計的多功能數(shù)字鐘采用數(shù)字電路對日期和溫度進行控制設(shè)置,我

3、們采用LCD液晶顯示,以24小時的計時方式,根據(jù)LCD顯示原理進行顯示,定時器計數(shù)。在本次設(shè)計中,電路具有顯示日期、時間、溫度的基本功能,還可以實現(xiàn)對它們的調(diào)整。本次設(shè)計要達到的目的是:具有時間顯示和手動校對功能,24小時制;具有年、月、日顯示和手動校對功能;具有顯示當(dāng)前星期的功能;具有鬧鈴功能;具有環(huán)境溫度采集功能;掉電后無需重新設(shè)置時間和日期。</p><p>  關(guān)鍵詞: DS1302時鐘芯片; LCD16

4、02; DS18B20溫度傳感器.</p><p><b>  目 錄</b></p><p>  1 總體方案設(shè)計2</p><p>  1.1 設(shè)計內(nèi)容2</p><p>  2 單元模塊設(shè)計3</p><p>  2.1 各單元模塊功能介紹及電路設(shè)計3</p><

5、;p>  2.1.1 溫度采集電路3</p><p>  2.1.2 DS1302時鐘電路3</p><p>  2.1.3 串行通信接口電路4</p><p>  2.1.4 電源電路4</p><p>  2.1.5 按鍵電路5</p><p>  2.1.6液晶顯示顯示電路5</p>

6、<p>  2.2 特殊器件介紹5</p><p>  2.2.1 AT89S52單片機芯片5</p><p>  2.2.2 DS1302介紹6</p><p>  2.2.3 溫度傳感器DS18B207</p><p>  2.2.4 液晶顯示LCD16027</p><p><b&

7、gt;  3軟件設(shè)計8</b></p><p>  3.1軟件設(shè)計流程8</p><p>  3.1.1 溫度采集流程9</p><p>  3.2.2 日期數(shù)據(jù)處理流程9</p><p>  4 調(diào)試與結(jié)果10</p><p><b>  附錄11</b></p&

8、gt;<p><b>  參考文獻23</b></p><p><b>  1 總體方案設(shè)計</b></p><p><b>  1.1 設(shè)計內(nèi)容</b></p><p>  該電路具有顯示日期、時間、溫度的基本功能,還可以實現(xiàn)對它們的調(diào)整。本次設(shè)計要達到的目的是:具有時間顯示和手動校

9、對功能,24小時制;具有年、月、日顯示和手動校對功能;具有顯示當(dāng)前星期的功能;具有鬧鈴功能;具有環(huán)境溫度采集功能;掉電后無需重新設(shè)置時間和日期;</p><p>  系統(tǒng)不但接口設(shè)計簡單、便于控制,而且具有很好的人機界面,可以通過幾個按鍵對當(dāng)前的時間進行調(diào)整,對鬧鐘進行隨意設(shè)置,以及溫度超過上下限會自動進行報警(LED亮)等功能。其原理框圖如下圖2.1所示:</p><p>  圖1.1

10、數(shù)字鐘原理框圖</p><p>  在現(xiàn)代SOC技術(shù)的引領(lǐng)下,人們對低故障、高實時、高可靠、高穩(wěn)定的性能更加青睞,其抗干擾性強,加密性強,超低功耗,可以遠(yuǎn)程升級,內(nèi)部有專用復(fù)位電路,價格也較便宜,結(jié)合本設(shè)計的要求及綜合以上比較的情況,我們選擇用AT89S52單片機芯片來實現(xiàn)本次設(shè)計。</p><p><b>  2 單元模塊設(shè)計</b></p><

11、p>  2.1 各單元模塊功能介紹及電路設(shè)計</p><p>  2.1.1 溫度采集電路</p><p>  DS18B20是美國Dallas半導(dǎo)體公司生產(chǎn)的一線制數(shù)字溫度傳感器。測量范圍為- 50 ℃~ + 125 ℃,精度可達0. 1 ℃,不需A /D 轉(zhuǎn)換電路,直接將溫度值轉(zhuǎn)換成數(shù)字量。溫度數(shù)據(jù)的傳輸,只需要一根數(shù)據(jù)線,直接將數(shù)據(jù)線與單片機的P3.6口相連接。其圖如下3.1所

12、示:</p><p><b>  圖2.1溫度采集 </b></p><p>  2.1.2 DS1302時鐘電路</p><p>  DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘芯片,它可以對年、月、日、周日、時、分、秒進行計時。DS1302用于數(shù)據(jù)記錄,特別是對某些具有特殊意義的數(shù)據(jù)點的記錄上,能實現(xiàn)數(shù)據(jù)與

13、出現(xiàn)該數(shù)據(jù)的時間同時記錄。DS1302提供2個電源引腳:一個(VCC2)接主電源;另一個(VCC1)接備用電源。其圖如下3.2所示:</p><p>  圖2.2 DS1302時鐘電路</p><p>  2.1.3 串行通信接口電路</p><p>  MAX232是電壓轉(zhuǎn)換芯片,將TTL電平轉(zhuǎn)換成可以和電腦串口匹配的電壓。DB9通過下載線纜與電腦連接,可以將程

14、序下載到單片機上。其圖如下3.3所示:</p><p>  圖2.3 RS232串行通信</p><p>  2.1.4 電源電路</p><p>  為了便于使用,本次采用了把交流的220V經(jīng)變壓器再經(jīng)LM7805B 變?yōu)閱纹瑱C所使用的5V電源,如圖3.4。</p><p><b>  圖2.4 電源電路</b>&l

15、t;/p><p>  2.1.5 按鍵電路</p><p>  本次設(shè)計中用到了4*4的矩陣鍵盤列陣,通過賦低電平選中其中一列,以便來控制時,分,秒,年,月,日,以及鬧鐘的調(diào)整。其電路如圖3.5:</p><p>  圖2.5 按鍵控制電路</p><p>  2.1.6液晶顯示顯示電路</p><p>  本設(shè)計中會將時

16、分秒,年月日周以及鬧鐘的設(shè)置,溫度全部都會顯示到液晶LCD1602上面,其具有16×2能夠顯示所有英文大小寫字母,0到9十個數(shù)字以及一些常用的符號。該液晶在4.5V到5.5V電壓范圍內(nèi)都能正確工作,平均工作電流為2mA。液晶HS162共16個管腳。但是由于原理圖中電路很簡單并且只用到接插件所以此處沒有給出原理圖。</p><p>  2.2 特殊器件介紹</p><p>  2.

17、2.1 AT89S52單片機芯片</p><p>  AT89S52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高

18、靈活、超有效的解決方案。 AT89S52具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),

19、單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。其圖如下3.6所示:</p><p>  圖2.6 AT89S52引腳圖</p><p>  2.2.2 DS1302介紹</p><p>  DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的

20、時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月、年,一個月小于31天時可自動進行調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后背電源進行。DS1302是以下的特性:雙電源管腳用于主電源和備份電源供應(yīng),Vcc1為課編程涓流充電電源,附加七個字節(jié)存儲器。其外部引腳分配如圖所示:</p><p>  圖2.7 DS1302的

21、外部時鐘引腳分配</p><p>  2.2.3 溫度傳感器DS18B20</p><p>  采用獨特的一線接口,可用數(shù)據(jù)總線供電,電壓范圍為3.0 V至5.5 V 無需備用電源。測量溫度范圍為-55℃至+125℃ 。華氏相當(dāng)于是-67°F到257華氏度 -10 °C至+85 °C范圍內(nèi)精度為±0.5℃。溫度傳感器可編程的分辨率為9~12位 溫度轉(zhuǎn)

22、換為12位數(shù)字格式最大值為750毫秒 用戶可定義的非易失性溫度報警設(shè)置應(yīng)用范圍包括恒溫控制,工業(yè)系統(tǒng),消費電子產(chǎn)品溫度計,或任何熱敏感系統(tǒng)。DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。該裝置信號線高的時候,內(nèi)部電容器儲存能量通由1線通信線路給片子供電,而且在低電平期間為片子供電直至下一個高電平的到來重新充電。</p><p>  圖2.8

23、DS18B20的管腳</p><p>  2.2.4 液晶顯示LCD1602</p><p>  HS1602是目前最常用的字符液晶之一。在操作液晶時,先要對液晶進行初始化,即進行最初是的命令設(shè)置。要設(shè)置液晶的工作方式設(shè)置,顯示狀態(tài)設(shè)置,輸入方式設(shè)置等。最后再向液晶寫入數(shù)據(jù),即寫入想要顯示字符的ASCII碼。</p><p><b>  3軟件設(shè)計<

24、/b></p><p><b>  3.1軟件設(shè)計流程</b></p><p>  本次設(shè)計的系統(tǒng)軟件設(shè)計主要包括主程序設(shè)計和溫度采集子模塊程序設(shè)計、日歷日期數(shù)據(jù)子模塊程序、按鍵控制子模塊程序和LCD液晶顯示子模塊程序設(shè)計等。主程序主要完成器件的初始化,并判斷有無按鍵按下,并根據(jù)判斷的結(jié)果調(diào)用相應(yīng)的子模塊程序;而溫度采集子模塊程序和日歷日期數(shù)據(jù)子模塊程序完成相應(yīng)

25、的數(shù)據(jù)采集、處理和保存,按鍵處理子模塊程序完成日期和鬧鐘的設(shè)置,而液晶顯示子模塊只要把上述子模塊儲存的數(shù)據(jù)送去顯示即可。系統(tǒng)總的流程圖如下圖所示:</p><p>  圖3.1 主程序流程</p><p>  3.1.1 溫度采集流程</p><p>  DS18B20在進行溫度采集時,必須首先進行初始化,然后發(fā)ROM操作指令,再發(fā)存儲器操作指令,最后才能傳輸數(shù)據(jù)。

26、每次對器件進行讀寫操作時, 必須嚴(yán)格按照DS18B20 的時序要求。因為溫度數(shù)據(jù)在DS18B20中是以2的補碼形式存放的,且低4位為小數(shù)部分, 4位到10位為整數(shù)部分,其余為符號位,因此在讀出2個字節(jié)的溫度數(shù)據(jù)后,首先求一次補碼得到原碼,再將數(shù)據(jù)分離為整數(shù)溫度值和小數(shù)溫度值,整數(shù)部分的值可通過數(shù)據(jù)交換指令得到,而小數(shù)溫度值部分可通過查表得到。</p><p>  因為在液晶顯示器上顯示的是字符的ASCII碼,因而

27、還要轉(zhuǎn)換為BCD,在加30H轉(zhuǎn)換為ASCII碼。</p><p>  其流程圖如圖3.2:</p><p>  3.1.2 日期數(shù)據(jù)處理流程</p><p>  對時鐘芯片的操作主要包括一是將芯片中的日期等數(shù)據(jù)讀出來,二是在進行日期等設(shè)置時將設(shè)置的數(shù)據(jù)寫入芯片,這也是按鍵處理時的主要內(nèi)容。無論是讀數(shù)據(jù)還是寫數(shù)據(jù)滿足DS1302 對時序的要求。而對芯片各個數(shù)據(jù)部分的

28、訪問是通過地址進行的,且讀和寫的地址不一樣。讀出的數(shù)據(jù)同樣要轉(zhuǎn)為ASC II碼,然后儲存起來,等待送去顯示,流程圖如圖3.3:</p><p><b>  圖3.2 流程圖</b></p><p><b>  圖3.3 流程圖</b></p><p><b>  4 調(diào)試與結(jié)果</b></p&g

29、t;<p>  系統(tǒng)的調(diào)試可以分為軟件調(diào)試與硬件調(diào)試。軟件調(diào)試可以在其集成開放環(huán)境中進行,編譯完之后,分別對各子程序進行仿真。仿真之后在下載到單片機,根據(jù)實際要求,進行逐一測試。如果不滿足則進行修改。直到可以準(zhǔn)確的報站以及顯示各站名為止。</p><p>  對于硬件的測試,要對電路板的各個部分進行測試,尤其對虛焊要嚴(yán)格檢查,因為如果發(fā)生短路可能是其他元件損壞。用萬用表對電路板進行反復(fù)檢查,再分別測

30、試鍵盤部分,I/O部分,LED顯示部分等。</p><p>  通過本次設(shè)計,我們對單片機有了更深刻的認(rèn)識,也從實踐的例子中去感受到了單片機設(shè)計給我們設(shè)計帶來的改變與進步。我們不僅掌握Keil uVision3軟件的使用,與此同時,我們還對電子設(shè)計的思路有了更多的認(rèn)識。這次對多功能數(shù)字鐘的設(shè)計與制作,讓我了解設(shè)計電路的程序,也了解了關(guān)于智能電子鐘的原理與設(shè)計理念。在此次的智能電子鐘設(shè)計過程中,更進一步地熟悉了芯片

31、的結(jié)構(gòu)及掌握了各芯片的工作原理和具體的使用方法。總之是受益匪淺。這為自己今后進一步深化學(xué)習(xí),積累了一定寶貴經(jīng)驗。</p><p><b>  附錄</b></p><p><b>  實現(xiàn)程序:</b></p><p>  //介紹整個程序所包含的頭文件</p><p>  #include<

32、reg52.h></p><p>  #include<intrins.h></p><p>  #include<ds1302.h></p><p>  #include<lcd1602.h></p><p>  #include<1820.h></p><p>

33、<b>  //定義</b></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  Uchar u,u1,u2,u3,u4,u5,u6,u7,u8,</p><p><b>  ala

34、rmOn;</b></p><p>  uint fen,miao,shi,nian,yue,ri,anshu,</p><p><b>  zh;</b></p><p>  uchar linshi,a,a1,a2,a3,a4,a5,a6;</p><p>  uint tab[3];</p>

35、<p>  sbit rd=P3^5;</p><p>  sbit P30=P3^0;</p><p>  sbit P31=P3^1;</p><p>  sbit P32=P3^2;</p><p>  sbit P33=P3^3;</p><p>  sbit beep=P3^3;</p&g

36、t;<p>  sbit ds1302_rst=P0^2;</p><p>  sbit ds1302_sclk=P0^0;</p><p>  sbit ds1302_io=P0^1;</p><p>  sbit ACC7=ACC^7;</p><p>  sbit B1=B^0;</p><p> 

37、 sbit lcd1602_en=P0^5;</p><p>  sbit lcd1602_rw=P0^6;</p><p>  sbit lcd1602_rs=P0^7;</p><p>  #define lcd1602_data P2</p><p>  uchar low,high; //存儲溫度的高位</p>&

38、lt;p><b>  值和低位值</b></p><p>  sbit DQ=P3^6; // -- 定義通信端口</p><p>  sbit D1=P0^7;</p><p>  uchar gw,sw,w4,tpl,tph;</p><p>  uint bai,b;</p><p>

39、;<b>  //主函數(shù)部分</b></p><p>  void fenjia (uchar rddr,uchar wddr,uchar yddr,uchar fenjiajian)//鍵盤掃描</p><p><b>  {</b></p><p>  u=ds1302_read(rddr);</p>&

40、lt;p>  fen=((u&0x70)>>4)*10+(u&0x0f);//進制轉(zhuǎn)換</p><p>  if(fenjiajian==1)</p><p><b>  {</b></p><p><b>  fen++;</b></p><p>  if(fen

41、==60)</p><p><b>  {</b></p><p><b>  fen=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else&l

42、t;/b></p><p><b>  {</b></p><p><b>  fen--;</b></p><p>  if((fen+1)==0)</p><p><b>  {</b></p><p><b>  fen=59;&l

43、t;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ds1302_write(wddr,((fen/10)<<4)|(fen%10));</p><p>  write_sfm(yddr,fen);</p>

44、<p>  lcd1602_writecom(0x80+0x40+yddr);</p><p>  lcd1602_writecom(0x0f);</p><p>  lcd1602_writecom(0x80+0x40+yddr);</p><p><b>  }</b></p><p>  void shi

45、jia (uchar rddr,uchar wddr,uchar yddr,uchar shijiajian)//鍵盤掃描</p><p><b>  {</b></p><p>  a4=ds1302_read(rddr);</p><p>  shi=((a4&0x70)>>4)*10+(a4&0x0f);//進

46、制轉(zhuǎn)換</p><p>  if(shijiajian==1)</p><p><b>  {</b></p><p><b>  shi++;</b></p><p>  if(shi==24)</p><p><b>  {</b></p>

47、;<p><b>  shi=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p

48、><p><b>  shi--;</b></p><p>  if((shi+1)==0)</p><p><b>  {</b></p><p><b>  shi=23;</b></p><p><b>  }</b></p

49、><p>  }ds1302_write(wddr,(shi/10)<<4|(shi%10));</p><p>  write_sfm(yddr,shi);</p><p>  lcd1602_writecom(0x80+0x40+yddr)</p><p>  lcd1602_writecom(0x0f);</p>

50、<p>  lcd1602_writecom(0x80+0x40+yddr);</p><p><b>  }</b></p><p>  void sfmset()</p><p><b>  {</b></p><p>  uchar linshi;</p><p&

51、gt;<b>  do</b></p><p><b>  {</b></p><p>  if(P30==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  i

52、f(P30==0)</p><p><b>  {</b></p><p>  while(!(P30));</p><p><b>  linshi=1;</b></p><p><b>  anshu++;</b></p><p>  if(ansh

53、u==1)</p><p><b>  {</b></p><p>  a=ds1302read(0x81);</p><p>  miao=((a&0x70)>>4)*10+(a&0x0f);/</p><p>  write_sfm(6,miao)lcd1602_writecom(0x

54、80+0x40+6);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+6);</p><p><b>  }</b></p><p>  if(anshu==2)</p><p><b>  {</b></p><p>  u1=ds130

55、2_read(0x83)fen=((u1&0x70)>>4)*10+(u1&0x0f);</p><p>  write_sfm(3,fen);lcd1602_writecom(0x80+0x40+3);</p><p>  lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+3);</p>

56、<p><b>  }</b></p><p>  if(anshu==3)</p><p><b>  {</b></p><p>  u2=ds1302_read(0x85);</p><p>  shi=((u2&0x70)>>4)*10+(u2&0x

57、0f);</p><p>  write_sfm(0,shi);lcd1602_writecom(0x80+0x40+0);</p><p>  lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+0);</p><p><b>  }</b></p><p>  

58、if(anshu==4)</p><p><b>  {</b></p><p>  lcd1602_writecom(0x0c); lcd1602_writecom(0x80 + 0x40+14);lcd1602_writedata('s');</p><p>  lcd1602_writedata('t'

59、;); lcd1602_writecom(0x0f);</p><p><b>  }</b></p><p>  if(anshu==5)</p><p><b>  {</b></p><p>  u7=ds1302_read(0x83)tab[0]=((u7&0x70

60、)>>4)*10+(u7&0x0f); write_sfm(3,tab[0]);//table[0]為分存儲器lcd1602_writecom(0x80+0x40+3);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+3);</p><p><b>  }</b></p>&l

61、t;p>  if(anshu==6)</p><p>  {u8=ds1302_read(0x85);tab[1]=((u8&0x70)>>4)*10+(u8&0x0f);write_sfm(0,tab[1]);//table[1]為時存儲器lcd1602_writecom(0x80+0x40+0);lcd1602_writecom(0x0

62、f);lcd1602_writecom(0x80+0x40+0);</p><p><b>  }</b></p><p>  if(anshu==7)</p><p><b>  {</b></p><p>  lcd1602_writecom(0x0c);</p><p&

63、gt;  lcd1602_writecom(0x80 + 0x40+14);</p><p>  lcd1602_writedata('O'); //顯示"On",提示鬧鐘已開啟 lcd1602_writedata('n');</p><p><b>  linshi=0;</b><

64、;/p><p><b>  }</b></p><p>  if(anshu==8)</p><p><b>  {</b></p><p><b>  linshi=0;</b></p><p>  anshu = 0;</p><p&

65、gt;  beep=1; lcd1602_writecom(0x80 + 0x40+14); //第二次按下清除 "On"標(biāo)記</p><p>  lcd1602_writedata(''); lcd1602_writedata(' ');</p><p><b>  }

66、</b></p><p>  if(anshu==9)</p><p><b>  {</b></p><p><b>  linshi=0;</b></p><p>  anshu=0;ds1302_write(0x80,0x00);</p><p> 

67、 lcd1602_writecom(0x38);</p><p>  lcd1602_writecom(0x0c);//不出現(xiàn)光標(biāo)</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

68、t;p>  if (anshu==2)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P3

69、2==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p>  fenjia(0x83,0x82,3,1);</p><p><b>  }</b></p><p><b>  }</b></p

70、><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p>  

71、while(!P33);</p><p>  fenjia(0x83,0x82,3,0);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (anshu==

72、3)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p>  shijia(0x85,0x84,0,1);</p><p&g

73、t;<b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P33==0)</p><p><b>  {<

74、;/b></p><p>  while(!P33);</p><p>  shijia(0x85,0x84,0,0);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

75、/p><p>  if (anshu==5)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p&

76、gt;  if(P32==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p><b>  tab[0]++;</b></p><p>  write_sfm(3,tab[0]);</p><p>  if(tab[0]=

77、=60)</p><p><b>  {</b></p><p><b>  tab[0]=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

78、;/b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P33==0)</p><p><b>  {</b></p>

79、<p>  while(!P33);</p><p><b>  tab[0]--;</b></p><p>  write_sfm(3,tab[0]);</p><p>  if(tab[0]==0)</p><p><b>  {</b></p><p> 

80、 tab[0]=59;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if (anshu==6)&

81、lt;/p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p><b>  tab[1]++;</b></p><

82、p>  write_sfm(0,tab[1]);</p><p>  if(tab[1]==24)</p><p><b>  {</b></p><p><b>  tab[1]=0;</b></p><p><b>  }</b></p><p&g

83、t;<b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p><b>  tab[1]--;</b></p><p>  write_sfm(0

84、,tab[1]);</p><p>  if(tab[1]==0)</p><p><b>  {</b></p><p>  tab[1]=23;</p><p><b>  }</b></p><p><b>  }</b></p>&

85、lt;p><b>  }</b></p><p>  if (anshu==7) //設(shè)置好鬧鐘返回時鐘界面并開啟鬧鐘</p><p><b>  {</b></p><p>  lcd1602_writecom(0x0c);//鬧鐘已經(jīng)設(shè)置好</p><p>  lcd1602_writec

86、om(0x80 + 0x40+16);</p><p>  lcd1602_writedata('O'); //顯示"On",提示鬧鐘已開啟</p><p>  lcd1602_writedata('n');</p><p>  u7=ds1302_read(0x83);</p><p> 

87、 fen=((u7&0x70)>>4)*10+(u7&0x0f);</p><p>  u8=ds1302_read(0x85);</p><p>  shi=((u8&0x70)>>4)*10+(u8&0x0f);</p><p>  if(tab[0]==fen && tab[1]==shi

88、)</p><p><b>  {</b></p><p>  alarmOn = 1; //鬧鐘時間到了</p><p><b>  }</b></p><p>  if(alarmOn == 1)</p><p><b>  {</b></p&

89、gt;<p><b>  beep = 0;</b></p><p>  delay(10);</p><p><b>  beep=1;</b></p><p>  delay(10);</p><p><b>  beep = 0;</b></p>

90、<p>  delay(10);</p><p><b>  beep=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p&g

91、t;  while(linshi);</p><p><b>  }</b></p><p>  void zhjia(uchar rddr,uchar wddr,uchar yddr,uchar zhjiajian)</p><p><b>  {</b></p><p>  u6=ds1302_

92、read(rddr);</p><p>  zh=u6&0x07;//進制轉(zhuǎn)換</p><p>  if(zhjiajian==1)</p><p><b>  {</b></p><p><b>  zh++;</b></p><p><b>  if(z

93、h==8)</b></p><p><b>  {</b></p><p><b>  zh=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>

94、;  else</b></p><p><b>  {</b></p><p><b>  zh--;</b></p><p><b>  if(zh==0)</b></p><p><b>  {</b></p><p&g

95、t;<b>  zh=7;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ds1302_write(wddr,(zh/10)<<4|(zh%10));</p><p>  write_nyr(yddr,z

96、h);</p><p>  lcd1602_writecom(0x80+yddr);</p><p>  lcd1602_writecom(0x0f);</p><p>  lcd1602_writecom(0x80+yddr);</p><p><b>  }</b></p><p>  Voi

97、d rijia(uchar rddr,uchar wddr,uchar yddr,uchar rijiajian)</p><p><b>  {</b></p><p>  u3=ds1302_read(rddr);</p><p>  ri=((u3&0x70)>>4)*10+(u3&0x0f);//進制轉(zhuǎn)換&l

98、t;/p><p>  if(rijiajian==1)</p><p><b>  {</b></p><p><b>  ri++;</b></p><p>  if(ri==31)</p><p><b>  {</b></p><p

99、><b>  ri=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

100、;p><b>  ri--;</b></p><p>  if((ri+1)==0)</p><p><b>  {</b></p><p><b>  ri=30;</b></p><p><b>  }</b></p><p&

101、gt;<b>  }</b></p><p>  ds1302_write(wddr,(ri/10)<<4|(ri%10));</p><p>  write_nyr(yddr,ri);</p><p>  lcd1602_writecom(0x80+yddr);</p><p>  lcd1602_writ

102、ecom(0x0f);</p><p>  lcd1602_writecom(0x80+yddr);</p><p><b>  }</b></p><p>  void yuejia (uchar rddr,uchar wddr,uchar yddr,uchar yuejiajian)//鍵盤掃描</p><p>&l

103、t;b>  {</b></p><p>  u4=ds1302_read(rddr);</p><p>  yue=((u4&0x70)>>4)*10+(u4&0x0f);//進制轉(zhuǎn)換</p><p>  if(yuejiajian==1)</p><p><b>  {</b&g

104、t;</p><p><b>  yue++;</b></p><p>  if(yue==13)</p><p><b>  {</b></p><p><b>  yue=0;</b></p><p><b>  }</b>&l

105、t;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  yue--;</b></p><p>  if((yue+1)==0)</

106、p><p><b>  {</b></p><p><b>  yue=12;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ds1302_write(wddr,(yue/1

107、0)<<4|(yue%10));</p><p>  write_nyr(yddr,yue);</p><p>  lcd1602_writecom(0x80+yddr);</p><p>  lcd1602_writecom(0x0f);</p><p>  lcd1602_writecom(0x80+yddr);</p&

108、gt;<p><b>  }</b></p><p>  void nianjia (uchar rddr,uchar wddr,uchar yddr,uchar nianjiajian)//鍵盤掃描</p><p><b>  {</b></p><p>  u5=ds1302_read(rddr);<

109、;/p><p>  nian=((u5&0x70)>>4)*10+(u5&0x0f);//進制轉(zhuǎn)換</p><p>  if(nianjiajian==1)</p><p><b>  {</b></p><p><b>  nian++;</b></p>&l

110、t;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  nian--;</b></p><p><b>  }</b></p>

111、<p>  ds1302_write(wddr,(nian/10)<<4|(nian%10));</p><p>  write_nyr(yddr,nian);</p><p>  lcd1602_writecom(0x80+yddr);</p><p>  lcd1602_writecom(0x0f);</p><p&

112、gt;  lcd1602_writecom(0x80+yddr);</p><p><b>  }</b></p><p>  void nyrset()</p><p><b>  {</b></p><p><b>  do</b></p><p>

113、<b>  {</b></p><p>  if(P31==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P31==0)</p><p><b>  {</

114、b></p><p>  while(!(P31));</p><p><b>  linshi=1;</b></p><p><b>  anshu++;</b></p><p>  if(anshu==1)</p><p>  {a6=ds1302_read(

115、0x8B);zh=((a6&0x70)>>4)*10+(a6&0x0f);</p><p>  write_nyr(13,zh);lcd1602_writecom(0x80+13);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+13);</p><p><b>  }</b>&l

116、t;/p><p>  if(anshu==2)</p><p>  {a1=ds1302_read(0x87);ri=((a1&0x70)>>4)*10+(a1&0x0f);</p><p>  write_nyr(8,ri);lcd1602_writecom(0x80+8);lcd1602_writecom(0x

117、0f); lcd1602_writecom(0x80+8);</p><p><b>  }</b></p><p>  if(anshu==3)</p><p><b>  {</b></p><p>  a2=ds1302_read(0x89);</p><p>

118、;  yue=((a2&0x70>>4))*10+(a2&0x0f);</p><p>  write_nyr(5,yue);</p><p>  lcd1602_writecom(0x80+5);</p><p>  lcd1602_writecom(0x0f);</p><p>  lcd1602_writec

119、m(0x80+5);</p><p><b>  }</b></p><p>  if(anshu==4)</p><p><b>  {</b></p><p>  a3=ds1302_read(0x8D);</p><p>  nian=((a3&0x70>

120、>4))*10+(a3&0x0f)</p><p>  write_nyr(2,nian);</p><p>  lcd1602_writecom(0x80+2);</p><p>  lcd1602_writecom(0x0f);</p><p>  lcd1602_writecom(0x80+2);</p>&

121、lt;p><b>  }</b></p><p>  if(anshu==5)</p><p><b>  {</b></p><p><b>  linshi=0;</b></p><p><b>  anshu=0;</b></p>

122、<p>  ds1302_write(0x80,0x00);lcd1602_writecom(0x38);</p><p>  lcd1602_writecom(0x0c);</p><p><b>  }</b></p><p><b>  }</b></p><p>  }i

123、f (anshu==1)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p>  zhjia(0x8B,0x8A,13,1);</p>

124、;<p><b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P33==0)</p><p><b

125、>  {</b></p><p>  while(!P33);</p><p>  zhjia(0x8B,0x8A,13,0);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

126、/b></p><p>  if (anshu==2)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p>  while(!P32);</p><p>  r

127、ijia(0x87,0x86,8,1);</p><p><b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>  if(P33=

128、=0)</p><p><b>  {</b></p><p>  while(!P33);</p><p>  rijia(0x87,0x86,8,0);</p><p><b>  }</b></p><p><b>  }</b></p>

129、;<p><b>  }</b></p><p>  if (anshu==3)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p>  while(!P

130、32);yuejia(0x89,0x88,5,1);</p><p><b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5);</b></p><p&g

131、t;  if(P33==0)</p><p><b>  {</b></p><p>  while(!P33);</p><p>  yuejia(0x89,0x88,5,0);</p><p><b>  }</b></p><p><b>  }</b&

132、gt;</p><p><b>  }</b></p><p>  if (anshu==4)</p><p><b>  {</b></p><p>  if(P32==0)</p><p><b>  {</b></p><p&g

133、t;  while(!P32);</p><p>  nianjia(0x8D,0x8C,2,1);</p><p><b>  }</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p><b>  delay(5

134、);</b></p><p>  if(P33==0)</p><p><b>  {</b></p><p>  while(!P33);nianjia(0x8D,0x8C,2,0);</p><p><b>  }</b></p><p><b&

135、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  while(linshi);</p><p><b>  }</b></p><p>  void init()<

136、/p><p><b>  {</b></p><p>  uchar num;</p><p>  Init_DS18B20();</p><p>  lcd1602_init();</p><p>  //ds1302_init();</p><p><b>  r

137、d=0;</b></p><p>  for(num=0;num<15;num++)</p><p><b>  {</b></p><p>  lcd1602_writedata(table[num]);</p><p><b>  delay(5);</b></p>

138、<p><b>  }</b></p><p>  lcd1602_writecom(0x80+0x40); //換行</p><p>  for(num=0;num<8;num++)</p><p><b>  {</b></p><p>  lcd1602_writedat

139、a(table1[num]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {&

140、lt;/b></p><p><b>  init();</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  sfmset();</b></p><p&

141、gt;<b>  nyrset();</b></p><p>  u=ds1302_read(0x81);</p><p>  miao=((u&0x70)>>4)*10+(u&0x0f);</p><p>  write_sfm(6,miao);</p><p>  u1=ds1302_re

142、ad(0x83);</p><p>  fen=((u1&0x70)>>4)*10+(u1&0x0f);</p><p>  write_sfm(3,fen);</p><p>  u2=ds1302_read(0x85);</p><p>  shi=((u2&0x70)>>4)*10+(u2

143、&0x0f);</p><p>  write_sfm(0,shi);</p><p>  u3=ds1302_read(0x87);</p><p>  ri=((u3&0x70)>>4)*10+(u3&0x0f);</p><p>  write_nyr(8,ri);</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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論