版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 引 言</b></p><p> 數(shù)字電子時(shí)鐘,自從它問(wèn)世起,就是人們的好朋友,是人們?nèi)粘I钪斜夭豢缮俚碾娮赢a(chǎn)品,廣泛用于生活的方方面面,給人們的學(xué)習(xí)、生活、工作帶來(lái)了極大的方便。但隨著時(shí)間的推移,科學(xué)技術(shù)的不斷發(fā)展,生活節(jié)奏越來(lái)越快,競(jìng)爭(zhēng)日益激烈,人們對(duì)時(shí)間計(jì)量的精度要求越來(lái)越高,應(yīng)用越來(lái)越廣。通常使用的晶振芯片設(shè)計(jì)的電子時(shí)鐘,在生活中使用是一個(gè)很不錯(cuò)的選
2、擇,然而在工業(yè)現(xiàn)場(chǎng),環(huán)境惡劣,勢(shì)必會(huì)影響走時(shí)的進(jìn)度,我們?cè)囅胍幌?,大型的工業(yè)現(xiàn)場(chǎng)的走時(shí)如果因?yàn)榄h(huán)境的惡劣而不精確,導(dǎo)致的生產(chǎn)損失將有多大。而利用開(kāi)關(guān)量控制的PLC來(lái)設(shè)計(jì)的時(shí)鐘是不會(huì)因?yàn)榄h(huán)境的因素而發(fā)生走時(shí)誤差,從而,在工業(yè)現(xiàn)場(chǎng)最好使用PLC設(shè)計(jì)的時(shí)鐘。</p><p> 本文主要介紹在工業(yè)現(xiàn)場(chǎng)應(yīng)用的時(shí)鐘用PLC的設(shè)計(jì)。通過(guò)PLC我們?cè)O(shè)計(jì)的這種走時(shí)精確的的時(shí)鐘,終究會(huì)變成產(chǎn)品走進(jìn)工業(yè)現(xiàn)場(chǎng)。</p>
3、<p> 1 設(shè)計(jì)的目的及意義</p><p> 本設(shè)計(jì)通過(guò)用對(duì)一個(gè)能實(shí)現(xiàn)定時(shí),時(shí)鐘顯示功能的時(shí)間系統(tǒng)的設(shè)計(jì)學(xué)習(xí),讓我們了解到了51單片機(jī)應(yīng)用中的數(shù)據(jù)轉(zhuǎn)換顯示,數(shù)碼管顯示原理,靜態(tài)掃描顯示原理,單片機(jī)的定時(shí)中斷原理等,從而達(dá)到學(xué)習(xí)、了解單片機(jī)相關(guān)指令在各方面的應(yīng)用,讓我們學(xué)到更多關(guān)于單片機(jī)方面的知識(shí)。 </p><p><b> 2 芯片簡(jiǎn)介</b
4、></p><p> 2.1 STC80C52單片機(jī)芯片引腳功能介紹</p><p> 單片機(jī)的40個(gè)引腳大致可分為4類(lèi):電源、時(shí)鐘、控制和I/O引腳。</p><p> ?、?電源: ⑴ VCC - 芯片電源,接+5V;⑵ VSS - 接地端;</p><p> ?、?時(shí)鐘:XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出
5、端。</p><p> ?、?控制線(xiàn):控制線(xiàn)共有4根,⑴ ALE/PROG:地址鎖存允許/片內(nèi)EPROM編程脈沖 ① ALE功能:用來(lái)鎖存P0口送出的低8位地址 ② PROG功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖。⑵ PSEN:外ROM讀選通信號(hào)。⑶ RST/VPD:復(fù)位/備用電源。① RST(Reset)功能:復(fù)位信號(hào)輸入端。② VPD功能:在Vcc掉電情況下,接備用電源。⑷ E
6、A/Vpp:內(nèi)外ROM選擇/片內(nèi)EPROM編程電源。① EA功能:內(nèi)外ROM選擇端。② Vpp功能:片內(nèi)有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp。</p><p> ?、?I/O線(xiàn)80C51共有4個(gè)8位并行I/O端口:P0、P1、P2、P3口,共32個(gè)引腳。P3口還具有第二功能,用于特殊信號(hào)輸入輸出和控制信號(hào)(屬控制總線(xiàn))。</p><p> 2.2 STC89C52
7、單片機(jī)芯片封裝圖</p><p> STC89C52芯片的封裝有PLCC、PQFP以及DIP—40,本設(shè)計(jì)采用的是引腳雙列直插式封裝。其封裝形式如圖2.2.1。</p><p> 圖2.2.1 STC89C52 DIP-40封裝</p><p> 2.3 DS1302芯片功能的介紹</p><p> DS1302 是美國(guó)Dallas
8、公司生產(chǎn)的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片。該芯片采用3 線(xiàn)串行接口方式,可提供年、月、日、星期、時(shí)、分、秒等時(shí)間信息,并可根據(jù)月份和閏年的情況自動(dòng)調(diào)整月份的結(jié)束日期,同時(shí)可以根據(jù)用戶(hù)需要決定是采用24 小時(shí)或12 小時(shí)格式。DS 1302 內(nèi)部帶有31 個(gè)字節(jié)RAM ,用于存放臨時(shí)性數(shù)據(jù),同時(shí)具有可編程涓細(xì)電流充電能力,從而使外圍硬件電路設(shè)計(jì)得到了大大簡(jiǎn)化。其中X1 、X2 為32. 768kHz 晶振端, GND 為地;R
9、ST 為復(fù)位端,高電平時(shí)允許I/ O 端進(jìn)行數(shù)據(jù)傳輸,低電平則禁止數(shù)據(jù)傳送且使I/ O 端呈高阻狀態(tài); I/ O 為串行數(shù)據(jù)輸入、輸出端,所有輸入、輸出數(shù)據(jù)的傳送順序均以最低位LSB 打頭, 最高位MSB 結(jié)束;SCL K為同步時(shí)鐘脈沖端,其上升沿將I/ O 端數(shù)據(jù)按位寫(xiě)入DS1302 ,下降沿使DS1302 按位輸出數(shù)據(jù)至I/ O 端;VCC2 、VCC1 為主電源和備份電源端,當(dāng)主電源VCC2 大于備份電源VCC1 +0. 2V 時(shí)
10、,由VCC2 對(duì)芯片供電,否則,由VCC1 對(duì)芯片電。工作電壓范圍為2. 5~5. 5</p><p> 圖2.3.1 DS1302芯片引腳圖</p><p> DS1302芯片引腳功能說(shuō)明如下表2.3.1。</p><p> 表2.3.1 DS1302芯片引腳功能說(shuō)明</p><p> 3 電路原理圖與功能說(shuō)明</p>
11、<p><b> 3.1 晶振電路</b></p><p> 晶體振蕩器在固定頻率振蕩器中能夠提供較高的精度,絕大多數(shù)RTC采用32.768kHz的晶體,晶體振蕩器輸出經(jīng)過(guò)分頻后會(huì)產(chǎn)生1Hz的基準(zhǔn)來(lái)刷新時(shí)間和日期。RTC的精度主要取決于晶振的精度,晶體振蕩器在固定頻率振蕩器中能夠提供較高的精度,絕大多數(shù)RTC采用32.768kHz的晶體,晶體振蕩器輸出經(jīng)過(guò)分頻后會(huì)產(chǎn)生1Hz的
12、基準(zhǔn)來(lái)刷新時(shí)間和日期。RTC的精度主要取決于晶振的精度,晶振一般在特定的電容負(fù)載下,其調(diào)諧振蕩在正確的頻點(diǎn),而當(dāng)晶振調(diào)諧于12.5pF負(fù)載的RTC電路中時(shí),使用6pF負(fù)載的晶振將會(huì)使時(shí)鐘變快。Dallas Semiconductor提供的所有RTC均采用內(nèi)部偏置網(wǎng)絡(luò),因而晶振可直接連接到RTC的X1、X2引腳,而不需要額外的元件。由于RTC的晶振輸入電路具有很高的輸入阻抗,因此,它與晶振的連線(xiàn)猶如一個(gè)天線(xiàn),很容易耦合系統(tǒng)其余電路的高頻干
13、擾。而干擾信號(hào)被耦合到晶振引腳將導(dǎo)致時(shí)鐘數(shù)的增加或減少??紤]到線(xiàn)路板上大多數(shù)信號(hào)的頻率高于32.768kHz,所以,通常會(huì)產(chǎn)生額外的時(shí)鐘脈沖計(jì)數(shù)。因此,晶振應(yīng)盡可能靠近X1、X2引腳安裝,同時(shí)晶振、X1/X2引腳的下方最好布成地平面。晶振電路如</p><p> 圖3.1.1 晶振電路</p><p><b> 3.2 復(fù)位電路</b></p>&l
14、t;p> 當(dāng)STC89C52單片機(jī)的復(fù)位引腳RST(全稱(chēng)RESET)出現(xiàn)2個(gè)機(jī)器周期以上的高電平時(shí),單片機(jī)就執(zhí)行復(fù)位操作。如果RST持續(xù)為高電平,單片機(jī)就處于循環(huán)復(fù)位狀態(tài)。根據(jù)應(yīng)用的要求,復(fù)位操作通常有兩種基本形式:上電復(fù)位和上電或開(kāi)關(guān)復(fù)位。上電復(fù)位要求接通電源后,自動(dòng)實(shí)現(xiàn)復(fù)位操作。上電或開(kāi)關(guān)復(fù)位要求電源接通后,單片機(jī)自動(dòng)復(fù)位,并且在單片機(jī)運(yùn)行期間,用開(kāi)關(guān)操作也能使單片機(jī)復(fù)位。上電后,由于電容的充電和反相門(mén)的作用,使RST持續(xù)一
15、段時(shí)間的高電平。當(dāng)單片機(jī)已在運(yùn)行當(dāng)中時(shí),按下復(fù)位鍵K后松開(kāi),也能使RST為一段時(shí)間的高電平,從而實(shí)現(xiàn)上電或開(kāi)關(guān)復(fù)位的操作。復(fù)位電路如圖3.2.1</p><p> 圖 3.2.1 復(fù)位電路</p><p> 3.3 數(shù)碼管顯示電路</p><p> 所謂數(shù)碼管就是為數(shù)碼管顯示提供的各段狀態(tài)組合,即字形代碼。八段數(shù)碼管的段碼為八位,用一個(gè)字節(jié)即可表示。在段碼字節(jié)
16、中代碼位與各段發(fā)光二極管的對(duì)應(yīng)關(guān)系表3.3.1。</p><p> 表3.3.1 段碼字節(jié)代碼位與發(fā)光二極管的關(guān)系</p><p> 段碼的值與數(shù)碼管公共引腳的接法有關(guān)。以八段數(shù)碼管為例,顯示十六進(jìn)制的段碼值如表3.3.2。</p><p> 表3.3.2 十六進(jìn)制段碼表</p><p> 并排使用的多位數(shù)碼管稱(chēng)為L(zhǎng)ED顯示器。LED
17、顯示器多采用動(dòng)態(tài)顯示方式,全部數(shù)碼管共用一套段碼驅(qū)動(dòng)電路,各位數(shù)碼管的同段引腳短接后在借到應(yīng)段碼的驅(qū)動(dòng)線(xiàn)上。顯示時(shí)通過(guò)位控信號(hào)采用掃描的方法逐位地循環(huán)點(diǎn)亮各位數(shù)碼管。動(dòng)態(tài)顯示雖然在任何一時(shí)刻只有一位數(shù)碼管被點(diǎn)亮,但是由于人眼具有的視覺(jué)殘留效應(yīng),看起來(lái)與全部數(shù)碼管持續(xù)點(diǎn)亮的效果完全一樣。LED顯示器動(dòng)態(tài)顯示需要為各位提供段碼以及相應(yīng)的位控制,此即通常所說(shuō)的段控和位控。把LED顯示器段碼表預(yù)先存放在存儲(chǔ)器中,使用時(shí)通過(guò)查表就可以得到段碼。段
18、碼輸出后送到公共段碼線(xiàn)上,也可稱(chēng)為段控信號(hào)。而通過(guò)并行口輸出的相互獨(dú)立的為嘛則是起選通作用的,也稱(chēng)位控或掃描信號(hào),用于選擇顯示位。數(shù)碼管電路如圖3.3.1。</p><p> 圖3.3.1 數(shù)碼管電路圖</p><p> 3.4 DS1302電路</p><p> DS1302 所進(jìn)行的一切工作必須先由CPU 向DS1302 發(fā)送命令字節(jié), 命令字節(jié)格式如圖3
19、.4.1 。各位定義如下:命令字節(jié)的最高位7 必須為“1”,否則禁止對(duì)DS1302 進(jìn)行操作。第6 位是時(shí)鐘/ 日歷或RAM 選擇位, 如它為“1”可對(duì)內(nèi)部RAM 讀寫(xiě),如它為“0”可對(duì)時(shí)鐘日歷操作。此處所謂日歷型數(shù)據(jù)即數(shù)據(jù)格式為壓縮型BCD 碼,且數(shù)值必須在它的定義域內(nèi);例如,“月份”的定義域?yàn)?~12“, 秒”的定義域?yàn)?~59 等等。所謂RAM型數(shù)據(jù)即指一般16 進(jìn)制數(shù)據(jù)。位5 至位1 為DS1302 內(nèi)部寄存器地址。DS1302
20、 有單字節(jié)和多字節(jié)兩種讀、寫(xiě)方式。所謂單字節(jié)讀、寫(xiě)方式即每次只能從DS1302 中讀、寫(xiě)1 字節(jié)數(shù)據(jù)。所謂多字節(jié)讀、寫(xiě)方式則每次可從DS1302 中連續(xù)讀、寫(xiě)若干字節(jié)數(shù)據(jù)。當(dāng)位5 至位1 各位均為“1”時(shí),DS1302為多字節(jié)讀、寫(xiě)方式。最低位0 為“0”表示寫(xiě)操作,否則為讀操作。命令字節(jié)的傳輸都是從最低位開(kāi)始。</p><p> 圖3.4.1 DS1302時(shí)鐘芯片的控制字</p><p&g
21、t; DS1302 采用串行方式與微控制器通訊。在片選信號(hào)RST 變?yōu)楦唠娖胶?可向芯片發(fā)送指令及讀取數(shù)據(jù)。DS1302 的命令字的傳輸從最低位開(kāi)始。當(dāng)對(duì)DS1302 進(jìn)行寫(xiě)數(shù)據(jù)時(shí),首先發(fā)寫(xiě)控制指令,在控制指令字輸入后的下一個(gè)SCL K時(shí)鐘的上升沿,數(shù)據(jù)被寫(xiě)入DS1302 ,數(shù)據(jù)輸入從低位即位0開(kāi)始。當(dāng)對(duì)DS1302 進(jìn)行讀數(shù)據(jù)時(shí),首先發(fā)讀控制指令,在緊跟8 位的控制指令字后的下一個(gè)SCL K脈沖的下降沿讀出DS1302 的數(shù)據(jù),讀出
22、數(shù)據(jù)時(shí)從低位0 位至高位7 。注意在SCLK為高電平期間,不能讀I/ O 線(xiàn),此期間I/ O 端為高阻狀態(tài)。因此,在程序設(shè)計(jì)時(shí)應(yīng)保證在SCLK上升沿之前讀I/ O線(xiàn),即可正確讀出時(shí)鐘數(shù)據(jù)[3 ] [8 ] 。在本記錄儀表系統(tǒng)中,實(shí)時(shí)時(shí)鐘軟件首先應(yīng)將日歷信息初值———秒、分、時(shí)、日、月、星期、年等按序?qū)懭氲紻S1302 相關(guān)寄存器中,此后,時(shí)鐘便以此初值為基準(zhǔn)進(jìn)行計(jì)時(shí),只要主電源VCC2 和備份電源VCC1 尚有一個(gè)工作正常,則計(jì)時(shí)就不會(huì)
23、終止。初始化日歷信息程序分為三部分:(1) 發(fā)送“解除寫(xiě)保護(hù)”命令字8EH 和內(nèi)容00H ,以開(kāi)放DS1302 寫(xiě)操作。(2) </p><p> 圖3.4.2 DS1302工作流程圖</p><p> 4.1 接口電路設(shè)計(jì)</p><p> 在溫度測(cè)量記錄儀表中,DS1302 與微處理器的接口電路如圖2 所示。該微處理器采用宏晶科技推出的STC89C516R
24、D + 單片機(jī)作為主控芯片,該產(chǎn)品具有片內(nèi)資源豐富、超強(qiáng)抗干擾、高抗靜電、超低功耗、寬電壓、不怕電源抖動(dòng)、在系統(tǒng)可編程、加密性強(qiáng)、無(wú)法解密、可降低單片機(jī)時(shí)鐘對(duì)外部電磁輻射等特點(diǎn)[7 ] ,其良好的性能保證了各個(gè)器件的協(xié)調(diào)可靠工作及控制要求。在電路中單片機(jī)的P1. 7 控制DS1302 的復(fù)位輸入端, P1. 4 與數(shù)據(jù)輸入/ 輸出引腳相連, P1. 3 用來(lái)作為DS1302 的輸入時(shí)鐘SCL K控制端。由于單片機(jī)復(fù)位時(shí),所有單片機(jī)的端口
25、均為高電平,如果直接用單片機(jī)的某一口線(xiàn)同DS1302 的RST 相連,則影響了系統(tǒng)加電時(shí)對(duì)DS1302 的初始化,從而造成DS1302 計(jì)時(shí)的不穩(wěn)定。因此,本電路在設(shè)計(jì)時(shí)采用反相器來(lái)完成單片機(jī)的I/ O 線(xiàn)同DS1302 的RST 相連。供電時(shí),儀表主電源(5 V) 接VCC2 ,備份電池采用可充電鎘鎳電池(3. 6 V) 接VCC1 ,可啟用內(nèi)部涓流充電器在主電壓正常時(shí)向電池充電,以延長(zhǎng)電池使用時(shí)間。備份電池也可用1 微法以上的超容量
26、電</p><p> 圖4.1.1 DS1302 與STC89C51 單片機(jī)的接口電路</p><p><b> 5 調(diào)試與軟件設(shè)計(jì)</b></p><p><b> 5.1 調(diào)試</b></p><p> 調(diào)試分為硬件調(diào)試和軟件調(diào)試,硬件調(diào)試就是檢測(cè)電路是否有錯(cuò)誤或者有短路、虛焊、短路的現(xiàn)
27、象,通過(guò)萬(wàn)用表的檢測(cè)可以最終完成硬件的調(diào)試。</p><p> 軟件調(diào)試是指通過(guò)Keil軟件編譯生成Hex文件,在通過(guò)Protus軟件的聯(lián)調(diào),再進(jìn)行仿真,出現(xiàn)所能實(shí)現(xiàn)的功能,最后通過(guò)串口下載到STC89C52單片機(jī)芯片中讓整個(gè)硬件可以得到運(yùn)行。</p><p><b> 5.2 程序設(shè)計(jì)</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()//開(kāi)啟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()//跳出調(diào)整按鍵</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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計(jì)-單片機(jī)基于單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告---基于單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字時(shí)鐘.doc
- 單片機(jī)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)(數(shù)字時(shí)鐘)
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- 數(shù)字時(shí)鐘的課程設(shè)計(jì)--基于單片機(jī)的數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)數(shù)字時(shí)鐘
- 單片機(jī)數(shù)字時(shí)鐘控制課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字時(shí)鐘的設(shè)計(jì)
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告--基于單片機(jī)的電子時(shí)鐘
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)--單片機(jī)多功能電子鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-基于單片機(jī)的數(shù)字秒表的設(shè)計(jì)
- 課程設(shè)計(jì)---基于51單片機(jī)的數(shù)字時(shí)鐘
評(píng)論
0/150
提交評(píng)論