找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 14569|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的1602萬(wàn)年歷程序設(shè)計(jì)資料(附帶小鬧鐘)可做單組自動(dòng)打鈴系統(tǒng)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:309367 發(fā)表于 2018-6-18 14:11 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
自己做過(guò)的設(shè)計(jì)資料,現(xiàn)在放在51hei論壇上,用得著的朋友可以下去用,功能簡(jiǎn)單易懂,一些不好的地方可以自己開(kāi)發(fā)或者拓展改進(jìn)。純粹學(xué)習(xí)用

設(shè)計(jì)主要研究基于單片機(jī)的自動(dòng)打鈴系統(tǒng)。設(shè)計(jì)的系統(tǒng)利用時(shí)鐘芯片提供走時(shí),并由單片機(jī)對(duì)其進(jìn)行監(jiān)測(cè)和控制,然后通過(guò)顯示模塊將時(shí)間數(shù)據(jù)反饋給用戶(hù),同時(shí)根據(jù)用戶(hù)設(shè)定的時(shí)刻進(jìn)行打鈴提醒。設(shè)計(jì)采用的核心控制器是STC89C51單片機(jī),確保對(duì)時(shí)鐘的實(shí)時(shí)監(jiān)測(cè);提供時(shí)鐘信號(hào)的芯片是DS1302,可以產(chǎn)生較為精準(zhǔn)的時(shí)鐘;所有的時(shí)間數(shù)據(jù)通過(guò)LCD1602顯示器反饋給用戶(hù),這款顯示器具有體積小巧、功耗低的優(yōu)點(diǎn);最后根據(jù)用戶(hù)設(shè)定時(shí)間用蜂鳴器打鈴輸出。通過(guò)對(duì)系統(tǒng)的軟、硬件進(jìn)行設(shè)計(jì),并進(jìn)行系統(tǒng)仿真和系統(tǒng)測(cè)試,完成對(duì)基于單片機(jī)的自動(dòng)打鈴系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。



Abstract

The design mainly studies the automatic bell ringing system based on single chip microcomputer. The designed system uses the clock chip to provide travel time, and monitors and controls it by the single chip computer. Then the time data is fed back to the user through the display module, and the bell is remined by the time set by the user. The core controller used in the design is the STC89C51 microcontroller to ensure real-time monitoring of the clock. The chip of the clock signal is DS1302, which can produce a more accurate clock. All the time data are fed back to the user through the LCD1602 display. This display has the advantages of small size and low power consumption; finally, it is based on the user. Set the time to bell the output by the buzzer. Through the design of the hardware and software of the system, and the system simulation and system debugging, the design and implementation of the automatic bell system based on single chip microcomputer is completed.


              目錄            

第1章 緒論

1.1 研究的目的和意義

1.2國(guó)內(nèi)外的發(fā)展研究狀況

1.3研究的基本任務(wù)與方案設(shè)計(jì)

1.3.1 研究任務(wù)

1.3.2 方案設(shè)計(jì)

1.4 文檔的內(nèi)容與結(jié)構(gòu)

第2章 硬件電路的設(shè)計(jì)與實(shí)現(xiàn)

2.1 硬件電路總體設(shè)計(jì)

2.2 單片機(jī)最小系統(tǒng)

2.3 顯示電路設(shè)計(jì)

2.4 按鍵電路設(shè)計(jì)

2.5 時(shí)間電路設(shè)計(jì)

2.6 打鈴電路的設(shè)計(jì)

第3章 軟件電路的設(shè)計(jì)與實(shí)現(xiàn)

3.1 軟件系統(tǒng)設(shè)計(jì)

3.2 顯示子程序

3.3 按鍵子程序

3.4 時(shí)間子程序

3.5 打鈴子程序

第4章 開(kāi)發(fā)軟件的介紹及系統(tǒng)測(cè)試

4.1 開(kāi)發(fā)軟件的介紹

4.1.1 Proteus
4.1.2 Keil C

4.2 系統(tǒng)仿真

4.3 系統(tǒng)測(cè)試

第5章 結(jié)論
參考文獻(xiàn)
致謝
附錄

附錄一:自動(dòng)打鈴系統(tǒng)原理圖

附錄二:源程序


第1章 緒論
1.1
研究的目的和意義

隨著電子計(jì)算機(jī)技術(shù)的高速發(fā)展,以及其在信息處理系統(tǒng)中的廣泛應(yīng)用,單片機(jī)作為一種采用超大規(guī)模集成電路技術(shù)、并把具有數(shù)據(jù)處理能力的中央處理器CPU和隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)/計(jì)數(shù)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的計(jì)算機(jī)系統(tǒng)。其體積小、功能強(qiáng)、成本低、適用范圍廣,體現(xiàn)出了其很大的使用價(jià)值?v觀(guān)我們現(xiàn)在生活的各個(gè)領(lǐng)域,從導(dǎo)彈的導(dǎo)航裝置,到飛機(jī)上各種儀表的控制,從計(jì)算機(jī)的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,到工業(yè)自動(dòng)化過(guò)程的實(shí)時(shí)控制和數(shù)據(jù)處理,以及我們生活中廣泛使用的各種智能IC卡、電子寵物等,這些都離不開(kāi)單片機(jī)。以前沒(méi)有單片機(jī)時(shí),這些東西也能做,但是只能使用復(fù)雜的模擬電路,然而這樣做出來(lái)的產(chǎn)品不僅體積大,而且成本高,并且會(huì)因?yàn)殚L(zhǎng)期使用,使得元器件不斷老化,控制的精度自然也會(huì)達(dá)不到標(biāo)準(zhǔn)。在單片機(jī)產(chǎn)生后,我們就將控制這些東西變得智能化了,我們只需要在單片機(jī)外圍接一點(diǎn)簡(jiǎn)單的接口電路,核心部分只是由人為的寫(xiě)入程序來(lái)完成。這樣產(chǎn)品的體積變小了,成本也降低了,長(zhǎng)期使用也不會(huì)擔(dān)心精度達(dá)不到的問(wèn)題。所以,它的魔力不僅是在現(xiàn)在,在將來(lái)將會(huì)有更多的人來(lái)接受它、使用它。據(jù)統(tǒng)計(jì),我國(guó)的單片機(jī)年容量已達(dá)到3億片,且每年以大約30%的速度高速增長(zhǎng)。隨著開(kāi)發(fā)以及推出單片機(jī)的公司越來(lái)越多,各種高性能的單片機(jī)芯片市場(chǎng)也日趨活躍。新技術(shù)的不斷加入和納入使用,使得單片機(jī)的性能和種類(lèi)及其應(yīng)用范圍不斷增強(qiáng)和擴(kuò)大。集成的功能及其展現(xiàn)出的性能得到了逐步的全面和強(qiáng)化,所以單片機(jī)會(huì)越來(lái)越受到廣大用戶(hù)的青睞和使用。

而今,在很多的公共場(chǎng)所,例如學(xué)校、機(jī)關(guān)、工廠(chǎng)、車(chē)站等單位,都是用電鈴作為作息時(shí)間信號(hào)的。而最原始的電鈴控制方式就是人工打鈴,采用邏輯電路進(jìn)行控制,其原理簡(jiǎn)單、便于操作,但會(huì)導(dǎo)致設(shè)備體積過(guò)大,不利于臨時(shí)調(diào)整。所以,就引入以單片機(jī)為基礎(chǔ)控制的自動(dòng)打鈴系統(tǒng),這樣不僅節(jié)省了人力,同時(shí)也使得設(shè)備的集成化大大提高,而且便于設(shè)備的調(diào)整。為此,設(shè)計(jì)一種基于單片機(jī)的自動(dòng)打鈴系統(tǒng),采用數(shù)字鐘和自動(dòng)打鈴系統(tǒng)相結(jié)合的方式。該系統(tǒng)一單片機(jī)為核心來(lái)控制各個(gè)功能模塊,使用者可以隨時(shí)對(duì)作息時(shí)間進(jìn)行修改,可以很方便地設(shè)定作息時(shí)間方案。這是一個(gè)集數(shù)字鐘顯示、設(shè)置、打鈴為一體的多功能打鈴計(jì)時(shí)系統(tǒng)。這樣,通過(guò)簡(jiǎn)單的設(shè)置,就可以滿(mǎn)足任何學(xué)校、企事業(yè)公共場(chǎng)所和單位的需求。而本設(shè)計(jì)就是理論與實(shí)踐并重,對(duì)于有效地掌握單片機(jī)的應(yīng)用具有很重要的意義。

1.2國(guó)內(nèi)外的發(fā)展研究狀況

