久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

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

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

51單片機(jī)電子跑表課程設(shè)計(jì)報(bào)告 含源代碼,原理圖,word文檔

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:337138 發(fā)表于 2018-5-24 11:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
課程設(shè)計(jì)任務(wù)書(shū)

課題名稱

電子跑表的設(shè)計(jì)

姓    名

陳*

專業(yè)

測(cè)控技術(shù)

班級(jí)

1401

學(xué)號(hào)

04

指導(dǎo)老師

肖*

課程設(shè)計(jì)時(shí)間

(1-2周)

一、任務(wù)及要求

設(shè)計(jì)任務(wù):

    利用單片機(jī)為核心設(shè)計(jì)一個(gè)多功能電子表,具有電時(shí)鐘和跑表功能。用做時(shí)鐘時(shí),在顯示器上顯示時(shí)、分、秒,用做跑表時(shí),顯示范圍00時(shí)00分00秒-23時(shí)59分59秒并具有跑表啟動(dòng)和跑表復(fù)位功能鍵。當(dāng)按下啟動(dòng)按鈕跑表開(kāi)始計(jì)時(shí),按下停止按停止計(jì)時(shí),當(dāng)按下復(fù)位按鈕跑表回零。
設(shè)計(jì)要求:
  1)確定系統(tǒng)設(shè)計(jì)方案;
  2)進(jìn)行系統(tǒng)的硬件設(shè)計(jì);
  3)完成必要的參數(shù)計(jì)算與元器件選擇;
  4)完成應(yīng)用程序設(shè)計(jì);
  5)應(yīng)用系統(tǒng)的硬件和軟件的調(diào)試。
二、進(jìn)度安排
第一周:
周一:集中布置課程設(shè)計(jì)任務(wù)和相關(guān)事宜,查資料確定系統(tǒng)總體方案。
周二~周三:完成硬件設(shè)計(jì)和電路連接
周四~周日:完成軟件設(shè)計(jì)
第二周:
周一~周三:程序調(diào)試
周四~周五:設(shè)計(jì)報(bào)告撰寫(xiě)。周五進(jìn)行答辯和設(shè)計(jì)結(jié)果檢查。
三、參考資料
1、王迎旭等.單片機(jī)原理及及應(yīng)用[M]. 2版.機(jī)械工業(yè)出版社,2012
2、胡漢才.單片機(jī)原理及其接口技術(shù)[M].3版.清華大學(xué)出版社,2010.
3、戴燦金.51單片機(jī)及其C語(yǔ)言程序設(shè)計(jì)開(kāi)發(fā)實(shí)例[M].清華大學(xué)出版社,2010



目錄

第1章 總體方案設(shè)計(jì)            
1.1設(shè)計(jì)任務(wù)與要求            
1.2設(shè)計(jì)原理或者設(shè)計(jì)思路            
第2章 硬件電路設(shè)計(jì)
2.2顯示電路            
2.3控制電路            
第3章 軟件設(shè)計(jì)            
3.1系統(tǒng)主程序            
3.2系統(tǒng)子程序            
3.3中斷服務(wù)程序            
第4章 調(diào)試            
4.1系統(tǒng)調(diào)試方法            
4.2調(diào)試結(jié)果            
4.3調(diào)試中遇到的問(wèn)題及其解決方法            
總結(jié)
附錄一
附錄二

第1章 總體方案設(shè)計(jì)

1.1設(shè)計(jì)任務(wù)與要求

1.1.1設(shè)計(jì)任務(wù):

利用單片機(jī)為核心設(shè)計(jì)一個(gè)多功能電子表,具有電時(shí)鐘和跑表功能。用做時(shí)鐘時(shí),在顯示器上顯示時(shí)、分、秒,用做跑表時(shí),顯示范圍00時(shí)00分00秒-23時(shí)59分59秒并具有跑表啟動(dòng)和跑表復(fù)位功能鍵。當(dāng)按下啟動(dòng)按鈕跑表開(kāi)始計(jì)時(shí),按下停止按停止計(jì)時(shí),當(dāng)按下復(fù)位按鈕跑表回零。
1.1.2設(shè)計(jì)要求:
  1)確定系統(tǒng)設(shè)計(jì)方案;
  2)進(jìn)行系統(tǒng)的硬件設(shè)計(jì);
  3)完成必要的參數(shù)計(jì)算與元器件選擇;
  4)完成應(yīng)用程序設(shè)計(jì);
  5)應(yīng)用系統(tǒng)的硬件和軟件的調(diào)試。
1.2設(shè)計(jì)原理或者設(shè)計(jì)思路
電子跑表的電路由多個(gè)部分組成,如控制按鍵的輸入電路,單片機(jī)的時(shí)鐘電路,復(fù)位電路 ,顯示電路,秒表電路,LED顯示器段碼驅(qū)動(dòng)電路,LED顯示器位碼驅(qū)動(dòng)電路及秒表記錄電路組成。
本電子跑表采用AT89C52單片機(jī)為核心器件,AT89C52是一個(gè)低電壓,高性能CMOS8位單片機(jī),片內(nèi)含8k bytes的可反復(fù)擦寫(xiě)的Flash只讀程序存儲(chǔ)器和256 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲(chǔ)單元,AT89C52單片機(jī)在電子行業(yè)中有著廣泛的應(yīng)用。
AT89C52有40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內(nèi)含2個(gè)外中斷口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,2 個(gè)讀寫(xiě)口線,AT89C52可以按照常規(guī)方法進(jìn)行編程,也可以在線編程。其將通用的微處理器和Flash存儲(chǔ)器結(jié)合在一起,特別是可反復(fù)擦寫(xiě)的 Flash存儲(chǔ)器可有效地降低開(kāi)發(fā)成本。
  將LED數(shù)碼管與單片機(jī)和開(kāi)關(guān)連接,用于顯示時(shí)鐘與跑表。P3.2-P3.4分別接開(kāi)關(guān)K1-K3,P3.5和P3.6接開(kāi)關(guān)K4,P1.0-P1.5接LED數(shù)碼管輸出位碼,P0.0-P0.7輸出顯示段碼。電子跑表是利用單片機(jī)內(nèi)部的定時(shí)器來(lái)實(shí)現(xiàn)的,首先設(shè)置單片機(jī)內(nèi)部的一個(gè)定時(shí)器1對(duì)秒表數(shù)據(jù)處理,定時(shí)器0對(duì)時(shí)間數(shù)據(jù)處理。
