課程設計-單片機基于單片機的數(shù)字時鐘設計_第1頁
已閱讀1頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  引 言</b></p><p>  數(shù)字電子時鐘,自從它問世起,就是人們的好朋友,是人們日常生活中必不可少的電子產品,廣泛用于生活的方方面面,給人們的學習、生活、工作帶來了極大的方便。但隨著時間的推移,科學技術的不斷發(fā)展,生活節(jié)奏越來越快,競爭日益激烈,人們對時間計量的精度要求越來越高,應用越來越廣。通常使用的晶振芯片設計的電子時鐘,在生活中使用是一個很不錯的選

2、擇,然而在工業(yè)現(xiàn)場,環(huán)境惡劣,勢必會影響走時的進度,我們試想一下,大型的工業(yè)現(xiàn)場的走時如果因為環(huán)境的惡劣而不精確,導致的生產損失將有多大。而利用開關量控制的PLC來設計的時鐘是不會因為環(huán)境的因素而發(fā)生走時誤差,從而,在工業(yè)現(xiàn)場最好使用PLC設計的時鐘。</p><p>  本文主要介紹在工業(yè)現(xiàn)場應用的時鐘用PLC的設計。通過PLC我們設計的這種走時精確的的時鐘,終究會變成產品走進工業(yè)現(xiàn)場。</p>

3、<p>  1 設計的目的及意義</p><p>  本設計通過用對一個能實現(xiàn)定時,時鐘顯示功能的時間系統(tǒng)的設計學習,讓我們了解到了51單片機應用中的數(shù)據(jù)轉換顯示,數(shù)碼管顯示原理,靜態(tài)掃描顯示原理,單片機的定時中斷原理等,從而達到學習、了解單片機相關指令在各方面的應用,讓我們學到更多關于單片機方面的知識。 </p><p><b>  2 芯片簡介</b

4、></p><p>  2.1 STC80C52單片機芯片引腳功能介紹</p><p>  單片機的40個引腳大致可分為4類:電源、時鐘、控制和I/O引腳。</p><p> ?、?電源: ⑴ VCC - 芯片電源,接+5V;⑵ VSS - 接地端;</p><p> ?、?時鐘:XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出

5、端。</p><p> ?、?控制線:控制線共有4根,⑴ ALE/PROG:地址鎖存允許/片內EPROM編程脈沖 ① ALE功能:用來鎖存P0口送出的低8位地址 ② PROG功能:片內有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。⑵ PSEN:外ROM讀選通信號。⑶ RST/VPD:復位/備用電源。① RST(Reset)功能:復位信號輸入端。② VPD功能:在Vcc掉電情況下,接備用電源。⑷ E

6、A/Vpp:內外ROM選擇/片內EPROM編程電源。① EA功能:內外ROM選擇端。② Vpp功能:片內有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。</p><p> ?、?I/O線80C51共有4個8位并行I/O端口:P0、P1、P2、P3口,共32個引腳。P3口還具有第二功能,用于特殊信號輸入輸出和控制信號(屬控制總線)。</p><p>  2.2 STC89C52

7、單片機芯片封裝圖</p><p>  STC89C52芯片的封裝有PLCC、PQFP以及DIP—40,本設計采用的是引腳雙列直插式封裝。其封裝形式如圖2.2.1。</p><p>  圖2.2.1 STC89C52 DIP-40封裝</p><p>  2.3 DS1302芯片功能的介紹</p><p>  DS1302 是美國Dallas

8、公司生產的一種高性能、低功耗、帶RAM的實時時鐘芯片。該芯片采用3 線串行接口方式,可提供年、月、日、星期、時、分、秒等時間信息,并可根據(jù)月份和閏年的情況自動調整月份的結束日期,同時可以根據(jù)用戶需要決定是采用24 小時或12 小時格式。DS 1302 內部帶有31 個字節(jié)RAM ,用于存放臨時性數(shù)據(jù),同時具有可編程涓細電流充電能力,從而使外圍硬件電路設計得到了大大簡化。其中X1 、X2 為32. 768kHz 晶振端, GND 為地;R