自1986年德國(guó)誕生了世界上第一款商用電子時(shí)鐘后,電子鐘的發(fā)展趨勢(shì)在全球逐步蔓延開(kāi)來(lái)。繼德國(guó)之后,日本也普及了電子鐘,英國(guó)、美國(guó)以及大多數(shù)歐洲國(guó)家也都在將消費(fèi)者的熱點(diǎn)轉(zhuǎn)移到了電子鐘表上面,逐步提高了市場(chǎng)占有率。中國(guó)是繼德、日、英、美以后,第五個(gè)擁有電子鐘制造技術(shù)的國(guó)家。中國(guó)科學(xué)院國(guó)家授時(shí)中心與西安高華科技有限公司,在河南建立了電子鐘研發(fā)基地,用于開(kāi)發(fā)多功能的電子鐘表和數(shù)字電子鐘等產(chǎn)品,極大地推動(dòng)了電子鐘行業(yè)的發(fā)展。中國(guó)第一款數(shù)字電子時(shí)鐘已經(jīng)推出針對(duì)中國(guó)市場(chǎng)接受中國(guó)國(guó)家授時(shí)中心信號(hào)的多功能電子鐘表,走時(shí)精確,在信號(hào)覆蓋區(qū)域外日累計(jì)誤差小于0.5秒,質(zhì)量可靠,價(jià)格僅為國(guó)外同期同類(lèi)競(jìng)品的1/8。從區(qū)域格局來(lái)看,全國(guó)已形成以廣州、深圳為龍頭的珠三角地區(qū)、福建、浙江、江蘇、山東、天津等6大多功能時(shí)鐘主產(chǎn)區(qū);從產(chǎn)量來(lái)看,我國(guó)已成為世界多功能時(shí)鐘生產(chǎn)大國(guó),多功能時(shí)鐘產(chǎn)量穩(wěn)居世界第一。監(jiān)測(cè)數(shù)據(jù)顯示,2011年,我國(guó)多功能時(shí)鐘的產(chǎn)量達(dá)到2.89億只。我國(guó)多功能時(shí)鐘行業(yè)發(fā)展雖然取得長(zhǎng)足的進(jìn)步,但國(guó)內(nèi)多功能時(shí)鐘企業(yè)及其品牌在國(guó)際市場(chǎng)上的信譽(yù)度和影響力還微不足道,產(chǎn)量占比雖然已經(jīng)達(dá)到80%以上。可見(jiàn),其發(fā)展趨勢(shì)迅猛。而隨著技術(shù)的進(jìn)步,各種新的的功能也負(fù)之而上,使得電子鐘的精度大大提高。例如,在國(guó)外企業(yè)中,日本RICOH公司推出的時(shí)鐘芯片甚至已經(jīng)出現(xiàn)時(shí)基軟件調(diào)校功能(TTF)及振蕩器停振自動(dòng)檢測(cè)功能而且芯片的價(jià)格極為低廉。目前,這些芯片已被客戶(hù)大量使用中。最新一代時(shí)鐘芯片產(chǎn)品中,除了包含第二代產(chǎn)品所具有的全部功能,更加入了復(fù)合功能,如低電壓檢測(cè),主備用電池切換功能,抗印制板漏電功能,且本身封裝更。ǜ叨 0.85mm,面積僅2mm*2mm),如RICOH公司的代表產(chǎn)品R2051。而如今,使用范圍較廣的多功能電子時(shí)鐘一般由振蕩器,分頻器,譯碼器,顯示器等部分組成,這些都是數(shù)字電路中最基本的,應(yīng)用最廣的電路。當(dāng)前市場(chǎng)上已有現(xiàn)成的數(shù)字鐘集成電路芯片出售,價(jià)格較便宜。由于數(shù)字集成電路技術(shù)的發(fā)展,使數(shù)字電子鐘具有走時(shí)準(zhǔn)確,性能穩(wěn)定,攜帶方便等特點(diǎn),是目前人們生活和工作補(bǔ)課或缺的報(bào)時(shí)用品。國(guó)內(nèi)廠(chǎng)家的產(chǎn)品擁有時(shí)間、日期、溫度、夜光、貪睡功能、倒計(jì)時(shí)、順計(jì)時(shí)、省電模式、多組鬧鐘、可循環(huán)顯示、多檔亮度調(diào)節(jié)、12/24時(shí)制轉(zhuǎn)換、調(diào)節(jié)亮度、遙控操作等功能。比如美國(guó)的INTEL公司在上世紀(jì)80年代推出的AT89C51芯片與HD7279芯片構(gòu)成的鍵盤(pán)控制電路,通過(guò)程序的編寫(xiě)控制I/O口的輸出進(jìn)而控制顯示定時(shí)數(shù)據(jù)及打鈴電路。當(dāng)然也有部分采用德州儀器公司產(chǎn)的8255芯片為核心部件的打鈴系統(tǒng),原理都大同小異,F(xiàn)今在一些特殊的對(duì)定時(shí)精確度要求高的領(lǐng)域。比如,微電子方面,體育競(jìng)技項(xiàng)目等行業(yè),單片機(jī)技術(shù)顯然會(huì)有一定的誤差,于是隨之出現(xiàn)了部分通過(guò)計(jì)算機(jī)控的打鈴系統(tǒng),或者是結(jié)合其他影像技術(shù)設(shè)計(jì)而成的打鈴系統(tǒng)。隨著技術(shù)的不斷發(fā)展,自動(dòng)打鈴系統(tǒng)不斷地走向體積小、模塊化的集成電路的形式,在一些大型的電子設(shè)備或機(jī)械儀器中充當(dāng)不可或缺的一部分,基于單片機(jī)為基礎(chǔ)的打鈴系統(tǒng)不僅有較成熟的技術(shù)而且成本低廉、體積小,根據(jù)功能需求可以很容易的設(shè)計(jì)多元的定時(shí)器,未來(lái)的自動(dòng)打鈴系統(tǒng)將會(huì)朝著多元化的趨勢(shì)行進(jìn),比如定時(shí)與記憶保護(hù)功能的實(shí)現(xiàn),基于單片機(jī)為基礎(chǔ)的自動(dòng)打鈴系統(tǒng)適合于低成本的大量生產(chǎn),多元化發(fā)展的道路上具有很大的發(fā)展前景。

1.3研究的基本任務(wù)與方案設(shè)計(jì)
1.3.1 研究任務(wù)

研究基于單片機(jī)的自動(dòng)打鈴系統(tǒng)設(shè)計(jì),掌握基于單片機(jī)自動(dòng)打鈴系統(tǒng)工作原理與設(shè)計(jì)思想,并設(shè)計(jì)具體電路,達(dá)到一定的設(shè)計(jì)要求,熟悉基本電路原理及模擬技術(shù),掌握基于單片機(jī)的自動(dòng)打鈴系統(tǒng)的結(jié)構(gòu)及原理,具體電路設(shè)計(jì)和功能等。

1.3.2 方案設(shè)計(jì)

方案的確立與論證

根據(jù)設(shè)計(jì)要求,進(jìn)行方案設(shè)計(jì),形成以數(shù)字邏輯電路為基礎(chǔ)的方案一、以單片機(jī)位控制核心的方案二。對(duì)這兩種方案說(shuō)明如下:

方案一:采用數(shù)字邏輯電路(即與或非等門(mén)電路)設(shè)計(jì)的自動(dòng)打鈴系統(tǒng)。利用函數(shù)信號(hào)發(fā)生器來(lái)進(jìn)行脈沖信號(hào)輸出,利用74160N來(lái)設(shè)置十進(jìn)制和六進(jìn)制的進(jìn)位輸出。利用數(shù)碼顯示器來(lái)顯示時(shí)間,利用或門(mén)、與門(mén)、非門(mén)、與非門(mén)、等電路元件進(jìn)行組合實(shí)現(xiàn)打鈴的控制。

方案二:采用以51單片機(jī)為基礎(chǔ)而設(shè)計(jì)的自動(dòng)打鈴系統(tǒng)。單片機(jī)內(nèi)部存儲(chǔ)器設(shè)三個(gè)字節(jié)分別存放時(shí)鐘的時(shí)、分、秒信息。利用定時(shí)器與軟件結(jié)合實(shí)現(xiàn)1秒定時(shí)中斷,每產(chǎn)生一次中斷,存儲(chǔ)器內(nèi)相應(yīng)的秒字節(jié)值加1;若秒字節(jié)值達(dá)到60,則將其清零,并將相應(yīng)的分字節(jié)值加1;若分值達(dá)到60,則清零分字節(jié),并將時(shí)字節(jié)值加1;若時(shí)值達(dá)到24,則將時(shí)字節(jié)清零。建立完一個(gè)實(shí)時(shí)時(shí)鐘后,接下來(lái)進(jìn)行定時(shí)分析處理和打鈴輸出,當(dāng)主程序檢測(cè)到有分進(jìn)位標(biāo)志時(shí),便開(kāi)始比較當(dāng)前時(shí)間與用戶(hù)設(shè)定的定時(shí)時(shí)間是否相同,若相同,則執(zhí)行打鈴提醒功能;不相同,則返回主程序。

通過(guò)對(duì)比以上兩種方案,可以看出:方案一的設(shè)計(jì)只能事先設(shè)定打鈴時(shí)間而不能完全自動(dòng)打鈴,且在修改打鈴時(shí)間上存在一定的困難,操作過(guò)程繁瑣。而方案二中的設(shè)計(jì)就能完全實(shí)現(xiàn)自動(dòng)化,并且控制精確、操作簡(jiǎn)易、方便,也詮釋了本設(shè)計(jì)的最終要求和目的。所以,我選擇方案二進(jìn)行設(shè)計(jì)。

