2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  《單片機(jī)原理及接口》</p><p><b>  課程設(shè)計報告</b></p><p>  題 目: 時鐘系統(tǒng)設(shè)計 </p><p>  專業(yè)名稱: xxx </p><p>  班 級:

2、 </p><p>  學(xué) 號: xxxx </p><p>  姓 名: xxxx </p><p><b>  2012年 1月</b></p><p><b>  時鐘系統(tǒng)設(shè)計</b>

3、;</p><p><b>  一.設(shè)計說明</b></p><p><b>  1.1 設(shè)計目的:</b></p><p> ?。?)掌握C51單片機(jī)的結(jié)構(gòu)及其內(nèi)部的定時/計數(shù)器、中斷系統(tǒng)、以及外圍的行列式按鍵和LED數(shù)碼管等部件</p><p>  (2)掌握定時/計數(shù)器的結(jié)構(gòu)和原理、中斷處理系

4、統(tǒng)的工作原理及中斷方式處理定時/計數(shù)的工作過程,數(shù)碼管顯示原理</p><p> ?。?)設(shè)計時鐘系統(tǒng)通過數(shù)碼管顯示及按鍵設(shè)置實(shí)現(xiàn)時間的準(zhǔn)確顯示、鬧鈴和修改</p><p>  (4)學(xué)會運(yùn)用軟件和硬件相結(jié)合來實(shí)現(xiàn)設(shè)計的需要</p><p><b>  1.2 設(shè)計要求:</b></p><p>  設(shè)計一時鐘系統(tǒng),系統(tǒng)

5、具有時鐘功能,能準(zhǔn)確顯示時、分、秒。</p><p>  1.3 電子數(shù)字鐘實(shí)現(xiàn)的主要功能</p><p><b>  實(shí)現(xiàn)正常走時</b></p><p>  能夠設(shè)置時間且待設(shè)置位會閃爍顯示</p><p>  具有鬧鈴及設(shè)定鬧鈴時間功能</p><p><b>  具有倒計時功能&

6、lt;/b></p><p><b>  1.4設(shè)計環(huán)境</b></p><p><b>  硬件:計算機(jī)一臺</b></p><p>  Windowns操作系統(tǒng) 、 KeilC51單片機(jī)仿真軟件 、 proteus單片機(jī)系統(tǒng)仿真軟件。</p><p><b>  二、整體設(shè)

7、計方案</b></p><p><b>  1.硬件電路設(shè)計</b></p><p>  時鐘的設(shè)計,主要采用了AT89S52、74HC573、74LS138、晶振、8只共陰LED數(shù)碼管,包括顯示模塊,按鍵模塊和揚(yáng)聲器模塊以及單片機(jī)的基礎(chǔ)電路。 </p><p>  1.1方案設(shè)計所應(yīng)用知識</p><p>

8、  1.1.1.C51單片機(jī)介紹(如圖1-1)</p><p>  89C51單片機(jī)有四組8位并行I/O口,記作P0、P1、P2和P3。每組I/O口內(nèi)部都有8位數(shù)據(jù)輸入緩沖器、8位數(shù)據(jù)輸出鎖存器及數(shù)據(jù)輸出驅(qū)動等電路。</p><p>  四組并行I/O端口即可以按字節(jié)操作,又可以按位操作。當(dāng)系統(tǒng)沒有擴(kuò)展外部器件時,I/O端口用作雙向輸入輸出口;當(dāng)系統(tǒng)作外部擴(kuò)展時,使用P0口作系統(tǒng)地址的低8

9、位、P2口作系統(tǒng)地址的高8位;P0口還可作數(shù)據(jù)時分復(fù)用線,P3口有第二功能(如圖1-2),大多與其內(nèi)部功能部件有關(guān),其中RD、WR是外部數(shù)據(jù)存儲器的寫、讀控制信號。 應(yīng)注意:當(dāng)四個并行口在作輸入口使用時,均應(yīng)先對其寫“1”,以避免誤讀。</p><p>  圖1-1 89C51 單片機(jī)相關(guān)引腳 圖1-2 P3口每一位的第二功能</p><p>  1.1.2定

