下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于單片機(jī)的萬(wàn)年歷設(shè)計(jì)二、實(shí)驗(yàn)要求設(shè)計(jì)一個(gè)萬(wàn)年歷,將時(shí)鐘顯示在 LCD1602的顯示屏上并且可以進(jìn)行年、月、 日以及時(shí)、分、秒的設(shè)置。此外還可以通過(guò)按鍵進(jìn)行鬧鐘設(shè)置以及事件提醒功能, 用蜂鳴器進(jìn)行鬧鈴提醒。最后附加一個(gè)溫濕度檢測(cè)的功能,用溫濕度傳感器檢測(cè) 室內(nèi)的溫濕度并將溫濕度數(shù)據(jù)在顯示屏上顯示出來(lái)。三、實(shí)驗(yàn)設(shè)備和儀器1 .用STC89C52E片作為系統(tǒng)板的主控芯片2 .DHT11溫濕度傳感器3 .DS1302時(shí)鐘芯片4 .LCD1602顯示屏四、實(shí)驗(yàn)各模塊原理介紹4.1 STC89C52I片機(jī)STC89C52是STC公司生產(chǎn)的一種低功耗、高性能 CMOS8位微控制器,具 有8K字節(jié)系統(tǒng)可編程
2、Flash存儲(chǔ)器。STC89C52fg用經(jīng)典的MCS-51內(nèi)核,具有 傳統(tǒng)51單片機(jī)不具備的功能。在單芯片上,擁有靈巧的 8位CPU和在系統(tǒng)可 編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、 超有效的解 決方案。(1)主要特性8K字節(jié)程序存儲(chǔ)空間;512字節(jié)數(shù)據(jù)存儲(chǔ)空間;內(nèi)帶4K字節(jié)EEPROM存儲(chǔ)空間;可直接使用串口下載;(2)器件參數(shù)1 .增強(qiáng)型8051單片機(jī),6時(shí)鐘/機(jī)器周期和12時(shí)鐘/機(jī)器周期可以任意選擇, 指令代碼完全兼容傳統(tǒng)8051。2 .工作電壓:5.5V3.3V (5V單片機(jī))/3.8V2.0V (3V單片機(jī))3 .工作頻率范圍:040MHz,相當(dāng)于普
3、通8051的080MHz,實(shí)際工作頻 率可達(dá)48MHz編輯版word4 .用戶應(yīng)用程序空間為8K字節(jié)5 .片上集成512字節(jié)RAM6 .通用I/O 口(32個(gè)),復(fù)位后為:P1/P2/P3是準(zhǔn)雙向口 /弱上拉,P0 口 是漏極開(kāi)路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需 加上拉電阻。7 . ISP (在系統(tǒng)可編程)/IAP (在應(yīng)用可編程),無(wú)需專(zhuān)用編程器,無(wú)需專(zhuān)用 仿真器,可通過(guò)用口( RXD/P3.0 , TXD/P3.1 )直接下載用戶程序,數(shù)秒即可完 成一片。8 .具有EEPROM 功能9 .共3個(gè)16位定時(shí)器/計(jì)數(shù)器。即定時(shí)器T0、T1、T2。10外部中斷4路
4、,下降沿中斷或低電平觸發(fā)電路,Power Down模式可由外 部中斷低電平觸發(fā)中斷方式喚醒o11.通用異步用行口( UART),還可用定時(shí)器軟件實(shí)現(xiàn)多個(gè) UART。12 .工作溫度范圍:-40+85 C (工業(yè)級(jí))/075c (商業(yè)級(jí))13 . PDIP 封裝1、STC89C52單片機(jī)弓唧圖o 1 W 3 $ $ 6 7 .T3P3.的爆口 陽(yáng)Elpa.溫_1_雷IIT.IL1VSS333 35333 2 丐,2 £ 2 * -*.二 2) 一二 m13 34$ bIRXwnlsnNljl&n'IBIBizoDnn3 _一匚匚匚匚匚匚匚匚1|附小必 -1 P0. 2
5、AD: Ml $:皿 M.4 AM 而$;業(yè) ra麻。7丫A_E ?JiCG 於目i K.7/JLU F3 £ AH K 5 All PJP </All PS,1<A11 陞 S/A16 PE UM P:.O M圖4.1 STC89C52單片機(jī)引腳圖主電源引腳(2根)VCC(Pin40):電源輸入,接+5V電源GND(Pin20):接地線外接晶振引腳(2根)XTAL1(Pin19):片內(nèi)振蕩電路的輸入端XTAL2(Pin20):片內(nèi)振蕩電路的輸出端控制引腳(4根)RST/VPP(Pin9):復(fù)位引腳,引腳上出現(xiàn)2個(gè)機(jī)器周期的高電平將使單編輯版word片機(jī)復(fù)位ALE/PRO
6、G(Pin30):地址鎖存允許信號(hào) PSEN(Pin29)外部存儲(chǔ)器讀選通信號(hào) EA/VPP(Pin31):程序存儲(chǔ)器的內(nèi)外部選通,接低電平從外部程序存儲(chǔ) 器讀指令,如果接高電平則從內(nèi)部程序存儲(chǔ)器讀指令??删幊梯斎?輸出弓I腳(32根)STC89C52II片機(jī)有4組8位的可編程I/O 口,分別位PR P1、P2、P3 口,每個(gè)口有8位(8根引腳),共32根。PO 口(Pin39Pin32): 8 位雙向 I/O 口線,名稱(chēng)為 P0gP0.7 P1 口(Pin1 Pin8): 8位準(zhǔn)雙向I/O 口線,名稱(chēng)為P1.0-P1.7 P2D(Pin21Pin28): 8位準(zhǔn)雙向I/O 口 線,名稱(chēng)為P2
7、.0-P2.7 P3口(Pin10Pin17): 8位準(zhǔn)雙向I/O 口線,名稱(chēng)為P3.0- P3.7。2、STC89C52單片機(jī)最小系統(tǒng)STC89C52單片機(jī)最小系統(tǒng)主要由復(fù)位電路和時(shí)鐘電路組成。復(fù)位功能通過(guò) 外部電路來(lái)實(shí)現(xiàn),按下按鍵K1控制單片機(jī)的復(fù)位。時(shí)鐘電路主要通過(guò)晶振來(lái)實(shí) 現(xiàn),為單片機(jī)提供運(yùn)行時(shí)鐘。根據(jù)不同的需求選用的晶振頻率會(huì)有差異,在本次課程設(shè)計(jì)中采用11.0592MHZ的晶振頻率。單片機(jī)復(fù)位電路如圖 4.2所示,晶振 電路如圖4.3所示。圖4.2復(fù)位電路圖4.3晶振電路4.2 DS1302K 片DS1302是DALLAS公司出的一款實(shí)時(shí)時(shí)鐘芯片,它廣泛應(yīng)用于電話、傳真、編輯版wo
8、rd便攜式儀器等產(chǎn)品領(lǐng)域,主要性能指標(biāo)如下:1、DS1302是一個(gè)實(shí)時(shí)時(shí)鐘芯片,可以提供秒、分、小時(shí)、日期、月、年等信息, 具有軟件自動(dòng)調(diào)整的能力,可以通過(guò)配置 AM/PM來(lái)決定采用24小時(shí)格式還是 12小時(shí)格式。2、擁有31字節(jié)數(shù)據(jù)存儲(chǔ)RAM。3、串行I/O通信方式。4、DS1302的工作電壓比較寬,在2.0V5.5V范圍內(nèi)均可正常工作。采用雙電源 供電,當(dāng)主電源比備用電源高 0.2V時(shí),由主電源供電,否則采用備用電源,一 般是一個(gè)紐扣電池。5、DS1302實(shí)時(shí)時(shí)鐘芯片的功耗很低,當(dāng)工作電壓為2.0V時(shí),工作電流小于300nA。 6、DS1302共有8個(gè)引腳,有兩種封裝形式,一種是 DIP-
9、8封裝,芯片寬度(不含 弓唧)是300mil, 一種是SOP-8封裝,有兩種寬度,一種是150mil, 一種是208mil。(1) DS1302弓唧及其功能VcC2X1X2GNDIorIL2 g 7 36 4 Q 5HVcci zisclk in i/oUCE圖4.4 DS1302芯片引腳圖(1) Vcc2:主電源引腳,當(dāng) Vcc2比Vcc1高0.2v以上時(shí),DS1302由Vcc2供電, 當(dāng)Vcc2低于Vcc1時(shí),由Vcc1供電。(2、3) X1、X2:這兩個(gè)引腳需要接一個(gè)32.768k的晶振,為了給DS1302提供 一個(gè)基準(zhǔn)。但是該晶振的引腳負(fù)載電容必須為 6pF,若使用有源晶振,接到X1
10、上即可,X2則懸空。(4) GND :接地(5) CE: DS1302的輸入引腳。該引腳內(nèi)部有一個(gè)40k的下拉電阻,當(dāng)該引腳為 高電平,對(duì)DS1302進(jìn)行讀寫(xiě)。(6) I/O :該引腳是一個(gè)雙向通信引腳,且內(nèi)部含有一個(gè)40k的下拉電阻,可進(jìn)行數(shù)據(jù)的讀寫(xiě)。(7) SCLK:該引腳是輸入引腳,且內(nèi)部含有一個(gè) 40k的下拉電阻,作為通信的 時(shí)鐘信號(hào)。(8) Vcc1:備用電源引腳DS1302與單片機(jī)接線圖編輯版wordDS1302引腳與單片機(jī)接線圖如圖4.5所示,從圖4.5可看出,引腳X1與X2 之間接一個(gè)32.768K的晶體正振蕩器,Vcc1通過(guò)一個(gè)紐扣能電池再接地。圖4.5 DS1302與單片機(jī)
11、連接圖4.3 LCD1602液晶顯示屏LCD1602液晶屏能夠能夠同時(shí)顯示32個(gè)字符,價(jià)格便宜,編程簡(jiǎn)單而且穩(wěn) 定可靠。LCD1602液晶屏是一種圖形點(diǎn)陣顯示器,顯示原理簡(jiǎn)單易懂,都是液晶 屏內(nèi)部的液晶材料變化而顯示不同的字符,因?yàn)橐壕蔷哂辛鲃?dòng)特性的物質(zhì),所以只需外加很微小的力量即可使液晶分子運(yùn)動(dòng)。(1) LCD1602 弓唧1602LCD采用標(biāo)準(zhǔn)的14腳(無(wú)背光)或16腳(帶背光)接口,各引腳接口 圖如圖4.6所示:圖4.6 LCD1602引腳圖上二*1 ?> «>LE60W=I E F * w - 由R f Q Hl父正E口二二二二二二二=!e(a)各個(gè)引腳說(shuō)明1腳
12、:VSS為地電源2腳:VDD接5V正電源3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè) 10K的電位器調(diào)整。4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器5腳:R/W為讀寫(xiě)信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫(xiě)操作。當(dāng) RSR/W共同為低電平時(shí)可以寫(xiě)入指令或者顯示地址,當(dāng)RS為低電平,R/W為高電平;RS為高電平,R/W為低電平時(shí)可以寫(xiě)入數(shù)據(jù)。編輯版word6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。714腳:D0D7為8位雙向數(shù)據(jù)線。15腳:背光源正極16腳:背光源負(fù)極(b
13、) LCD1602主要技術(shù)參數(shù):顯示容量:32個(gè)字符;芯片工作電壓:4.5-5.5V;工作電流:2.0mA (5.0V);模塊最佳工作電壓:5.0V;(2) LCD1602與單片機(jī)接線圖圖4.7 LCD1602與單片機(jī)接線圖LCD1602與單片機(jī)接線圖如 4.7所示,背光源正極(5)與VDD (2)均接電源,將液 晶顯示器接地保證對(duì)比度最強(qiáng),可使用一個(gè)10K的電位器進(jìn)行調(diào)整。4.4溫濕度傳感器DHT11DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳 感器。它采用專(zhuān)用的數(shù)字模塊采集技術(shù)、溫濕度傳感技術(shù),確保產(chǎn)品的可靠性、 長(zhǎng)期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC
14、測(cè)溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此,該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力 強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。每個(gè)DHT11傳感器都在極為精確的濕度校驗(yàn)室中進(jìn)行校準(zhǔn)。校準(zhǔn)系數(shù)以程 序的形式儲(chǔ)存在OTP內(nèi)存中,傳感器內(nèi)部在檢測(cè)信號(hào)的處理過(guò)程中要調(diào)用這些 校準(zhǔn)系數(shù)。單線制串行接口,使系統(tǒng)集成變得簡(jiǎn)易快捷。超小的體積、極低的功編輯版word耗,信號(hào)傳輸距離可達(dá)20米以上,使其成為各類(lèi)應(yīng)用甚至最為苛刻的應(yīng)用場(chǎng)合 的最佳選則。產(chǎn)品為4針單排引腳封裝,連接方便,特殊封裝形式可根據(jù)用戶需 求而提供。(1) DHT11引腳及其功能VCC、DHT11的引腳圖如圖4,8所示,一般情況下它有四個(gè)引腳,分別為:4-
15、1所示。DOUT、NC、GND。各引腳以及功能如表圖4.8 DHT11引腳圖表4-1 DHT11引腳及其功能pin名稱(chēng)注釋1VDD供電 3-5.5VDC2DATA申行數(shù)據(jù),單總線3NC空腳,請(qǐng)懸空4GND接地,電源負(fù)極1.電源引腳DHT11的供電電壓為3-5.5V。傳感器上電后,要等待1s以越過(guò)不穩(wěn)定狀態(tài) 在此期間無(wú)需發(fā)送任何指令。電源引腳(VDD , GND)之間可增加一個(gè)100nF的 電容,作用在于去耦濾波。2洋行接口(單線雙向)DATA是用于微處理器與DHT11之間的通信和同步的串行雙 向接口,采用單總線數(shù)據(jù)格式。每次通信都是以高位先出的順序傳 輸40位數(shù)據(jù),用時(shí)約為4 mso數(shù)據(jù)格式為
16、:8位濕度整數(shù)數(shù)據(jù)+8位濕度小數(shù)數(shù)據(jù)+8位溫度整數(shù)數(shù)據(jù)+8位溫度小數(shù)數(shù)據(jù) +8位校驗(yàn)和數(shù)據(jù)。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,當(dāng)前小數(shù)部分用于以后擴(kuò)展,編輯版word現(xiàn)讀出為零。數(shù)據(jù)傳送正確時(shí),校驗(yàn)和數(shù)據(jù)等于“8位濕度整數(shù)數(shù)據(jù)+8位濕度小數(shù)數(shù)據(jù)+8位溫度整數(shù)數(shù)據(jù)+8位溫度小數(shù)數(shù)據(jù)”所得結(jié)果的末 8位。(2) DHT11與單片機(jī)接線圖DHT11與單片機(jī)的接線圖如圖4,9所示,由圖4.9中可看出,DHT11第三個(gè)引腳接單片機(jī)的P2.2引腳,第一個(gè)引腳接電阻和發(fā)光二極管。圖4.9 DHT11與單片機(jī)接線圖4.5蜂鳴器蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器, 采用直流電壓供電,廣泛應(yīng)用于計(jì) 算機(jī)、打印機(jī)、復(fù)印機(jī)、
17、報(bào)警器、電子玩具、汽車(chē)電子設(shè)備、電話機(jī)、定時(shí)器等 電子產(chǎn)品中作發(fā)聲器件。蜂鳴器可分為無(wú)源蜂鳴器和有源蜂鳴器兩種,此處我們用到的是有源蜂鳴器。有源蜂鳴器工作的理想信號(hào)是直流電,通常標(biāo)示為VDC、VDD等。因?yàn)榉澍Q器內(nèi)部有一簡(jiǎn)單的振蕩電路,能將恒定的直流電轉(zhuǎn)化成一定 頻率的脈沖信號(hào),從而帶動(dòng)鋁片振動(dòng)發(fā)音。有源蜂鳴器主要靠壓電效應(yīng)的原理來(lái)發(fā)聲的,且內(nèi)部帶有多諧振蕩器,可產(chǎn)生1.5-2.5kHZ的電壓信號(hào)。由此有源蜂鳴器才能發(fā)聲。有源蜂鳴器在單片機(jī)中 的電路圖較為簡(jiǎn)單,圖4.10為蜂鳴器與單片機(jī)的接線圖。圖4.10蜂鳴器與單片機(jī)的接線圖有源蜂鳴器直接接上額定電源就可連續(xù)發(fā)聲,I/O 口輸出后接一個(gè)1K
18、的電 阻,目的在于基極限流,以低電平方式,啟動(dòng)蜂鳴器發(fā)聲。五、流程圖編輯版word(1)主程序流程圖圖5.1是系統(tǒng)主程序流程圖,系統(tǒng)開(kāi)始時(shí)先進(jìn)行初始化,然后再調(diào)整時(shí)間和 鬧鐘,再通過(guò)串口屏將時(shí)間顯示出來(lái)。主程序流程圖鬧鐘、事件設(shè)置子程序N F.LCD1602顯示圖5.1主程序流程圖(2)子程序流程圖系統(tǒng)從主程序開(kāi)始執(zhí)行,分別調(diào)用各個(gè)子程序,其中子程序包括DS1302子程序,DHT11子程序和LCD1602子程序等。(1) DS1302芯片子程序流程圖DS1302為實(shí)時(shí)時(shí)鐘芯片,可以提供秒、分、時(shí)、日、月、年及星期等信息, 具有軟件自動(dòng)調(diào)整的能力,可以通過(guò)配置 AM/PM來(lái)決定采用24小時(shí)格式還
19、是 12小時(shí)格式。從DS1302中可以讀出年、月、日、時(shí)、分、秒等信息。圖5.2為DS1302芯片的子程序流程圖:編輯版wordDS1302子程序流程圖開(kāi)始圖5.2 DS1302子程序流程圖(2) DHT11子程序流程圖DHT11為溫濕度傳感器,可以實(shí)時(shí)顯示環(huán)境中的溫濕度。其數(shù)據(jù)由 8位濕 度整數(shù)數(shù)據(jù),8位濕度小數(shù)數(shù)據(jù),8位溫度整數(shù)數(shù)據(jù)和8位溫度小數(shù)數(shù)據(jù)以及8 位校驗(yàn)和數(shù)據(jù)。DHT11子程序流程圖如5.3所示:DHT11子程序流程圖開(kāi)始結(jié)束圖5.3 DHT11子程序流程圖編輯版word(3) LCD1602子程序流程圖LCD1602顯示時(shí),也要先進(jìn)行初始化,緊接著讀指令, 讀完之后寫(xiě)指令,冉
20、對(duì)數(shù)據(jù)進(jìn)行讀寫(xiě),然后顯示出來(lái),其流程圖如圖 5.4所示。LCD1602子程序庫(kù)程圖開(kāi)始初始化讀寫(xiě)指令讀寫(xiě)數(shù)據(jù)返回J J圖5.4 LCD1602顯示屏子程序流程圖六、實(shí)驗(yàn)?zāi)康? .學(xué)會(huì)并掌握可keil軟件的使用;2 .學(xué)會(huì)并掌握Altium Designer軟件的使用;3 .實(shí)現(xiàn)萬(wàn)年歷的基本功能;4 .通過(guò)實(shí)驗(yàn)鞏固單片機(jī)相關(guān)知識(shí)和檢驗(yàn)自身動(dòng)手能力七、實(shí)驗(yàn)內(nèi)容本次實(shí)驗(yàn)使用STC89C52單片機(jī)作為主控芯片,使用 DS1302芯片作為時(shí)鐘 芯片,在LCD1602顯示屏上顯示,并可以設(shè)置鬧鐘和事件提醒功能,此外還可 以進(jìn)行室內(nèi)溫濕度的檢測(cè)和顯示,最終完成萬(wàn)年歷的設(shè)計(jì)。八、實(shí)驗(yàn)步驟1 .查詢資料,確定主
21、控芯片、溫濕度傳感器、時(shí)鐘芯片以及LCD1602顯示屏 的使用說(shuō)明。2 .根據(jù)功能要求進(jìn)行硬件電路的設(shè)計(jì),使用 Altium Designer軟件設(shè)計(jì)電路。 整個(gè)電路分為主控芯片控制模塊、LCD1602顯示模塊、按鍵設(shè)置模塊、蜂鳴器電編輯版word路模塊以及DHT11溫濕度傳感器模塊。硬件電路圖如圖 1所示:圖8.1:硬件電路圖DS1302中讀鬧鐘秒值的命令字節(jié)DS1302中寫(xiě)鬧鐘秒值的命令字節(jié)DS1302中讀鬧鐘分值的命令字節(jié)DS1302中寫(xiě)鬧鐘分值的命令字節(jié)DS1302中讀鬧鐘小時(shí)值命令字節(jié)DS1302中寫(xiě)鬧鐘小時(shí)值命令字節(jié)3根據(jù)電路圖編寫(xiě)C語(yǔ)言代碼:代碼如下:#include <r
22、eg52.h>#define uchar unsigned char#define uint unsigned int#define lcddata P0 #define readalarmsecond 0xc7 / 定義從# define writealarmsecond 0xc6 / 定義往# define readalarmminute 0xc5 / 定義從# define writealarmminute 0xc4 / 定義往# define readalarmhour 0xc3 / 定義從#define writealarmhour 0xc2 / 定義往編輯版word#defi
23、ne readeventday0xd7 /定義從 DS1302中讀事件提醒日期值的命令 字節(jié)#define writeeventday 0xd6 /定義往 DS1302中寫(xiě)事件提醒日期值的命令字 節(jié)#define readeventmonth 0xd5 /定義從 DS1302中讀事件提醒月份值的命令 字節(jié)#define writeeventmonth 0xd4 /定義往 DS1302中寫(xiě)事件提醒月份值的命令 字節(jié)#define readeventyear 0xd3 /定義從 DS1302中讀事件提醒年份值的命令字 節(jié)#define writeeventyear0xd2 /定義往 DS1302中
24、寫(xiě)事件提醒年份值的命令字 節(jié)sbit lcdrs=P2A7;/LCD 數(shù)據(jù) /命令選擇端(H/L)sbit lcdrw=P2A6;/LCD 讀/寫(xiě)選擇端(H/L)sbit lcden=P2A5;/LCD 使能控制sbit beep=P1A3; /蜂鳴器控制端sbit DQ = P1A4;/溫濕度傳感器sbit kmenu=P3A2;/ 功能鍵sbit kup=P3A3;/ 增大鍵sbit kdown=P3A4;/ 減小鍵sbit kalarm=P3A5; /鬧鐘查看鍵 Ring:顯示鬧鐘需要調(diào)到的時(shí)間編輯版word sbit kevent=P3A6; 事件查看鍵Ding:顯示事件提醒需要調(diào)到的
25、時(shí)間/sbit kmode=P3A7;/切換溫濕度顯示sbit dsclk=P2A2;/ds1302的時(shí)鐘信號(hào)端sbit dsdata=P2A1; /ds1302 的數(shù)據(jù) I/O 端sbit dsrst=P2A0; /ds1302 的復(fù)位端sbit ACC7=ACCA7; /定義累加器的最高和最低位。sbit ACC0=ACCA0;bit flagalarm,flagseta,flagset; 分別定義鬧鐘響標(biāo)志位,鬧鐘設(shè)置標(biāo)志位,時(shí)間設(shè)置標(biāo)志位bit flagevent,flagsseta;/分別定義事件提醒標(biāo)志位,事件提醒設(shè)置標(biāo)志位 uchar FLAG,k; uchar temp;uch
26、ar T data H,T data L,RH data H,RH data L,checkdata;ucharT_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp; uchar comdata;uchar kmenunum,s,m,h,dd,mm,yy;/功能鍵被按次數(shù)的計(jì)數(shù)器 .char second,minute,hour,year,month,day,week;uchar inittime7=0x59,0x59,0x11,0x05,0x07,0x04,0x18;初始化后設(shè)置為:/2018年7月5
27、日星期四,11點(diǎn)59分59秒,/從左往右的數(shù)據(jù)依次是,秒,分,時(shí),日,月,星期,年。編輯版word/ 年月日星期:2018-07-05 THU / 時(shí)間:11:59:59uchar code t1="-" 液晶固定顯示部分。uchar code t2=":"/各函數(shù)聲明void delay(uint z); /毫秒級(jí)延時(shí)函數(shù)。void di(); /蜂鳴器發(fā)聲函數(shù)。void writecom(uchar com); 液晶寫(xiě)命令函數(shù)。void writedata(uchar dat); /腋晶寫(xiě)數(shù)據(jù)函數(shù)。void writetime(uchar add,u
28、char dat); 液晶刷新時(shí)分秒。void writenyr(uchar add,uchar dat); 液晶刷新 日期。void writeweek(uchar week); / 液晶星期幾顯示函數(shù)。void keyscan(); /鍵盤(pán)掃描函數(shù)。void dswritebyte(uchar d);/ 往 DS1302 寫(xiě)入一個(gè)字節(jié)。uchar dsreadbyte(); /隊(duì) DS1302 讀出一個(gè)字節(jié)。void dswrite(uchar add, uchar dat); / 向 DS1302 的指定地址寫(xiě)入一個(gè)字節(jié)uchar dsread(uchar add);耿 DS1302的指
29、定地址讀出一個(gè)字節(jié)void init1302time(uchar *pClock); /DS1302 時(shí)間初始化函數(shù)void init(); /初始化函數(shù)void Delay_100us(uint j);/施時(shí) 100usvoid Delay_10us(void);/延時(shí) 10us void COM(void);編輯版wordvoid Read_DHT11(void);void delay(uint z) 毫秒級(jí)延時(shí)函數(shù)。(uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void di() /蜂鳴器發(fā)聲函數(shù)。(beep=0;delay(100);
30、beep=1;void writecom(uchar com) 液晶寫(xiě)命令函數(shù)。(lcdrs=0;/置為寫(xiě)入命令lcddata=com;/ 送入數(shù)據(jù)delay(1);lcden=1;/拉高使能端delay(1);lcden=0;/完成高脈沖編輯版wordvoid writedata(uchar dat) /腋晶寫(xiě)數(shù)據(jù)函數(shù)。(lcdrs=1;/置為寫(xiě)入數(shù)據(jù)lcddata=dat;/ 送入數(shù)據(jù)delay;lcden=1;delay;lcden=0;void writetime(uchar add,uchar dat) 液晶刷新時(shí)分秒。9為秒。/3為時(shí)的開(kāi)始位置,6為分,uchar shi,ge;s
31、hi=dat/10;ge=dat%10;writecom(0x80+0x40+add);writedata(0x30+shi);writedata(0x30+ge);void writenyr(uchar add,uchar dat) / 液晶刷新日期。/0為年,3為月,6為日uchar shi,ge;shi=dat/10;編輯版wordge=dat%10;writecom(0x80+add);writedata(0x30+shi);writedata(0x30+ge);void writeweek(uchar week) /液晶星期幾顯示函數(shù)。writecom(0x80+9); /從第一行隔
32、十三個(gè)字符后開(kāi)始寫(xiě)星期switch(week)case 1: writedata('M');writedata('O');writedata('N');break;case 2: writedata('T');writedata('U');writedata('E');break;case 3: writedata('W');writedata('E');writedata('D');break;編輯版wordcase 4: writedata(
33、9;T');writedata('H');writedata('U');break;case 5: writedata('F');writedata('R');writedata('I');break;case 6: writedata('S');writedata('A');writedata('T');break;case 7: writedata('S');writedata('U');writedata('N
34、39;);break;)void keyscan() /鍵盤(pán)掃描函數(shù)。(if(flagalarm=1)|(flagevent=1) /如果鬧鐘在響或者有事件提醒,任意鍵停止鬧鐘響或者取消事件提醒編輯版wordif(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)|(kevent=0) (delay(5);if(kmenu=0)|(kup=0)|(kdown=0)|(kalarm=0)|(kevent=0)(while(!(kmenu&&kup&&kdown&&kalarm&&kevent);di();fl
35、agalarm=0;/清除鬧鐘標(biāo)志。flagevent=0; /消除事件提醒標(biāo)志。if(kmenu=0) /檢測(cè)功能鍵。(delay(5);if(kmenu=0)(kmenunum+; /記錄功能鍵按下次數(shù)。if(flagseta=1) /檢測(cè)是否在進(jìn)行鬧鐘設(shè)置。if(kmenunum=4) kmenunum=1; / 因?yàn)檫M(jìn)行鬧鐘設(shè)置時(shí),只調(diào)節(jié)時(shí)分秒,所以,kmenunum只能等于1,2,3編輯版wordif(flagsseta=1) /檢測(cè)是否在進(jìn)行事件提醒設(shè)置。if(kmenunum=8) kmenunum=5; / 因?yàn)檫M(jìn)行事件提醒設(shè)置時(shí),只調(diào)節(jié)年月曰,所以,kmenunum只能等于5
36、,6,7flagset=1; /設(shè)置標(biāo)志位,表示在進(jìn)行各種時(shí)間設(shè)置。while(!kmenu);di();switch(kmenunum) /定位光標(biāo)閃爍點(diǎn)。case 1: whtecom(0x80+0x40+10); /秒閃爍。writecom(0x0f); / 開(kāi)光標(biāo)閃爍。break;case 2: whtecom(0x80+0x40+7); /分閃爍。break;case 3: writecom(0x80+0x40+4); / 時(shí)閃爍。break;case 4: whtecom(0x80+10); /星期閃爍.break;case 5: writecom(0x80+7); /.B 閃爍.
37、break;case 6: whtecom(0x80+4); /M 閃爍.break;case 7: writecom(0x80+1); /與閃爍.編輯版word break;case 8: kmenunum=0;writecom(0x0c); /取消光標(biāo)閃爍。flagset=0; 取消時(shí)間調(diào)節(jié)標(biāo)志。dswHte(0x8e,0x00); /*允許寫(xiě)操作 */dswrite(0x80,second/10*16+second%10);dswrite(0x82,minute/10*16+minute%10);dswrite(0x84,hour/10*16+hour%10);dswrite(0x8a,
38、week/10*16+week%10);dswrite(0x86,day/10*16+day%10);dswrite(0x88,month/10*16+month%10);dswrite(0x8c,year/10*16+year%10);dswHte(0x8e,0x80); /*禁止寫(xiě)操作 */ break;if(kmenunum!=0)/只有當(dāng)功能鍵按下時(shí),才檢測(cè)增大,減小鍵.if(kup=0)delay(5);編輯版wordif(kup=0)while(!kup);di();switch(kmenunum) /根據(jù)功能鍵被按下的次數(shù),調(diào)節(jié)相應(yīng)數(shù)值。case 1: second+;if(se
39、cond=60)second=0;writetime(9,second);writecom(0x80+0x40+10);/ 因?yàn)?,上面送液晶顯小break; / 一次,光標(biāo)后移一位,所以要將光標(biāo)復(fù)位case 2: minute+;if(minute=60)minute=0;writetime(6,minute);writecom(0x80+0x40+7);break;case 3: hour+;if(hour=24)編輯版wordhour=0;writetime(3,hour);writecom(0x80+0x40+4);break;case 4: week+;if(week=8)week=1
40、;writeweek(week);writecom(0x80+11);break;case 5: day+;if(day=32)day=1;writenyr(6,day);writecom(0x80+7);break;case 6: month+;if(month=13)month=1;writenyr(3,month);writecom(0x80+4);break;編輯版wordcase 7: year+;if(year=100)year=0;writenyr(0,year);writecom(0x80+1);break;if(kdown=0)delay(5);if(kdown=0)whil
41、e(!kdown);di();switch(kmenunum) /根據(jù)功能鍵被按次數(shù)調(diào)節(jié)相應(yīng)數(shù)值case 1: second-;if(second=-1)second=59;writetime(9,second);編輯版wordwritecom(0x80+0x40+10);break;case 2: minute-;if(minute=-1)minute=59;writetime(6,minute);writecom(0x80+0x40+7);break;case 3: hour-;if(hour=-1)hour=23;writetime(3,hour);writecom(0x80+0x40+
42、4);break;case 4: week-;if(week=0)week=7;writeweek(week);writecom(0x80+11);break;case 5: day-;if(day=0)編輯版wordcase 6: month-;day=31;writenyr(6,day);writecom(0x80+7);break;if(month=0)month=12;writenyr(3,month);writecom(0x80+4);break;case 7: year-;if(year=-1)year=99;writenyr(0,year);writecom(0x80+1);br
43、eak;if(kalarm=0) /檢測(cè)鬧鐘調(diào)節(jié)鍵是否按下,此條if語(yǔ)句與if(kmenunum!=0)/在同一個(gè)層次編輯版worddelay(5);if(kalarm=0)(flagseta=-flagseta;while(!kalarm);di();if(flagseta=0)/止匕時(shí),退出鬧鐘設(shè)置,保存各相關(guān)數(shù)值。(flagset=0; /清除時(shí)間設(shè)置標(biāo)志,在 if(kalarm=0)這個(gè)if語(yǔ)句whtecom(0x80+0x40沖,不用flagset=1這條語(yǔ)句來(lái)設(shè)置/flagset標(biāo)志位,因?yàn)槿绻M(jìn)行了鬧鐘時(shí)間的設(shè)置就會(huì)執(zhí)行前面if(kmenunum=0)語(yǔ)句中的flagset=1這
44、條語(yǔ)句。writedata(' '); /消除液晶上的 “ Ri鬧鐘調(diào)節(jié)標(biāo)志?!眞ritedata(' ');whtecom(0x0c); /取消光標(biāo)閃爍dswhte(0x8e,0x00); /*允許寫(xiě)操作 */dswrite(writealarmsecond,second/10*16+second%10); / 往DS1302中保存鬧鐘的時(shí)分秒值。dswrite(writealarmminute,minute/10*16+minute%10);dswrite(writealarmhour,hour/10*16+hour%10);dswhte(0x8e,0x80
45、); /*禁止寫(xiě)操作 */編輯版wordelse /進(jìn)入鬧鐘設(shè)置s=dsread(readalarmsecond)/16*10+dsread(readalarmsecond)%76;讀取DS1302中保存的鬧鐘時(shí)分秒原始值,轉(zhuǎn)化為十進(jìn)制數(shù)存進(jìn)s,m,h保存,用以后面判斷鬧鐘時(shí)間是否到達(dá)。*/m=dsread(readalarmminute)/16*10+dsread(readalarmminute)%16;h=dsread(readalarmhour)/16*10+dsread(readalarmhour)%16;second=s; /把鬧鐘時(shí)間的十進(jìn)制數(shù)據(jù)傳送給變量second,minute
46、,hou用以調(diào)節(jié)其值。minute=m;hour=h;writecom(0x80+0x40);writedata('R'); /液晶顯示鬧鐘調(diào)節(jié)標(biāo)志。writedata('i');writetime(3,hour); /送液晶顯示鬧鐘時(shí)間。writetime(6,minute);writetime(9,second);if(kevent=0) / 檢測(cè)事件提醒調(diào)節(jié)鍵是否按下,此條if語(yǔ)句與if(kmenunum!=0)編輯版word/在同一個(gè)層次delay(5);if(kevent=0)(flagsseta=-flagsseta;while(!kevent);d
47、i();if(flagsseta=0) 此時(shí),退出事件提醒設(shè)置,保存各相關(guān)數(shù)值。(flagset=0;/清除時(shí)間設(shè)置標(biāo)志,在 if(kevent=0)這個(gè)if語(yǔ)句writecom(0x80+9);/中,不用flagset=1這條語(yǔ)句來(lái)設(shè)置/flagset標(biāo)志位,因?yàn)椋绻M(jìn)行了事件提醒時(shí)間的設(shè) 置/,就會(huì)執(zhí)行前面 if(kmenunum=0)語(yǔ)句中的flagset=1這條語(yǔ) 旬。writedata(' '); /消除液晶上的 “ Ti事件提醒調(diào)節(jié)標(biāo)志?!眞ritedata(' ');writedata(' ');whtecom(0x0c); /取
48、消光標(biāo)閃爍dswhte(0x8e,0x00); /*允許寫(xiě)操作 */dswrite(writeeventyear,year/10*16+year%10)/ 往 DS1302 中保存事件提醒的年月日值編輯版word dswrite(writeeventmonth,month/10*16+month%10);dswrite(writeeventday,day/10*16+day%10);dswhte(0x8e,0x80); /*禁止寫(xiě)操作 */else /進(jìn)入事件提醒設(shè)置。yy=dsread(readeventyear)/16*10+dsread(readeventyear)%16 讀取DS130
49、2中保存的事件提醒年月日原始值,轉(zhuǎn)化為十進(jìn)制數(shù)存進(jìn)yy,mm,dd保存, 用以后面判斷事件提醒時(shí)間是否到達(dá)。*/mm=dsread(readeventmonth)/16*10+dsread(readeventmonth)%16;dd=dsread(readeventday)/16*10+dsread(readeventday)%16;year=yy; /把事件提醒時(shí)間的十進(jìn)制數(shù)據(jù)傳送給變量 hour,day,month,weekffl 以調(diào)節(jié)其值。month=mm;day=dd;writecom(0x80+9);writedata('T'); /液晶顯示事件提醒設(shè)置標(biāo)志。wri
50、tedata('i');writedata('');writenyr(0,year);/送液晶顯示事件提醒時(shí)間。writenyr(3,month);writenyr(6,day);編輯版word)void dswritebyte(uchar d)/ 往 DS1302 寫(xiě)入一個(gè)字節(jié)。(uchar i;ACC=d;for(i=8;i>0;i-)(dsdata=ACC0;dsclk=1;/*為什么這里時(shí)鐘先為1后為0,因?yàn)閐sclk初始化為0,而,每次循環(huán)最后,都將其置0這樣就形成一個(gè)從0開(kāi)始的上升沿,恰好滿足ds1302寫(xiě)數(shù)據(jù)在上升沿,但是,時(shí)鐘必須從0開(kāi)始的
51、要求*/dsclk=0;ACC=ACC>>1;)uchar dsreadbyte() /M DS1302 讀出一個(gè)字節(jié)。編輯版worduchar i;for(i=8;i>0;i-)(ACC=ACC>>1;ACC7=dsdata;dsclk=1; /讀數(shù)據(jù)也一樣,雖然是下降沿,但是,也要從0開(kāi)始.這樣 設(shè)置dsclk剛好滿足要求。dsclk=0;return ACC;void dswrite(uchar add,uchar dat) / 向 DS1302 的指定地址寫(xiě)入一個(gè)字節(jié)。(dsrst=0;dsclk=0;dsrst=1;dswritebyte(add); /
52、*先寫(xiě)入地址,命令字節(jié)*/dswritebyte(dat); /* 冉寫(xiě) 1Byte 數(shù)據(jù) */dsclk=1;dsrst=0;uchar dsread(uchar add) /仄 DS1302的指定地址讀出一個(gè)字節(jié) .編輯版worduchar dat;dsrst=0;dsclk=0;dsrst=1;dswritebyte(add); /*先寫(xiě)入地址,命令字節(jié)*/dat=dsreadbyte(); /* 再讀 1Byte 數(shù)據(jù) */dsclk=1;dsrst=0;return dat;void init1302time(uchar *pClock) /DS1302 時(shí)間初始化函數(shù).(uchar
53、 i;uchar add=0x80;dswhte(0x8e,0x00); /*允許寫(xiě)操作 */for(i=7;i>0;i-)(dswrite(add,*pClock); /*依次寫(xiě)入秒分時(shí)日月星期年*/0,pClock+;add+=2; /因?yàn)镈S1302同一個(gè)時(shí)鐘寄存器占兩個(gè)地址,最低位為編輯版word /用于寫(xiě)的地址,最低位為1,是用于讀的地址.所以add加2.dswhte(0x8e,0x80); /*禁止寫(xiě)操作 */void init() /初始化函數(shù)。(uchar num;/變量初始化.flagset=0; /時(shí)間設(shè)置標(biāo)志位置0,表示未進(jìn)行時(shí)間設(shè)置flagseta=0; /鬧鐘設(shè)
54、置標(biāo)志位置 0.flagalarm=0;/鬧鐘標(biāo)志位置0.kmenunum=0; /功能鍵被按次數(shù)計(jì)數(shù)器置0.lcdrw=0;/DS1302初始化。dswhte(0x8e,0x00); /*允許寫(xiě)操作 */dswrite(0x80,0x00);/打開(kāi) DS1302晶振,使其開(kāi)始工作。dswrite(0x84,0x00);/ 設(shè)置為 24 小時(shí)制。init1302time(inittime);/ 初始化時(shí)間為:/2018年7月5日 星期四,11點(diǎn)59分59秒,/從左往右的數(shù)據(jù)依次是,秒,分,時(shí),日,月,星期,年dswhte(0x8e,0x80); /*禁止寫(xiě)操作 */1602液晶初始化。writecom(0x38);/ 開(kāi)顯
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年中國(guó)茜素黃GG數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年活動(dòng)型整紙機(jī)項(xiàng)目投資價(jià)值分析報(bào)告
- 2024至2030年存幣器項(xiàng)目投資價(jià)值分析報(bào)告
- 2024年中國(guó)美腸靈市場(chǎng)調(diào)查研究報(bào)告
- 2024年木屑顆粒機(jī)項(xiàng)目可行性研究報(bào)告
- 2024年ABS塑膠漁餌項(xiàng)目可行性研究報(bào)告
- 2024年中國(guó)壁掛電鍋爐市場(chǎng)調(diào)查研究報(bào)告
- 中國(guó)汽車(chē)軸承產(chǎn)業(yè)發(fā)展現(xiàn)狀及應(yīng)用前景預(yù)測(cè)研究報(bào)告(2024-2030版)
- 中國(guó)水轉(zhuǎn)印油墨行業(yè)發(fā)展態(tài)勢(shì)及投資盈利預(yù)測(cè)研究報(bào)告(2024-2030版)
- 中國(guó)景區(qū)造雪機(jī)發(fā)展現(xiàn)狀調(diào)研與前景預(yù)測(cè)分析研究報(bào)告(2024-2030版)
- 咖啡線下活動(dòng)策劃方案
- 草原牧歌-鴻雁 課件 2024-2025學(xué)年人音版(簡(jiǎn)譜)(2024)初中音樂(lè)七年級(jí)上冊(cè)
- 期中模擬試卷(1-4單元)(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 期中測(cè)試卷(1-3單元)(試題)-2024-2025學(xué)年六年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 人教版八年級(jí)上冊(cè)生物期中考試試卷
- 2024年江蘇省淮安市中考英語(yǔ)試題卷(含答案解析)
- 《醫(yī)療機(jī)構(gòu)工作人員廉潔從業(yè)九項(xiàng)準(zhǔn)則》制定主題學(xué)習(xí)課件
- 《大學(xué)美育》 課件 22.模塊五 第二十二章 光影交織的攝影藝術(shù)之美
- 2024-2030年月子中心行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資前景研究報(bào)告
- 2024-2025一年級(jí)上冊(cè)科學(xué)教科版1.5 《植物的變化》課件
- 2024語(yǔ)文新教材培訓(xùn)講座:初中語(yǔ)文教材修訂的變與不變
評(píng)論
0/150
提交評(píng)論