在本設(shè)計(jì)中LED數(shù)碼顯示器采用的是共陰極接法,把發(fā)光二極管的陰極連在一起構(gòu)成 公共陰極,使用時(shí)公共陰極接地,每個(gè)發(fā)光二極管的陽(yáng)極通過(guò)電阻與輸入端相連。當(dāng)陽(yáng)極端輸入高電平時(shí),段發(fā)光二極管就導(dǎo)通點(diǎn)亮,而輸入低電平時(shí)則不亮。
第2章 硬件電路設(shè)計(jì)            

2.1時(shí)鐘電路

單片機(jī)工作的時(shí)間基準(zhǔn)是由時(shí)鐘電路提供的。在單片機(jī)的XTAL1和XTAL2兩個(gè)管腳,接一只晶振及兩只電容就構(gòu)成了單片機(jī)的時(shí)鐘電路。

圖2.1.1  時(shí)鐘電路

圖2.1.2 單片機(jī)
2.2顯示電路
本設(shè)計(jì)顯示用的是四位七段顯示共陰數(shù)碼管,用來(lái)顯示時(shí)間及跑表參數(shù),LED數(shù)碼管顯示器成本低,配置靈活,與單片機(jī)接口簡(jiǎn)單,在單片機(jī)應(yīng)用系統(tǒng)中廣泛應(yīng)用。
為了將時(shí)間顯示在LED數(shù)碼管上,可采用靜態(tài)顯示法和動(dòng)態(tài)顯示法,由于靜態(tài)顯示法需要譯碼器,數(shù)據(jù)鎖存器等較多硬件,可采用動(dòng)態(tài)顯示法實(shí)現(xiàn)LED顯示,通過(guò)對(duì)每位數(shù)碼管的依次掃描,使對(duì)應(yīng)數(shù)碼管亮,同時(shí)向該數(shù)碼管送對(duì)應(yīng)的字碼,使其顯示數(shù)字。由于數(shù)碼管掃描周期很短和人眼的視覺(jué)暫留效應(yīng),使數(shù)碼管看起來(lái)總是亮的,從而實(shí)現(xiàn)了各種顯示。
LED顯示流程圖如下:


圖2.2.1  顯示程序流程圖
圖2.2.2  LED數(shù)碼顯示管
2.3控制電路
K1鍵:模式選擇,可以讓時(shí)鐘、秒表、時(shí)間設(shè)置及秒表的記錄進(jìn)行切換;
K2鍵:加一、開(kāi)始及暫停,設(shè)置時(shí)間設(shè)置時(shí)可以調(diào)節(jié)時(shí)和分加一,秒表記錄時(shí)可以開(kāi)始和暫停;
K3鍵:切換和清零,當(dāng)需要設(shè)置時(shí)間時(shí),按下K3可以切換‘時(shí)’和‘分’;當(dāng)顯示秒表時(shí),K3具有清零功能;
K4鍵:記錄秒表,電路為秒表功能時(shí),按下K4可以記錄一組秒表數(shù)據(jù),最多可以記錄20組數(shù)據(jù)。
                           圖2.3  開(kāi)關(guān)控制電路

第3章 軟件設(shè)計(jì)

3.1系統(tǒng)主程序
主要進(jìn)行定時(shí)器的初始化編程,然后反復(fù)調(diào)用顯示子程序的方法,等待中斷的到來(lái)。K1是模式選擇開(kāi)關(guān),當(dāng)K1沒(méi)有按下時(shí),數(shù)碼管表示時(shí)間;當(dāng)K1第一次按下時(shí),數(shù)碼管表示秒表;當(dāng)K1第二次按下時(shí),數(shù)碼管表示時(shí)間設(shè)置,并可以閃爍定位;當(dāng)K1第三次按下時(shí),數(shù)碼管顯示秒表記錄。
主程流程圖如下:單片機(jī)源程序如下:

圖3.1 主程序流程圖

