單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)_第1頁
單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)_第2頁
單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)_第3頁
單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)_第4頁
單片機(jī)自動(dòng)打鈴系統(tǒng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、自動(dòng)打鈴系統(tǒng)設(shè)計(jì)自動(dòng)打鈴系統(tǒng)-學(xué)校上下課自動(dòng)打鈴設(shè)計(jì)設(shè)計(jì)人:要求:(1)實(shí)現(xiàn)上下課的打鈴,并通過語音提示上下課;(2)按下開機(jī)鍵,顯示當(dāng)前年月日時(shí)間,在LCD液晶屏顯示年,月,日,星期,時(shí),分,秒,年-月-日-星期顯示在第一行,格式xx-xx-xx-星期x;時(shí)分秒顯示在第二行,格式xx-xx-xx(24小時(shí)格式);(3)能夠設(shè)置當(dāng)前時(shí)間;(4)使用語音芯片提示上下課,上課時(shí)提示:“親愛的同學(xué)們,上課了”,重復(fù)2遍,下課時(shí)提示:“親愛的同學(xué)們,下課了“,重復(fù)2遍。(5)允許使用時(shí)鐘芯片。摘要單片機(jī)的外接石英晶體振蕩器能提供穩(wěn)定、準(zhǔn)確的基準(zhǔn)頻率,并經(jīng)12分頻后向內(nèi)部定時(shí)器提供實(shí)時(shí)基準(zhǔn)頻率信號(hào),設(shè)定

2、定時(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ù)自動(dòng)打鈴系統(tǒng),是以一片8位單片機(jī)為核心的實(shí)時(shí)時(shí)鐘及控制系統(tǒng)。我們知道到60,則向時(shí)計(jì)數(shù)器進(jìn)位,如此周而復(fù)始的連續(xù)計(jì)數(shù),便可獲得時(shí)、分、秒的信號(hào),建立一個(gè)實(shí)時(shí)時(shí)鐘。接下來便可以進(jìn)行定時(shí)處理和打鈴輸出,當(dāng)主程序檢測到有分進(jìn)位標(biāo)志時(shí),便開

3、始比較當(dāng)前時(shí)間(小時(shí)與分、存放在RAM中)與信息時(shí)間表上的作息時(shí)間(小時(shí)與分,存放在ROM)是否相同,如有相同者,則進(jìn)行報(bào)時(shí)處理并控制打鈴,如有不相同則返回主程序,如此便實(shí)現(xiàn)了報(bào)時(shí)控制的要求。關(guān)鍵詞單片機(jī);時(shí)間設(shè)置電路;計(jì)時(shí)電路;顯示電路;定時(shí)打鈴控制電路引言始的無人問津到現(xiàn)在的隨處可見,紅綠燈,記分牌,電子秒表,遙控器,電飯煲,電視等只要是電子產(chǎn)隨著科技的不斷發(fā)展,各種芯片都得到了很好的發(fā)展,80C51 同樣如此,從開品,都會(huì)和芯片有關(guān),其實(shí)芯片并不是什么神秘的高科技,它只是里面裝了一些己編好的程序而己而這里要介紹的是用匯編語言來編程的一個(gè)系統(tǒng),它能夠讓一個(gè)學(xué)校或企業(yè)集團(tuán)實(shí)現(xiàn)打鈴自動(dòng)化,總之

4、,一個(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ī)模地興起。而本文是用AT89C52單片機(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)的功能。可分為:時(shí)間設(shè)置電路,計(jì)時(shí)電路,顯示電路和定時(shí)

5、打鈴控制電路等。(以信息科學(xué)與技術(shù)學(xué)院的打鈴情況設(shè)計(jì)內(nèi)容時(shí)間起床8:10 早自習(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:301.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í)

6、現(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)主程序檢測到有分進(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í)間

7、上存在一定的困難。而方案二中的設(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ì)課題簡要概述自動(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ì)電氣原理圖,簡要概述基本原理,按照設(shè)計(jì)技術(shù)參數(shù)設(shè)計(jì)出各部分程序。1.3.2 系統(tǒng)軟硬件劃分由于需要最小系統(tǒng)設(shè)

8、計(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ī)完全兼容的AT89C52功耗單片機(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í)

9、器工作方式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)行打鈴,每次打鈴30S2.2 主要原件參數(shù)及功能簡介2.2.1 主控器AT89C52AT89C52為8 位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相

10、同,其主要用于會(huì)聚調(diào)整時(shí)的功能控制。功能包括對(duì)會(huì)聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會(huì)聚調(diào)整控制,會(huì)聚測試圖控制,紅外遙控信號(hào)IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端。P0P3 為可編程通用I/O 腳,其功能用途由軟件定義,在本設(shè)計(jì)中,P0 端口(3239 腳)被定義為N1 功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13 腳定義

11、為IR輸入端,10 腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12 腳、27 腳及28 腳定義為握手信號(hào)功能端口,連接主板CPU 的相應(yīng)功能端,用于當(dāng)前制式的檢測及會(huì)聚調(diào)整狀態(tài)進(jìn)入的控制功能。2.2.2 DS13021)性能特性DS1302與單片機(jī)之間能簡單地采用同步串行的方式進(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ù)和閏