根據(jù)所選定的設(shè)計(jì)方案,具體的設(shè)計(jì)主要分為硬件和軟件兩大部分,現(xiàn)規(guī)劃如下:

硬件部分其中包括電路原理圖、合理選擇元器件、繪制線(xiàn)路圖,然后對(duì)硬件進(jìn)行調(diào)試、測(cè)試,達(dá)到設(shè)計(jì)要求。硬件電路采用結(jié)構(gòu)化系統(tǒng)設(shè)計(jì)方法,該方法保證設(shè)計(jì)電路的標(biāo)準(zhǔn)化、模塊化。硬件電路的設(shè)計(jì)最重要的選擇用于控制的單片機(jī),并確定與之配套的外圍芯片,使設(shè)計(jì)的系統(tǒng)既經(jīng)濟(jì)又高性能。硬件電路設(shè)計(jì)包括輸入射出接口設(shè)計(jì),畫(huà)出詳細(xì)電路圖,標(biāo)出芯片的信號(hào)、器件參數(shù)值,根據(jù)電路圖在仿真機(jī)上進(jìn)行調(diào)試,修改,最終達(dá)到設(shè)計(jì)要求。

軟件部分:首先在總體設(shè)計(jì)中完成軟件系統(tǒng)流程規(guī)劃和各模塊的功能設(shè)計(jì),然后進(jìn)行具體設(shè)計(jì),包括各模塊的流程圖,軟件程序編寫(xiě)等;最后對(duì)軟件進(jìn)行調(diào)試、測(cè)試,達(dá)到所需的功能要求。

1.4 文檔的內(nèi)容與結(jié)構(gòu)

在自動(dòng)打鈴系統(tǒng)的基礎(chǔ)上可以實(shí)現(xiàn)多種功能,設(shè)計(jì)主要研究時(shí)間內(nèi)容的顯示與時(shí)間數(shù)據(jù)的分析并響應(yīng)兩大部分。文檔共有五章。第一章對(duì)自動(dòng)打鈴系統(tǒng)的概況進(jìn)行簡(jiǎn)單的介紹,包括自動(dòng)打鈴系統(tǒng)的研究意義和當(dāng)前的發(fā)展?fàn)顩r。第二章介紹本設(shè)計(jì)的硬件電路方案,包括單片機(jī)系統(tǒng)、LCD顯示部分、按鍵部分、時(shí)鐘部分、打鈴部分等。第三章則詳細(xì)地介紹軟件系統(tǒng)的設(shè)計(jì)流程和各項(xiàng)子程序的設(shè)計(jì)流程。第四章介紹本設(shè)計(jì)用到的開(kāi)發(fā)軟件,以及對(duì)硬件的測(cè)試與調(diào)試。第五章結(jié)論里對(duì)本設(shè)計(jì)進(jìn)行了總結(jié)。


第2章 硬件電路的設(shè)計(jì)與實(shí)現(xiàn)

2.1 硬件電路總體設(shè)計(jì)

系統(tǒng)的總硬件原理圖和實(shí)物圖分別為圖2-1與圖2-2,本系統(tǒng)主要由主控電路,時(shí)鐘電路,顯示電路,按鍵電路等4 部分構(gòu)成。通過(guò)內(nèi)部定時(shí)產(chǎn)生中斷,從而使驅(qū)動(dòng)電鈴打鈴。設(shè)定51 單片機(jī)工作在定時(shí)器0工作方式1 ,每100ms產(chǎn)生一次中斷,利用軟件將基準(zhǔn)100ms 單元進(jìn)行累加,當(dāng)定時(shí)器產(chǎn)生10 次中斷就產(chǎn)生lS 信號(hào),這是秒單元加1 。同理,對(duì)分單元和時(shí)單元計(jì)數(shù)從而產(chǎn)生秒,分,時(shí)的值。由于動(dòng)態(tài)顯示法需要數(shù)據(jù)所存等硬件,接口較復(fù)雜,考慮顯示的位數(shù)和系統(tǒng)沒(méi)有其他浮躁的處理程序,所以采用LCD1602進(jìn)行顯示。本系統(tǒng)采用四個(gè)按鍵,當(dāng)時(shí)鐘時(shí)間和設(shè)置時(shí)間一致時(shí),CPU控制蜂鳴器進(jìn)行打鈴。系統(tǒng)設(shè)計(jì)的實(shí)物圖如圖2-2所示。

圖2-1總硬件電路原理圖

圖2-2總硬件電路實(shí)物圖

2.2 單片機(jī)最小系統(tǒng)

單片機(jī)的最小系統(tǒng)是指單片機(jī)工作時(shí)所需的最少元件,即:?jiǎn)纹瑱C(jī)、晶振電路、復(fù)位電路。本設(shè)計(jì)主要采用的STC89C51單片機(jī)最小系統(tǒng)如圖2-3所示。

圖2-3單片機(jī)最小系統(tǒng)

STC89C51單片機(jī)

本設(shè)計(jì)采用STC89C51單片機(jī),如圖2-4所示。STC89C51是一款高性能、低功耗的8位CMOS微處理芯片其具備4K的FLASH程序存儲(chǔ)器,256字節(jié)的內(nèi)部RAM、6個(gè)不同的中斷源、4和中斷優(yōu)先級(jí)、4個(gè)8位I/O口、2個(gè)16位的定時(shí)計(jì)數(shù)器、全雙工的串口通信。

圖2-4 STC89C51單片機(jī)引腳圖

各引腳的用途如下所示:

  • VCC(40):接電源+5V,用于電路供電。
  • GND(20):接地,用于保護(hù)電路。
  • XTAL1(19)和XTAL2(18):當(dāng)時(shí)鐘脈沖式輸入狀態(tài)時(shí),用外部振蕩電路,如果有1個(gè)外接電容,就用時(shí)鐘電路。當(dāng)外部時(shí)鐘脈沖來(lái)臨時(shí),用來(lái)接輸入的脈沖信號(hào)。由于石英晶體和外部電容的作用,故該口也有反向放大的作用。
  • P0(39-32):雙向I/O口,不拓展的情況下,可用作普通的輸入輸出使用。也可用作地址數(shù)據(jù)總線(xiàn)口使用、
  • P1(1-8):準(zhǔn)雙向通用I/O口,可輸出推動(dòng)4個(gè)肖特基TTL負(fù)載,一般加一個(gè)上拉電阻以便外部接收器不被損壞,此時(shí)它就是輸入端口。
  • P2(21-28):不拓展時(shí),用作一般的雙向I/O口,當(dāng)它為 8 位雙向 I/O 口時(shí),P2 緩沖器可以接受輸出的 4個(gè)晶體管-晶體管邏輯電路門(mén)限電流。當(dāng) P2口收到的信號(hào)為“1”時(shí)候,說(shuō)明外加的電壓大于單片機(jī)的電壓,單片機(jī)內(nèi)部將管腳電壓升高,讓該管腳作為輸入端口。
  • P3(10-17):多用途端口。P3口管腳是由8個(gè)內(nèi)部上拉電阻組成的雙向I/O 口,可接收輸出4個(gè)TTL門(mén)電流。當(dāng)P3口收到“1”,單片機(jī)機(jī)內(nèi)部的電阻開(kāi)始作用,對(duì)此口加上高電平,使得這個(gè)管腳有輸入作用。
  • RST(9):復(fù)位信號(hào)輸入端口,收到高電位時(shí),便開(kāi)始工作,要完成復(fù)位作用就需要無(wú)外部的時(shí)鐘脈沖進(jìn)行作用。此時(shí)會(huì)出現(xiàn)多個(gè)振蕩周期的高電平信號(hào),它們加在復(fù)位端口,完成復(fù)位用。
  • EA(31):內(nèi)部和外部程序存儲(chǔ)器的選擇線(xiàn),該引腳為低電平EA=0時(shí),讀取外部ROM 0000H-FFFFH,當(dāng)該引腳為高電位時(shí),地址0000H-0FFFH訪(fǎng)問(wèn)ROM, 000H-FFFFH訪(fǎng)問(wèn)外部ROM。
  • PSEN(29):即片選程序存儲(chǔ)器選通信號(hào),當(dāng)?shù)碗娖叫盘?hào)到來(lái)時(shí),它會(huì)自動(dòng)訪(fǎng)問(wèn)單片機(jī)尾部的程序存儲(chǔ)器。但此時(shí)需要兩個(gè)連續(xù)低電平信號(hào)持續(xù)訪(fǎng)問(wèn)才有效。
  • ALE/PROG(30):ALE為高電平信號(hào),同時(shí)也是外部地址鎖存器的鎖存信號(hào)。在沒(méi)有特殊要求的情況下,F(xiàn)ALE=1/6FOSC,因此它可以用作其他芯片的時(shí)鐘源或用于定時(shí)作用。
2.3 顯示電路設(shè)計(jì)

