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

QQ登錄

只需一步,快速開始

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

單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)論文下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:342079 發(fā)表于 2018-5-31 12:47 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
目錄
摘要
關(guān)鍵詞
引言
第一章  設(shè)計(jì)方案論證
1.1 設(shè)計(jì)要求
1.2 設(shè)計(jì)方案選擇
1.2.1 方案一:數(shù)字電路設(shè)計(jì)的自動(dòng)打鈴系統(tǒng)
1.2.2 方案二:基于單片機(jī)的自動(dòng)打鈴系統(tǒng)設(shè)計(jì)
1.2.3 方案確定
1.3 基本方案
1.3.1 設(shè)計(jì)課題簡(jiǎn)要概述
1.3.2 系統(tǒng)軟硬件劃分
1.3.3 單片機(jī)選型
1.4 總體設(shè)計(jì)框圖
第二章  硬件電路設(shè)計(jì)
2.1 基本原理概述
2.2 主要原件參數(shù)及功能簡(jiǎn)介
2.2.1 主控器AT89C51
2.2.2 時(shí)鐘電路DS1302
2.3 單元電路的設(shè)計(jì)
2.3.1顯示電路設(shè)計(jì)
2.3.2 鍵盤接口電路設(shè)計(jì)
2.3.3 響鈴電路設(shè)計(jì)
2.4 總體運(yùn)行進(jìn)程
第三章  軟件電路設(shè)計(jì)及流程圖
3.1 基本原理概述
3.1.1 中斷服務(wù)程序設(shè)計(jì)
3.1.2 顯示程序設(shè)計(jì)和按鍵判斷與按鍵處理程序設(shè)計(jì)
3.2 流程圖
3.2.1 系統(tǒng)主程序流程圖
3.2.2 系統(tǒng)定時(shí)中斷流程圖
第四章 系統(tǒng)程序設(shè)計(jì)
4.1 程序設(shè)計(jì)概要
4.2 源程序清單
第五章  自動(dòng)打鈴硬件原理圖
第六章  畢業(yè)設(shè)計(jì)總結(jié)
致謝
參考文獻(xiàn)

摘要
自動(dòng)打鈴系統(tǒng),是以一片8位單片機(jī)為核心的實(shí)時(shí)時(shí)鐘及控制系統(tǒng)。我們知道單片機(jī)的外接石英晶體振蕩器能提供穩(wěn)定、準(zhǔn)確的基準(zhǔn)頻率,并經(jīng)12分頻后向內(nèi)部定時(shí)器提供實(shí)時(shí)基準(zhǔn)頻率信號(hào),設(shè)定定時(shí)器工作在中斷方式下,連續(xù)對(duì)此頻率信號(hào)進(jìn)行分頻計(jì)數(shù),便可得秒信號(hào),再對(duì)秒信號(hào)進(jìn)行計(jì)數(shù)便可得到分、時(shí)等實(shí)時(shí)時(shí)鐘信息。如果石英晶體振蕩器的頻率信號(hào)為6MHZ,設(shè)定定時(shí)器定時(shí)工作方式1下,定時(shí)器為3CBOH,則定時(shí)器每100ms產(chǎn)生1次中斷,在定時(shí)器的中斷定時(shí)處理程序中,每10次中斷,則向秒計(jì)數(shù)器加1,秒計(jì)數(shù)器計(jì)數(shù)到60則向分計(jì)數(shù)器進(jìn)位(并建立分進(jìn)位標(biāo)志),分計(jì)數(shù)器計(jì)數(shù)到60,則向時(shí)計(jì)數(shù)器進(jìn)位,如此周而復(fù)始的連續(xù)計(jì)數(shù),便可獲得時(shí)、分、秒的信號(hào),建立一個(gè)實(shí)時(shí)時(shí)鐘。接下來便可以進(jìn)行定時(shí)處理和打鈴輸出,當(dāng)主程序檢測(cè)到有分進(jìn)位標(biāo)志時(shí),便開始比較當(dāng)前時(shí)間(小時(shí)與分、存放在RAM中)與信息時(shí)間表上的作息時(shí)間(小時(shí)與分,存放在ROM)是否相同,如有相同者,則進(jìn)行報(bào)時(shí)處理并控制打鈴,如有不相同則返回主程序,如此便實(shí)現(xiàn)了報(bào)時(shí)控制的要求。

引言

隨著科技的不斷發(fā)展,各種芯片都得到了很好的發(fā)展,80C51 同樣如此,從開始的無人問津到現(xiàn)在的隨處可見,紅綠燈,記分牌,電子秒表,遙控器,電飯煲,電視等只要是電子產(chǎn)品,都會(huì)和芯片有關(guān),其實(shí)芯片并不是什么神秘的高科技,它只是里面裝了一些己編好的程序而己.而這里要介紹的是用匯編語言來編程的一個(gè)系統(tǒng),它能夠讓一個(gè)學(xué);蚱髽I(yè)集團(tuán)實(shí)現(xiàn)打鈴自動(dòng)化,總之,一個(gè)需要時(shí)間系統(tǒng)的機(jī)構(gòu)實(shí)現(xiàn)自動(dòng)提醒功能。

當(dāng)今時(shí)代是一個(gè)新技術(shù)層出不窮的時(shí)代,在電子領(lǐng)域尤其是自動(dòng)化智能控制領(lǐng)域,傳統(tǒng)的分立元件或數(shù)字邏輯電路構(gòu)成的控制系統(tǒng),正以前所未有的速度被單片機(jī)智能控制系統(tǒng)所取代。單片機(jī)具有體積小、功能強(qiáng)、成本低、應(yīng)用面廣等優(yōu)點(diǎn),可以說,智能控制與自動(dòng)控制的核心就是單片機(jī)。目前,一個(gè)學(xué)習(xí)與應(yīng)用單片機(jī)的高潮正在工廠、學(xué)校及企事業(yè)單位大規(guī)模地興起。而本文是用AT89C51單片機(jī)設(shè)計(jì)的一個(gè)自動(dòng)打鈴系統(tǒng)。

第一章  設(shè)計(jì)方案論證
1.1 設(shè)計(jì)要求
它可以作為時(shí)鐘電路來顯示時(shí)間,進(jìn)行設(shè)置,定時(shí)打鈴。按照自頂向下設(shè)計(jì)方法劃分自動(dòng)打鈴系統(tǒng)的功能?煞譃椋簳r(shí)間設(shè)置電路,計(jì)時(shí)電路,顯示電路和定時(shí)打鈴控制電路等。
以江蘇信息職業(yè)技術(shù)學(xué)院的打鈴情況設(shè)計(jì)
內(nèi)容
時(shí)間
起床
6:30
早自習(xí)
7:30-8:10
第一節(jié)課
8:20-9:00
第二節(jié)課
9:10-9:50
第三節(jié)課
10:00-10:40
第四節(jié)課
10:50-11:30
第五節(jié)課
13:30-14:10
第六節(jié)課
14:20-15:00
第七節(jié)課
15:20-16:00
第八節(jié)課
16:10-16:50
晚自習(xí)
19:00-20:30
熄燈
22:30