10、時/計數(shù)器</p><p>  8051型單片機(jī)有兩個十六位定時/計數(shù)器T0、T1,有四種工作方式,跟定時/計數(shù)器相關(guān)的特殊功能寄存器有這樣幾個:</p><p>  表一:方式控制寄存器TMOD </p><p>  加法計數(shù)寄存器TH0、TH1 (高八位)TL0、TL1(低八位);定時/計數(shù)到標(biāo)志TF0、TF1(中斷控制寄存器

11、TCON);定時/計數(shù)器啟??刂莆籘R0、TR1(TCON);</p><p>  定時/計數(shù)器中斷允許位ET0、ET1(中斷允許寄存IE);定時/計數(shù)器中斷優(yōu)先級控制位PT0、PT1(中斷優(yōu)IP)。</p><p>  TMOD的低四位為T0的方式字,高四位為T1的方式字。TMOD不能位尋址,必須整體賦值。</p><p> ?。?)工作方式選擇位M1、M0 &l

12、t;/p><p>  表二:M1、M0的狀態(tài)決定定時器的工作方式</p><p>  (2)定時和外部事件計數(shù)方式選擇位C/T</p><p>  C/T=0為定時器方式;C/T=1為外部事件計數(shù)器方式</p><p> ?。?)門控位GATE</p><p>  GATE = 0時,且受定時器運(yùn)行控制位(TR0、TR1)

13、的控制時為軟件啟動。</p><p>  GATE = 1時,除受TR0、TR1控制外,還受外部引腳(INT0、 INT1)輸入電平的控制(為高)為硬啟動。</p><p><b> ?。?)初值的確定:</b></p><p>  a = – T×fosc/12 (注意單位);THx = a / 256;TLx = a % 256;

14、</p><p>  根據(jù)確定初值的公式,三種工作方式下可得以下結(jié)論:a.同種方式下,頻率越大,所定的最大時間越來越短;b.同種頻率下,方式1所定的時間最長;c.晶振為6MHZ時能定的最大時間100ms,晶振為12MHZ時能定的最大時間為50ms</p><p><b>  1.1.3中斷</b></p><p>  所謂中斷是指,單片機(jī)內(nèi)部有

15、一個中斷管理系統(tǒng),它對內(nèi)部的定時器事件、串行通信的發(fā)送和接收事件及外部事件(如鍵盤按鍵動作)等進(jìn)行自動的檢測判斷,當(dāng)有某個事件產(chǎn)生時,中斷管理系統(tǒng)會置位相應(yīng)標(biāo)志通知CPU,請求CPU迅速去處理。CPU檢測到某個標(biāo)志時,會停止當(dāng)前正在處理的程序流程,轉(zhuǎn)去處理所發(fā)生的事件(針對發(fā)生的事件,調(diào)用某一特定的函數(shù),稱為該事件的中斷服務(wù)函數(shù)),處理完以后,再回到原來被中斷的地方,繼續(xù)執(zhí)行原來的程序。</p><p>  1.

16、1.4數(shù)碼管顯示原理</p><p>  數(shù)碼管是一種把多個LED顯示段集成在一起的顯示設(shè)備,有兩種類型:共陰和共陽如圖1-3(a)和(b)。共陽極的就是把多個LED顯示段的陽極接在一起,又稱為公共端;共陰極的就是把多個LED顯示段的陰極接在一起,稱為公共端。通常數(shù)碼管又分為8段,即8個LED顯示段,分別為a~dp,其中dp是小數(shù)點(diǎn)位段。N位LED顯示器有N根位選線和8×N根段選線。根據(jù)顯方式不同,位選

17、線與段選線的連接方法不同。段選線控制字符選擇,位選線控制顯示位的亮、滅。</p><p>  數(shù)碼管有兩種顯示方式:靜態(tài)顯示與動態(tài)顯示</p><p>  靜態(tài)顯示方式:各位LED的位選線連在一起接地或接+5V;每位LED的段選線(a-dp)各與一個八位并行口相連。</p><p>  動態(tài)顯示方式:將所有LED的段選線并聯(lián)在一起,由一個八位I/O口控制,而位選線分