9、ST 為復位端,高電平時允許I/ O 端進行數(shù)據(jù)傳輸,低電平則禁止數(shù)據(jù)傳送且使I/ O 端呈高阻狀態(tài); I/ O 為串行數(shù)據(jù)輸入、輸出端,所有輸入、輸出數(shù)據(jù)的傳送順序均以最低位LSB 打頭, 最高位MSB 結束;SCL K為同步時鐘脈沖端,其上升沿將I/ O 端數(shù)據(jù)按位寫入DS1302 ,下降沿使DS1302 按位輸出數(shù)據(jù)至I/ O 端;VCC2 、VCC1 為主電源和備份電源端,當主電源VCC2 大于備份電源VCC1 +0. 2V 時

10、,由VCC2 對芯片供電,否則,由VCC1 對芯片電。工作電壓范圍為2. 5~5. 5</p><p>  圖2.3.1 DS1302芯片引腳圖</p><p>  DS1302芯片引腳功能說明如下表2.3.1。</p><p>  表2.3.1 DS1302芯片引腳功能說明</p><p>  3 電路原理圖與功能說明</p>

11、<p><b>  3.1 晶振電路</b></p><p>  晶體振蕩器在固定頻率振蕩器中能夠提供較高的精度,絕大多數(shù)RTC采用32.768kHz的晶體,晶體振蕩器輸出經(jīng)過分頻后會產生1Hz的基準來刷新時間和日期。RTC的精度主要取決于晶振的精度,晶體振蕩器在固定頻率振蕩器中能夠提供較高的精度,絕大多數(shù)RTC采用32.768kHz的晶體,晶體振蕩器輸出經(jīng)過分頻后會產生1Hz的

12、基準來刷新時間和日期。RTC的精度主要取決于晶振的精度,晶振一般在特定的電容負載下,其調諧振蕩在正確的頻點,而當晶振調諧于12.5pF負載的RTC電路中時,使用6pF負載的晶振將會使時鐘變快。Dallas Semiconductor提供的所有RTC均采用內部偏置網(wǎng)絡,因而晶振可直接連接到RTC的X1、X2引腳,而不需要額外的元件。由于RTC的晶振輸入電路具有很高的輸入阻抗,因此,它與晶振的連線猶如一個天線,很容易耦合系統(tǒng)其余電路的高頻干

13、擾。而干擾信號被耦合到晶振引腳將導致時鐘數(shù)的增加或減少??紤]到線路板上大多數(shù)信號的頻率高于32.768kHz,所以,通常會產生額外的時鐘脈沖計數(shù)。因此,晶振應盡可能靠近X1、X2引腳安裝,同時晶振、X1/X2引腳的下方最好布成地平面。晶振電路如</p><p>  圖3.1.1 晶振電路</p><p><b>  3.2 復位電路</b></p>&l

14、t;p>  當STC89C52單片機的復位引腳RST(全稱RESET)出現(xiàn)2個機器周期以上的高電平時,單片機就執(zhí)行復位操作。如果RST持續(xù)為高電平,單片機就處于循環(huán)復位狀態(tài)。根據(jù)應用的要求,復位操作通常有兩種基本形式:上電復位和上電或開關復位。上電復位要求接通電源后,自動實現(xiàn)復位操作。上電或開關復位要求電源接通后,單片機自動復位,并且在單片機運行期間,用開關操作也能使單片機復位。上電后,由于電容的充電和反相門的作用,使RST持續(xù)一

15、段時間的高電平。當單片機已在運行當中時,按下復位鍵K后松開,也能使RST為一段時間的高電平,從而實現(xiàn)上電或開關復位的操作。復位電路如圖3.2.1</p><p>  圖 3.2.1 復位電路</p><p>  3.3 數(shù)碼管顯示電路</p><p>  所謂數(shù)碼管就是為數(shù)碼管顯示提供的各段狀態(tài)組合,即字形代碼。八段數(shù)碼管的段碼為八位,用一個字節(jié)即可表示。在段碼字節(jié)

16、中代碼位與各段發(fā)光二極管的對應關系表3.3.1。</p><p>  表3.3.1 段碼字節(jié)代碼位與發(fā)光二極管的關系</p><p>  段碼的值與數(shù)碼管公共引腳的接法有關。以八段數(shù)碼管為例,顯示十六進制的段碼值如表3.3.2。</p><p>  表3.3.2 十六進制段碼表</p><p>  并排使用的多位數(shù)碼管稱為LED顯示器。LED