3.2系統(tǒng)子程序
子程序包括時(shí)鐘設(shè)置顯示程序,時(shí)鐘運(yùn)行顯示程序,時(shí)鐘溢出入口程序,跑表暫停,跑表記錄數(shù)據(jù)程序。
3.2.1顯示時(shí)鐘模式
如果K1=0時(shí),程序設(shè)定為12.00.00起始計(jì)時(shí),通過(guò)計(jì)數(shù)方式進(jìn)行滿60秒分鐘位進(jìn)一,滿60分小時(shí)位進(jìn)一,滿24小時(shí)小時(shí)位清零。
3.2.2時(shí)間設(shè)置模式
如果K1=2時(shí),先判斷是否為時(shí)間設(shè)置模式,再判斷K2是否按下,需要判斷是否為誤按,所以需要延時(shí)消抖,然后檢測(cè)用戶需要設(shè)置時(shí)還是分。
設(shè)置分,則跳到59之后重新賦值為0;
設(shè)置時(shí),則跳到23之后重新賦值為0 。
K3每按一次Set0取反,時(shí)分切換,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’。設(shè)置時(shí)間時(shí)用if語(yǔ)句實(shí)現(xiàn)分和鐘以0.5秒的頻率閃爍。
3.2.3秒表模式
如果K1=1時(shí),先判斷是否為秒表模式,再判斷K2是否按下,需要判斷是否為誤按,所以需要延時(shí)消抖,K2每按一次TR1取反,暫停或開(kāi)始定時(shí)器1,達(dá)到暫停或開(kāi)始秒表的目的。當(dāng)K4按下時(shí)秒表記錄一組數(shù)據(jù)。當(dāng)K3按下時(shí)清除所有秒記錄數(shù)據(jù),并停止定時(shí)器1。
3.2.4秒表記錄顯示模式
如果K1=3時(shí),先判斷是否為秒表記錄顯示模式,再判斷K2是否按下,需要判斷是否為誤按,所以需要延時(shí)消抖,將秒表的記錄分為4組,可存20組數(shù)據(jù)。當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1。
定時(shí)器1函數(shù)對(duì)于秒表數(shù)據(jù)處理,每?jī)纱窝h(huán)進(jìn)行一次操作,這樣秒表1(1/10秒位)每加1次為0.1s。當(dāng)秒表1(1/10秒位)加到10時(shí),重新賦值為0,此時(shí)秒表2(秒位)開(kāi)始增加;當(dāng)秒表2(秒位)加到60時(shí),重新賦值為0,此時(shí)秒表3(分位)開(kāi)始增加;當(dāng)秒表3(分位)加到60時(shí),重新賦值為0,此時(shí)秒表4(時(shí)位)開(kāi)始增加;當(dāng)秒表4(時(shí)位)加到10時(shí),重新賦值為0。
定時(shí)器0函數(shù)每溢出10次Time0_bit取反一次,時(shí)間間隔為0.5秒閃爍一次,以達(dá)到時(shí)間設(shè)置模式時(shí),分和時(shí)的閃爍。
3.3中斷服務(wù)程序
中斷服務(wù)程序的作用是進(jìn)行計(jì)時(shí)操作,定時(shí)器0和定時(shí)器1都選擇第1種工作方式。定時(shí)器0和定時(shí)器1裝初值,定時(shí)50ms。

中斷服務(wù)程序流程圖如下:

圖3.3  中斷程序流程圖
第4章 調(diào)試4.1系統(tǒng)調(diào)試方法
本次課程設(shè)計(jì)采用的是Proteus仿真軟件進(jìn)行電路的仿真,編程使用Keil生成可執(zhí)行文件加載到單片機(jī)中,通過(guò)對(duì)各個(gè)模塊程序的單步或跟蹤調(diào)試,使程序正確,最后統(tǒng)調(diào)程序,并生成相應(yīng)的*.hex文件。進(jìn)行程序的運(yùn)行和調(diào)試,觀察顯示結(jié)果,根據(jù)顯示的結(jié)果和課題的要求再修改程序,再運(yùn)行查找錯(cuò)誤,直到滿足要求。
4.2調(diào)試結(jié)果
K1鍵表示模式選擇,可以讓時(shí)鐘、秒表、時(shí)間設(shè)置及秒表的記錄進(jìn)行切換;
K2表示加一、開(kāi)始及暫停,設(shè)置時(shí)間設(shè)置時(shí)可以調(diào)節(jié)時(shí)間,秒表記錄時(shí)可以開(kāi)始和暫停;
K3表示切換和清零,當(dāng)需要設(shè)置時(shí)間時(shí),按下K3可以切換‘時(shí)’和‘分’;當(dāng)顯示秒表時(shí),K3具有清零功能;
K4表示記錄秒表,電路為秒表功能時(shí),按下K4可以記錄一組秒表數(shù)據(jù)。

          圖4.2.1  秒表時(shí)的調(diào)試結(jié)果
       圖4.2.2  時(shí)鐘調(diào)試結(jié)果