顯示器是屬于I/O設(shè)備,即輸入輸出設(shè)備。它是一種將一定的電子文件通過(guò)特定的傳輸設(shè)備顯示到屏幕上再反射到人眼的顯示工具。而本設(shè)計(jì)的顯示部分采用的是LCD1602液晶顯示器。其電路圖和實(shí)物圖如圖2-5與圖2-6所示。這是一款工業(yè)字符型液晶,顯示質(zhì)量極高,能夠同時(shí)顯示16x02即32個(gè)字符。其顯示的原理是利用液晶的物理特性,通過(guò)電壓對(duì)其顯示區(qū)域進(jìn)行控制,即可以顯示出圖形。不過(guò),由于單片機(jī)P0口不能輸出高電平,所以必須在LCD1602 上加上拉電阻從而使其能輸出高電平。

圖2-5 LCD1602液晶顯示器電路圖

圖2-6 LCD1602液晶顯示器實(shí)物圖

LCD1602個(gè)引腳功能說(shuō)明如下:

第1引腳:GND為電源地

第2引腳:VCC接5V電源正極

第3引腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高

第4引腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。

第5引腳:RW為讀寫(xiě)信號(hào)線(xiàn),高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫(xiě)操作。

第6引腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令。

第7~14引腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。第15引腳背光正極,第16引腳背光負(fù)極。

2.4 按鍵電路設(shè)計(jì)

按鍵在電路中的作用就是通過(guò)觸點(diǎn)的接觸與斷開(kāi)來(lái)控制電路的通斷。而本設(shè)計(jì)由于鍵盤(pán)只有四個(gè),采用獨(dú)立式按鈕,通過(guò)查詢(xún)完成讀取鍵盤(pán)功能分別為K1,K2,K3,K4。其中,K1用以加和查看農(nóng)歷,K2應(yīng)以減,K3用以切換設(shè)置選項(xiàng)、K4用以進(jìn)入設(shè)置界面和返回時(shí)鐘走時(shí)主界面?刂茣r(shí)、分、秒的調(diào)節(jié)以及設(shè)定時(shí)間模式的開(kāi)關(guān)和返回正常走時(shí)模式的功能。按鍵電路的電路圖和實(shí)物圖如圖2-7和2-8所示。

圖2-7按鍵電路圖

圖2-8按鍵實(shí)物圖

2.5 時(shí)間電路設(shè)計(jì)

本設(shè)計(jì)采用的時(shí)鐘是DS1302。DS1302是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片,它可以對(duì)年、月、日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.0V~5.5V。采用三線(xiàn)接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。其與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需用到三個(gè)口線(xiàn):1.RSE復(fù)位,2.I/O數(shù)據(jù)線(xiàn),3.SCLK 串行時(shí)鐘。時(shí)鐘/RAM 的讀/寫(xiě)數(shù)據(jù)以一個(gè)字節(jié)或多達(dá)31個(gè)字節(jié)的字符組方式通信。DS1302工作時(shí)功耗很低。提供秒、分、時(shí)、日、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘,操作可通過(guò)AM/PM指示決定采用24或12小時(shí)格式。其電路圖和實(shí)物圖如圖2-9和2-10所示。

圖2-9 DS1302電路圖


圖2-10 DS1302實(shí)物圖

DS1302引腳功能說(shuō)明如下:

XI XZ 32.768KHz 晶振管腳。

GND 接地。

RST 復(fù)位腳。

I/O 數(shù)據(jù)輸入/輸出引腳。

SCLK 串行時(shí)鐘。

VCC1、VCC2 電源供電管腳。

DS1302 串行時(shí)鐘芯片8腳 DPI。

DS1302S 串行時(shí)鐘芯片8腳 SOIC 200mil。

DS1302Z 串行時(shí)鐘芯片8腳 SOIC 150mil。

2.6 打鈴電路的設(shè)計(jì)

打鈴是為了在用戶(hù)需要的時(shí)刻起到必要的提醒作用,本設(shè)計(jì)針對(duì)用戶(hù)設(shè)定的時(shí)間進(jìn)行響應(yīng),將實(shí)時(shí)對(duì)比設(shè)定時(shí)間和系統(tǒng)走時(shí),二者相一致時(shí),打鈴電路就會(huì)開(kāi)始工作。打鈴電路的電路圖與實(shí)物圖如圖2-11和2-12所示。蜂鳴器兩端分別接電源和89C51的P3.7接口,接收來(lái)自單片機(jī)的信號(hào),從而實(shí)現(xiàn)打鈴功能。

圖2-11打鈴電路電路圖

圖2-12打鈴電路實(shí)物圖(蜂鳴器)










第3章 軟件電路的設(shè)計(jì)與實(shí)現(xiàn)3.1 軟件系統(tǒng)設(shè)計(jì)

根據(jù)硬件電路設(shè)計(jì),軟件設(shè)計(jì)的總流程圖如圖3-1所示。外部電源供電后,系統(tǒng)完成初始化,之后就讀取時(shí)間、顯示時(shí)間。然后判斷用戶(hù)是否要對(duì)時(shí)間進(jìn)行調(diào)整,若需要,則調(diào)整時(shí)間,反之則不調(diào)整。之后判斷是否需要設(shè)置時(shí)間進(jìn)行打鈴提示,若需要,則設(shè)置,否則不不設(shè)置。最后判斷當(dāng)前時(shí)間是否為設(shè)定的打鈴時(shí)間,是則打鈴,反之不打鈴并返回讀取時(shí)間顯示處,重復(fù)進(jìn)行。

圖3-1軟件設(shè)計(jì)總流程圖

3.2 顯示子程序

顯示電路流程圖如圖3-2所示。起初,LCD1602初始化顯示。當(dāng)RS為高電平、RW為低電平時(shí),寫(xiě)入數(shù)據(jù),液晶屏顯示預(yù)設(shè)值。經(jīng)過(guò)10us的延時(shí)后清屏,設(shè)置數(shù)據(jù)為8位,然后,顯示器待機(jī)等待數(shù)據(jù),數(shù)據(jù)到來(lái)時(shí),顯示在屏幕上。此時(shí),判斷是否顯示完畢,若已顯示完畢,就結(jié)束;反之,就繼續(xù)接受數(shù)據(jù)顯示,直至顯示完畢。

圖3-3顯示電路流程圖
3.3 按鍵子程序

按鍵電路流程圖如圖3-4所示。本設(shè)計(jì)采用了4個(gè)獨(dú)立按鍵,因工作方式相同,故流程相同。首先判斷按鍵是否閉合,若是,則延時(shí)10ms。然后再次判斷按鍵是否,若仍是,則對(duì)其進(jìn)行處理,反之則返回重復(fù)執(zhí)行。

圖3-4按鍵電路流程圖

3.4 時(shí)間子程序

時(shí)間電路流程圖如圖3-5所示。首先讀取系統(tǒng)默認(rèn)的時(shí)間,再根據(jù)用戶(hù)需要是否做出調(diào)整,若需要,則調(diào)整;不需要,則結(jié)束。

圖3-5時(shí)間電路流程圖

3.5 鈴子程序

打鈴電路流程圖如圖3-6所示。首先,進(jìn)行初始化,然后讀取當(dāng)前時(shí)間數(shù)據(jù),隨后判斷讀取時(shí)間與用戶(hù)設(shè)定的打鈴時(shí)間是否一致,是,則打鈴;反之則結(jié)束程序。

圖3-6打鈴電路流程圖


第4 開(kāi)發(fā)軟件的介紹及系統(tǒng)測(cè)試4.1 開(kāi)發(fā)軟件的介紹4.1.1 Proteus

本系統(tǒng)的硬件設(shè)計(jì)首先是在Proteus軟件環(huán)境中仿真實(shí)現(xiàn)的。Proteus軟件是來(lái)自英國(guó)Labcenter electronics公司的EDA工具軟件,Proteus軟件有十多年的歷史,在全球廣泛使用,除了具有和其它EDA工具一樣的原理布圖、PCB自動(dòng)或人工布線(xiàn)及電路仿真的功能外,其革命性的功能是,它的電路仿真是互動(dòng)的。針對(duì)微處理器的應(yīng)用,還可以直接在基于原理圖的虛擬原型上編程,并實(shí)現(xiàn)軟件源碼級(jí)的實(shí)時(shí)調(diào)試。如果有顯示及輸出,配合系統(tǒng)配置的虛擬儀器如示波器、邏輯分析儀等,還能看到運(yùn)行后輸入輸出的效果。Proteus建立了完備的電子設(shè)計(jì)開(kāi)發(fā)環(huán)境,尤其重要的是Proteus Lite可以完全免費(fèi),也可以花微不足道的費(fèi)用注冊(cè)達(dá)到更好的效果[2]。