17、顯示器多采用動態(tài)顯示方式,全部數(shù)碼管共用一套段碼驅動電路,各位數(shù)碼管的同段引腳短接后在借到應段碼的驅動線上。顯示時通過位控信號采用掃描的方法逐位地循環(huán)點亮各位數(shù)碼管。動態(tài)顯示雖然在任何一時刻只有一位數(shù)碼管被點亮,但是由于人眼具有的視覺殘留效應,看起來與全部數(shù)碼管持續(xù)點亮的效果完全一樣。LED顯示器動態(tài)顯示需要為各位提供段碼以及相應的位控制,此即通常所說的段控和位控。把LED顯示器段碼表預先存放在存儲器中,使用時通過查表就可以得到段碼。段

18、碼輸出后送到公共段碼線上,也可稱為段控信號。而通過并行口輸出的相互獨立的為嘛則是起選通作用的,也稱位控或掃描信號,用于選擇顯示位。數(shù)碼管電路如圖3.3.1。</p><p>  圖3.3.1 數(shù)碼管電路圖</p><p>  3.4 DS1302電路</p><p>  DS1302 所進行的一切工作必須先由CPU 向DS1302 發(fā)送命令字節(jié), 命令字節(jié)格式如圖3

19、.4.1 。各位定義如下:命令字節(jié)的最高位7 必須為“1”,否則禁止對DS1302 進行操作。第6 位是時鐘/ 日歷或RAM 選擇位, 如它為“1”可對內部RAM 讀寫,如它為“0”可對時鐘日歷操作。此處所謂日歷型數(shù)據(jù)即數(shù)據(jù)格式為壓縮型BCD 碼,且數(shù)值必須在它的定義域內;例如,“月份”的定義域為1~12“, 秒”的定義域為0~59 等等。所謂RAM型數(shù)據(jù)即指一般16 進制數(shù)據(jù)。位5 至位1 為DS1302 內部寄存器地址。DS1302

20、 有單字節(jié)和多字節(jié)兩種讀、寫方式。所謂單字節(jié)讀、寫方式即每次只能從DS1302 中讀、寫1 字節(jié)數(shù)據(jù)。所謂多字節(jié)讀、寫方式則每次可從DS1302 中連續(xù)讀、寫若干字節(jié)數(shù)據(jù)。當位5 至位1 各位均為“1”時,DS1302為多字節(jié)讀、寫方式。最低位0 為“0”表示寫操作,否則為讀操作。命令字節(jié)的傳輸都是從最低位開始。</p><p>  圖3.4.1 DS1302時鐘芯片的控制字</p><p&g

21、t;  DS1302 采用串行方式與微控制器通訊。在片選信號RST 變?yōu)楦唠娖胶?可向芯片發(fā)送指令及讀取數(shù)據(jù)。DS1302 的命令字的傳輸從最低位開始。當對DS1302 進行寫數(shù)據(jù)時,首先發(fā)寫控制指令,在控制指令字輸入后的下一個SCL K時鐘的上升沿,數(shù)據(jù)被寫入DS1302 ,數(shù)據(jù)輸入從低位即位0開始。當對DS1302 進行讀數(shù)據(jù)時,首先發(fā)讀控制指令,在緊跟8 位的控制指令字后的下一個SCL K脈沖的下降沿讀出DS1302 的數(shù)據(jù),讀出

22、數(shù)據(jù)時從低位0 位至高位7 。注意在SCLK為高電平期間,不能讀I/ O 線,此期間I/ O 端為高阻狀態(tài)。因此,在程序設計時應保證在SCLK上升沿之前讀I/ O線,即可正確讀出時鐘數(shù)據(jù)[3 ] [8 ] 。在本記錄儀表系統(tǒng)中,實時時鐘軟件首先應將日歷信息初值———秒、分、時、日、月、星期、年等按序寫入到DS1302 相關寄存器中,此后,時鐘便以此初值為基準進行計時,只要主電源VCC2 和備份電源VCC1 尚有一個工作正常,則計時就不會