18、別由相應(yīng)的I/O口線控制(如圖1-4)</p><p>  本設(shè)計用的是數(shù)碼管動態(tài)顯示原理,利用人眼的視覺暫留性,依次給出各個數(shù)碼管公共端加有效信號,在此同時給出數(shù)碼管加有效地數(shù)據(jù)信號,當(dāng)全段掃面速度大于視覺暫留速度時,顯示就會清晰顯示出來。</p><p>  根據(jù)圖1-3(a)和(c)可推導(dǎo)出顯示0~9的共陰代碼(包括顯示小數(shù)點(diǎn))即為0時相應(yīng)的顯示段亮</p><p

19、>  圖1-3 LED顯示器</p><p>  1.2控制器部分方案論證 </p><p>  方案一:時鐘模塊采用DS1302 芯片,功耗實(shí)時時鐘電路結(jié)構(gòu)、工作原理及其在實(shí)時顯示時間中的應(yīng)用。它可以對年、月、日、周、日、時、分、秒進(jìn)行計時。</p><p>  方案二:采用51單片機(jī),用51單片機(jī)加以一定的硬件電路,由于使用軟硬件結(jié)合的方式,所以電路結(jié)構(gòu)

20、簡單,調(diào)試也相對方便。</p><p>  1.3顯示部分的方案論證</p><p>  方案一:采用8段數(shù)碼管LED有兩種顯示方式:動態(tài)顯示和靜態(tài)顯示。靜態(tài)顯示式是簡單的將數(shù)碼管的段選與I\O口相連,另一端接VCC或GND,動態(tài)顯示則是將多個數(shù)碼管的段選接至同一個I\O口,位選接入相應(yīng)的I\O口,在編程時,分別點(diǎn)亮每一個數(shù)碼管,,利用人眼的暫留效果即感覺到數(shù)碼管是一直顯示的。</p

21、><p>  方案二:液晶顯示方式。液晶顯示效果出眾,可以運(yùn)用菜單項(xiàng)來方便操作但是價格相對比較貴,而且驅(qū)動程序相對于LED也比較復(fù)雜。 </p><p>  圖-2 數(shù)碼管顯示電路</p><p><b>  1.4最終方案</b></p><p>  控制器部分選擇AT89S52作為始終電路的核心,顯示部分選擇8位8段數(shù)碼

22、管,揚(yáng)聲器部分由I\O連接至三極管作為驅(qū)動。由此結(jié)合單片機(jī)課程學(xué)習(xí)中對實(shí)驗(yàn)面板的了解,做出如下電路:</p><p>  圖-3 proteus仿真電路</p><p>  如圖,晶振頻率12MHz,P0口接一個上拉排阻,輸出作為控制數(shù)碼管的段控信號,經(jīng)74LS573即8位數(shù)據(jù)鎖存器接到數(shù)碼管中;P2.0-P2.2經(jīng)74HC138連接到數(shù)碼管位選,P27為74HC138的片選信號;P3.7

23、經(jīng)三極管與蜂鳴器相連;四個按鈕分別與P3.0-P3.3相連。</p><p>  2.系統(tǒng)軟件總流程設(shè)計</p><p><b>  流程圖如左圖所示。</b></p><p>  主程序是先開始,然后啟動定時器,定時器啟動后在進(jìn)行按鍵檢測,檢測完后,就可以顯示時間,之后再檢測是否響鈴。 </p>

24、<p>  按鍵處理是先檢測切換功能位是否被按下,如果沒有則顯示保留當(dāng)前狀態(tài),若按下,則顯示下一個功能(順序?yàn)闀r鐘→鬧鐘→倒計時循環(huán));判斷以為案件是否按下,如果按下,被設(shè)置位就相應(yīng)的改變(順序?yàn)槊搿帧鷷r循環(huán));判斷“+”按鍵是否按下,“+”按鍵如果按下,相對應(yīng)的被設(shè)置位就加1;如果沒有按下,原數(shù)字不變。秒計時是采用中斷方式進(jìn)行溢出次數(shù)的累積,計滿20次,即得到秒計時。從秒到分,從分到時是通過軟件累加并進(jìn)行比較的方法來實(shí)現(xiàn)的

25、。要求每滿1秒,則“秒”單元中的內(nèi)容加1;“秒”單元滿60,則“分”單元中的內(nèi)容加1;“分”單元滿60,則“時”單元中的內(nèi)容加1;“時”單元滿24,則將時、分、秒的內(nèi)容全部清零。</p><p>  3.實(shí)時時鐘程序設(shè)計步驟:</p><p><b> ?。?)計算初值;</b></p><p> ?。?)采用中斷方式進(jìn)行溢出次數(shù)累計;<