4.3調(diào)試中遇到的問(wèn)題及其解決方法
按下K4記錄秒表數(shù)據(jù)時(shí),當(dāng)記錄次數(shù)大于20時(shí),還是會(huì)繼續(xù)保存數(shù)據(jù),但由于AT89C52單片機(jī)內(nèi)存不夠,保存次數(shù)多了就會(huì)出現(xiàn)亂碼。發(fā)現(xiàn)這個(gè)問(wèn)題后小組成員檢查程序是否有錯(cuò),然后在同學(xué)的幫助下修改了程序。
總結(jié)
在課程設(shè)計(jì)第一天,老師帶領(lǐng)我們焊電路板,為之后的實(shí)物連接做準(zhǔn)備,有了上學(xué)期電子實(shí)習(xí)的經(jīng)驗(yàn),這次焊接很迅速,半天就焊好了兩塊電路板,在老師的幫助下順利仿真。
課程設(shè)計(jì)開(kāi)始幾天,基本上沒(méi)有收獲,不知從何下手,不知所措。為了看得更遠(yuǎn),,不妨站在前人的肩膀上,我在整體思路模糊的情況下,在網(wǎng)上找資料。也自己研究了一下Proteus仿真軟件的使用,仔細(xì)研究AT89C52芯片的主要功能及管腳接法,這也就為后面比較成功的仿真出結(jié)果打下了基礎(chǔ)。隨著涉獵的點(diǎn)滴積累,我對(duì)電子跑表的設(shè)計(jì)方案已經(jīng)慢慢醞釀而成,有了方向和不少知識(shí)儲(chǔ)備后,在接下來(lái)的幾天,幾乎每天都有突破,雖然有時(shí)只是一句程序的修改或誕生,但那種收獲一直激勵(lì)著我。當(dāng)然在設(shè)計(jì)過(guò)程中也遇到了一些問(wèn)題,比如秒表記錄次數(shù)超過(guò)20次后會(huì)出現(xiàn)亂碼情況,在老師的指導(dǎo)下,經(jīng)過(guò)一次又一次的思考,一遍又一遍的檢查,我終于發(fā)現(xiàn)了問(wèn)題所在,也暴露了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐才是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),唯有通過(guò)親自動(dòng)手才能令我們掌握的知識(shí)不再是紙上談兵的東西。
    經(jīng)過(guò)一周的課程設(shè)計(jì),我收獲頗多,有深刻的心得體會(huì),實(shí)踐讓我們受益匪淺。首先是單片機(jī)方面,為了順利完成程序的編寫(xiě),我又撿起了大一所學(xué)習(xí)的C語(yǔ)言知識(shí)。其次鍛煉了小組合作的能力,合理的分工讓我們組的課程設(shè)計(jì)按時(shí)完成,并對(duì)本專業(yè)的課程充滿了濃厚的興趣,相信有了興趣,我在以后對(duì)本專業(yè)的學(xué)習(xí)會(huì)更加得心應(yīng)手。在這次過(guò)程中我們也曾灰心也曾茫然,也曾不知所措,從一開(kāi)始的自信滿滿,到最后的緊張繁雜,所有這些都令我回味無(wú)窮,這已經(jīng)成為我人生道路上的寶藏。我想今后的學(xué)習(xí)和工作也是這樣的,汗水見(jiàn)證成功。