23、終止。初始化日歷信息程序分為三部分:(1) 發(fā)送“解除寫保護”命令字8EH 和內容00H ,以開放DS1302 寫操作。(2) </p><p>  圖3.4.2 DS1302工作流程圖</p><p>  4.1 接口電路設計</p><p>  在溫度測量記錄儀表中,DS1302 與微處理器的接口電路如圖2 所示。該微處理器采用宏晶科技推出的STC89C516R

24、D + 單片機作為主控芯片,該產品具有片內資源豐富、超強抗干擾、高抗靜電、超低功耗、寬電壓、不怕電源抖動、在系統(tǒng)可編程、加密性強、無法解密、可降低單片機時鐘對外部電磁輻射等特點[7 ] ,其良好的性能保證了各個器件的協(xié)調可靠工作及控制要求。在電路中單片機的P1. 7 控制DS1302 的復位輸入端, P1. 4 與數(shù)據(jù)輸入/ 輸出引腳相連, P1. 3 用來作為DS1302 的輸入時鐘SCL K控制端。由于單片機復位時,所有單片機的端口

25、均為高電平,如果直接用單片機的某一口線同DS1302 的RST 相連,則影響了系統(tǒng)加電時對DS1302 的初始化,從而造成DS1302 計時的不穩(wěn)定。因此,本電路在設計時采用反相器來完成單片機的I/ O 線同DS1302 的RST 相連。供電時,儀表主電源(5 V) 接VCC2 ,備份電池采用可充電鎘鎳電池(3. 6 V) 接VCC1 ,可啟用內部涓流充電器在主電壓正常時向電池充電,以延長電池使用時間。備份電池也可用1 微法以上的超容量

26、電</p><p>  圖4.1.1 DS1302 與STC89C51 單片機的接口電路</p><p><b>  5 調試與軟件設計</b></p><p><b>  5.1 調試</b></p><p>  調試分為硬件調試和軟件調試,硬件調試就是檢測電路是否有錯誤或者有短路、虛焊、短路的現(xiàn)

27、象,通過萬用表的檢測可以最終完成硬件的調試。</p><p>  軟件調試是指通過Keil軟件編譯生成Hex文件,在通過Protus軟件的聯(lián)調,再進行仿真,出現(xiàn)所能實現(xiàn)的功能,最后通過串口下載到STC89C52單片機芯片中讓整個硬件可以得到運行。</p><p><b>  5.2 程序設計</b></p><p>  #include<

28、reg52.h></p><p>  #include<intrins.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit rtc_clk=P1^0;</p><p> 

29、 sbit rtc_io=P1^1;</p><p>  sbit rtc_rst=P1^2;</p><p>  sbit set=P1^3;</p><p>  sbit up=P1^4;</p><p>  sbit out=P1^5;</p><p>  sbit qiehuan=P1^6;</p>

30、<p>  uchar cnt,num;</p><p>  uchar done,count,temp,up_flag,flag;</p><p>  uchar time[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};</p><p>  uchar code SEG7[10]={0xc0,0xf9,0xa4,0xb

31、0,0x99,0x92,0x82,0xf8,0x80,0x90};</p><p>  //uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p>  uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hid

32、e_year;</p><p>  uchar ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; </p><p>  #define RD 0x01</p><p>  #define WR 0x00</p><p>  #define C_SEC 0x80</p><p

33、>  #define C_MIN 0x82</p><p>  #define C_HR 0x84</p><p>  #define C_DAY 0x86</p><p>  #define C_MTH 0x88</p><p>  #define C_WK 0x8a</p><p>  #define C_Y

34、R 0x8c</p><p>  #define C_WP 0x8e</p><p>  #define CLK_HALT 0x80</p><p>  #define CLK_START 0x00</p><p>  #define M12_24 0x80</p><p>  #define PROTECT 0x80

35、</p><p>  #define UNPROTECT 0x00</p><p>  void delay(uint k)</p><p><b>  {</b></p><p><b>  uint i,j;</b></p><p>  for(i=0;i<k;i+