26、/p><p> ?。?)時鐘顯示:時鐘時間在方位數(shù)碼管上進(jìn)行顯示,直接通過顯示子函數(shù)完成; </p><p> ?。?)響鈴程序:在一定的條件下是蜂鳴器播放聲音;</p><p> ?。?)時鐘設(shè)置:對相應(yīng)的設(shè)置為堿性加或減操作;</p><p> ?。?)中斷服務(wù)程序:進(jìn)行計時操作,并完成對時、分、秒的加或減操作。</p><

27、;p><b>  三.程序調(diào)試過程:</b></p><p><b>  3.1顯示模塊</b></p><p>  電子時鐘顯示采用數(shù)碼管,顯示模塊采用動態(tài)顯示的方式,即將所有LED的段選線并聯(lián)在一起接至P0,而位選線由74HC138的輸出控制。一次可以推算出顯示的位碼為smg_wei[]={0xf7,0xf6,0xf5,0xf4,0xf

28、3,0xf2,0xf1,0xf0}。</p><p>  正常顯示狀態(tài):默認(rèn)為走時狀態(tài),按24小時制分別顯示“時時-分分-秒秒”,</p><p>  設(shè)置時間狀態(tài):數(shù)碼管時間暫停,同時對應(yīng)的待設(shè)置位會閃爍顯示。</p><p>  判斷當(dāng)前的顯示狀態(tài),既flag_into標(biāo)志位。三個flag_int0分別對應(yīng)時鐘、鬧鐘、倒計時。</p><p&

29、gt;<b>  如下圖所示:</b></p><p>  圖-6 設(shè)置時間時的顯示</p><p>  3.2 走時、倒計時功能</p><p>  走時程序有內(nèi)部中斷T0完成,把定時器的定時時間定為50ms。這樣,計數(shù)溢出20次即可得到1秒。而計數(shù)20次可以用軟件實(shí)現(xiàn)。然后完成通過程序?qū)r、分、秒的加操作。</p><p

30、>  同理,倒計時程序由內(nèi)部中斷T1完成,硬件定時50ms,軟件循環(huán)20次得到1秒,通過相應(yīng)的程序完成時分秒的減操作。并在數(shù)碼管上動態(tài)顯示。</p><p>  綜上所述在設(shè)置T0、T1定時器是即將TMOD=0X11(0001 0001),THx=-50000/256,TLx=-50000%256,然后將相應(yīng)的中斷打開即可。走時截圖如下:</p><p>  3.3 時間設(shè)置模塊&l

31、t;/p><p>  由于時鐘有三個功能,而這三個功能對應(yīng)時間內(nèi)容都是暫時存放在三個對應(yīng)的數(shù)組(time[]、alarm[]、timer[])內(nèi),所以設(shè)置時間時要將待設(shè)置的時間裝入一個臨時數(shù)組(time_tmp[])內(nèi)。</p><p>  由于正常顯示時間時,數(shù)碼管是顯示實(shí)時時間,而設(shè)置時間時,數(shù)碼管則應(yīng)該暫停顯示,所以在調(diào)試時,在設(shè)置時間模塊里加了一個讀標(biāo)志(read_flag),當(dāng)rea

32、d_flag為1時,本模塊可以讀取相應(yīng)數(shù)組的時間;反之則不能讀取,如果不能讀取時間則相當(dāng)于時間一直停止在當(dāng)前狀態(tài)不變。對于倒計時功能則處理相對簡單,每當(dāng)進(jìn)入設(shè)置狀態(tài)時,直接置TR1=0,暫停計時。</p><p>  在分別設(shè)置過秒、分、時之后,將time_tmp[]數(shù)組的時間寫入相應(yīng)的待設(shè)置數(shù)組,并且置TR1=1,read_flag=1。進(jìn)入正常走勢狀態(tài)。</p><p><b&g