Proteus是目前最好的模擬單片機(jī)外圍器件的工具?梢苑抡51系列、AVR、PIC等常用的MCU及其外圍電路(如LCD,RAM,ROM,鍵盤(pán),馬達(dá),LED,AD/DA,部分SPI器件,部分IIC器件...)。其實(shí)Proteus 與 multisim比較類(lèi)似,只不過(guò)它可以仿真MCU,當(dāng)然,軟件仿真精度有限,而且不可能所有的器件都找得到相應(yīng)的仿真模型,用開(kāi)發(fā)板和仿真器當(dāng)然是最好選擇,可是初學(xué)者擁有它們的可能性比較小。當(dāng)然,硬件實(shí)踐還是必不可少的。在沒(méi)有硬件的情況下,Proteus能像pspice 仿真模擬/數(shù)字電路那樣仿真MCU及外圍電路。另外,即使有硬件,在程序編寫(xiě)早期用軟件仿真一下也是很有必要的。Proteus軟件主要具有以下幾個(gè)方面的特點(diǎn):

1、設(shè)計(jì)和仿真軟件Proteus 是一個(gè)很有用的工具,它可以幫助學(xué)生和專(zhuān)業(yè)人士提高他們的模擬和數(shù)字電路的設(shè)計(jì)能力。

2、它允許對(duì)電路設(shè)計(jì)采用圖形環(huán)境,在這種環(huán)境中,可以使用一個(gè)特定符號(hào)來(lái)代替元器件,并完成不會(huì)對(duì)真實(shí)電路造成任何損害的電路仿真操作。

3、它可以仿真儀表以及可描述在仿真過(guò)程中所獲得的信號(hào)的圖表。

4、它可以仿真目前流行的單片機(jī),如PICS, ATMEL-AVR, MOTOROLA, 8051 等。

5、在設(shè)計(jì)綜合性方案中,還可以利用ARES開(kāi)發(fā)印制電路板。

4.1.2 Keil C

Keil C是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng),與匯編相比,C語(yǔ)言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。提供了包括C編譯器、宏匯編、鏈接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(μVision)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。用過(guò)匯編語(yǔ)言后再使用C來(lái)開(kāi)發(fā),體會(huì)更加深刻。KeilC51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開(kāi)發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。

4.2 系統(tǒng)仿真

通過(guò)以上硬件設(shè)計(jì)和軟件設(shè)計(jì)過(guò)程,設(shè)計(jì)工作已基本完成。接下來(lái)的工作就是對(duì)已設(shè)計(jì)好的系統(tǒng)進(jìn)行仿真和調(diào)試。通過(guò)仿真,可以體現(xiàn)出系統(tǒng)所具備的功能;通過(guò)調(diào)試,可以檢查出系統(tǒng)出現(xiàn)的錯(cuò)誤,從而進(jìn)行進(jìn)一步的改正。

本系統(tǒng)設(shè)計(jì)在Proteus中的仿真圖如圖4-1所示:

圖4-1 系統(tǒng)仿真圖

接通電源后,系統(tǒng)默認(rèn)上次設(shè)定時(shí)間,顯示模塊燈亮并顯示時(shí)間內(nèi)容。通過(guò)按鍵可以設(shè)置打鈴時(shí)刻及陰陽(yáng)歷查看。

4.3 系統(tǒng)測(cè)試

電路測(cè)試

硬件電路的最終測(cè)試是本次設(shè)計(jì)的核心。為了硬件電路能正常運(yùn)行,要對(duì)每一個(gè)電路部分進(jìn)行測(cè)試并調(diào)整。圖4-2為測(cè)試圖,F(xiàn)分部測(cè)試說(shuō)明如下:

(1)顯示部分:如圖4-2液晶顯示屏測(cè)試,通電后,LCD1602顯示器亮,說(shuō)明顯示部分沒(méi)問(wèn)題。

(2)按鍵部分:如圖4-2按鍵測(cè)試,按下按鍵K1,LCD1602顯示的是農(nóng)歷時(shí)間;按下K4,可以進(jìn)入時(shí)間設(shè)置界面,說(shuō)明按鍵部分也沒(méi)問(wèn)題。

(3)打鈴部分:調(diào)節(jié)打鈴時(shí)刻,使當(dāng)前時(shí)間和打鈴所設(shè)定的時(shí)刻相吻合,蜂鳴器響,說(shuō)明蜂鳴器也能正常工作。

圖4-2 系統(tǒng)硬件測(cè)試圖

系統(tǒng)整體測(cè)試

(1)系統(tǒng)測(cè)試一如圖4-3所示,系統(tǒng)通電,按下啟動(dòng)開(kāi)關(guān)。此時(shí),顯示器顯示時(shí)鐘芯片默認(rèn)的時(shí)間并正常走時(shí)。

圖4-3系統(tǒng)測(cè)試一

(2)系統(tǒng)測(cè)試二分別為圖4-4和4-5,按下K4按鍵,進(jìn)入設(shè)置主界面。再通過(guò)按K3L按鍵來(lái)切換設(shè)置選項(xiàng),進(jìn)入到設(shè)置打鈴界面。通過(guò)按下K1、K2來(lái)設(shè)定一個(gè)打鈴時(shí)間,然后再按下K4,返回時(shí)間顯示主界面。

圖4-4 設(shè)置主界面

圖4-5 設(shè)置打鈴界面

(3)系統(tǒng)測(cè)試三如圖4-6所示,當(dāng)系統(tǒng)時(shí)間和設(shè)定的打鈴時(shí)間吻合時(shí),顯示器顯示提示,蜂鳴器響。此時(shí)按下任意鍵,蜂鳴器停止響動(dòng),系統(tǒng)繼續(xù)走時(shí)。

圖4-6 系統(tǒng)測(cè)試三












第5章  結(jié)

綜上所述,整個(gè)硬件電路由STC89C51單片機(jī)、DS1302時(shí)鐘、LCD1602液晶顯示器、按鍵電路、打鈴電路等組成。本設(shè)計(jì)能夠很好地完成對(duì)時(shí)間的實(shí)時(shí)顯示和時(shí)刻打鈴的任務(wù),設(shè)計(jì)從STC89C51單片機(jī)最基本的硬件系統(tǒng)入手,拓展到其他所需要的硬件。通過(guò)時(shí)鐘芯片和LCD顯示器與單片機(jī)系統(tǒng)的配合,有效地完成了時(shí)間的顯示和時(shí)刻的打鈴。本設(shè)計(jì)采用的是以單片機(jī)和時(shí)鐘芯片控制的自動(dòng)化系統(tǒng),使用起來(lái)更加簡(jiǎn)單、更加方便?偟膩(lái)說(shuō),完成本設(shè)計(jì)任務(wù),設(shè)計(jì)的系統(tǒng)具有很不錯(cuò)的實(shí)用價(jià)值。


參考文獻(xiàn)

[1] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì). 第五版[M].北京:清華大學(xué)出版社,2017

[2] 馬秀麗、周越、王紅. 單片機(jī)原理與應(yīng)用系統(tǒng)設(shè)計(jì).第二版[M].北京:清華大學(xué)出版社,2017

[3] 朱曉青、凌云、袁川來(lái). 傳感器與檢測(cè)技術(shù)[M]. 北京:清華大學(xué)出版社,2014

[4] 馬建明. 數(shù)據(jù)采集與處理技術(shù)上冊(cè)、下冊(cè).第三版[M]. 西安:西安交通大學(xué)出版社,2012

[5] 劉少?gòu)?qiáng)、張靖. 現(xiàn)代傳感器技術(shù)——面向物聯(lián)網(wǎng)應(yīng)用.第二版[M] . 北京:電子工業(yè)出版社,2016

[6] 廖建尚. 物聯(lián)網(wǎng)&云平臺(tái)高級(jí)應(yīng)用開(kāi)發(fā)[M]. 北京:電子工業(yè)出版社,2017

[7] 朱清慧,張鳳蕊,翟天嵩等. Proteus教程—電子線(xiàn)路設(shè)計(jì)、制版與仿真.第三版[M]. 北京:清華大學(xué)出版社,2016

[8] 王淵峰,戴旭輝. Altium Designer 10電路設(shè)計(jì)標(biāo)準(zhǔn)教程[M]. 北京:科學(xué)出版社,2012

[9]馬忠梅,籍順心等.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)[M].北京航空航天大學(xué)出版社, 2001年

[10]新編單片機(jī)原理與應(yīng)用.第二版[M].西安電子科技大學(xué)出版社,2007.2

[11]張萌.單片機(jī)應(yīng)用系統(tǒng)開(kāi)發(fā)綜合實(shí)例[M]. 北京:清華大學(xué)出版社,2007.7

[12]樓然苗.單片機(jī)設(shè)計(jì)指導(dǎo)[M]. 北京:北京航空航天大學(xué)出版社,2007.7

[13]李廣弟. 單片機(jī)原理及應(yīng)用[M].北京航空航天大學(xué)出版社,2004年




致謝