36、+)</p><p>  for(j=0;j<121;j++);</p><p><b>  }</b></p><p>  void DS1302_writeB(uchar byte)</p><p><b>  {</b></p><p><b>  uc

37、har i;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  if(byte&0x01)</p><p><b>  rtc_io=1;</b></p><p><b&

38、gt;  else</b></p><p><b>  rtc_io=0;</b></p><p>  rtc_clk=0;</p><p>  rtc_clk=1;</p><p><b>  delay(1);</b></p><p>  byte=byte&

39、gt;>1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  uchar DS1302_readB()</p><p><b>  {</b></p><p>  uchar i,date;<

40、;/p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  date=date>>1;</p><p>  rtc_clk=1;</p><p>  rtc_clk=0;</p><p><b>

41、  delay(1);</b></p><p>  if(rtc_io==1)</p><p>  date=date|0x80;</p><p><b>  else</b></p><p>  date=date&0x7f;</p><p><b>  }<

42、/b></p><p>  return(date);</p><p><b>  }</b></p><p>  void DS1302_writeD(uchar add,uchar date)</p><p><b>  {</b></p><p>  rtc_rs

43、t=0;</p><p>  rtc_clk=0;</p><p>  rtc_rst=1;</p><p>  DS1302_writeB(add);</p><p><b>  delay(1);</b></p><p>  DS1302_writeB(date);</p>&l

44、t;p>  rtc_clk=0;</p><p>  rtc_rst=0;</p><p><b>  }</b></p><p>  uchar DS1302_readD(uchar add)</p><p><b>  {</b></p><p>  uchar

45、date;</p><p>  rtc_rst=0;</p><p>  rtc_clk=0;</p><p>  rtc_rst=1;</p><p><b>  delay(1);</b></p><p>  DS1302_writeB(add|RD);</p><p>

46、;<b>  delay(1);</b></p><p>  date=DS1302_readB();</p><p><b>  delay(1);</b></p><p>  rtc_clk=0;</p><p>  rtc_rst=0;</p><p>  return

47、(date);</p><p><b>  }</b></p><p>  void DS1302_init()//開啟ds1302</p><p><b>  {</b></p><p>  uint second;</p><p>  second=DS1302_rea

48、dD(C_SEC);</p><p>  if(second&0x80)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_SEC|WR,CLK_START);</p>

49、<p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  void DS1302_getT();<

50、/p><p><b>  }</b></p><p><b>  }</b></p><p>  void DS1302_getT()</p><p><b>  {</b></p><p>  uchar i,value;</p><p

51、>  uchar addr=0x80;</p><p>  for(i=0;i<7;i++)</p><p><b>  {</b></p><p>  value=DS1302_readD(addr);</p><p>  //time[i]=DS1302_readD(addr|RD);</p&g

52、t;<p>  time[i]=((value&0x70)>>4)*10+(value&0x0f);</p><p><b>  addr+=2;</b></p><p><b>  }</b></p><p><b>  }</b></p>&

53、lt;p>  void outkey()//跳出調整按鍵</p><p><b>  {</b></p><p><b>  //out=1;</b></p><p>  uchar second;</p><p>  if(out==0)</p><p><b