33、t;  3.4 響鈴模塊</b></p><p>  響鈴的原理主要是單片機(jī)的某個引腳產(chǎn)生一定頻率的方波,通過驅(qū)動電路接入揚(yáng)聲器,從而產(chǎn)生某一特定頻率的聲音,程序和響鈴有關(guān)的有整點(diǎn)報時、鬧鐘和倒計時三個部分,其中鬧鐘和倒計時的響鈴程序除了條件不一樣以外,其他都差不多。只是在響鈴時由于蜂鳴器占用了cpu導(dǎo)致了現(xiàn)實(shí)程序無法正常運(yùn)行。整點(diǎn)時,則是把它設(shè)置成56s和58s兩聲約1s低音,進(jìn)入整點(diǎn)時,一聲高音,

34、</p><p><b>  3.5仿真調(diào)試</b></p><p>  軟件調(diào)試部分主要是使用protus 7 professional軟件配合keil進(jìn)行在線仿真,通過設(shè)置斷點(diǎn)來判斷程序有不合實(shí)際的地方,并且修改,在最終完成程序以后,將keil生成的hex文件下載到51單片機(jī)的學(xué)習(xí)板上進(jìn)行硬件仿真,取得了預(yù)期的效果。仿真效果如下:</p><p

35、>  圖-8 最終調(diào)試結(jié)果</p><p><b>  四 心得體會</b></p><p>  通過了解89C51單片機(jī)結(jié)構(gòu)及工作原理和硬件電路定時/計數(shù)器、中斷、行列式鍵盤、數(shù)碼管顯示的工作原理,從而通過keil軟件編寫程序和仿真器結(jié)合控制時鐘系統(tǒng)實(shí)現(xiàn)基本的準(zhǔn)確顯示時間和鬧。</p><p>  通過這次課程設(shè)計進(jìn)一步數(shù)碼管動態(tài)顯示及

36、定時/計數(shù)器的工作原理,掌握keil軟件與仿真器的結(jié)合使用。經(jīng)過這次的設(shè)計讓自己學(xué)會軟件與硬件相結(jié)合使用,同時也認(rèn)識到理論與實(shí)際相結(jié)合的重要性,只有理論知識是不夠的,只有把理論知識與實(shí)踐相結(jié)合,多動手多思考,從而提高自己的實(shí)踐能力。在設(shè)計過程中也發(fā)現(xiàn)自己有很多不足之處,對所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,也不太懂與實(shí)際相運(yùn)用,但是經(jīng)過一周的實(shí)訓(xùn),還有通過網(wǎng)上查找資料,在老師和同學(xué)們的幫助下,不僅鞏固了課堂所學(xué)的知識,而且加深了

37、解了89C51單片機(jī)中的使用及工作原理。在設(shè)計過程中,經(jīng)過老師的指導(dǎo),學(xué)會了獨(dú)立畫流程圖來分析程序,只有這樣,才比較清楚地知道自己每一步要做什么,每一步要完成什么任務(wù),而且在程序調(diào)試的過程中也容易查錯。</p><p><b>  6、附錄:</b></p><p>  /************************************************

38、</p><p>  主要功能:正常走時、鬧鐘、秒表倒計時、正點(diǎn)報時、設(shè)置時間</p><p>  ***************************************************/</p><p>  #include <reg52.h></p><p>  #define uchar unsigned c

39、har</p><p>  #define uint unsigned int</p><p>  uchar s,flag_t1,flag_t0,flag_int0,flag_int1,</p><p>  flag_alarm,flag_read,flag_timer;</p><p>  sbit beep=P3^7; //蜂鳴器&l

40、t;/p><p>  sbit P30=P3^0; //時間+</p><p>  sbit P31=P3^1;//時間-</p><p>  uint time[]={0,5,10,9,5,10,0,1};</p><p>  uint alarm[]={0,2,10,0,0,10,0,1};</p><p>  ui

41、nt timer[]={0,1,10,0,0,10,0,0};</p><p>  uint time_tmp[]={1,1,10,3,3,10,3,3};</p><p>  unsigned char smg_du[]={0x3f,0x06,0x5b,0x4f,0x66</p><p>  ,0x6d,0x7d,0x07,0x7f,0x6f,0x40};// 顯

42、示段碼值0123456789-</p><p>  unsigned char smg_wei[]={0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,</p><p>  0xf0};//{0,1,2,3,4,5,6,7};//分別對應(yīng)相應(yīng)的數(shù)碼管點(diǎn)亮,即位碼</p><p>  void delay1ms(uchar x);//大約1ms