附錄一
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code Tab0[]=                            //定義數(shù)碼管數(shù)組,沒(méi)有小數(shù)點(diǎn)
  5. {
  6.               0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  7. };
  8. uchar code Tab1[]=                            //定義數(shù)碼管數(shù)組,有小數(shù)點(diǎn)
  9. {            
  10.               0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
  11. };
  12. uchar miaobiao[80];                            //定義存儲(chǔ)秒表數(shù)組
  13. sbit K1=P3^2;                                          //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
  14. sbit K2=P3^3;                                          //設(shè)置時(shí)間時(shí)加一/開(kāi)始(暫停)秒表按鍵
  15. sbit K3=P3^4;                                          //切換設(shè)置位/清零秒表按鍵
  16. sbit K4=P3^5;                                          //秒記錄
  17. void Delay(uchar x);                            //延時(shí)函數(shù)
  18. void Display0();                             //時(shí)間顯示函數(shù)
  19. void Display1();                             //秒表顯示函數(shù)
  20. void Display2();                            //時(shí)間設(shè)置顯示函數(shù)
  21. void Display3();                            //保存的秒表顯示函數(shù)
  22. void Init();                                           //中斷初始化函數(shù)
  23. void Mode_K1();                                          //模式切換函數(shù)
  24. void KEY_MiaoBiao();              //檢測(cè)秒表操作按鍵
  25. void KEY_Time_Set();              //檢測(cè)時(shí)間設(shè)置按鍵
  26. void KEY_MiaoBiao_keep();              //檢測(cè)秒表記錄顯示按鍵操作            
  27. uchar Hours=12,Minutes=00,seconds=00;                            //分別定義三個(gè)變量表示時(shí)、分、秒
  28. uchar Time0_bit=0;                                          //用于定時(shí)器0的溢出標(biāo)志
  29. bit Set_Time=0;                                                        //設(shè)置時(shí) 閃爍時(shí)長(zhǎng)的標(biāo)志位
  30. bit Set0=0;                                                                      //設(shè)置時(shí)間標(biāo)志,確定是設(shè)置‘分’還設(shè)置‘時(shí)’
  31. uchar K1_bit=0,m=0;                                                          //用于模式切換的標(biāo)志
  32. uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4;                            //用于秒表的變量
  33. uchar Miao_Biao11,Miao_Biao22,Miao_Biao33,Miao_Biao44;    //用于保存秒表顯示時(shí)的變量
  34. void main()
  35. {
  36.               Init();                                                                                                                                            //中斷初始化
  37.               while(1)                                                                                                                              //死循環(huán)
  38.                             {
  39.                                           Mode_K1();                                                                                                  //模式掃描
  40.                                           switch(K1_bit)                                                                                    //模式選擇
  41.                                                         {
  42.                                                                       case 0:
  43.                                                                                     {
  44.                                                                                                   Display0();                                          //顯示時(shí)間                                                                                                               
  45.                                                                                                   break;
  46.                                                                                     }
  47.                                                                       case 1:
  48.                                                                                     {
  49.                                                                                                   Display1();                                          //顯示秒表
  50.                                                                                                   KEY_MiaoBiao();                            //掃描秒表操作
  51.                                                                                                   break;
  52.                                                                                     }
  53.                                                                       case 2:
  54.                                                                                                   {
  55.                                                                                                                 Display2();              //設(shè)置時(shí)間時(shí)的顯示程序,可閃爍定位
  56.                                                                                                                 KEY_Time_Set();              //掃描按鍵
  57.                                                                                                                 break;
  58.                                                                                                   }
  59.                                                            case 3:
  60.                                                                                     {
  61.                                                                                                   Display3();                                          //顯示秒表
  62.                                                                                                   KEY_MiaoBiao_keep();                            //掃描秒表操作
  63.                                                                                                   break;
  64.                                                                                     }
  65.                                                         }
  66.                             }
  67. }
  68. void KEY_Time_Set()                                                                                                                   //設(shè)置時(shí)間時(shí)的按鍵掃描函數(shù)
  69. {
  70.               if(K1_bit==2)                                                                                                                  //判斷是否為時(shí)間設(shè)置模式
  71.                             {
  72.                                           if(K2==0)                                                                                                  //K2有按下(下同)
  73.                                                         {
  74.                                                                       Delay(10);                                                                         //延時(shí)消抖(下同)
  75.                                                                       if(K2==0)                                                                      //再次檢測(cè)是否為誤按
  76.                                                                                     {
  77.                                                                                                   if(Set0==0)                                          //檢測(cè)是設(shè)置‘時(shí)’還是分,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
  78.                                                                                                                 {
  79.                                                                                                                               Minutes++;               //‘分’加1
  80.                                                                                                                               if(Minutes==60)              //當(dāng)'分'加到60時(shí),重新賦值0
  81.                                                                                                                                             Minutes=0;
  82.                                                                                                                 }
  83.                                                                                                   else
  84.                                                                                                                 {
  85.                                                                                                                               Hours++;                  //‘時(shí)’加1
  86.                                                                                                                               if(Hours==24)                //當(dāng)'時(shí)'加到24時(shí),重新賦值0
  87.                                                                                                                                             Hours=0;
  88.                                                                                                                 }
  89.                                                                                                   while(!K2);//按鍵松開(kāi)檢測(cè),消除松開(kāi)按鍵時(shí)的抖動(dòng)干擾
  90.                                                                                     }
  91.                                                         }
  92.                                           if(K3==0)
  93.                                                         {
  94.                                                                       Delay(10);
  95.                                                                       if(K3==0)
  96.                                                                                     {
  97.                                                                                                   Set0=~Set0;              //K3每按一次Set0取反,時(shí)分切換,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
  98.                                                                                                   while(!K3);
  99.                                                                                     }            
  100.                                                         }
  101.                             }
  102. }
  103. void KEY_MiaoBiao()                                                                                                                //檢測(cè)秒表按鍵操作
  104. {
  105.               if(K1_bit==1)                                                                                                                //判斷是否為秒表模式
  106.                             {
  107.                                           if(K2==0)
  108.                                                         {
  109.                                                                       Delay(10);
  110.                                                                       if(K2==0)
  111.                                                                                     {
  112.                                                                                                   TR1=~TR1;                  //K2每按一次TR1取反,0暫停或1開(kāi)始定時(shí)器1,達(dá)到暫停或開(kāi)始秒表的目的
  113.                                                                                                   while(!K2);
  114.                                                                                     }
  115.                                                         }
  116.                                                         if(K4==0)                                                                                       //當(dāng)K4按下時(shí)秒表記錄一組數(shù)據(jù)
  117.                                                         {
  118.                                                                       Delay(10);
  119.                                                                       if(K4==0)
  120.                                                                       {
  121.                                                                                     miaobiao[4*m]=Miao_Biao1;
  122.                                                                                     miaobiao[4*m+1]=Miao_Biao2;
  123.                                                                                     miaobiao[4*m+2]=Miao_Biao3;
  124.                                                                                     miaobiao[4*m+3]=Miao_Biao4;
  125.                                                                                     m++;
  126.                                                                                     while(!K4);
  127.                                                                       }            
  128.                                                         }
  129.                                           if(K3==0)
  130.                                                         {
  131.                                                                       Delay(10);
  132.                                                                       if(K3==0)                            //當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1
  133.                                                                                     {
  134.                                                                                                   uchar i;
  135.                                                                                                   for(i=0;i<81;i++)
  136.                                                                                                   {
  137.                                                                                                                 miaobiao[i]=0;              //清除所有秒記錄數(shù)據(jù)
  138.                                                                                                   }
  139.                                                                                                   TR1=0;                                                        //停止定時(shí)器1
  140.                                                                                                   Miao_Biao0=0;                             //清零數(shù)據(jù)
  141.                                                                                                   Miao_Biao1=0;
  142.                                                                                                   Miao_Biao2=0;
  143.                                                                                                   Miao_Biao3=0;
  144.                                                                                                   Miao_Biao4=0;
  145.                                                                                                   m=0;                                                        //秒表記錄清零
  146.                                                                                                   while(!K3);
  147.                                                                                     }
  148.                                                         }
  149.                             }
  150. }
  151. void KEY_MiaoBiao_keep()                                                                                                                //檢測(cè)秒表記錄顯示按鍵操作
  152. {
  153.               if(K1_bit==3)                                                                                                                //判斷是否為秒表記錄顯示模式
  154.                             {
  155.                                                                                    
  156.                                           if(K2==0)
  157.                                                         {
  158.                                                                       Delay(10);
  159.                                                                       if(K2==0)
  160.                                                                                     {
  161.                                                                                                   m++;
  162.                                                                                                   while(!K2);
  163.                                                                                     }
  164.                                                         }
  165.                                           Miao_Biao11=miaobiao[4*m];
  166.                                           Miao_Biao22=miaobiao[4*m+1];
  167.                                           Miao_Biao33=miaobiao[4*m+2];
  168.                                           Miao_Biao44=miaobiao[4*m+3];
  169. if(K3==0)
  170.                                                         {
  171.                                                                       Delay(10);
  172.                                                                       if(K3==0)                            //當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1
  173.                                                                                     {
  174.                                                                                                     uchar i;
  175.                                                                                                   for(i=0;i<81;i++)
  176.                                                                                                   {
  177.                                                                                                                 miaobiao[i]=0;              //清除所有秒記錄數(shù)據(jù)
  178.                                                                                                   }
  179.                                                                   while(!K3);
  180.                                                                                     }
  181.                                                         }
  182.                             }
  183. }
  184. void Mode_K1()              //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
  185. {
  186.               if(K1==0)
  187.                             {
  188.                                           Delay(10);
  189.                                           if(K1==0)
  190.                                                         {
  191.                                                                       K1_bit++;
  192.                                                         //              if(K1_bit==1) m=0;
  193.                                                                       if(K1_bit==3) m=0;
  194.                                                                       if(K1_bit==4)
  195.                                                                                     {
  196.                                                                                                   K1_bit=0;
  197.                                                                                     }
  198.                                                                       while(!K1);


  199. /***********************************************************************
  200. *************當(dāng)K1_bit為0時(shí)顯示時(shí)鐘,為1時(shí)進(jìn)入秒表,*********************
  201. *******************為2時(shí)進(jìn)入時(shí)間設(shè)置模式,3時(shí)進(jìn)入秒表記錄顯示***********
  202. ***********************************************************************/
  203.                                                         }
  204.                             }
  205. }
  206.               void Time1() interrupt 3                                            //定時(shí)器1函數(shù)
  207. {
  208.               TH1=(65536-50000)/256;                                          //重裝初值
  209.               TL1=(65536-50000)%256;
  210. Miao_Biao0++;
  211.               if(Miao_Biao0==2)                                                        //以下為秒表數(shù)據(jù)處理,每?jī)纱窝h(huán)進(jìn)行一次操作
  212.                             {
  213.                                           Miao_Biao0=0;
  214.                                           Miao_Biao1++;                                          //Miao_Biao1每加1次為100ms
  215.                                           if(Miao_Biao1==10)
  216.                                                         {
  217.                                                                       Miao_Biao1=0;
  218.                                                                       Miao_Biao2++;
  219.                                                                       if(Miao_Biao2==60)
  220.                                                                                     {
  221.                                                                                                   Miao_Biao2=0;
  222.                                                                                                   Miao_Biao3++;
  223.                                                                                                   if(Miao_Biao3==60)
  224.                                                                                                                 {
  225.                                                                                                                               Miao_Biao3=0;
  226.                                                                                                                               Miao_Biao4++;
  227.                                                                                                                               if(Miao_Biao4==10)
  228.                                                                                                                                             Miao_Biao4=0;
  229.                                                                                                                 }
  230.                                                                                     }
  231.                                                         }
  232.                             }
  233. }
  234. void Time0() interrupt 1                                                                       //定時(shí)器0函數(shù)
  235. {
  236.               TH0=(65536-50000)/256;                                                                         //重裝初值
  237.               TL0=(65536-50000)%256;
  238.               Time0_bit++;
  239.               if((Time0_bit%10)==0)                                                                      //每溢出10次Time0_bit取反一次
  240.                             Set_Time=~Set_Time;                                                                        //0.5秒閃爍一次
  241. if(Time0_bit==20)                                                                                    //以下為時(shí)間數(shù)據(jù)處理
  242.                             {
  243.                                           Time0_bit=0;
  244.                                           seconds++;
  245.                                           if(seconds==60)
  246.                                                         {
  247.                                                                       seconds=0;
  248.                                                                       Minutes++;
  249.                                                                       if(Minutes==60)
  250.                                                                                     {
  251.                                                                                                   Minutes=0;
  252.                                                                                                   Hours++;
  253.                                                                                                   if(Hours==24)
  254.                                                                                                                 {
  255.                                                                                                                               Hours=0;
  256.                                                                                                                 }
  257.                                                                                     }
  258.                                                         }
  259.                             }
  260. }
  261. void Init()                                                                                                  //中斷初始化函數(shù)
  262. {
  263.               EA=1;                                                                                                  //開(kāi)總中斷
  264.               TMOD=0X11;                                                                                      //定時(shí)器工作方式選擇,定時(shí)器0和定時(shí)器1都選擇第1種工作方式
  265.               TH0=(65536-50000)/256;                                          //定時(shí)器0裝初值,定時(shí)50ms
  266.               TL0=(65536-50000)%256;
  267.               ET0=1;                                                                                                  //開(kāi)定時(shí)器0開(kāi)關(guān)
  268.               TR0=1;                                                                                                     //開(kāi)定時(shí)器0小開(kāi)關(guān)
  269.               TH1=(65536-50000)/256;                                          //定時(shí)器1裝初值,定時(shí)50ms
  270.               TL1=(65536-50000)%256;
  271.               ET1=1;                                                                                                    //開(kāi)定時(shí)器1開(kāi)關(guān)
  272.               TR1=0;                                                                                                  //關(guān)定時(shí)器1小開(kāi)關(guān)
  273. }
  274. void Display3()                                          //顯示保存的秒表
  275. {
  276.               P0=Tab0[Miao_Biao11%10];                            //顯示1/10秒的個(gè)位
  277.               P1=0xdf;                                                                      //段選
  278.               Delay(10);                                                                      //延時(shí)
  279.               P0=0X00;                                                                      //消隱
  280.               P0=Tab1[Miao_Biao22%10];                            //顯示秒的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  281.               P1=0xef;                                                                      //段選
  282.               Delay(10);                                                                      //延時(shí)
  283.               P0=0X00;                                                                      //消隱
  284.               P0=Tab0[Miao_Biao22/10];                            //顯示秒的十位
  285.               P1=0xf7;                                                                      //段選
  286.               Delay(10);                                                                      //延時(shí)
  287.               P0=0X00;                                                                      //消隱
  288.               P0=Tab1[Miao_Biao33%10];                            //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  289.               P1=0xfb;                                                                      //段選
  290.               Delay(10);                                                                      //延時(shí)
  291.               P0=0X00;                                                                      //消隱
  292.               P0=Tab0[Miao_Biao33/10];                            //顯示分的十位
  293.               P1=0xfd;                                                                      //段選
  294.               Delay(10);                                                                      //延時(shí)
  295.               P0=0X00;                                                                      //消隱
  296.               P0=Tab1[Miao_Biao44%10];                            //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  297.               P1=0xfe;                                                                      //段選
  298.               Delay(10);                                                                      //延時(shí)
  299.               P0=0X00;                                                                      //消隱
  300. }
  301. void Display2()                                                                                                  //時(shí)間設(shè)置時(shí)的顯示函數(shù)            
  302. {
  303.               if(Set0==0)                                                                                                  //判斷是否為設(shè)置‘時(shí)’還是‘分’
  304.                             {
  305.                                           P0=Tab0[seconds%10];                            //顯示秒的個(gè)位
  306.                                           P1=0xdf;                                                                      //段選
  307.                                           Delay(10);                                                                      //延時(shí)
  308.                                           P0=0X00;                                                                      //消隱
  309.                                           P0=Tab0[seconds/10];                            //顯示秒的十位
  310.                                           P1=0xef;                                                                      //段選
  311.                                           Delay(10);                                                                      //延時(shí)
  312.                                           P0=0X00;                                                                      //消隱
  313.                                           if(Set_Time)                                                        //這個(gè)if語(yǔ)句實(shí)現(xiàn)分鐘以0.5秒的頻率閃爍
  314.                                                         {
  315.                                                                       P0=Tab1[Minutes%10];              //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  316.                                                                       P1=0xf7;                                                                      //段選
  317.                                                                       Delay(10);                                                                      //延時(shí)
  318.                                                                       P0=0X00;                                                                      //消隱
  319.                                                                       P0=Tab0[Minutes/10];                            //顯示分的十位
  320.                                                                       P1=0xfb;                                                                      //段選
  321.                                                                       Delay(10);                                                                      //延時(shí)
  322.                                                                       P0=0X00;                                                                      //消隱
  323.                                                         }
  324.                                           else
  325.                                                         {
  326.                                                                       P0=0x00;                            //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  327.                                                                       P1=0xf7;                                                                      //段選
  328.                                                                       Delay(10);                                                                      //延時(shí)
  329.                                                                       P0=0X00;                                                                      //消隱
  330.                                                                       P0=0x00;                                      //顯示分的十位
  331.                                                                       P1=0xfb;                                                                      //段選
  332.                                                                       Delay(10);                                                                      //延時(shí)
  333.                                                                       P0=0X00;                                                                      //消隱
  334.                                                         }
  335.                                           P0=Tab1[Hours%10];              //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  336.                                           P1=0xfd;                                                                      //段選
  337.                                           Delay(10);                                                                      //延時(shí)
  338.                                           P0=0X00;                                                                      //消隱
  339.                                           P0=Tab0[Hours/10];                            //顯示時(shí)的十位
  340.                                           P1=0xfe;                                                                      //段選
  341.                                           Delay(10);                                                                      //延時(shí)
  342.                                           P0=0X00;                                                                      //消隱
  343.                             }
  344. else                                          //‘時(shí)’鐘閃爍
  345.                             {
  346.                                           P0=Tab0[seconds%10];                            //顯示秒的個(gè)位
  347.                                           P1=0xdf;                                                                      //段選
  348.                                           Delay(10);                                                                      //延時(shí)
  349.                                           P0=0X00;                                                                      //消隱
  350.                                           P0=Tab0[seconds/10];                            //顯示秒的十位
  351.                                           P1=0xef;                                                                      //段選
  352.                                           Delay(10);                                                                      //延時(shí)
  353.                                           P0=0X00;                                                                      //消隱
  354.                                           P0=Tab1[Minutes%10];                            //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  355.                                           P1=0xf7;                                                                      //段選
  356.                                           Delay(10);                                                                      //延時(shí)
  357.                                           P0=0X00;                                                                      //消隱
  358.                                           P0=Tab0[Minutes/10];                            //顯示分的十位
  359.                                           P1=0xfb;                                                                      //段選
  360.                                           Delay(10);                                                                      //延時(shí)
  361.                                           P0=0X00;                                                                      //消隱
  362.                                           if(Set_Time)                                                        //這個(gè)if語(yǔ)句實(shí)現(xiàn)‘時(shí)’鐘以0.5秒的頻率閃爍
  363.                                                         {
  364.                                                                       P0=Tab1[Hours%10];              //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  365.                                                                       P1=0xfd;                                                                      //段選
  366.                                                                       Delay(10);                                                                      //延時(shí)
  367.                                                                       P0=0X00;                                                                      //消隱
  368.                                                                       P0=Tab0[Hours/10];                            //顯示時(shí)的十位
  369.                                                                       P1=0xfe;                                                                      //段選
  370.                                                                       Delay(10);                                                                      //延時(shí)
  371.                                                                       P0=0X00;                                                                      //消隱
  372.                                                         }
  373.                                           else
  374.                                                         {
  375.                                                                       P0=0x00;                                          //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  376.                                                                       P1=0xFF;                                                                      //段選
  377.                                                                       Delay(10);                                                                      //延時(shí)
  378.                                                                       P0=0X00;                                                                      //消隱
  379.                                                                       P0=0X00;                                          //顯示時(shí)的十位
  380.                                                                       P1=0xFF;                                                                      //段選
  381.                                                                       Delay(10);                                                                      //延時(shí)
  382.                                                                       P0=0X00;                                                                      //消隱                                                      
  383.                                                         }                           
  384.                             }
  385. }
  386. void Display1()                                          //顯示秒表
  387. {
  388.               P0=Tab0[Miao_Biao1%10];                            //顯示1/10秒的個(gè)位
  389.               P1=0xdf;                                                                      //段選
  390.               Delay(10);                                                                      //延時(shí)
  391.               P0=0X00;                                                                      //消隱
  392.               P0=Tab1[Miao_Biao2%10];                            //顯示秒的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  393.               P1=0xef;                                                                      //段選
  394.               Delay(10);                                                                      //延時(shí)
  395.               P0=0X00;                                                                      //消隱
  396.               P0=Tab0[Miao_Biao2/10];                            //顯示秒的十位
  397.               P1=0xf7;                                                                      //段選
  398.               Delay(10);                                                                      //延時(shí)
  399.               P0=0X00;                                                                      //消隱
  400.               P0=Tab1[Miao_Biao3%10];                            //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  401.               P1=0xfb;                                                                      //段選
  402.               Delay(10);                                                                      //延時(shí)
  403.               P0=0X00;                                                                      //消隱
  404.               P0=Tab0[Miao_Biao3/10];                            //顯示分的十位
  405.               P1=0xfd;                                                                      //段選
  406.               Delay(10);                                                                      //延時(shí)
  407.               P0=0X00;                                                                      //消隱
  408.               P0=Tab1[Miao_Biao4%10];                            //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  409.               P1=0xfe;                                                                      //段選
  410.               Delay(10);                                                                      //延時(shí)
  411.               P0=0X00;                                                                      //消隱
  412. }
  413. void Display0()                                          //顯示時(shí)鐘
  414. {
  415.               P0=Tab0[seconds%10];                            //顯示秒的個(gè)位
  416.               P1=0xdf;                                                                      //段選
  417.               Delay(10);                                                                      //延時(shí)
  418.               P0=0X00;                                                                      //消隱
  419.               P0=Tab0[seconds/10];                            //顯示秒的十位
  420.               P1=0xef;                                                                      //段選
  421.               Delay(10);                                                                      //延時(shí)
  422.               P0=0X00;                                                                      //消隱
  423.               P0=Tab1[Minutes%10];                            //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  424.               P1=0xf7;                                                                      //段選
  425.               Delay(10);                                                                      //延時(shí)
  426.               P0=0X00;                                                                      //消隱
  427.               P0=Tab0[Minutes/10];                            //顯示分的十位
  428.               P1=0xfb;                                                                      //段選
  429.               Delay(10);                                                                      //延時(shí)
  430.               P0=0X00;                                                                      //消隱
  431.               P0=Tab1[Hours%10];                                          //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
  432.               P1=0xfd;                                                                      //段選
  433.               Delay(10);                                                                      //延時(shí)
  434.               P0=0X00;                                                                      //消隱
  435.               P0=Tab0[Hours/10];                                          //顯示時(shí)的十位
  436.               P1=0xfe;                                                                      //段選
  437.               Delay(10);                                                                      //延時(shí)
  438.               P0=0X00;                                                                      //消隱
  439. }
  440. void Delay(uchar x)                                                          //延時(shí)
  441. {
  442.               uchar i,j;
  443.               for(i=x;i>0;i--)
  444.                             for(j=110;j>0;j--);
  445. }