12、年的天數(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 腳 DIPDS1302S 串行時(shí)鐘芯片8 腳 SOIC 200milDS1302Z 串行時(shí)鐘芯片8 腳 SOIC 150mi2.3 單元電路的設(shè)計(jì)2.3.1顯示電路顯示部分采用1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為電源地第2腳:VCC接5V電源正極第3腳:V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)

13、對(duì)比度最高(對(duì)比度過高時(shí)會(huì) 產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度)。第4腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器。第5腳:RW為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫操作。第6腳:E(或EN)端為使能(enable)端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令普通的LCD1602顯示2.3.2 鍵盤接口電路設(shè)計(jì)由于鍵盤只有四個(gè),采用獨(dú)立式按鈕,用查詢法完成讀健功能。 圖五 按鍵電路2.3.3 響鈴電路設(shè)計(jì)響鈴電路用到了蜂鳴器、三極管、1K電阻。蜂鳴器兩端分別接地和三極管。三極管一段電源另一端與電阻相連并接入AT89C51的

14、P3.7接口。 電路原理圖使用SH69P43 為控制芯片,使用4MHz 晶振作為主振蕩器。          PORTC.3/T0 作為I/O 口通過三極管Q2 來驅(qū)動(dòng)蜂鳴器LS1,而PORTC.2/PWM0 則作為PWM 輸出口通過三極管Q1 來驅(qū)動(dòng)蜂鳴器LS2。另外在PORTA.3 和PORTA.2 分別接了兩個(gè)按鍵,一個(gè)是PWM 按鍵,是用來控制PWM 輸出口驅(qū)動(dòng)蜂鳴器使用的;另一個(gè)是PORT 按鍵,是用來控制I/O 口驅(qū)動(dòng)蜂鳴器使用的。連接按鍵的I/O 口開內(nèi)部上拉電阻。     

15、60;    先分析一下蜂鳴器。所使用的蜂鳴器的工作頻率是2000Hz,也就是說蜂鳴器的驅(qū)動(dòng)信號(hào)波形周期是500s,由于是1/2duty 的信號(hào),所以一個(gè)周期內(nèi)的高電平和低電平的時(shí)間寬度都為250s。軟件設(shè)計(jì)上,將根據(jù)兩種驅(qū)動(dòng)方式來進(jìn)行說明。          a) 蜂鳴器工作原理:PWM 輸出口直接驅(qū)動(dòng)蜂鳴器方式          由于PWM 只控制固定頻率的蜂鳴器,所以可以在程序的系統(tǒng)初始化時(shí)就對(duì)PWM 的輸出波形進(jìn)行設(shè)置。   &

16、#160;      首先根據(jù)SH69P43 的PWM 輸出的周期寬度是10 位數(shù)據(jù)來選擇PWM 時(shí)鐘。系統(tǒng)使用4MHz 的晶振作為主振蕩器,一個(gè)tosc 的時(shí)間就是0.25s,若是將PWM 的時(shí)鐘設(shè)置為tosc 的話, 則蜂鳴器要求的波形周期500s 的計(jì)數(shù)值為500s/0.25s=(2000)10=(7D0)16,7D0H 為11 位的數(shù)據(jù),而SH69P43 的PWM  輸出周期寬度只是10 位數(shù)據(jù),所以選擇PWM 的時(shí)鐘為tosc 是不能實(shí)現(xiàn)蜂鳴器所要的驅(qū)動(dòng)波形的。         