43、,軟件延時</p><p>  void smg_dis();//數(shù)碼管顯示函數(shù)</p><p>  void timeset() ;//時間設(shè)置函數(shù)</p><p>  void beep_alarm();//蜂鳴器部分</p><p>  void delay1ms(uchar x)</p><p&

44、gt;<b>  {</b></p><p>  uchar i,j; </p><p>  for (i=0; i<x; i++)</p><p><b>  {</b></p><p>  for (j=0; j<120; j++)</p><p><

45、b>  {</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void to(void) interrupt 1</p><p> 

46、 //50ms*20次 一秒 用于時鐘</p><p><b>  {</b></p><p>  TH0=-50000/256;</p><p>  TL0=-50000%256;</p><p>  if(flag_t0!=20)</p><p><b>  {</b>

47、;</p><p>  flag_t0++;</p><p><b>  }</b></p><p>  else if (flag_t0==20)</p><p><b>  {</b></p><p>  flag_t0=0;</p><p>&l

48、t;b>  s++;</b></p><p><b>  }</b></p><p>  time[0]=s;if(s==10)s=0;</p><p>  if(time[0]==10){time[0]=0; time[1]++;} //時分秒進(jìn)位</p><p>  if(time

49、[1]==6){time[1]=0; time[3]++;}</p><p>  if(time[3]==10){time[3]=0; time[4]++;}</p><p>  if(time[4]==6){time[4]=0; time[6]++;}</p><p>  if(time[6]==4){time[6]=0; time[7]++;} <

50、;/p><p>  if(time[7]==2){time[7]=0; }</p><p><b>  }</b></p><p>  void t1(void) interrupt 3//50ms*20次 一秒用于倒計時</p><p><b>  {</b></p><

51、;p>  uchar t1_count=0;</p><p>  TH0=-50000/256;</p><p>  TL0=-50000%256;</p><p>  if(flag_t0!=20)</p><p><b>  {</b></p><p>  flag_t1++;</

52、p><p><b>  }</b></p><p>  else if (flag_t0==20)</p><p><b>  {</b></p><p>  flag_t1=0;</p><p>  timer[0]--;</p><p><b&g

53、t;  }</b></p><p>  if(timer[0]==-1){timer[0]=9; timer[1]--;} </p><p><b>  //時分秒退位</b></p><p>  if(timer[1]==-1){timer[1]=5; timer[3]--;}</p><p>  

54、if(timer[3]==-1){timer[3]=9; timer[4]--;}</p><p>  if(timer[4]==-1){timer[4]=5; timer[6]--;}</p><p>  if(timer[6]==-1){timer[6]=0; timer[6]--;}</p><p>  if(timer[7]==-1){timer[7

55、]=2;timer[7]=3; }</p><p><b>  }</b></p><p>  void setint0(void) interrupt 0</p><p>  //外部中斷 用于設(shè)置數(shù)碼管切換顯示時鐘、鬧鐘、倒計時</p><p><b>  {</b></p>

56、<p>  flag_int0++;</p><p>  delay1ms(2);</p><p>  flag_int1=0;</p><p>  if(flag_int0==3) flag_int0=0;</p><p><b>  }</b></p><p>  void s

57、etint1(void) interrupt 2 //設(shè)置時分秒位</p><p><b>  {</b></p><p>  flag_int1++;</p><p>  delay1ms(2);</p><p><b>  }</b></p><p>  voi

58、d smg_dis() //數(shù)碼管顯示</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p&g

59、t;  P2=smg_wei[i];</p><p>  if(flag_int0==0){P0=smg_du[time[i]];}</p><p><b>  //顯示時鐘</b></p><p>  if(flag_int0==1){P0=smg_du[time_tmp[i]];} </p><p

60、><b>  //顯示鬧鐘</b></p><p>  if(flag_int0==2){P0=smg_du[timer[i]];} </p><p><b>  //顯示倒計時</b></p><p>  delay1ms(2);</p><p>  if(flag_int1

61、==1){if(i!=0&i!=1)delay1ms(10);}</p><p>  //設(shè)置為閃爍 </p><p>  if(flag_int1==2</p><p>  {if(i!=3&i!=4)delay1ms(10);} </p><p>  if(flag_int1==3){if(i!