時(shí)光轉(zhuǎn)瞬即逝!在即將進(jìn)行文檔之際,首先要感謝我的指導(dǎo)老師——老師。在他的幫助下,我掌握了參閱查詢(xún)資料和篩選有用文獻(xiàn)的方法。從設(shè)計(jì)之初,老師就全程參與,經(jīng)常利于課余時(shí)間給我們講解,這讓我非常感動(dòng),老師嚴(yán)謹(jǐn)?shù)闹笇?dǎo)態(tài)度和溫和而耐心的性情讓我終身受益。還有感謝我的同行朋友同學(xué)們,在整個(gè)設(shè)計(jì)與學(xué)習(xí)的過(guò)程中給予我很多的幫助。在這樣溫暖的環(huán)境中,我們形成了良好的學(xué)習(xí)風(fēng)氣,互幫互助,攻克了學(xué)習(xí)道路上的一道道難關(guān),他們?cè)谖业凸鹊臅r(shí)候不僅沒(méi)有嘲笑我,而且還幫助我解決了很多問(wèn)題,突破了很多難點(diǎn),帶我走出困境。其次,感謝我的同行同學(xué)們,是他們?cè)谠O(shè)計(jì)中盡量的幫助我,才讓這次設(shè)計(jì)進(jìn)行的如此順利,他們的設(shè)計(jì)理念、見(jiàn)解給了我很大的啟發(fā),在遇到想不通的問(wèn)題的時(shí)候, 他們給我提供多種方案,帶我走出思維的困境,讓我在實(shí)際操作更加順利。同時(shí),在交流和學(xué)習(xí)中,我也更加深刻的認(rèn)識(shí)到團(tuán)隊(duì)精神的重要性。同學(xué)們對(duì)在硬件的設(shè)計(jì)和軟件的編寫(xiě)上給了我很大的幫助,給我講解如何看懂程序、如何分析內(nèi)容、如何根據(jù)要執(zhí)行的功能進(jìn)行正確的編程,以及指出軟硬件中出現(xiàn)的問(wèn)題。希望今后多多交流,畢竟友誼地久天長(zhǎng)!最后,再次向給予我?guī)椭闹笇?dǎo)老師和同行同學(xué)們致以最衷心的感謝!