54、>  {</b></p><p>  delay(10);</p><p>  if(out==0);</p><p><b>  {</b></p><p><b>  count=0;</b></p><p>  hide_sec=0,hide_min=

55、0,hide_hour=0,hide_day=0,hide_week,hide_month=0,hide_year=0;</p><p>  //hide_sfm=0,hide_nyr=0,hide_week=0;;</p><p>  second=DS1302_readD(C_SEC);</p><p>  DS1302_writeD(C_WP|WR,UNPR

56、OTECT);</p><p>  DS1302_writeD(C_SEC|WR,second&0x7f);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p><b>  done=0;</b></p><p>  while(out==0);</p>

57、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void upkey()//升序按鍵</p><p><b>  {</b></p><

58、p>  //uchar valueble;</p><p><b>  up=1;</b></p><p><b>  if(up==0)</b></p><p><b>  {</b></p><p>  delay(20);</p><p>

59、  if(up==0);</p><p><b>  {</b></p><p>  while(up==0);</p><p>  switch(count)</p><p><b>  {</b></p><p><b>  case 1:</b>&

60、lt;/p><p>  temp=DS1302_readD(C_SEC);</p><p>  //temp=((valueble&0x70)>>4)*10+(valueble&0x0f);</p><p>  temp=temp+1;</p><p>  up_flag=1;</p><p>

61、  if((temp&0x7f)>0x59)</p><p><b>  temp=0;</b></p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  temp=DS1302_readD(C_M

62、IN);</p><p>  temp=temp+1;</p><p>  up_flag=1;</p><p>  if((temp&0x7f)>0x59)</p><p><b>  temp=0;</b></p><p><b>  break;</b>&

63、lt;/p><p><b>  case 3:</b></p><p>  temp=DS1302_readD(C_HR);</p><p>  temp=temp+1;</p><p>  up_flag=1;</p><p>  if((temp&0x7f)>0x23)</p

64、><p><b>  temp=0;</b></p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  temp=DS1302_readD(C_WK);</p><p>  temp=temp

65、+1;</p><p>  up_flag=1;</p><p>  if((temp&0x7f)>0x07)</p><p><b>  temp=1;</b></p><p><b>  break;</b></p><p><b>  case

66、5:</b></p><p>  temp=DS1302_readD(C_DAY);</p><p>  temp=temp+1;</p><p>  up_flag=1;</p><p>  if((temp&0x7f)>0x31)</p><p><b>  temp=1;&l

67、t;/b></p><p><b>  break;</b></p><p><b>  case 6:</b></p><p>  temp=DS1302_readD(C_MTH);</p><p>  temp=temp+1;</p><p>  up_flag=

68、1;</p><p>  if((temp&0x7f)>0x12)</p><p><b>  temp=1;</b></p><p><b>  break;</b></p><p><b>  case 7:</b></p><p>

69、  temp=DS1302_readD(C_YR);</p><p>  temp=temp+1;</p><p>  up_flag=1;</p><p>  if((temp&0x7f)>0x85)</p><p><b>  temp=0;</b></p><p><b&

70、gt;  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void

71、 setkey()//功能切換</p><p><b>  {</b></p><p><b>  set=1;</b></p><p>  if(set==0)</p><p><b>  {</b></p><p>  delay(10);</

72、p><p>  if(set==0)</p><p><b>  {</b></p><p>  count=count+1;</p><p><b>  done=1;</b></p><p><b>  }</b></p><p>

73、;  while(set==0);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void qiehuankey()</p><p><b>  {</b></p><p>  qiehuan=1;&

74、lt;/p><p>  if(qiehuan==0)</p><p><b>  {</b></p><p>  delay(10);</p><p>  if(qiehuan==0)</p><p><b>  {</b></p><p>  while

75、(qiehuan==0);</p><p>  num=num+1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(num==2)</p><p><b>  num=0;</b></p&

76、gt;<p><b>  }</b></p><p>  void keydone()</p><p><b>  {</b></p><p>  uchar value;</p><p>  uchar second;</p><p>  if(flag==0

77、)</p><p><b>  {</b></p><p>  temp=DS1302_readD(C_SEC);</p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_SEC|WR,temp|0x80);</p><

78、;p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p><b>  flag=1;</b></p><p><b>  }</b></p><p><b>  setkey();</b></p><p>  switch(count)&l

79、t;/p><p><b>  {</b></p><p><b>  case 1:do</b></p><p><b>  {</b></p><p><b>  outkey();</b></p><p><b>  up

80、key();</b></p><p>  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_SEC|WR,temp|0x80);</p>

81、<p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  //dis_play();</p><p>  hide_sec++;</p><p>  if(hide_

82、sec>10)</p><p>  hide_sec=0;</p><p>  value=DS1302_readD(C_SEC);</p><p>  //time[i]=DS1302_readD(addr|RD);</p><p>  time[0]=((value&0x70)>>4)*10+(value&a

83、mp;0x0f);</p><p>  }while(count==2);break;</p><p><b>  case 2:do</b></p><p><b>  {</b></p><p>  hide_sec=0;</p><p><b>  outke

84、y();</b></p><p><b>  upkey();</b></p><p>  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>

85、;  DS1302_writeD(C_MIN|WR,temp);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  hide_min++;</p><p>  i

86、f(hide_min>10)</p><p>  hide_min=0;</p><p>  value=DS1302_readD(C_MIN);</p><p>  //time[i]=DS1302_readD(addr|RD);</p><p>  time[1]=((value&0x70)>>4)*10+(

87、value&0x0f);</p><p>  }while(count==3);break;</p><p><b>  case 3:do</b></p><p><b>  {</b></p><p>  hide_min=0;</p><p><b>

88、  outkey();</b></p><p><b>  upkey();</b></p><p>  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p>&

89、lt;p>  DS1302_writeD(C_HR|WR,temp);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  hide_hour++;</p><p

90、>  if(hide_hour>10)</p><p>  hide_hour=0;</p><p>  value=DS1302_readD(C_HR);</p><p>  //time[i]=DS1302_readD(addr|RD);</p><p>  time[2]=((value&0x70)>>

91、;4)*10+(value&0x0f);</p><p>  }while(count==4);break;</p><p><b>  case 4:do</b></p><p><b>  {</b></p><p>  hide_hour=0;</p><p>

92、<b>  outkey();</b></p><p><b>  upkey();</b></p><p>  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);<

93、/p><p>  DS1302_writeD(C_WK|WR,temp);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  hide_week++;</p&g

94、t;<p>  if(hide_week>10)</p><p>  hide_week=0;</p><p>  value=DS1302_readD(C_WK);</p><p>  time[5]=((value&0x70)>>4)*10+(value&0x0f);</p><p>  }