62、=6&i!=7)delay1ms(10);}</p><p><b>  }</b></p><p><b>  }</b></p><p>  void timeset()//設(shè)置時間</p><p><b>  {</b></p><

63、;p><b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  if(flag_read==1&flag_int0==0){time_tmp[i]=time[i]; }</p>&l

64、t;p>  //時鐘時間放入time——tmp</p><p>  if(flag_int0==1){time_tmp[i]=alarm[i];}</p><p>  //鬧鐘時間放入time——tmp</p><p>  if(flag_int0==2){time_tmp[i]=timer[i];}</p><p&g

65、t;  //定時時間放入time——tmp</p><p><b>  }</b></p><p>  if(flag_int0==2&flag_int1!=0){TR1=0;}</p><p>  //設(shè)置倒計時時,T1停止計時</p><p>  if(flag_int1==1) // </

66、p><p><b>  設(shè)置時間 秒</b></p><p>  { flag_read=0;</p><p>  if(P30==0)//</p><p>  //按鍵+按下 時間++</p><p>  {time_tmp[0]++; delay1ms(255);</p>

67、<p>  if(time_tmp[0]==10){time_tmp[0]=0; time_tmp[1]++;}; </p><p>  if(time_tmp[1]==6){time_tmp[1]=0; } ;</p><p><b>  }</b></p><p>  if(P31==0) //按鍵+按

68、下 時間--</p><p>  {time_tmp[0]--;delay1ms(255);</p><p>  if(time_tmp[0]==0){time_tmp[0]=9; time_tmp[1]--;}; </p><p>  if(time_tmp[1]==-1){time_tmp[1]=5; } ;</p><p

69、><b>  } </b></p><p><b>  }</b></p><p>  if(flag_int1==2) // 設(shè)置時間 分</p><p>  { flag_read=0;</p><p>  if(P30==0)</p><p>

70、  { time_tmp[3]++;delay1ms(255);</p><p>  if(time_tmp[3]==10){time_tmp[3]=0; time_tmp[4]++;}; </p><p>  if(time_tmp[4]==6){time_tmp[4]=0; } ;</p><p><b>  }</b>

71、</p><p>  if(P31==0)</p><p>  {time_tmp[3]--;delay1ms(255);</p><p>  if(time_tmp[3]==0){time_tmp[3]=9; time_tmp[4]--;};//時分秒進(jìn)位</p><p>  if(time_tmp[4]==-1){time_tm

72、p[4]=5; } ;</p><p><b>  } </b></p><p><b>  }</b></p><p>  if(flag_int1==3) // 設(shè)置時間 時</p><p>  { flag_read=0;</p><p>  if(

73、P30==0) //按鍵+按下 時間++</p><p>  {time_tmp[6]++;delay1ms(255);</p><p>  if(time_tmp[6]==10){time_tmp[6]=0; time_tmp[7]++;}; </p><p>  if(time_tmp[7]==2&time_tmp[6]==4){ti

74、me_tmp[7]=0;time_tmp[6]=0;} ;</p><p><b>  }</b></p><p>  if(P31==0)</p><p><b>  {</b></p><p>  time_tmp[6]--;delay1ms(255);</p><p>

75、;  if(time_tmp[6]==-1&time_tmp[7]==0){time_tmp[6]=3; time_tmp[7]-- ;}</p><p>  if(time_tmp[6]==-1&time_tmp[7]==1){time_tmp[6]=9; time_tmp[7]-- ;}</p><p>  if(time_tmp[6]==-1&time_t

76、mp[7]==2){time_tmp[6]=9; time_tmp[7]-- ;}</p><p>  if(time_tmp[7]==-1){time_tmp[7]=2; }</p><p><b>  } </b></p><p><b>  }</b></p><p>  for(i=0;

77、i<8;i++)</p><p><b>  {</b></p><p>  if(flag_int0==2){timer[i]=time_tmp[i];}</p><p>  if(flag_int0==1){alarm[i]=time_tmp[i];}</p><p>  if(flag_int0==0)

78、{time[i]=time_tmp[i];}</p><p><b>  } </b></p><p>  if(flag_int1==4)</p><p><b>  {</b></p><p>  flag_int1=0;</p><p>  flag_read=1;&l

79、t;/p><p>  TR0=1; TR1=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void beep_alarm()//蜂鳴器部分</p><p><b>  {</b></p&

80、gt;<p><b>  uint i,x;</b></p><p><b>  beep=1;</b></p><p>  if(alarm[0]==time[0]&alarm[1]==time[1]&alarm[3]==time[3]&alarm[4]==time[4]&alarm[6]==tim

81、e[6]&alarm[7]==time[7])</p><p>  flag_alarm=1; //flag_alarm為1時是 鬧鐘</p><p>  if(TR1==1&timer[0]==0&timer[1]==0&timer[3]==0&timer[4]==0&timer[6]==0&timer[7]==0)//&

82、t1_count==t1_timer())</p><p>  { flag_alarm=1;} //定時器</p><p>  if((time[0]==8|time[0]==6)&time[1]==5&time[3]==9&time[4]==5)</p><p>  flag_alarm=20; //flag_alarm為20時是