附錄附錄一:自動(dòng)打鈴系統(tǒng)原理圖
附錄二:源程序
  1. #include <reg51.h>                       //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義              變量范圍0~255
  3. #define uint  unsigned int              //無(wú)符號(hào)整型 宏定義              變量范圍0~65535
  4. #include "eeprom52.h"
  5. #include "nongli.h"
  6. bit flag_200ms ;
  7. bit flag_100ms ;
  8. sbit beep = P3^7;                //蜂鳴器定義
  9. bit flag_beep_en;
  10. uint clock_value;     //用作鬧鐘用的
  11. sbit dq   = P3^1;                //18b20 IO口的定義
  12. uint temperature ;    //溫度變量
  13. uchar flag_nl;        //農(nóng)歷 陽(yáng)歷顯示標(biāo)志位
  14. uchar menu_1,menu_2;
  15. uchar key_time,flag_value;      //用做連加的中間變量
  16. bit key_500ms  ;
  17. uchar n_nian,n_yue,n_ri;                            //農(nóng)歷顯示的函數(shù)
  18. #include "ds1302.h"
  19. #include "lcd1602.h"
  20. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  21. void write_eeprom()
  22. {
  23.               SectorErase(0x2000);
  24.               byte_write(0x2000, fen1);
  25.               byte_write(0x2001, shi1);
  26.               byte_write(0x2002, open1);
  27.               byte_write(0x2058, a_a);            
  28. }

  29. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
  30. void read_eeprom()
  31. {
  32.               fen1  = byte_read(0x2000);
  33.               shi1  = byte_read(0x2001);
  34.               open1  = byte_read(0x2002);
  35.               a_a      = byte_read(0x2058);
  36. }
  37. /**************開(kāi)機(jī)自檢eeprom初始化*****************/
  38. void init_eeprom()
  39. {
  40.               read_eeprom();                            //先讀
  41.               if(a_a != 1)                            //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
  42.               {
  43.                             fen1  = 3;
  44.                             shi1  = 8;
  45.                             open1  = 1;
  46.                             a_a = 1;
  47.                             write_eeprom();                 //保存數(shù)據(jù)
  48.               }            
  49. }
  50. /***********************18b20初始化函數(shù)*****************************/
  51. void init_18b20()
  52. {
  53.               bit q;
  54.               dq = 1;                                                        //把總線(xiàn)拿高
  55.               delay_uint(1);                  //15us
  56.               dq = 0;                                                        //給復(fù)位脈沖
  57.               delay_uint(80);                            //750us
  58.               dq = 1;                                                        //把總線(xiàn)拿高 等待
  59.               delay_uint(10);                            //110us
  60.               q = dq;                                                        //讀取18b20初始化信號(hào)
  61.               delay_uint(20);                            //200us
  62.               dq = 1;                                                        //把總線(xiàn)拿高 釋放總線(xiàn)
  63. }

  64. /*************寫(xiě)18b20內(nèi)的數(shù)據(jù)***************/
  65. void write_18b20(uchar dat)
  66. {
  67.               uchar i;
  68.               for(i=0;i<8;i++)
  69.               {                                                                      //寫(xiě)數(shù)據(jù)是低位開(kāi)始
  70.                             dq = 0;                                          //把總線(xiàn)拿低寫(xiě)時(shí)間隙開(kāi)始
  71.                             dq = dat & 0x01; //向18b20總線(xiàn)寫(xiě)數(shù)據(jù)了
  72.                             delay_uint(5);              // 60us
  73.                             dq = 1;                                          //釋放總線(xiàn)
  74.                             dat >>= 1;
  75.               }            
  76. }

  77. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  78. uchar read_18b20()
  79. {
  80.               uchar i,value;
  81.               for(i=0;i<8;i++)
  82.               {
  83.                             dq = 0;                                          //把總線(xiàn)拿低讀時(shí)間隙開(kāi)始
  84.                             value >>= 1;              //讀數(shù)據(jù)是低位開(kāi)始
  85.                             dq = 1;                                          //釋放總線(xiàn)
  86.                             if(dq == 1)                            //開(kāi)始讀寫(xiě)數(shù)據(jù)
  87.                                           value |= 0x80;
  88.                             delay_uint(5);              //60us              讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
  89.               }
  90.               return value;                            //返回?cái)?shù)據(jù)
  91. }
  92. /*************讀取溫度的值 讀出來(lái)的是小數(shù)***************/
  93. uint read_temp()
  94. {
  95.               uint value;
  96.               uchar low;                                             //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
  97.               init_18b20();                               //初始化18b20
  98.               write_18b20(0xcc);                 //跳過(guò)64位ROM
  99.               write_18b20(0x44);                 //啟動(dòng)一次溫度轉(zhuǎn)換命令
  100.               delay_uint(50);                               //500us
  101.               init_18b20();                               //初始化18b20
  102.               write_18b20(0xcc);                 //跳過(guò)64位ROM
  103.               write_18b20(0xbe);                 //發(fā)出讀取暫存器命令
  104.               EA = 0;
  105.               low = read_18b20();                 //讀溫度低字節(jié)
  106.               value = read_18b20();  //讀溫度高字節(jié)
  107.               EA = 1;
  108.               value <<= 8;                               //把溫度的高位左移8位
  109.               value |= low;                               //把讀出的溫度低位放到value的低八位中
  110.               value *= 0.625;                     //轉(zhuǎn)換到溫度值 小數(shù)
  111.               return value;                               //返回讀出的溫度 帶小數(shù)
  112. }



  113. /******************1ms 延時(shí)函數(shù)*******************/
  114. void delay_1ms(uint q)
  115. {
  116.               uint i,j;
  117.               for(i=0;i<q;i++)
  118.                             for(j=0;j<120;j++);
  119. }

  120. /******************寫(xiě)星期函數(shù)*******************/
  121. void write_week(uchar hang,uchar add,uchar week)//寫(xiě)星期函數(shù)
  122. {
  123.               if(hang==1)  
  124.                             write_com(0x80+add);
  125.               else
  126.                             write_com(0x80+0x40+add);               
  127.               switch(week)
  128.               {
  129.                             case 1:write_data('M');//星期數(shù)為1時(shí),顯示
  130.                                              write_data('O');
  131.                                              write_data('N');
  132.                                              break;
  133.                
  134.                             case 2:write_data('T');//星期數(shù)據(jù)為2時(shí)顯示
  135.                                              write_data('U');
  136.                                              write_data('E');
  137.                                              break;
  138.                            
  139.                             case 3:write_data('W');//星期數(shù)據(jù)為3時(shí)顯示
  140.                                              write_data('E');
  141.                                              write_data('D');
  142.                                              break;
  143.                             case 4:write_data('T');//星期數(shù)據(jù)為4是顯示
  144.                                              write_data('H');
  145.                                              write_data('U');
  146.                                              break;
  147.                             case 5:write_data('F');//星期數(shù)據(jù)為5時(shí)顯示
  148.                                              write_data('R');
  149.                                              write_data('I');
  150.                                              break;
  151.                             case 6:write_data('S');//星期數(shù)據(jù)為6時(shí)顯示
  152.                                              write_data('T');
  153.                                              write_data('A');
  154.                                              break;
  155.                             case 0:write_data('S');//星期數(shù)據(jù)為7時(shí)顯示
  156.                                              write_data('U');
  157.                                              write_data('N');
  158.                                              break;
  159.               }
  160. }
  161. /*************時(shí)鐘顯示***************/
  162. void init_1602_ds1302()
  163. {
  164.               write_sfm2_ds1302(1,1,shi);                               //顯示時(shí)
  165.               write_sfm2_ds1302(1,4,fen);                               //顯示分
  166.               write_sfm2_ds1302(1,7,miao);                 //顯示秒
  167.               write_week(2,12,week);
  168. //              write_sfm1(1,14,week);                                             //顯示星期
  169.               write_sfm3_18B20(1,11,temperature);                 //顯示溫度
  170.               if(flag_nl == 0)  //顯示陽(yáng)歷
  171.               {
  172.                             write_sfm2_ds1302(2,2,nian);   //顯示年
  173.                             write_sfm2_ds1302(2,5,yue);                 //顯示月            
  174.                             write_sfm2_ds1302(2,8,ri);                 //顯示日              
  175.               }
  176.               else                                           //顯示農(nóng)歷
  177.               {
  178.                             write_sfm2_ds1302(2,2,n_nian);              //顯示年
  179.                             write_sfm2_ds1302(2,5,n_yue);              //顯示月            
  180.                             write_sfm2_ds1302(2,8,n_ri);              //顯示日
  181.                            
  182.               }
  183. }                                                                                                                                
  184. /*************定時(shí)器0初始化程序***************/
  185. void init_time0()               
  186. {
  187.               EA   = 1;                              //開(kāi)總中斷
  188.               TMOD = 0X01;                //定時(shí)器0、工作方式1
  189.               ET0  = 1;                              //開(kāi)定時(shí)器0中斷
  190.               TR0  = 1;                              //允許定時(shí)器0定時(shí)
  191. }

  192. /*************鬧鐘報(bào)警函數(shù)***************/
  193. void menu_dis()
  194. {
  195.               static uchar mm,value;
  196.               if(flag_100ms == 1)                              //100ms執(zhí)行一次
  197.               {
  198.                             flag_100ms = 0;
  199.                             if(open1 == 1)              //如果鬧鐘打開(kāi)
  200.                             {
  201.                                           if((miao == 0) && (fen == fen1) && (shi == shi1))
  202.                                           {                           
  203.                                                         flag_beep_en = 1;              //有報(bào)警 打開(kāi)蜂鳴器響的標(biāo)志位                                         
  204.                                           }                           
  205.                                           if(flag_beep_en == 1)              //鬧鐘以被打開(kāi)
  206.                                           {
  207.                                                         clock_value++;
  208.                                                         if(clock_value <= 30)            
  209.                                                                       beep = ~beep;                 //蜂鳴器叫3秒
  210.                                                         else if(clock_value > 30)
  211.                                                         {
  212.                                                                       beep = 1;                                //蜂鳴器停1秒
  213.                                                                       if(clock_value > 40)
  214.                                                                       {
  215.                                                                                     clock_value = 0;
  216.                                                                       }
  217.                                                         }
  218.                                                         //  1 分鐘后自動(dòng)關(guān)閉鬧鐘
  219.                                                         value ++;
  220.                                                         if(value >= 10)
  221.                                                         {
  222.                                                                       value = 0;
  223.                                                                       mm++;
  224.                                                                       if(mm >= 60)
  225.                                                                       {
  226.                                                                                     mm = 0;
  227.                                                                                     flag_beep_en = 0;
  228.                                                                                     beep = 1;            
  229.                                                                       }
  230.                                                         }                                                                     
  231.                                           }
  232.                             }            
  233.               }
  234. }
  235. /********************獨(dú)立按鍵程序*****************/
  236. uchar key_can;              //按鍵值
  237. void key()              //獨(dú)立按鍵程序
  238. {
  239.               static uchar key_new;
  240.               key_can = 20;                   //按鍵值還原
  241.               P3 |= 0x78;                     //對(duì)應(yīng)的按鍵IO口輸出為1
  242.               if((P3 & 0x78) != 0x78)                            //按鍵按下
  243.               {
  244.                             delay_1ms(1);                                 //按鍵消抖動(dòng)
  245.                             if(((P3 & 0x78) != 0x78) && (key_new == 1))
  246.                             {                                                                                    //確認(rèn)是按鍵按下
  247.                                           key_new = 0;
  248.                                           switch(P3 & 0x78)
  249.                                           {
  250.                                                         case 0x70:  key_can = 4;  break;              //得到按鍵值
  251.                                                         case 0x68:  key_can = 3;  break;              //得到按鍵值
  252.                                                         case 0x58:  key_can = 2;  break;              //得到按鍵值
  253.                                                         case 0x38:  key_can = 1;  break;              //得到按鍵值
  254.                                           }
  255. //                                          write_sfm2(1,0,key_can);                                                        //顯示按鍵值
  256.                             }                                         
  257.               }
  258.               else
  259.                             key_new = 1;            
  260. }
  261. /**********************設(shè)置函數(shù)************************/
  262. void key_with()
  263. {
  264.               if(key_can == 1)              //設(shè)置鍵
  265.               {
  266.                             menu_1++;
  267.                             if(menu_1 == 1)                //設(shè)置時(shí)間
  268.                             {
  269.                                           menu_2 = 1;
  270.                                           write_string(1,0,"    :  :    W:  ");                                         
  271.                                           write_string(2,0," 20  -  -       ");            
  272.                             }
  273.                             if(menu_1 == 2)                //設(shè)置鬧鐘
  274.                             {
  275.                                           menu_2 = 1;
  276.                                           write_string(1,0,"   set clock    ");                                         
  277.                                           write_string(2,0,"    Y  00:00      ");            
  278.                             }
  279.                             if(menu_1 > 2)    //回到正常顯示
  280.                             {
  281.                                           menu_1 = 0;
  282.                                           write_guanbiao(1,2,0);              //關(guān)閉光標(biāo)
  283.                                           init_1602_dis_csf();      //初始化液晶顯示                           
  284.                             }
  285.               }
  286.               if(key_can == 2)              //選擇鍵
  287.               {
  288.                             flag_200ms = 1;
  289.                             if(menu_1 == 1)                              //設(shè)置時(shí)間
  290.                             {
  291.                                           menu_2 ++;
  292.                                           if(menu_2 > 7)
  293.                                                         menu_2 = 1;
  294.                             }
  295.                             if(menu_1 == 2)                            //設(shè)置鬧鐘
  296.                             {
  297.                                           menu_2 ++;
  298.                                           if(menu_2 > 3)
  299.                                                         menu_2 = 1;                                                      
  300.                             }
  301.               }
  302.               if(menu_1 == 1)
  303.               {
  304.                             if(menu_2 == 1)                              //設(shè)置時(shí)
  305.                             {
  306.                                           if(key_can == 3)              //加
  307.                                           {
  308.                                                         shi+=0x01;
  309.                                                         if((shi & 0x0f) >= 0x0a)
  310.                                                                       shi = (shi & 0xf0) + 0x10;
  311.                                                         if(shi >= 0x24)
  312.                                                                       shi = 0;
  313.                                           }                           
  314.                                           if(key_can == 4)              //減
  315.                                           {
  316.                                                         if(shi == 0x00)
  317.                                                                       shi = 0x24;
  318.                                                         if((shi & 0x0f) == 0x00)
  319.                                                                       shi = (shi | 0x0a) - 0x10;
  320.                                                         shi -- ;
  321.                                           }                                                                       
  322.                             }
  323.                             if(menu_2 == 2)                              //設(shè)置分
  324.                             {
  325.                                           if(key_can == 3)              //加
  326.                                           {
  327.                                                         fen+=0x01;
  328.                                                         if((fen & 0x0f) >= 0x0a)
  329.                                                                       fen = (fen & 0xf0) + 0x10;
  330.                                                         if(fen >= 0x60)
  331.                                                                       fen = 0;
  332.                                           }                           
  333.                                           if(key_can == 4)              //減               
  334.                                           {
  335.                                                         if(fen == 0x00)
  336.                                                                       fen = 0x5a;
  337.                                                         if((fen & 0x0f) == 0x00)
  338.                                                                       fen = (fen | 0x0a) - 0x10;
  339.                                                         fen -- ;
  340.                                           }            
  341.                             }
  342.                             if(menu_2 == 3)                              //設(shè)置秒
  343.                             {
  344.                                           if(key_can == 3)              //加
  345.                                           {
  346.                                                         miao+=0x01;
  347.                                                         if((miao & 0x0f) >= 0x0a)
  348.                                                                       miao = (miao & 0xf0) + 0x10;
  349.                                                         if(miao >= 0x60)
  350.                                                                       miao = 0;
  351.                                           }            
  352.                                           if(key_can == 4)              //減               
  353.                                           {
  354.                                                         if(miao == 0x00)
  355.                                                                       miao = 0x5a;
  356.                                                         if((miao & 0x0f) == 0x00)
  357.                                                                       miao = (miao | 0x0a) - 0x10;
  358.                                                         miao -- ;                                         
  359.                                           }
  360.                             }
  361.                             if(menu_2 == 4)                              //設(shè)置星期
  362.                             {
  363.                                           if(key_can == 3)              //加
  364.                                           {
  365.                                               week+=0x01;
  366.                                                         if((week & 0x0f) >= 0x0a)
  367.                                                                       week = (week & 0xf0) + 0x10;
  368.                                                         if(week >= 0x08)
  369.                                                                       week = 1;
  370.                                           }                           
  371.                                           if(key_can == 4)              //減               
  372.                                           {
  373.                                                         if(week == 0x01)
  374.                                                                       week = 0x08;
  375.                                                         if((week & 0x0f) == 0x00)
  376.                                                                       week = (week | 0x0a) - 0x10;
  377.                                                         week -- ;
  378.                                           }            
  379.                             }
  380.                             if(menu_2 == 5)                              //設(shè)置年
  381.                             {
  382.                                           if(key_can == 3)              //加
  383.                                           {
  384.                                               nian+=0x01;
  385.                                                         if((nian & 0x0f) >= 0x0a)
  386.                                                                       nian = (nian & 0xf0) + 0x10;
  387.                                                         if(nian >= 0x9a)
  388.                                                                       nian = 1;
  389.                                           }                           
  390.                                           if(key_can == 4)              //減               
  391.                                           {
  392.                                                         if(nian == 0x01)
  393.                                                                       nian = 0x9a;
  394.                                                         if((nian & 0x0f) == 0x00)
  395.                                                                       nian = (nian | 0x0a) - 0x10;
  396.                                                         nian -- ;                           
  397.                                           }            
  398.                             }
  399.                             if(menu_2 == 6)                              //設(shè)置月
  400.                             {
  401.                                           if(key_can == 3)              //加
  402.                                           {
  403.                                               yue+=0x01;
  404.                                                         if((yue & 0x0f) >= 0x0a)
  405.                                                                       yue = (yue & 0xf0) + 0x10;
  406.                                                         if(yue >= 0x13)
  407.                                                                       yue = 1;
  408.                                           }                           
  409.                                           if(key_can == 4)              //減               
  410.                                           {
  411.                                                         if(yue == 0x01)
  412.                                                                       yue = 0x13;
  413.                                                         if((yue & 0x0f) == 0x00)
  414.                                                                       yue = (yue | 0x0a) - 0x10;
  415.                                                         yue -- ;                                                                     
  416.                                           }            
  417.                             }
  418.                             if(menu_2 == 7)                              //設(shè)置日
  419.                             {
  420.                                           if(key_can == 3)              //加
  421.                                           {
  422.                                 ri+=0x01;
  423.                                           if((ri & 0x0f) >= 0x0a)
  424.                                                         ri = (ri & 0xf0) + 0x10;
  425.                                           if(ri >= 0x32)
  426.                                                         ri = 0;                                         
  427.                                           }                           
  428.                                           if(key_can == 4)              //減               
  429.                                           {
  430.                                                         if(ri == 0x01)
  431.                                                                       ri = 0x32;
  432.                                                         if((ri & 0x0f) == 0x00)
  433.                                                                       ri = (ri | 0x0a) - 0x10;
  434.                                                         ri -- ;                                         
  435.                                           }            
  436.                             }
  437.                             write_sfm2_ds1302(1,2,shi);                 //顯示時(shí)
  438.                             write_sfm2_ds1302(1,5,fen);                 //顯示分
  439.                             write_sfm2_ds1302(1,8,miao);                 //顯示秒
  440.                             write_sfm1(1,14,week);                 //顯示星期                                                                     
  441.                             write_sfm2_ds1302(2,3,nian);                 //顯示年
  442.                             write_sfm2_ds1302(2,6,yue);                 //顯示月
  443.                             write_sfm2_ds1302(2,9,ri);                 //顯示日
  444.                             switch(menu_2)                 // 光標(biāo)顯示
  445.                             {
  446.                                           case 1:  write_guanbiao(1,2,1);  break;
  447.                                           case 2:  write_guanbiao(1,5,1);  break;
  448.                                           case 3:  write_guanbiao(1,8,1);  break;
  449.                                           case 4:  write_guanbiao(1,14,1);  break;
  450.                                           case 5:  write_guanbiao(2,3,1);  break;
  451.                                           case 6:  write_guanbiao(2,6,1);  break;
  452.                                           case 7:  write_guanbiao(2,9,1);  break;
  453.                             }
  454.                             write_time();                 //把時(shí)間寫(xiě)進(jìn)去
  455.               }            
  456. /***************設(shè)置鬧鐘*********************/
  457.               if(menu_1 == 2)
  458.               {
  459.                             if(menu_2 == 1)                              //設(shè)置鬧鐘開(kāi)關(guān)
  460.                             {
  461.                                           if(key_can == 3)            
  462.                                           {
  463.                                                         open1 = 1;                //鬧鐘開(kāi)
  464.                                           }                           
  465.                                           if(key_can == 4)            
  466.                                           {
  467.                                                         open1 = 0;                //鬧鐘關(guān)
  468.                                           }                                                                       
  469.                             }
  470.                             if(menu_2 == 2)                              //設(shè)置鬧鐘時(shí)
  471.                             {
  472.                                           if(key_can == 3)              //加
  473.                                           {
  474.                                               shi1+=0x01;
  475.                                                         if((shi1 & 0x0f) >= 0x0a)
  476.                                                                       shi1 = (shi1 & 0xf0) + 0x10;
  477.                                                         if(shi1 >= 0x24)
  478.                                                                       shi1 = 0;
  479.                                           }                           
  480.                                           if(key_can == 4)              //減               
  481.                                           {
  482.                                                         if(shi1 == 0x00)
  483.                                                                       shi1 = 0x5a;
  484.                                                         if((shi1 & 0x0f) == 0x00)
  485.                                                                       shi1 = (shi1 | 0x0a) - 0x10;
  486.                                                         shi1 -- ;
  487.                                           }            
  488.                             }
  489.                             if(menu_2 == 3)                              //設(shè)置秒
  490.                             {
  491.                                           if(key_can == 3)              //加
  492.                                           {
  493.                                               fen1+=0x01;
  494.                                                         if((fen1 & 0x0f) >= 0x0a)
  495.                                                                       fen1 = (fen1 & 0xf0) + 0x10;
  496.                                                         if(fen1 >= 0x60)
  497.                                                                       fen1 = 0;
  498.                                           }            
  499.                                           if(key_can == 4)              //減               
  500.                                           {
  501.                                                         if(fen1 == 0x00)
  502.                                                                       fen1 = 0x5a;
  503.                                                         if((fen1 & 0x0f) == 0x00)
  504.                                                                       fen1 = (fen1 | 0x0a) - 0x10;
  505.                                                         fen1 -- ;                                         
  506.                                           }
  507.                             }
  508.                             if(open1 == 1)
  509.                                           write_string(2,4,"Y");            
  510.                             else
  511.                                           write_string(2,4,"N");            
  512.                             write_sfm2_ds1302(2,7,shi1);                 //顯示鬧鐘時(shí)
  513.                             write_sfm2_ds1302(2,10,fen1);                 //顯示鬧鐘分
  514.                             switch(menu_2)                 // 光標(biāo)顯示
  515.                             {
  516.                                           case 1:  write_guanbiao(2,4,1);  break;
  517.                                           case 2:  write_guanbiao(2,7,1);  break;
  518.                                           case 3:  write_guanbiao(2,10,1);  break;
  519.                             }            
  520.                             write_eeprom();     //保存鬧鐘時(shí)間
  521.               }                                         
  522. }
  523. /*****************主函數(shù)********************/
  524. void main()
  525. {            
  526.               beep = 0;                                            //開(kāi)機(jī)叫一聲  
  527.               delay_1ms(150);
  528.               P0 = P1 = P2 = P3 = 0xff;                            //單片機(jī)IO口初始化為1
  529.               init_time0();                            //初始化定時(shí)器
  530. ……………………

  531. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


1602萬(wàn)年歷程序與仿真下載::

資料.7z (4.84 MB, 下載次數(shù): 265)

word文檔.docx (2.29 MB, 下載次數(shù): 182)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:652643 發(fā)表于 2019-11-29 20:56 | 只看該作者
樓主你好,請(qǐng)問(wèn)主函數(shù)里是怎么調(diào)用的呀,黑幣不夠下載不了附件
回復(fù)

使用道具 舉報(bào)

板凳
ID:712687 發(fā)表于 2020-4-3 17:26 | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:735425 發(fā)表于 2020-4-22 17:59 | 只看該作者
很感謝,但是主函數(shù)這樣就是寫(xiě)完了嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:737567 發(fā)表于 2020-4-25 16:50 | 只看該作者
請(qǐng)問(wèn)一下,可以設(shè)置成多個(gè)不同時(shí)段自動(dòng)打鈴嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:767375 發(fā)表于 2020-6-3 15:49 | 只看該作者
顯示程序有問(wèn)題打不開(kāi)啊
回復(fù)

使用道具 舉報(bào)

7#
ID:743050 發(fā)表于 2020-6-13 16:54 | 只看該作者
謝謝,優(yōu)秀
回復(fù)

使用道具 舉報(bào)

8#
ID:979060 發(fā)表于 2021-11-8 18:51 | 只看該作者
你好,你是星期計(jì)算是有問(wèn)題的吧?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表