95、while(count==5);break;</p><p><b>  case 5:do</b></p><p><b>  {</b></p><p>  hide_week=0;</p><p><b>  outkey();</b></p><p&

96、gt;<b>  upkey();</b></p><p>  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_DAY|WR,temp);

97、</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  hide_day++;</p><p>  if(hide_day>10)</p><

98、;p>  hide_day=0;</p><p>  value=DS1302_readD(C_DAY);</p><p>  time[3]=((value&0x70)>>4)*10+(value&0x0f);</p><p>  }while(count==6);break;</p><p><b&

99、gt;  case 6:do</b></p><p><b>  {</b></p><p>  hide_day=0;</p><p><b>  outkey();</b></p><p><b>  upkey();</b></p><p&

100、gt;  if(up_flag==1)</p><p><b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_MTH|WR,temp);</p><p>  DS1302_writeD(C_WP|WR,PROTE

101、CT);</p><p>  up_flag=0;</p><p><b>  }</b></p><p>  hide_month++;</p><p>  if(hide_month>10)</p><p>  hide_month=0;</p><p>  va

102、lue=DS1302_readD(C_MTH);</p><p>  time[4]=((value&0x70)>>4)*10+(value&0x0f);</p><p>  }while(count==7);break;</p><p><b>  case 7:do</b></p><p>

103、;<b>  {</b></p><p>  hide_month=0;</p><p><b>  outkey();</b></p><p><b>  upkey();</b></p><p>  if(up_flag==1)</p><p>&l

104、t;b>  {</b></p><p>  DS1302_writeD(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_YR|WR,temp);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p>  up_flag=0;</p

105、><p><b>  }</b></p><p>  hide_year++;</p><p>  if(hide_year>10)</p><p>  hide_year=0;</p><p>  value=DS1302_readD(C_YR);</p><p>  

106、time[6]=((value&0x70)>>4)*10+(value&0x0f);</p><p>  }while(count==8);break;</p><p>  case 8: count=0;</p><p>  /*hide_sfm=0;</p><p>  hide_week=0;</p&

107、gt;<p>  hide_nyr=0;*/</p><p>  hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p>  second=DS1302_readD(C_SEC);</p><p>  DS1302_writeD

108、(C_WP|WR,UNPROTECT);</p><p>  DS1302_writeD(C_SEC|WR,second&0x7f);</p><p>  DS1302_writeD(C_WP|WR,PROTECT);</p><p><b>  done=0;</b></p><p><b>  br