83、短報時</p><p>  if(time[0]==0&time[1]==0&time[3]==0&time[4]==0)</p><p>  flag_alarm=21; //flag_alarm為20時是 短報時</p><p>  if (flag_alarm==1)</p><p><b>  {

84、</b></p><p>  for(x=0;x<3;x++) //鬧鐘大約六秒 響的時候顯示會中斷</p><p><b>  {</b></p><p>  for(i=0;i<6500;i++)</p><p><b>  {</b></p>&l

85、t;p>  delay1ms(1);</p><p>  beep=~beep;</p><p><b>  }</b></p><p>  }TR1=0; </p><p><b>  }</b></p><p>  if (flag_alarm==20)

86、//兩個短報時 00秒時di~~~~ 響的時候顯示會中斷</p><p><b>  {</b></p><p>  for(i=0;i<5;i++)</p><p><b>  {</b></p><p>  delay1ms(5);</p><p>  beep

87、=~beep;</p><p><b>  } }</b></p><p>  if (flag_alarm==21) // 00秒時di~~~~ 響的時候顯示會中斷</p><p><b>  {</b></p><p>  for(i=0;i<100;i++)</p>

88、<p><b>  {</b></p><p>  delay1ms(5);</p><p>  beep=~beep;</p><p><b>  } </b></p><p><b>  }</b></p><p>  flag_al

89、arm=0;</p><p><b>  }</b></p><p>  void main() </p><p><b>  {</b></p><p>  flag_t0=0; //內(nèi)部T0 循環(huán)20次 每次50ms標(biāo)志</p><p>  flag_int0

90、=0; //外部0 標(biāo)志位初始化 表示當(dāng)前顯示狀態(tài)</p><p>  flag_int1=0;//外部1 標(biāo)志位初始化 表示當(dāng)前待設(shè)置的位</p><p>  flag_read=1;//settime模塊 表示是否將當(dāng)前時間寫入time_tmp數(shù)組</p><p>  TMOD=0X11; //T0 T1 方式一</

91、p><p>  TH0=-50000/256;</p><p>  TL0=-50000%256;</p><p>  TH1=-50000/256;</p><p>  TL1=-50000%256;</p><p><b>  EA=1 ;</b></p><p><

92、b>  ET0=1 ;</b></p><p><b>  ET1=1;</b></p><p><b>  TR0=1;</b></p><p><b>  EX0=1;</b></p><p>  IT0=1;//下降沿觸發(fā) INT0</p&

93、gt;<p><b>  EX1=1;</b></p><p>  IT1=1;//下降沿觸發(fā)</p><p><b>  while(1)</b></p><p>  {if(flag_int0==0) //int0為1時設(shè)置時間 </p><p><b>  

94、{</b></p><p>  timeset();</p><p>  smg_dis();</p><p>  beep_alarm();</p><p><b>  }</b></p><p>  if(flag_int0==1) //int0標(biāo)志等于2時,鬧鐘部分</p

95、><p><b>  {</b></p><p>  timeset();</p><p>  smg_dis();</p><p><b>  }</b></p><p>  if(flag_int0==2) //int0標(biāo)志等于3時,倒計時部分</p>&l

96、t;p><b>  {</b></p><p>  timeset();</p><p>  smg_dis();</p><p>  beep_alarm();</p><p><b>  }</b></p><p><b>  }</b><

溫馨提示

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

評論

0/150

提交評論