復(fù)制代碼

所有資料51hei提供下載:
單片機(jī)課設(shè).doc (310.88 KB, 下載次數(shù): 76)


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

使用道具 舉報(bào)

沙發(fā)
ID:359904 發(fā)表于 2018-6-27 08:59 | 只看該作者
有仿真嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:310313 發(fā)表于 2018-6-27 11:24 | 只看該作者
為什么我的顯示不一樣
回復(fù)

使用道具 舉報(bào)

地板
ID:677724 發(fā)表于 2019-12-31 13:13 | 只看該作者
電路圖有嗎?朋友
回復(fù)

使用道具 舉報(bào)

5#
ID:793352 發(fā)表于 2020-7-8 16:31 | 只看該作者

同問(wèn),是用CAD還是protues
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国产视频一区 | 2022国产精品| 中文日本在线 | av黄色在线| www.激情.com| 国产在线观看一区二区三区 | 欧美成人第一页 | 操久久久| 91久久爽久久爽爽久久片 | 日韩午夜在线观看 | 亚洲成人一区二区在线 | 热99在线 | 黄色网址在线免费播放 | 国产精品欧美一区二区三区 | 精品视频免费 | 毛片区| 欧美成人精品一区二区三区 | 国产精品久久久久久吹潮日韩动画 | 欧美日韩国产精品一区二区 | 日韩精品成人一区二区三区视频 | 国产精品成人一区 | 精品人伦一区二区三区蜜桃网站 | 国产成人精品一区二区三区四区 | 在线欧美一区 | 91精品久久久久久久 | 欧美一级欧美三级在线观看 | 亚洲免费人成在线视频观看 | 欧美激情亚洲激情 | av不卡一区 | 老妇激情毛片免费 | 国产精品日韩欧美一区二区三区 | av网站在线播放 | 亚洲国产成人精品女人久久久 | 日韩成人在线视频 | 久久免费资源 | 爱爱视频在线观看 | 丝袜 亚洲 另类 欧美 综合 | 在线免费观看日本 | 国产精品视频久久久 | 91精品国产综合久久久久久 | 国产精品99久久久久久www |