17、60;這里將PWM 的時(shí)鐘設(shè)置為4tosc,這樣一個(gè)PWM 的時(shí)鐘周期就是1s 了,由此可以算出500s 對(duì)應(yīng)的計(jì)數(shù)值為500s/1s=(500)10=(1F4)16,即分別在周期寄存器的高2 位、中4 位和低4 位三個(gè)寄存器中填入1、F 和4,就完成了對(duì)輸出周期的設(shè)置。再來設(shè)置占空比寄存器,在PWM 輸出中占空比的實(shí)現(xiàn)是          通過設(shè)定一個(gè)周期內(nèi)電平的寬度來實(shí)現(xiàn)的。當(dāng)輸出模式選擇為普通模式時(shí),占空比寄存器是用來設(shè)置高電平的寬度。250s 的寬度計(jì)數(shù)值為250s/1s=(250)10=(0FA)16。只需要在占空比寄存器的

18、高2 位、中4 位和低4 位中分別填入0、F 和A 就可以完成對(duì)占空比的設(shè)置了,設(shè)置占空比為1/2duty。          以后只需要打開PWM 輸出,PWM 輸出口自然就能輸出頻率為2000Hz、占空比為1/2duty 的方波。          b) 蜂鳴器工作原理:I/O 口定時(shí)翻轉(zhuǎn)電平驅(qū)動(dòng)蜂鳴器方式          使用I/O 口定時(shí)翻轉(zhuǎn)電平驅(qū)動(dòng)蜂鳴器方式的設(shè)置比較簡單,只需要對(duì)波形分析一下。由于驅(qū)動(dòng)的

19、信號(hào)剛好為周期500s,占空比為1/2duty 的方波,只需要每250s 進(jìn)行一次電平翻轉(zhuǎn),就可以得到驅(qū)動(dòng)蜂鳴器的方波信號(hào)。在程序上,可以使用TIMER0 來定時(shí),將TIMER0 的預(yù)分頻設(shè)置為/1,選擇TIMER0 的始終為系統(tǒng)時(shí)鐘(主振蕩器時(shí)鐘/4),在TIMER0 的載入/計(jì)數(shù)寄存器的高4 位和低4 位分別寫入00H 和06H,就能將TIMER0 的中斷設(shè)置為250s。當(dāng)需要I/O 口驅(qū)動(dòng)的蜂鳴器鳴叫時(shí),只需要在進(jìn)入TIMER0 中斷的時(shí)候?qū)υ揑/O 口的電平進(jìn)行翻轉(zhuǎn)一次,直到蜂鳴器不需要鳴叫的時(shí)候,將I/O 口的電平設(shè)置為低電平即可。不鳴叫時(shí)將I/O 口的輸出電平設(shè)置為低電平是為了防止

20、漏電。 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)用了

21、定時(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)場保護(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)場恢復(fù)。3.1.2 顯示程序設(shè)

22、計(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ū)是2FH2AH;第二部分是查字型碼,輸出段控和位控信號(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)入按鍵處理程

23、序后就關(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

24、。減少鍵DEC_KEY: PI.2;按一次使選中位位。1如果長按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)。晶振12M4.2 源程序清單#include<reg52.h> /包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義#include <stdio.h> #include "ds1302.h"#include "delay.h

25、"#include "1602.h"#include "i2c.h"/管腳定義sbit SPEAK= P37; /蜂鳴器sbit KEY_SET=P32; /設(shè)置 返回sbit KEY_ENTER=P33; /確認(rèn) 下一個(gè)參數(shù)sbit KEY_UP=P34; /增加sbit KEY_DOWN=P35; /減小sbit KEY_SAVE=P36; /保存/按鍵菜單的數(shù)據(jù)定義bit bSet_Time_Flag = 0;/進(jìn)入設(shè)置時(shí)間的標(biāo)志位bit bShow_Time_Flag = 1;/進(jìn)入設(shè)置時(shí)間的標(biāo)志位unsigned char ucPag