1.2 設(shè)計(jì)方案選擇
1.2.1 方案一:數(shù)字電路設(shè)計(jì)的自動(dòng)打鈴系統(tǒng)
利用函數(shù)信號(hào)發(fā)生器來進(jìn)行脈沖信號(hào)輸出,利用74160N來設(shè)置十進(jìn)制和六進(jìn)制的進(jìn)位輸出。利用數(shù)碼顯示器來顯示時(shí)間,利用或門、與門、非門、與非門、等電路元件進(jìn)行組合實(shí)現(xiàn)打鈴的控制。
1.2.2 方案二:基于單片機(jī)的自動(dòng)打鈴系統(tǒng)設(shè)計(jì)
單片機(jī)內(nèi)部存儲(chǔ)器設(shè)三個(gè)字節(jié)分別存放時(shí)鐘的時(shí)、分、秒信息。利用定時(shí)器與軟件結(jié)合實(shí)現(xiàn)1秒定時(shí)中斷,沒產(chǎn)生一次中斷,存儲(chǔ)器內(nèi)相應(yīng)的秒值加1;若秒值達(dá)到60,則將其清零,并將相應(yīng)的分字節(jié)值加1;若分值達(dá)到60,則清零分字節(jié),并將時(shí)字節(jié)值加1;若時(shí)值達(dá)到24,則將時(shí)字節(jié)清零。建立完一個(gè)實(shí)時(shí)時(shí)鐘后接下來進(jìn)行定時(shí)處理和打鈴輸出,當(dāng)主程序檢測(cè)到有分進(jìn)位標(biāo)志時(shí),便開始比較當(dāng)前時(shí)間與信息時(shí)間表上的作息時(shí)間是否相同,相同者,則進(jìn)行報(bào)時(shí)處理并控制打鈴,不相同則返回主程序。
1.2.3 方案確定
方案一的設(shè)計(jì)只能事先設(shè)定打鈴時(shí)間不能完全自動(dòng)打鈴,且在修改打鈴時(shí)間上存在一定的困難。而方案二中的設(shè)計(jì)能完全實(shí)現(xiàn)自動(dòng)化,詮釋了我們這次畢業(yè)設(shè)計(jì)的主題。并在修改打鈴時(shí)間上有了很大的方便,只需修改一部分程序便能實(shí)現(xiàn)不同的需要。
因此我選擇方案二進(jìn)行設(shè)計(jì)。
1.3 基本方案
1.3.1 設(shè)計(jì)課題簡(jiǎn)要概述
自動(dòng)打鈴裝置用于工廠、學(xué)校等地的時(shí)間控制,本設(shè)計(jì)是按照學(xué)校作息時(shí)問設(shè)定的,模擬了電了鐘顯示時(shí)、分、秒。還根據(jù)學(xué)校的作息時(shí)間按時(shí)打鈴,本系統(tǒng)有4 個(gè)按鈕,分別用來調(diào)時(shí)、調(diào)分、秒和強(qiáng)制打鈴及強(qiáng)制關(guān)鈴,以保證始終與標(biāo)準(zhǔn)時(shí)間相吻合。
首先設(shè)計(jì)出本系統(tǒng)的硬件基本框圖,根據(jù)框圖設(shè)計(jì)電氣原理圖,簡(jiǎn)要概述基本原理,按照設(shè)計(jì)技術(shù)參數(shù)設(shè)計(jì)出各部分程序。
1.3.2 系統(tǒng)軟硬件劃分
由于需要最小系統(tǒng)設(shè)計(jì),因此,極大地介于系統(tǒng)的硬件成本,所有能用軟件實(shí)現(xiàn)的功能都用軟件完成,如按鍵的去抖,采用延時(shí),顯示部分用動(dòng)態(tài)顯示等,這樣硬件部分的設(shè)計(jì)可以采用單片機(jī)最小系統(tǒng),所謂最小系統(tǒng)時(shí)僅有程序存儲(chǔ)器和時(shí)鐘及復(fù)位電路的單片機(jī)系統(tǒng)。
1.3.3 單片機(jī)選型
根據(jù)課題的具體內(nèi)容,任務(wù)要求,計(jì)時(shí)、校時(shí)、定時(shí)、鍵盤顯示等功能,經(jīng)多方面考慮,所選系統(tǒng)選項(xiàng)用.與MSC-51單片機(jī)完全兼容的AT89C51 低功耗單片機(jī)。
1.4 設(shè)計(jì)框圖
圖一 整體框圖

第二章  硬件電路設(shè)計(jì)2.1 基本原理概述
本系統(tǒng)主要由主控模塊,時(shí)鐘模塊,顯示模塊,鍵盤接口模塊等4 部分構(gòu)成。通過內(nèi)部定時(shí)產(chǎn)生中斷,從而使驅(qū)動(dòng)電鈴打鈴。設(shè)定51 單片機(jī)工作在定時(shí)器工作方式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í)的值,通過六位七段顯示器進(jìn)行顯示。由于動(dòng)態(tài)顯示法需要數(shù)據(jù)所存等硬件,接口較復(fù)雜,考慮顯示只有六位,且系統(tǒng)沒有其他浮躁的處理程序,所有采用動(dòng)態(tài)掃描LED 的顯示。
本系統(tǒng)采用四個(gè)按鍵,當(dāng)時(shí)鐘時(shí)間和設(shè)置時(shí)間一直時(shí),驅(qū)動(dòng)程序動(dòng)作,進(jìn)行打鈴,每次打鈴30S
2.2 主要原件參數(shù)及功能簡(jiǎn)介2.2.1 主控器AT89C51
AT89C51 公司生產(chǎn)的AT89C51 單片機(jī)用高性能的靜態(tài)89C51 設(shè)計(jì),由先進(jìn)工藝制造,并帶有非易失性FLASH 程序存儲(chǔ)器,它是· 種高性能、低功耗的8 位CMOS 微處理芯片,市場(chǎng)應(yīng)用最多,主要特點(diǎn)有:
有4K 的FLASH 程序存儲(chǔ)器
256 字節(jié)內(nèi)部RAM
電源控制模式:時(shí)鐘可停止和恢復(fù),空閑模式,掉電模式
6個(gè)中斷源
4個(gè)中斷優(yōu)先級(jí)
4個(gè)8位I/O口
全雙工增強(qiáng)型UART
2個(gè)16位定時(shí)、計(jì)數(shù)器
圖二  AT89C51
2.2.2 DS1302
1)性能特性
DS1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需用到三個(gè)口線:1.RSE復(fù)位,2.I/O數(shù)據(jù)線,3.SCLK 串行時(shí)鐘。時(shí)鐘/RAM 的讀/寫數(shù)據(jù)以一個(gè)字節(jié)或多達(dá)31 個(gè)字節(jié)的字符組方式通信。DS1302 工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí)功率小十1mW 。提供秒分時(shí)日日期。月年的信息,每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整時(shí)鐘,操作可通過AM/PM 指示決定采用24 或12 小時(shí)格式。
2)管腳描述
XI XZ 32.768KHz 晶振管腳
GND 接地
RST 復(fù)位腳
I/O 數(shù)據(jù)輸入/輸出引腳
SCLK 串行時(shí)鐘
Vcc1,Vcc2 電源供電管腳
DS1302 串行時(shí)鐘芯片8 腳 DIP
DS1302S 串行時(shí)鐘芯片8 腳 SOIC 200mil
DS1302Z 串行時(shí)鐘芯片8 腳 SOIC 150mil
圖三  DS1302
2.3 單元電路的設(shè)計(jì)2.3.1顯示電路設(shè)計(jì)
顯示部分采用普通的LCD1602顯示
圖四  顯示電路
2.3.2 鍵盤接口電路設(shè)計(jì)
由于鍵盤只有四個(gè),采用獨(dú)立式按鈕,用查詢法完成讀健功能。


圖五  按鍵電路

2.3.3 響鈴電路設(shè)計(jì)
響鈴電路用到了蜂鳴器、三極管、1K電阻。蜂鳴器兩端分別接地和三極管。三極管一段電源另一端與電阻相連并接入AT89C51的P3.7接口。
圖六  響鈴電路
2.4 總體運(yùn)行進(jìn)程
首先實(shí)現(xiàn)24小時(shí)制電子鐘,在8位數(shù)碼管顯示,顯示為時(shí)分秒,實(shí)現(xiàn)的格式為:23-59-59。到達(dá)預(yù)定時(shí)間啟動(dòng)蜂鳴器開始打鈴,打鈴的方式分為起床、熄燈和上下課鈴兩種。系統(tǒng)使用了4個(gè)按鍵,3只按鍵用來調(diào)整時(shí)間,另一只為強(qiáng)制打鈴按鈕。通過選擇鍵選擇調(diào)整位,選中位閃爍,按增加鍵為選中位加1,按減少鍵為選中位減1。按強(qiáng)制打鈴按鈕是實(shí)現(xiàn)強(qiáng)制打鈴或者強(qiáng)制關(guān)閉打鈴。