109、eak;</b></p><p>  default:break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void init()</p><p><b>  {</b></p

110、><p>  TMOD=0x01;</p><p><b>  TH0=0xfc;</b></p><p><b>  TL0=0x18;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</

111、b></p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  init();</b>

112、;</p><p>  DS1302_init();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  while(done==0)</p><p><b>  {</b></p>

113、;<p>  DS1302_getT();</p><p><b>  setkey();</b></p><p>  qiehuankey();</p><p><b>  flag=0;</b></p><p><b>  }</b></p>&

114、lt;p>  while(done==1)</p><p><b>  {</b></p><p>  keydone();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&

115、lt;/b></p><p>  void time0(void) interrupt 1</p><p><b>  {</b></p><p><b>  TH0=0xfc;</b></p><p><b>  TL0=0x18;</b></p><

116、;p><b>  cnt++;</b></p><p><b>  if(cnt>9)</b></p><p><b>  cnt=0;</b></p><p>  if(num==0)</p><p><b>  {</b></p>

117、;<p>  switch(cnt)</p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  if(hide_sec<6)</p><p>  {P0=SEG7[time[0]%10];P2=ACT[0];break;<

118、;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[0];break;</p><p><b>  }</b>&

119、lt;/p><p><b>  case 2:</b></p><p>  if(hide_sec<6)</p><p>  {P0=SEG7[time[0]/10];P2=ACT[1];break;</p><p><b>  }</b></p><p><b>

120、;  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[1];break;</p><p><b>  }</b></p><p><b>  case 3:</b></p><p>

121、  if(hide_min<6)</p><p><b>  {</b></p><p>  P0=SEG7[time[1]%10];P2=ACT[2];break;</p><p><b>  }</b></p><p><b>  else</b></p>

122、<p><b>  {</b></p><p>  P0=0xff;P2=ACT[2];break;</p><p><b>  }</b></p><p><b>  case 4:</b></p><p>  if(hide_min<6)</p&g

123、t;<p><b>  {</b></p><p>  P0=SEG7[time[1]/10];P2=ACT[3];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {<

124、/b></p><p>  P0=0xff;P2=ACT[3];break;</p><p><b>  }</b></p><p><b>  case 5:</b></p><p>  if(hide_hour<6)</p><p><b>  {&

125、lt;/b></p><p>  P0=SEG7[time[2]%10];P2=ACT[4];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>

126、;  P0=0xff;P2=ACT[4];break;</p><p><b>  }</b></p><p><b>  case 6:</b></p><p>  if(hide_hour<6)</p><p><b>  {</b></p><p

127、>  P0=SEG7[time[2]/10];P2=ACT[5];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[5];break

128、;</p><p><b>  }</b></p><p><b>  case 7:</b></p><p>  if(hide_week<6)</p><p><b>  {</b></p><p>  P0=SEG7[time[5]%10];

129、P2=ACT[6];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[6];break;</p><p><

130、b>  }</b></p><p><b>  case 8:</b></p><p>  if(hide_week<6)</p><p><b>  {</b></p><p>  P0=SEG7[time[5]/10];P2=ACT[7];break;</p>

131、<p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[7];break;</p><p><b>  }</b></p&g

132、t;<p><b>  }</b></p><p><b>  }</b></p><p>  if(num==1)</p><p><b>  {</b></p><p>  switch(cnt)</p><p><b>  

133、{</b></p><p><b>  case 1:</b></p><p>  if(hide_day<6)</p><p>  {P0=SEG7[time[3]%10];P2=ACT[0];break;</p><p><b>  }</b></p><p

134、><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[0];break;</p><p><b>  }</b></p><p><b>  case 2:</b></p>

135、;<p>  if(hide_day<6)</p><p>  {P0=SEG7[time[3]/10];P2=ACT[1];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

136、gt;</p><p>  P0=0xff;P2=ACT[1];break;</p><p><b>  }</b></p><p><b>  case 3:</b></p><p>  if(hide_month<6)</p><p><b>  {<

137、;/b></p><p>  P0=SEG7[time[4]%10];P2=ACT[2];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p> 

138、 P0=0xff;P2=ACT[2];break;</p><p><b>  }</b></p><p><b>  case 4:</b></p><p>  if(hide_month<6)</p><p><b>  {</b></p><p&

139、gt;  P0=SEG7[time[4]/10];P2=ACT[3];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[3];break;

140、</p><p><b>  }</b></p><p><b>  case 5:</b></p><p>  if(hide_year<6)</p><p><b>  {</b></p><p>  P0=SEG7[time[6]%10];P

141、2=ACT[4];break;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  P0=0xff;P2=ACT[4];break;</p><p><b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論