26、e = 0;/頁面菜單unsigned char ucMenu_Count = 1;/菜單的數(shù)據(jù)bit bSet_Model_Frash = 0;/數(shù)據(jù)保存相關(guān)#define FLAG_ADDR 250#define FLAG_DAT 41 #define MAX_LIST 15#define Start_Time_First 0 /第一個(gè)保存的時(shí)間/設(shè)置的時(shí)間緩存idata unsigned char ucSave_Time_Set163 = 10,0,0, 10,45,0, 10,55,0, 11,40,0, 12,10,0, 12,55,0, 13,5,0, 13,50,0, / 16,

27、0,0, 16,45,0, 16,55,0, 17,40,0, 18,10,0, 18,55,0, 19,5,0, 19,50,0; /void Write_Time_Dat(unsigned char ucAddr,unsigned char *ucSet_Time)/數(shù)據(jù)定義bit bRead_Time_Flag = 1;bit bSave_Dat_Flag = 0;/保存標(biāo)志位 unsigned char time_use_Set8;unsigned char time_use_Set_Dis16; /*- 主函數(shù)-*/ /讀取時(shí)間 void Read_Time_Once(void);

28、/定時(shí)器初始化 void Init_Timer0(void);/按鍵掃描函數(shù)void Key_Scan(void); void Del_Time(unsigned char ucPage,unsigned char ucPositon,unsigned char ucHang_Num,char ucDel_Fun);/主函數(shù)入口void main (void) unsigned char ucGlobal_Dat = 0;/臨時(shí)使用的變量SPEAK = 1;LCD_Init(); /初始化液晶DelayMs(20); /延時(shí)有助于穩(wěn)定LCD_Clear(); /清屏/ Ds1302_Init(

29、); /ds1302初始化Ds1302_Read_Time(); /首次讀取時(shí)間LCD_Write_String(0,0,"OPEN SYSETM ") ; /之前沒有寫入時(shí)間 就要寫入時(shí)間if( FLAG_DAT != read_IIC(FLAG_ADDR)/標(biāo)志位沒有寫入 Ds1302_Write_Time(); write_IIC(FLAG_ADDR, FLAG_DAT); for(ucGlobal_Dat = Start_Time_First;ucGlobal_Dat < Start_Time_First + 48;ucGlobal_Dat += 3) Wri

30、te_Time_Dat(ucGlobal_Dat,ucSave_Time_SetucGlobal_Dat/3); DelayMs(2); else for(ucGlobal_Dat = Start_Time_First;ucGlobal_Dat < Start_Time_First + 48;ucGlobal_Dat += 3) Write_Read_Dat(ucGlobal_Dat,ucSave_Time_SetucGlobal_Dat/3); / while (1) /主循環(huán) Key_Scan();Read_Time_Once(); /bit bSet_Time_Flag = 0;/

31、進(jìn)入設(shè)置時(shí)間的標(biāo)志位/unsigned char ucPage = 0;/頁面菜單/unsigned char ucMenu_Count = 0;/菜單的數(shù)據(jù) /按鍵掃描函數(shù)void Key_Scan(void) char cI = 0;if(KEY_SET = 0)/設(shè)置 DelayMs(10); if(KEY_SET = 0) LCD_Clear( );ucMenu_Count = 1; if(bSet_Time_Flag)/退出設(shè)置 bSet_Time_Flag = 0; ucMenu_Count = 0; bShow_Time_Flag = 1;/不顯示時(shí)間 ucPage = 0; L

32、CD_Write_Com(0x0c);/歸位 bSave_Dat_Flag = 0;else /進(jìn)入設(shè)置 bSet_Time_Flag = 1;/設(shè)置時(shí)間 bShow_Time_Flag = 0;/不顯示時(shí)間 ucPage = 0; bSet_Model_Frash = 1; while(KEY_SET = 0); else if(KEY_ENTER = 0)/enter DelayMs(10); if(KEY_ENTER = 0) if(bSet_Time_Flag = 0) return; ucMenu_Count+=3; if(ucMenu_Count > 7) ucMenu_Co

33、unt = 1; ucPage+;if(ucPage >= (MAX_LIST + 1)/限值處理 ucPage = 0; bSet_Model_Frash = 1; while(KEY_ENTER = 0); else if(KEY_UP = 0)/增加 DelayMs(10); if(KEY_UP = 0) if(bSet_Time_Flag = 0) return; if(ucMenu_Count = 1) Del_Time(ucPage,0,0,1);/減法 else if(ucMenu_Count = 4) Del_Time(ucPage,1,0,1);/減法 else if(

34、ucMenu_Count >= 4) Del_Time(ucPage,2,0,1);/減法 bSet_Model_Frash = 1; bSave_Dat_Flag = 1; while(KEY_UP = 0); else if(KEY_DOWN = 0)/減小 DelayMs(10); if(KEY_DOWN = 0) if(bSet_Time_Flag = 0) return; if(ucMenu_Count = 1) Del_Time(ucPage,0,0,0);/減法 else if(ucMenu_Count = 4) Del_Time(ucPage,1,0,0);/減法 els

35、e if(ucMenu_Count >= 4) Del_Time(ucPage,2,0,0);/減法 bSet_Model_Frash = 1; bSave_Dat_Flag = 1;/數(shù)據(jù)發(fā)生改變 while(KEY_DOWN = 0); else if(KEY_SAVE = 0)/保存 DelayMs(10); if(KEY_SAVE = 0) if(bSet_Time_Flag = 0) return;LCD_Clear( );if(bSave_Dat_Flag = 1)LCD_Write_String(0,0,"SAVE TIME DATA OK") ; fo

36、r(cI = Start_Time_First;cI < Start_Time_First + 48;cI += 3) Write_Time_Dat(cI,ucSave_Time_SetcI/3); for(cI =0;cI < 16;cI+) LCD_Write_String(cI,1,">") ; DelayMs(200); DelayMs(200); DelayMs(200); bSave_Dat_Flag = 0;else LCD_Write_String(0,0,"TIME NOCHANGE ") ; LCD_Write_St

37、ring(0,1,"SAVE TIME FAILRE ") ; /保存失敗 DelayMs(200); DelayMs(200); DelayMs(200); LCD_Clear( ); bSet_Model_Frash = 1; while(KEY_SAVE = 0); if(bSet_Model_Frash) /LCD_Write_Com(0x0c);/歸位bSet_Model_Frash = 0;Show_Time(0,0,ucSave_Time_SetucPage,ucPage);LCD_Write_String(14,0,"<-");if

38、(ucPage < (MAX_LIST) Show_Time(0,1,ucSave_Time_SetucPage + 1,ucPage + 1); else Show_Time(0,1,ucSave_Time_SetucPage - MAX_LIST,ucPage - MAX_LIST); / LCD_Write_Com(0x0f); LCD_Write_Com(0x80 + ucMenu_Count);/ /讀取一次時(shí)間unsigned char ucTime_Old = 0; void Read_Time_Once(void) char cTime_Copy = 0; if(bRea

39、d_Time_Flag)Ds1302_Read_Time();/讀取時(shí)間參數(shù) if(bShow_Time_Flag) /顯示當(dāng)前的時(shí)間 sprintf(time_use_Set_Dis,"DATE %02d-%02d-%02d ",(int)time_buf11,(int)time_buf12,(int)time_buf13);/年月日周 /,(int)time_buf17LCD_Write_String(0,0,time_use_Set_Dis);/顯示第一行 sprintf(time_use_Set_Dis,"TIME %02d:%02d:%02d"

40、,(int)time_buf14,(int)time_buf15,(int)time_buf16);/時(shí)分秒LCD_Write_String(0,1,time_use_Set_Dis);/顯示第二行for(cTime_Copy = 0;cTime_Copy < 8;cTime_Copy+)time_use_SetcTime_Copy = time_buf1cTime_Copy; /判斷數(shù)據(jù) if(ucTime_Old != time_buf15) ucTime_Old = time_buf15; for(cTime_Copy = 0;cTime_Copy < (MAX_LIST + 1);cTime_Copy+) if(time_buf14 = ucSave_Time_SetcTime_Copy0 )&&(time_buf15 = ucSave_Time_SetcTime_Copy1 ) for(cTime_Copy = 0;cTime_Copy < 2;cTi

溫馨提示

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

評(píng)論

0/150

提交評(píng)論