第三章  軟件電路設(shè)計(jì)及流程圖3.1 基本原理概述
主程序首先是初始化部分,主要是計(jì)時(shí)單元清零,中斷初始化,堆棧指針初始化,啟動(dòng)定時(shí)器工作,然后是調(diào)用顯示子程序。主程序的起始存儲(chǔ)地址是0000H單元,但由于本系統(tǒng)用了定時(shí)器T0的中斷,中斷服務(wù)程序入口地址為000BH,因此從0000H單元起存放一條短調(diào)轉(zhuǎn)指令A(yù)JMP,使真正的主程序從0300H單元開始存放。
3.1.1 中斷服務(wù)程序設(shè)計(jì)
單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器T0定時(shí)100ms,即0.1s,10次中斷即為1秒,60秒為1分,60分為1小時(shí),24小時(shí)為一天,如此循環(huán),從而實(shí)現(xiàn)計(jì)時(shí)功能。
編寫中斷服務(wù)程序關(guān)鍵要注意:1.現(xiàn)場(chǎng)保護(hù),本系統(tǒng)中是累加器A和程序狀態(tài)字PSW值的保護(hù)。2.計(jì)時(shí)處理時(shí)采用的確十進(jìn)制,因此時(shí),分,秒單元加1后要進(jìn)行十進(jìn)制調(diào)整,即要執(zhí)行DAA指令,還要注意的是時(shí)計(jì)到24就回零,分和秒計(jì)到60就回零。3.中斷返回前的現(xiàn)場(chǎng)恢復(fù)。
3.1.2 顯示程序設(shè)計(jì)和按鍵判斷與按鍵處理程序設(shè)計(jì)
顯示采用的是動(dòng)態(tài)顯示,段控和位控都經(jīng)過反相器,顯示的字形代碼是共陽的顯示代碼,位控信號(hào)輸出時(shí)是高電平有效,在校時(shí)時(shí),采用的是點(diǎn)亮小數(shù)點(diǎn)信位調(diào)節(jié)器標(biāo)志,哪位小數(shù)點(diǎn)亮表示調(diào)整的是該為的值。
顯示子程序的第一部分是拆字,顯示緩沖區(qū)是2FH—2AH;第二部分是查字型碼,輸出段控和位控信號(hào),由于采用的是動(dòng)態(tài)顯示,所以每出輸出一位的段控和位控信號(hào)要延時(shí)一定的時(shí)間,使LED顯示器顯示的字符時(shí)穩(wěn)定的。
按鍵判斷程序有編寫時(shí)應(yīng)注意按鍵的去抖動(dòng),該系統(tǒng)采用的是延時(shí)去抖動(dòng)的方法,延時(shí)是通過調(diào)用子程序來實(shí)現(xiàn)的,每個(gè)按鍵按下后都要等待釋放后再返回。
按鍵處理程序中的按鍵式校時(shí)的,所以進(jìn)入按鍵處理程序后就關(guān)閉定時(shí)中斷,對(duì)于動(dòng)能鍵注意設(shè)置顯示標(biāo)志。
3.2 流程圖3.2.1 系統(tǒng)主程序流程圖
3.2.2 系統(tǒng)定時(shí)中斷流程圖
第四章 系統(tǒng)程序設(shè)計(jì)4.1 程序設(shè)計(jì)概要
程序名稱:51 單片機(jī)自動(dòng)掃鈴機(jī)控制系統(tǒng)
說明:實(shí)現(xiàn)24 小時(shí)制電子鐘,8 位數(shù)碼管顯示,顯示時(shí)分秒顯示格式:23-59-59(小時(shí)十位如果為0 則不顯示)。
到預(yù)定時(shí)問啟動(dòng)蜂鳴器模擬打鈴,蜂鳴器BEEP: P3.7。
打鈴方式分起床、熄幻鈴和上、下課鈴兩種。
系統(tǒng)使用4 只按鍵,3 只按鍵用來調(diào)整時(shí)間,另一只為鬧鐘按鈕即定時(shí)掃鈴。
鍵SET_KFY: PI.0;通過選擇鍵選擇調(diào)整位,選中位閃爍。
增加鍵ADD_KEY:PI.1;按一次使選中位加1。
減少鍵DEC_KEY: PI.2;按一次使選中位位。1
如果長(zhǎng)按ADD_KEY 或DEC_KEY,識(shí)別后則進(jìn)行調(diào)時(shí)快進(jìn),此時(shí)停止閃爍。
如果選中位是秒,則按增加鍵或減少鍵都是將秒清零。
定時(shí)掃鈴鍵DALING_KEY: P1.3;用來強(qiáng)制打鈴或強(qiáng)制關(guān)閉鈴聲PO 口輸出數(shù)碼管段選信號(hào),P2 口輸出數(shù)碼管位選信號(hào)。晶振12M

第五章  自動(dòng)打鈴硬件原理圖
第六章  畢業(yè)設(shè)計(jì)總結(jié)
完成自動(dòng)打鈴系統(tǒng)設(shè)計(jì)的畢業(yè)設(shè)計(jì)我能綜合運(yùn)用電子技術(shù)課程中的所學(xué)到的理論知識(shí)來完成自動(dòng)打鈴機(jī)的設(shè)計(jì)和分析電路,學(xué)會(huì)了在虛擬的環(huán)境下創(chuàng)建電路,計(jì)算和調(diào)整參數(shù),我能靈活的應(yīng)用protcl99se 軟件畫圖,并且掌握了一定的單片片機(jī)知識(shí),通過這門課的設(shè)計(jì)我還有以下幾點(diǎn)收獲:
1、有利于基礎(chǔ)知識(shí)的掌握
通過這次設(shè)計(jì)我親手做,自己思考,將理論知識(shí)上升到實(shí)踐的高度,從而進(jìn)一步打破了單片機(jī)的神秘面紗。
2、有利于邏輯思維的鍛煉。
在許多常規(guī)可生的日常學(xué)習(xí)中我們不難發(fā)現(xiàn)這樣一個(gè)現(xiàn)象,不少學(xué)生的思維常處于混亂的狀態(tài),寫作文來前言不搭后語,解起數(shù)學(xué)題來步驟混亂,這些都是缺乏思維訓(xùn)練的結(jié)果,程序設(shè)計(jì)是公認(rèn)的,最能直接有效的訓(xùn)練學(xué)生的創(chuàng)造思維,培養(yǎng)分析問題解決問題的能力的方法之一。即使見到陌生的程序,從任務(wù)分析,確定算法界面布局,縮寫代碼到調(diào)試運(yùn)行,都能順利完成。
整個(gè)過程需要我們有條理的構(gòu)思,這之間有猜測(cè)設(shè)計(jì),判斷思維的抽象思維訓(xùn)練,又有分析問題解決問題,預(yù)測(cè)日標(biāo)等能力的培養(yǎng)。
致謝
在本文的撰寫過程中,導(dǎo)師王琦華給予了悉心的指導(dǎo)和關(guān)心,使我克服了眾多困難終于完成了畢業(yè)設(shè)計(jì)的撰寫工作。導(dǎo)師淵博的知識(shí)、嚴(yán)謹(jǐn)求實(shí)的治學(xué)態(tài)度及敬業(yè)精神,給我留下了深刻的印象,并將在我今后的人生道路上產(chǎn)生深遠(yuǎn)的影響,在此論文完成之際,謹(jǐn)向?qū)熤乱猿绺叩木匆夂椭孕牡母兄x!
再一次感謝所有關(guān)心我、幫助我的人!

單片機(jī)源程序如下:
  1. #include <reg52.h>                       //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無符號(hào)字符型 宏定義              變量范圍0~255
  3. #define uint  unsigned int              //無符號(hào)整型 宏定義              變量范圍0~65535
  4. #include "eeprom52.h"

  5. bit flag_200ms ;
  6. bit flag_100ms ;
  7. sbit beep = P3^7;                //蜂鳴器定義
  8. bit flag_beep_en;
  9. uint clock_value;     //用作鬧鐘用的

  10. uchar menu_1,menu_2;

  11. uchar key_time,flag_value;      //用做連加的中間變量
  12. bit key_500ms  ;

  13. //#include "key.h"
  14. #include "ds1302.h"
  15. #include "lcd1602.h"

  16. uchar fen1=0x30,shi1=0x06;                //第1個(gè)打鈴的時(shí)間                            起床
  17. uchar fen2=0x30,shi2=0x07;                //第2個(gè)打鈴的時(shí)間                            早自習(xí)
  18. uchar fen3=0x10,shi3=0x08;                //第3個(gè)打鈴的時(shí)間                            早自習(xí)下         
  19. uchar fen4=0x20,shi4=0x08;                //第4個(gè)打鈴的時(shí)間                            第一節(jié)上課   
  20. uchar fen5=0x00,shi5=0x09;                //第5個(gè)打鈴的時(shí)間                            第一節(jié)下課
  21. uchar fen6=0x10,shi6=0x09;                //第6個(gè)打鈴的時(shí)間                            第二節(jié)上課     
  22. uchar fen7=0x50,shi7=0x09;                //第7個(gè)打鈴的時(shí)間                            第二節(jié)下課  
  23. uchar fen8=0x00,shi8=0x10;                //第8個(gè)打鈴的時(shí)間                            第三節(jié)上課  
  24. uchar fen9=0x40,shi9=0x10;                //第9個(gè)打鈴的時(shí)間                            第三節(jié)下課
  25. uchar fen10=0x50,shi10=0x10;                //第10個(gè)打鈴的時(shí)間 第四節(jié)上課
  26. uchar fen11=0x30,shi11=0x11;                //第11個(gè)打鈴的時(shí)間 第四節(jié)下課
  27. uchar fen12=0x30,shi12=0x13;                //第12個(gè)打鈴的時(shí)間 第五節(jié)上課
  28. uchar fen13=0x10,shi13=0x14;                //第13個(gè)打鈴的時(shí)間 第五節(jié)下課
  29. uchar fen14=0x20,shi14=0x14;                //第14個(gè)打鈴的時(shí)間 第六節(jié)上課
  30. uchar fen15=0x00,shi15=0x15;                //第15個(gè)打鈴的時(shí)間 第六節(jié)下課
  31. uchar fen16=0x20,shi16=0x15;                //第16個(gè)打鈴的時(shí)間 第七節(jié)上課
  32. uchar fen17=0x00,shi17=0x16;                //第17個(gè)打鈴的時(shí)間 第七節(jié)下課
  33. uchar fen18=0x10,shi18=0x16;                //第18個(gè)打鈴的時(shí)間 第八節(jié)上課
  34. uchar fen19=0x50,shi19=0x16;                //第19個(gè)打鈴的時(shí)間 第八節(jié)下課
  35. uchar fen20=0x00,shi20=0x19;                //第20個(gè)打鈴的時(shí)間 晚自習(xí)上課
  36. uchar fen21=0x30,shi21=0x20;                //第21個(gè)打鈴的時(shí)間 晚自習(xí)下課
  37. uchar fen22=0x30,shi22=0x22;                //第22個(gè)打鈴的時(shí)間 熄燈
  38. uchar fen23=0x00,shi23=0x00;                //第23個(gè)打鈴的時(shí)間
  39. uchar fen24=0x00,shi24=0x00;                //第24個(gè)打鈴的時(shí)間
  40. uchar fen25=0x00,shi25=0x00;                //第25個(gè)打鈴的時(shí)間
  41. uchar fen26=0x00,shi26=0x00;                //第26個(gè)打鈴的時(shí)間


  42. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  43. void write_eeprom()
  44. {
  45.               SectorErase(0x2000);
  46.               byte_write(0x2000, fen1);                 //第1個(gè)打鈴的時(shí)間
  47.               byte_write(0x2001, shi1);
  48.               byte_write(0x2002, fen2);                 //第2個(gè)打鈴的時(shí)間
  49.               byte_write(0x2003, shi2);
  50.               byte_write(0x2004, fen3);                 //第3個(gè)打鈴的時(shí)間
  51.               byte_write(0x2005, shi3);
  52.               byte_write(0x2006, fen4);                 //第4個(gè)打鈴的時(shí)間
  53.               byte_write(0x2007, shi4);
  54.               byte_write(0x2008, fen5);                 //第5個(gè)打鈴的時(shí)間
  55.               byte_write(0x2009, shi5);
  56.               byte_write(0x2010, fen6);                 //第6個(gè)打鈴的時(shí)間
  57.               byte_write(0x2011, shi6);
  58.               byte_write(0x2012, fen7);                 //第7個(gè)打鈴的時(shí)間
  59.               byte_write(0x2013, shi7);
  60.               byte_write(0x2014, fen8);                 //第8個(gè)打鈴的時(shí)間
  61.               byte_write(0x2015, shi8);
  62.               byte_write(0x2016, fen9);                 //第9個(gè)打鈴的時(shí)間
  63.               byte_write(0x2017, shi9);
  64.               byte_write(0x2018, fen10);                 //第10個(gè)打鈴的時(shí)間
  65.               byte_write(0x2019, shi10);
  66.               byte_write(0x2020, fen11);                 //第11個(gè)打鈴的時(shí)間
  67.               byte_write(0x2021, shi11);
  68.               byte_write(0x2022, fen12);                 //第12個(gè)打鈴的時(shí)間
  69.               byte_write(0x2023, shi12);
  70.               byte_write(0x2024, fen13);                 //第13個(gè)打鈴的時(shí)間
  71.               byte_write(0x2025, shi13);
  72.               byte_write(0x2026, fen14);                 //第14個(gè)打鈴的時(shí)間
  73.               byte_write(0x2027, shi14);
  74.               byte_write(0x2028, fen15);                 //第15個(gè)打鈴的時(shí)間
  75.               byte_write(0x2029, shi15);                              
  76.               byte_write(0x2030, fen16);                 //第16個(gè)打鈴的時(shí)間
  77.               byte_write(0x2031, shi16);
  78.               byte_write(0x2032, fen17);                 //第17個(gè)打鈴的時(shí)間
  79.               byte_write(0x2033, shi17);
  80.               byte_write(0x2034, fen18);                 //第18個(gè)打鈴的時(shí)間
  81.               byte_write(0x2035, shi18);
  82.               byte_write(0x2036, fen19);                 //第19個(gè)打鈴的時(shí)間
  83.               byte_write(0x2037, shi19);
  84.               byte_write(0x2038, fen20);                 //第20個(gè)打鈴的時(shí)間
  85.               byte_write(0x2039, shi20);
  86.               byte_write(0x2040, fen21);                 //第21個(gè)打鈴的時(shí)間
  87.               byte_write(0x2041, shi21);
  88.               byte_write(0x2042, fen22);                 //第22個(gè)打鈴的時(shí)間
  89.               byte_write(0x2043, shi22);
  90.               byte_write(0x2044, fen23);                 //第23個(gè)打鈴的時(shí)間
  91.               byte_write(0x2045, shi23);
  92.               byte_write(0x2046, fen24);                 //第24個(gè)打鈴的時(shí)間
  93.               byte_write(0x2047, shi24);                                                                                   
  94.               byte_write(0x2048, fen25);                 //第25個(gè)打鈴的時(shí)間
  95.               byte_write(0x2049, shi25);                                                                                   
  96.               byte_write(0x2050, fen26);                 //第26個(gè)打鈴的時(shí)間
  97.               byte_write(0x2051, shi26);                                                                                   
  98.               byte_write(0x2058, a_a);            
  99. }

  100. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
  101. void read_eeprom()
  102. {
  103.               fen1  = byte_read(0x2000);                //第1個(gè)打鈴的時(shí)間
  104.               shi1  = byte_read(0x2001);
  105.               fen2  = byte_read(0x2002);                //第2個(gè)打鈴的時(shí)間
  106.               shi2  = byte_read(0x2003);
  107.               fen3  = byte_read(0x2004);                //第3個(gè)打鈴的時(shí)間
  108.               shi3  = byte_read(0x2005);
  109.               fen4  = byte_read(0x2006);                //第4個(gè)打鈴的時(shí)間
  110.               shi4  = byte_read(0x2007);
  111.               fen5  = byte_read(0x2008);                //第5個(gè)打鈴的時(shí)間
  112.               shi5  = byte_read(0x2009);
  113.               fen6  = byte_read(0x2010);                //第6個(gè)打鈴的時(shí)間
  114.               shi6  = byte_read(0x2011);
  115.               fen7  = byte_read(0x2012);                //第7個(gè)打鈴的時(shí)間
  116.               shi7  = byte_read(0x2013);
  117.               fen8  = byte_read(0x2014);                //第8個(gè)打鈴的時(shí)間
  118.               shi8  = byte_read(0x2015);
  119.               fen9  = byte_read(0x2016);                //第9個(gè)打鈴的時(shí)間
  120.               shi9  = byte_read(0x2017);
  121.               fen10  = byte_read(0x2018);                //第10個(gè)打鈴的時(shí)間
  122.               shi10  = byte_read(0x2019);
  123.               fen11  = byte_read(0x2020);                //第11個(gè)打鈴的時(shí)間
  124.               shi11  = byte_read(0x2021);
  125.               fen12  = byte_read(0x2022);                //第12個(gè)打鈴的時(shí)間
  126.               shi12  = byte_read(0x2023);
  127.               fen13  = byte_read(0x2024);                //第13個(gè)打鈴的時(shí)間
  128.               shi13  = byte_read(0x2025);
  129.               fen14  = byte_read(0x2026);                //第14個(gè)打鈴的時(shí)間
  130.               shi14  = byte_read(0x2027);
  131.               fen15  = byte_read(0x2028);                //第15個(gè)打鈴的時(shí)間
  132.               shi15  = byte_read(0x2029);
  133.               fen16  = byte_read(0x2030);                //第16個(gè)打鈴的時(shí)間
  134.               shi16 = byte_read(0x2031);
  135.               fen17  = byte_read(0x2032);                //第17個(gè)打鈴的時(shí)間
  136.               shi17  = byte_read(0x2033);
  137.               fen18  = byte_read(0x2034);                //第18個(gè)打鈴的時(shí)間
  138.               shi18  = byte_read(0x2035);
  139.               fen19  = byte_read(0x2036);                //第19個(gè)打鈴的時(shí)間
  140.               shi19  = byte_read(0x2037);
  141.               fen20  = byte_read(0x2038);                //第20個(gè)打鈴的時(shí)間
  142.               shi20  = byte_read(0x2039);
  143.               fen21  = byte_read(0x2040);                //第21個(gè)打鈴的時(shí)間
  144.               shi21  = byte_read(0x2041);
  145.               fen22  = byte_read(0x2042);                //第22個(gè)打鈴的時(shí)間
  146.               shi22  = byte_read(0x2043);
  147.               fen23  = byte_read(0x2044);                //第23個(gè)打鈴的時(shí)間
  148.               shi23  = byte_read(0x2045);
  149.               fen24  = byte_read(0x2046);                //第24個(gè)打鈴的時(shí)間
  150.               shi24  = byte_read(0x2047);
  151.               fen25  = byte_read(0x2048);                //第25個(gè)打鈴的時(shí)間
  152.               shi25  = byte_read(0x2049);
  153.               fen26  = byte_read(0x2050);                //第26個(gè)打鈴的時(shí)間
  154.               shi26  = byte_read(0x2051);
  155.               a_a      = byte_read(0x2058);
  156. }

  157. /**************開機(jī)自檢eeprom初始化*****************/
  158. void init_eeprom()
  159. {
  160.               read_eeprom();                            //先讀
  161.               if(a_a != 2)                            //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
  162.               {
  163.                             a_a = 2;
  164.                             fen1=0x30,shi1=0x06;                //第1個(gè)打鈴的時(shí)間                            起床
  165.                             fen2=0x30,shi2=0x07;                //第2個(gè)打鈴的時(shí)間                            早自習(xí)
  166.                             fen3=0x10,shi3=0x08;                //第3個(gè)打鈴的時(shí)間                            早自習(xí)下         
  167.                             fen4=0x20,shi4=0x08;                //第4個(gè)打鈴的時(shí)間                            第一節(jié)上課   
  168.                             fen5=0x00,shi5=0x09;                //第5個(gè)打鈴的時(shí)間                            第一節(jié)下課
  169.                             fen6=0x10,shi6=0x09;                //第6個(gè)打鈴的時(shí)間                            第二節(jié)上課     
  170.                             fen7=0x50,shi7=0x09;                //第7個(gè)打鈴的時(shí)間                            第二節(jié)下課  
  171.                             fen8=0x00,shi8=0x10;                //第8個(gè)打鈴的時(shí)間                            第三節(jié)上課  
  172.                             fen9=0x40,shi9=0x10;                //第9個(gè)打鈴的時(shí)間                            第三節(jié)下課
  173.                             fen10=0x50,shi10=0x10;                //第10個(gè)打鈴的時(shí)間 第四節(jié)上課
  174.                             fen11=0x30,shi11=0x11;                //第11個(gè)打鈴的時(shí)間 第四節(jié)下課
  175.                             fen12=0x30,shi12=0x13;                //第12個(gè)打鈴的時(shí)間 第五節(jié)上課
  176.                             fen13=0x10,shi13=0x14;                //第13個(gè)打鈴的時(shí)間 第五節(jié)下課
  177.                             fen14=0x20,shi14=0x14;                //第14個(gè)打鈴的時(shí)間 第六節(jié)上課
  178.                             fen15=0x00,shi15=0x15;                //第15個(gè)打鈴的時(shí)間 第六節(jié)下課
  179.                             fen16=0x20,shi16=0x15;                //第16個(gè)打鈴的時(shí)間 第七節(jié)上課
  180.                             fen17=0x00,shi17=0x16;                //第17個(gè)打鈴的時(shí)間 第七節(jié)下課
  181.                             fen18=0x10,shi18=0x16;                //第18個(gè)打鈴的時(shí)間 第八節(jié)上課
  182.                             fen19=0x50,shi19=0x16;                //第19個(gè)打鈴的時(shí)間 第八節(jié)下課
  183.                             fen20=0x00,shi20=0x19;                //第20個(gè)打鈴的時(shí)間 晚自習(xí)上課
  184.                             fen21=0x30,shi21=0x20;                //第21個(gè)打鈴的時(shí)間 晚自習(xí)下課
  185.                             fen22=0x30,shi22=0x22;                //第22個(gè)打鈴的時(shí)間 熄燈
  186.                             fen23=0x00,shi23=0x00;                //第23個(gè)打鈴的時(shí)間
  187.                             fen24=0x00,shi24=0x00;                //第24個(gè)打鈴的時(shí)間
  188.                             fen25=0x00,shi25=0x00;                //第25個(gè)打鈴的時(shí)間
  189.                             fen26=0x00,shi26=0x00;                //第25個(gè)打鈴的時(shí)間
  190.                             write_eeprom();                 //保存數(shù)據(jù)
  191.               }            
  192. }


  193. /******************1ms 延時(shí)函數(shù)*******************/
  194. void delay_1ms(uint q)
  195. {
  196.               uint i,j;
  197.               for(i=0;i<q;i++)
  198.                             for(j=0;j<120;j++);
  199. }

  200. /*************定時(shí)器0初始化程序***************/
  201. void init_1602_ds1302()
  202. {
  203.               write_sfm2_ds1302(2,3,nian);            
  204.               write_sfm2_ds1302(2,6,yue);            
  205.               write_sfm2_ds1302(2,9,ri);            
  206.               write_sfm2_ds1302(1,2,shi);            
  207.               write_sfm2_ds1302(1,5,fen);            
  208.               write_sfm2_ds1302(1,8,miao);
  209.               write_sfm1(1,14,week);                           
  210. }                                                                                                                                

  211. /*************定時(shí)器0初始化程序***************/
  212. void init_time0()               
  213. {
  214.               EA   = 1;                              //開總中斷
  215.               TMOD = 0X01;                //定時(shí)器0、工作方式1
  216.               ET0  = 1;                              //開定時(shí)器0中斷
  217.               TR0  = 1;                              //允許定時(shí)器0定時(shí)
  218. }

  219. /*************鬧鐘報(bào)警函數(shù)***************/
  220. void menu_dis()
  221. {
  222.               static uchar mm,value;
  223.               if(flag_100ms == 1)                              //100ms執(zhí)行一次
  224.               {
  225.                             flag_100ms = 0;
  226.                             {            
  227.                                           if(miao == 0)
  228.                                           if(((fen == fen1) && (shi == shi1) && (shi1 != 0)) ||
  229.                                              ((fen == fen2) && (shi == shi2) && (shi2 != 0)) ||              //第2個(gè)打鈴時(shí)間判斷
  230.                                              ((fen == fen3) && (shi == shi3) && (shi3 != 0)) ||              //第3個(gè)打鈴時(shí)間判斷
  231.                                              ((fen == fen4) && (shi == shi4) && (shi4 != 0)) ||              //第4個(gè)打鈴時(shí)間判斷
  232.                                              ((fen == fen5) && (shi == shi5) && (shi5 != 0)) ||              //第5個(gè)打鈴時(shí)間判斷
  233.                                              ((fen == fen6) && (shi == shi6) && (shi6 != 0)) ||              //第6個(gè)打鈴時(shí)間判斷
  234.                                              ((fen == fen7) && (shi == shi7) && (shi7 != 0)) ||              //第7個(gè)打鈴時(shí)間判斷
  235.                                              ((fen == fen8) && (shi == shi8) && (shi8 != 0)) ||              //第8個(gè)打鈴時(shí)間判斷
  236.                                              ((fen == fen9) && (shi == shi9) && (shi9 != 0)) ||              //第9個(gè)打鈴時(shí)間判斷
  237.                                              ((fen == fen10) && (shi == shi10) && (shi10 != 0)) ||              //第10個(gè)打鈴時(shí)間判斷
  238.                                              ((fen == fen11) && (shi == shi11) && (shi11 != 0)) ||              //第11個(gè)打鈴時(shí)間判斷
  239.                                              ((fen == fen12) && (shi == shi12) && (shi12 != 0)) ||              //第12個(gè)打鈴時(shí)間判斷
  240.                                              ((fen == fen13) && (shi == shi13) && (shi13 != 0)) ||              //第13個(gè)打鈴時(shí)間判斷
  241.                                              ((fen == fen14) && (shi == shi14) && (shi14 != 0)) ||              //第14個(gè)打鈴時(shí)間判斷
  242.                                              ((fen == fen15) && (shi == shi15) && (shi15 != 0)) ||              //第15個(gè)打鈴時(shí)間判斷
  243.                                              ((fen == fen16) && (shi == shi16) && (shi16 != 0)) ||              //第16個(gè)打鈴時(shí)間判斷
  244.                                              ((fen == fen17) && (shi == shi17) && (shi17 != 0)) ||              //第17個(gè)打鈴時(shí)間判斷
  245.                                              ((fen == fen18) && (shi == shi18) && (shi18 != 0)) ||              //第18個(gè)打鈴時(shí)間判斷
  246.                                              ((fen == fen19) && (shi == shi19) && (shi19 != 0)) ||              //第19個(gè)打鈴時(shí)間判斷
  247.                                              ((fen == fen20) && (shi == shi20) && (shi20 != 0)) ||              //第20個(gè)打鈴時(shí)間判斷
  248.                                              ((fen == fen21) && (shi == shi21) && (shi21 != 0)) ||              //第21個(gè)打鈴時(shí)間判斷
  249.                                              ((fen == fen22) && (shi == shi22) && (shi22 != 0)) ||              //第22個(gè)打鈴時(shí)間判斷
  250.                                              ((fen == fen23) && (shi == shi23) && (shi23 != 0)) ||              //第23個(gè)打鈴時(shí)間判斷
  251.                                              ((fen == fen24) && (shi == shi24) && (shi24 != 0)) ||              //第24個(gè)打鈴時(shí)間判斷
  252.                                              ((fen == fen25) && (shi == shi25) && (shi25 != 0)) ||              //第25個(gè)打鈴時(shí)間判斷
  253.                                              ((fen == fen26) && (shi == shi26) && (shi26 != 0))               //第26個(gè)打鈴時(shí)間判斷
  254.                                                         )
  255.                                                         flag_beep_en = 1;              //打鈴蜂鳴器響的標(biāo)志位                                                      
  256.                                           if(flag_beep_en == 1)              //打鈴以被打開
  257.                                           {
  258.                                                         clock_value++;
  259.                                                         beep = ~beep;                 //蜂鳴器叫3秒
  260.                                                         //  15 秒后自動(dòng)關(guān)閉鬧鐘
  261.                                                         value ++;
  262.                                                         if(value >= 10)
  263.                                                         {
  264.                                                                       value = 0;
  265.                                                                       mm++;
  266.                                                                       if(mm >= 15)
  267.                                                                       {
  268.                                                                                     mm = 0;
  269.                                                                                     flag_beep_en = 0;
  270.                                                                                     beep = 1;
  271.                                                                       }
  272.                                                         }                                                                     
  273.                                           }
  274.                             }            
  275.               }
  276. }


  277. /********************獨(dú)立按鍵程序*****************/
  278. uchar key_can;              //按鍵值

  279. void key()              //獨(dú)立按鍵程序
  280. {
  281.               static uchar key_new;
  282.               key_can = 20;                   //按鍵值還原
  283.               P3 |= 0x78;                     //對(duì)應(yīng)的按鍵IO口輸出為1
  284.               if((P3 & 0x78) != 0x78)                            //按鍵按下
  285.               {
  286.                             delay_1ms(1);                                 //按鍵消抖動(dòng)
  287.                             if(((P3 & 0x78) != 0x78) && (key_new == 1))
  288.                             {                                                                                    //確認(rèn)是按鍵按下
  289.                                           key_new = 0;
  290.                                           switch(P3 & 0x78)
  291.                                           {
  292.                                                         case 0x70:  key_can = 4;  break;              //得到按鍵值
  293.                                                         case 0x68:  key_can = 3;  break;              //得到按鍵值
  294.                                                         case 0x58:  key_can = 2;  break;              //得到按鍵值
  295.                                                         case 0x38:  key_can = 1;  break;              //得到按鍵值
  296.                                           }
  297. //                                          write_sfm2(1,0,key_can);                                                        //顯示按鍵值
  298.                             }                                         
  299.               }
  300.               else
  301.                             key_new = 1;            
  302. }


  303. /**********************設(shè)置函數(shù)************************/
  304. void key_with()
  305. {
  306.               if(key_can == 1)              //設(shè)置鍵
  307.               {
  308.                             menu_1++;
  309.                             if(menu_1 == 1)                //設(shè)置時(shí)間
  310.                             {
  311.                                           menu_2 = 1;
  312.                                           write_string(1,0,"    -  -    W:  ");                                         
  313.                                           write_string(2,0," 20  -  -       ");            
  314.                             }
  315.                             menu_2 = 1;
  316.                             if(menu_1 > 15)    //回到正常顯示
  317.                             {
  318.                                           menu_1 = 0;
  319.                                           write_guanbiao(1,2,0);                //關(guān)閉光標(biāo)
  320.                                           init_1602_dis_csf();      //初始化液晶顯示                           
  321.                             }
  322.               }
  323.               if(key_can == 2)              //選擇鍵
  324.               {
  325.                             flag_200ms = 1;
  326.                             if(menu_1 == 1)                              //設(shè)置時(shí)間
  327.                             {
  328.                                           menu_2 ++;
  329.                                           if(menu_2 > 7)
  330.                                                         menu_2 = 1;
  331.                             }
  332.                             if(menu_1 != 1)                            //設(shè)置
  333.                             {
  334.                                           menu_2 ++;
  335.                                           if(menu_2 > 4)
  336.                                                         menu_2 = 1;                                                      
  337.                             }
  338.               }
  339.               if(menu_1 == 1)
  340.               {
  341.                             if(menu_2 == 1)                              //設(shè)置時(shí)
  342.                             {
  343.                                           if(key_can == 3)              //加
  344.                                           {
  345.                                                         shi+=0x01;
  346.                                                         if((shi & 0x0f) >= 0x0a)
  347.                                                                       shi = (shi & 0xf0) + 0x10;
  348.                                                         if(shi >= 0x24)
  349.                                                                       shi = 0;
  350.                                           }                           
  351.                                           if(key_can == 4)              //減
  352.                                           {
  353.                                                         if(shi == 0x00)
  354.                                                                       shi = 0x24;
  355.                                                         if((shi & 0x0f) == 0x00)
  356.                                                                       shi = (shi | 0x0a) - 0x10;
  357.                                                         shi -- ;
  358.                                           }                                                                       
  359.                             }
  360.                             if(menu_2 == 2)                              //設(shè)置分
  361.                             {
  362.                                           if(key_can == 3)              //加
  363.                                           {
  364.                                                         fen+=0x01;
  365.                                                         if((fen & 0x0f) >= 0x0a)
  366.                                                                       fen = (fen & 0xf0) + 0x10;
  367.                                                         if(fen >= 0x60)
  368.                                                                       fen = 0;
  369.                                           }                           
  370.                                           if(key_can == 4)              //減               
  371.                                           {
  372.                                                         if(fen == 0x00)
  373.                                                                       fen = 0x5a;
  374.                                                         if((fen & 0x0f) == 0x00)
  375.                                                                       fen = (fen | 0x0a) - 0x10;
  376.                                                         fen -- ;
  377.                                           }            
  378.                             }
  379.                             if(menu_2 == 3)                              //設(shè)置秒
  380.                             {
  381.                                           if(key_can == 3)              //加
  382.                                           {
  383.                                                         miao+=0x01;
  384.                                                         if((miao & 0x0f) >= 0x0a)
  385.                                                                       miao = (miao & 0xf0) + 0x10;
  386.                                                         if(miao >= 0x60)
  387.                                                                       miao = 0;
  388.                                           }            
  389.                                           if(key_can == 4)              //減               
  390.                                           {
  391.                                                         if(miao == 0x00)
  392.                                                                       miao = 0x5a;
  393.                                                         if((miao & 0x0f) == 0x00)
  394.                                                                       miao = (miao | 0x0a) - 0x10;
  395.                                                         miao -- ;                                         
  396.                                           }
  397.                             }
  398.                             if(menu_2 == 4)                              //設(shè)置星期
  399.                             {
  400.                                           if(key_can == 3)              //加
  401.                                           {
  402.                                               week+=0x01;
  403.                                                         if((week & 0x0f) >= 0x0a)
  404.                                                                       week = (week & 0xf0) + 0x10;
  405.                                                         if(week >= 0x08)
  406.                                                                       week = 1;
  407.                                           }                           
  408.                                           if(key_can == 4)              //減               
  409.                                           {
  410.                                                         if(week == 0x01)
  411.                                                                       week = 0x08;
  412.                                                         if((week & 0x0f) == 0x00)
  413.                                                                       week = (week | 0x0a) - 0x10;
  414.                                                         week -- ;
  415.                                           }            
  416.                             }
  417.                             if(menu_2 == 5)                              //設(shè)置年
  418.                             {
  419.                                           if(key_can == 3)              //加
  420.                                           {
  421.                                               nian+=0x01;
  422.                                                         if((nian & 0x0f) >= 0x0a)
  423.                                                                       nian = (nian & 0xf0) + 0x10;
  424.                                                         if(nian >= 0x9a)
  425.                                                                       nian = 1;
  426.                                           }                           
  427.                                           if(key_can == 4)              //減               
  428.                                           {
  429.                                                         if(nian == 0x01)
  430.                                                                       nian = 0x9a;
  431.                                                         if((nian & 0x0f) == 0x00)
  432.                                                                       nian = (nian | 0x0a) - 0x10;
  433.                                                         nian -- ;                           
  434.                                           }            
  435.                             }
  436.                             if(menu_2 == 6)                              //設(shè)置月
  437.                             {
  438.                                           if(key_can == 3)              //加
  439.                                           {
  440.                                               yue+=0x01;
  441.                                                         if((yue & 0x0f) >= 0x0a)
  442.                                                                       yue = (yue & 0xf0) + 0x10;
  443.                                                         if(yue >= 0x13)
  444.                                                                       yue = 1;
  445.                                           }                           
  446.                                           if(key_can == 4)              //減               
  447.                                           {
  448.                                                         if(yue == 0x01)
  449.                                                                       yue = 0x13;
  450.                                                         if((yue & 0x0f) == 0x00)
  451.                                                                       yue = (yue | 0x0a) - 0x10;
  452.                                                         yue -- ;                                                                     
  453.                                           }            
  454.                             }
  455.                             if(menu_2 == 7)                              //設(shè)置日
  456.                             {
  457.                                           if(key_can == 3)              //加
  458.                                           {
  459.                                 ri+=0x01;
  460.                                           if((ri & 0x0f) >= 0x0a)
  461.                                                         ri = (ri & 0xf0) + 0x10;
  462.                                           if(ri >= 0x32)
  463.                                                         ri = 0;                                         
  464.                                           }                           
  465.                                           if(key_can == 4)              //減               
  466.                                           {
  467.                                                         if(ri == 0x01)
  468.                                                                       ri = 0x32;
  469.                                                         if((ri & 0x0f) == 0x00)
  470.                                                                       ri = (ri | 0x0a) - 0x10;
  471.                                                         ri -- ;                                         
  472.                                           }            
  473.                             }
  474.                             write_sfm2_ds1302(1,2,shi);                 //顯示時(shí)
  475.                             write_sfm2_ds1302(1,5,fen);                 //顯示分
  476.                             write_sfm2_ds1302(1,8,miao);                 //顯示秒
  477.                             write_sfm1(1,14,week);                 //顯示星期                                                                     
  478.                             write_sfm2_ds1302(2,3,nian);                 //顯示年
  479.                             write_sfm2_ds1302(2,6,yue);                 //顯示月
  480.                             write_sfm2_ds1302(2,9,ri);                 //顯示日
  481.                             switch(menu_2)                 // 光標(biāo)顯示
  482.                             {
  483.                                           case 1:  write_guanbiao(1,2,1);  break;
  484.                                           case 2:  write_guanbiao(1,5,1);  break;
  485.                                           case 3:  write_guanbiao(1,8,1);  break;
  486.                                           case 4:  write_guanbiao(1,14,1); break;
  487.                                           case 5:  write_guanbiao(2,3,1);  break;
  488.                                           case 6:  write_guanbiao(2,6,1);  break;
  489.                                           case 7:  write_guanbiao(2,9,1);  break;
  490.                             }
  491.                             write_time();                 //把時(shí)間寫進(jìn)去
  492.               }            
  493. /***************設(shè)置1 2打鈴時(shí)間*********************/
  494.               if(menu_1 == 2)
  495.               {            
  496. /////////////////////                 第1個(gè)打鈴時(shí)間
  497.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  498.                             {
  499.                                           if(key_can == 3)              //加            
  500.                                                         set_ds1302time(1,&shi1,0x24);                           
  501.                                           if(key_can == 4)              //減               
  502.                                                         set_ds1302time(0,&shi1,0x24);                           
  503.                             }
  504.                             if(menu_2 == 2)                              //設(shè)
  505.                             {
  506.                                           if(key_can == 3)              //加
  507.                                                         set_ds1302time(1,&fen1,0x60);                           
  508.                                           if(key_can == 4)              //減               
  509.                                                         set_ds1302time(0,&fen1,0x60);                           
  510.                             }            
  511. /////////////////////                 第2個(gè)打鈴時(shí)間            
  512.                             if(menu_2 == 3)                              //設(shè)置打鈴分
  513.                             {
  514.                                           if(key_can == 3)              //加              第2個(gè)打鈴時(shí)間
  515.                                                         set_ds1302time(1,&shi2,0x24);                           
  516.                                           if(key_can == 4)              //減               
  517.                                                         set_ds1302time(0,&shi2,0x24);                           
  518.                             }
  519.                             if(menu_2 == 4)                              //設(shè)
  520.                             {
  521.                                           if(key_can == 3)              //加
  522.                                                         set_ds1302time(1,&fen2,0x60);                           
  523.                                           if(key_can == 4)              //減               
  524.                                                         set_ds1302time(0,&fen2,0x60);                           
  525.                             }
  526.                             write_string(1,0," set1 00:00    ");                                         
  527.                             write_string(2,0," set2 00:00      ");            
  528.                             write_sfm2_ds1302(1,6,shi1);                 //顯示時(shí)
  529.                             write_sfm2_ds1302(1,9,fen1);                 //顯示分
  530.                             write_sfm2_ds1302(2,6,shi2);                 //顯示時(shí)
  531.                             write_sfm2_ds1302(2,9,fen2);                 //顯示分
  532.                             switch(menu_2)                 // 光標(biāo)顯示
  533.                             {
  534.                                           case 1:  write_guanbiao(1,6,1);  break;
  535.                                           case 2:  write_guanbiao(1,9,1);  break;
  536.                                           case 3:  write_guanbiao(2,6,1);  break;
  537.                                           case 4:  write_guanbiao(2,9,1);  break;
  538.                             }            
  539.                             write_eeprom();     //保存鬧鐘時(shí)間
  540.               }            
  541. /***************設(shè)置3 4打鈴時(shí)間*********************/
  542.               if(menu_1 == 3)
  543.               {            
  544. /////////////////////                 第1個(gè)打鈴時(shí)間
  545.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  546.                             {
  547.                                           if(key_can == 3)              //加            
  548.                                                         set_ds1302time(1,&shi3,0x24);                           
  549.                                           if(key_can == 4)              //減               
  550.                                                         set_ds1302time(0,&shi3,0x24);                           
  551.                             }
  552.                             if(menu_2 == 2)                              //設(shè)
  553.                             {
  554.                                           if(key_can == 3)              //加
  555.                                                         set_ds1302time(1,&fen3,0x60);                           
  556.                                           if(key_can == 4)              //減               
  557.                                                         set_ds1302time(0,&fen3,0x60);                           
  558.                             }            
  559. /////////////////////                 第2個(gè)打鈴時(shí)間            
  560.                             if(menu_2 == 3)                              //設(shè)置打鈴分
  561.                             {
  562.                                           if(key_can == 3)              //加              第2個(gè)打鈴時(shí)間
  563.                                                         set_ds1302time(1,&shi4,0x24);                           
  564.                                           if(key_can == 4)              //減               
  565.                                                         set_ds1302time(0,&shi4,0x24);                           
  566.                             }
  567.                             if(menu_2 == 4)                              //設(shè)
  568.                             {
  569.                                           if(key_can == 3)              //加
  570.                                                         set_ds1302time(1,&fen4,0x60);                           
  571.                                           if(key_can == 4)              //減               
  572.                                                         set_ds1302time(0,&fen4,0x60);                           
  573.                             }
  574.                             write_string(1,0," set3 00:00    ");                                         
  575.                             write_string(2,0," set4 00:00      ");            
  576.                             write_sfm2_ds1302(1,6,shi3);                 //顯示時(shí)
  577.                             write_sfm2_ds1302(1,9,fen3);                 //顯示分
  578.                             write_sfm2_ds1302(2,6,shi4);                 //顯示時(shí)
  579.                             write_sfm2_ds1302(2,9,fen4);                 //顯示分
  580.                             switch(menu_2)                 // 光標(biāo)顯示
  581.                             {
  582.                                           case 1:  write_guanbiao(1,6,1);  break;
  583.                                           case 2:  write_guanbiao(1,9,1);  break;
  584.                                           case 3:  write_guanbiao(2,6,1);  break;
  585.                                           case 4:  write_guanbiao(2,9,1);  break;
  586.                             }            
  587.                             write_eeprom();     //保存鬧鐘時(shí)間
  588.               }            
  589. /***************設(shè)置5 6打鈴時(shí)間*********************/
  590.               if(menu_1 == 4)
  591.               {            
  592. /////////////////////                 第5個(gè)打鈴時(shí)間
  593.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  594.                             {
  595.                                           if(key_can == 3)              //加            
  596.                                                         set_ds1302time(1,&shi5,0x24);                           
  597.                                           if(key_can == 4)              //減               
  598.                                                         set_ds1302time(0,&shi5,0x24);                           
  599.                             }
  600.                             if(menu_2 == 2)                              //設(shè)
  601.                             {
  602.                                           if(key_can == 3)              //加
  603.                                                         set_ds1302time(1,&fen5,0x60);                           
  604.                                           if(key_can == 4)              //減               
  605.                                                         set_ds1302time(0,&fen5,0x60);                           
  606.                             }            
  607. /////////////////////                 第6個(gè)打鈴時(shí)間            
  608.                             if(menu_2 == 3)                              //設(shè)置打鈴分
  609.                             {
  610.                                           if(key_can == 3)              //加            
  611.                                                         set_ds1302time(1,&shi6,0x24);                           
  612.                                           if(key_can == 4)              //減               
  613.                                                         set_ds1302time(0,&shi6,0x24);                           
  614.                             }
  615.                             if(menu_2 == 4)                              //設(shè)
  616.                             {
  617.                                           if(key_can == 3)              //加
  618.                                                         set_ds1302time(1,&fen6,0x60);                           
  619.                                           if(key_can == 4)              //減               
  620.                                                         set_ds1302time(0,&fen6,0x60);                           
  621.                             }
  622.                             write_string(1,0," set5 00:00    ");                                         
  623.                             write_string(2,0," set6 00:00      ");            
  624.                             write_sfm2_ds1302(1,6,shi5);                 //顯示時(shí)
  625.                             write_sfm2_ds1302(1,9,fen5);                 //顯示分
  626.                             write_sfm2_ds1302(2,6,shi6);                 //顯示時(shí)
  627.                             write_sfm2_ds1302(2,9,fen6);                 //顯示分
  628.                             switch(menu_2)                 // 光標(biāo)顯示
  629.                             {
  630.                                           case 1:  write_guanbiao(1,6,1);  break;
  631.                                           case 2:  write_guanbiao(1,9,1);  break;
  632.                                           case 3:  write_guanbiao(2,6,1);  break;
  633.                                           case 4:  write_guanbiao(2,9,1);  break;
  634.                             }            
  635.                             write_eeprom();     //保存鬧鐘時(shí)間
  636.               }            
  637. /***************設(shè)置7 8打鈴時(shí)間*********************/
  638.               if(menu_1 == 5)
  639.               {            
  640. /////////////////////                 第7個(gè)打鈴時(shí)間
  641.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  642.                             {
  643.                                           if(key_can == 3)              //加            
  644.                                                         set_ds1302time(1,&shi7,0x24);                           
  645.                                           if(key_can == 4)              //減               
  646.                                                         set_ds1302time(0,&shi7,0x24);                           
  647.                             }
  648.                             if(menu_2 == 2)                              //設(shè)
  649.                             {
  650.                                           if(key_can == 3)              //加
  651.                                                         set_ds1302time(1,&fen7,0x60);                           
  652.                                           if(key_can == 4)              //減               
  653.                                                         set_ds1302time(0,&fen7,0x60);                           
  654.                             }            
  655. /////////////////////                 第8個(gè)打鈴時(shí)間            
  656.                             if(menu_2 == 3)                              //設(shè)置打鈴分
  657.                             {
  658.                                           if(key_can == 3)              //加            
  659.                                                         set_ds1302time(1,&shi8,0x24);                           
  660.                                           if(key_can == 4)              //減               
  661.                                                         set_ds1302time(0,&shi8,0x24);                           
  662.                             }
  663.                             if(menu_2 == 4)                              //設(shè)
  664.                             {
  665.                                           if(key_can == 3)              //加
  666.                                                         set_ds1302time(1,&fen8,0x60);                           
  667.                                           if(key_can == 4)              //減               
  668.                                                         set_ds1302time(0,&fen8,0x60);                           
  669.                             }
  670.                             write_string(1,0," set7 00:00    ");                                         
  671.                             write_string(2,0," set8 00:00      ");            
  672.                             write_sfm2_ds1302(1,6,shi7);                 //顯示時(shí)
  673.                             write_sfm2_ds1302(1,9,fen7);                 //顯示分
  674.                             write_sfm2_ds1302(2,6,shi8);                 //顯示時(shí)
  675.                             write_sfm2_ds1302(2,9,fen8);                 //顯示分
  676.                             switch(menu_2)                 // 光標(biāo)顯示
  677.                             {
  678.                                           case 1:  write_guanbiao(1,6,1);  break;
  679.                                           case 2:  write_guanbiao(1,9,1);  break;
  680.                                           case 3:  write_guanbiao(2,6,1);  break;
  681.                                           case 4:  write_guanbiao(2,9,1);  break;
  682.                             }            
  683.                             write_eeprom();     //保存鬧鐘時(shí)間
  684.               }            
  685. /***************設(shè)置9 10打鈴時(shí)間*********************/
  686.               if(menu_1 == 6)
  687.               {            
  688. /////////////////////                 第9個(gè)打鈴時(shí)間
  689.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  690.                             {
  691.                                           if(key_can == 3)              //加            
  692.                                                         set_ds1302time(1,&shi9,0x24);                           
  693.                                           if(key_can == 4)              //減               
  694.                                                         set_ds1302time(0,&shi9,0x24);                           
  695.                             }
  696.                             if(menu_2 == 2)                              //設(shè)
  697.                             {
  698.                                           if(key_can == 3)              //加
  699.                                                         set_ds1302time(1,&fen9,0x60);                           
  700.                                           if(key_can == 4)              //減               
  701.                                                         set_ds1302time(0,&fen9,0x60);                           
  702.                             }            
  703. /////////////////////                 第10個(gè)打鈴時(shí)間            
  704.                             if(menu_2 == 3)                              //設(shè)置打鈴分
  705.                             {
  706.                                           if(key_can == 3)              //加            
  707.                                                         set_ds1302time(1,&shi10,0x24);                           
  708.                                           if(key_can == 4)              //減               
  709.                                                         set_ds1302time(0,&shi10,0x24);                           
  710.                             }
  711.                             if(menu_2 == 4)                              //設(shè)
  712.                             {
  713.                                           if(key_can == 3)              //加
  714.                                                         set_ds1302time(1,&fen10,0x60);                           
  715.                                           if(key_can == 4)              //減               
  716.                                                         set_ds1302time(0,&fen10,0x60);                           
  717.                             }
  718.                             write_string(1,0," set9 00:00    ");                                         
  719.                             write_string(2,0,"set10 00:00    ");            
  720.                             write_sfm2_ds1302(1,6,shi9);                 //顯示時(shí)
  721.                             write_sfm2_ds1302(1,9,fen9);                 //顯示分
  722.                             write_sfm2_ds1302(2,6,shi10);                 //顯示時(shí)
  723.                             write_sfm2_ds1302(2,9,fen10);                 //顯示分
  724.                             switch(menu_2)                 // 光標(biāo)顯示
  725.                             {
  726.                                           case 1:  write_guanbiao(1,6,1);  break;
  727.                                           case 2:  write_guanbiao(1,9,1);  break;
  728.                                           case 3:  write_guanbiao(2,6,1);  break;
  729.                                           case 4:  write_guanbiao(2,9,1);  break;
  730.                             }            
  731.                             write_eeprom();     //保存鬧鐘時(shí)間
  732.               }                                         

  733. /***************設(shè)置9 10打鈴時(shí)間*********************/
  734.               if(menu_1 == 6)
  735.               {            
  736. /////////////////////                 第9個(gè)打鈴時(shí)間
  737.                             if(menu_2 == 1)                              //設(shè)置打鈴時(shí)
  738.                             {
  739.                                           if(key_can == 3)              //加            
  740.                                                         set_ds1302time(1,&shi9,0x24);                           
  741.                                           if(key_can == 4)              //減               
  742.                                                         set_ds1302time(0,&shi9,0x24);                           
  743. ……………………

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

所有資料51hei提供下載:
單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)畢業(yè)論文.doc (845.5 KB, 下載次數(shù): 67)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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