東北大學(xué)秦皇島分校單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)方案報(bào)告文件_第1頁(yè)
東北大學(xué)秦皇島分校單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)方案報(bào)告文件_第2頁(yè)
東北大學(xué)秦皇島分校單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)方案報(bào)告文件_第3頁(yè)
東北大學(xué)秦皇島分校單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)方案報(bào)告文件_第4頁(yè)
東北大學(xué)秦皇島分校單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)方案報(bào)告文件_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGE東北大學(xué)秦皇島分校計(jì)算機(jī)與通信工程學(xué)院?jiǎn)纹瑱C(jī)課程設(shè)計(jì) 設(shè)計(jì)題目數(shù)字鐘設(shè)計(jì)專業(yè)名稱電子信息工程班級(jí)學(xué)號(hào)4101403學(xué)生姓名李凱指導(dǎo)教師陳海宴設(shè)計(jì)時(shí)間2013.01.01—2013。01.07目錄TOC\o”1-3”\h\z\u1、設(shè)計(jì)目的 12、設(shè)計(jì)方案 1_Toc345499754"5、硬件電路設(shè)計(jì)及描述 35。1位單片機(jī)簡(jiǎn)介 35。2STC89S52單片機(jī)主要功能介紹 3_Toc345499758”5。4時(shí)鐘電路 55。5按鍵電路 66.2時(shí)間重設(shè)流程圖 7HYPERLINK\l”_Toc345499765"6。3正常時(shí)間顯示流程圖 8HYPERLINK\l”_Toc345499766”7程序主要模塊 10HYPERLINK\l”_Toc345499767”7.1延時(shí)子程序 107.2中斷服務(wù)子程序 10HYPERLINK\l”_Toc345499769”7。3顯示子程序 128、程序調(diào)試及仿真 12HYPERLINK\l”_Toc345499772"8。1普通時(shí)間顯示模式仿真圖 13HYPERLINK\l”_Toc345499773"8。2年月日顯示模式仿真圖 13_Toc345499775”8。4調(diào)節(jié)仿真圖 1410。設(shè)計(jì)總結(jié)及感想 15HYPERLINK\l”_Toc345499778"10.1操作問題 1512、設(shè)計(jì)時(shí)間與安排 18HYPERLINK\l”_Toc345499782"附錄一:設(shè)計(jì)原理 19_Toc345499784”附錄三:總體仿真圖 21HYPERLINK\l”_Toc345499785”附錄四:設(shè)計(jì)源程序 22PAGE291、設(shè)計(jì)目的1。學(xué)習(xí)8051定時(shí)器時(shí)間計(jì)時(shí)處理、按鍵掃描及LED數(shù)碼管顯示的設(shè)計(jì)方法。2.設(shè)計(jì)任務(wù)及要求利用實(shí)驗(yàn)平臺(tái)上6個(gè)LED數(shù)碼管,設(shè)計(jì)帶有鬧鈴功能的數(shù)字時(shí)鐘課程設(shè)計(jì)的目的與意義在于讓我們將理論與實(shí)踐相結(jié)合。培養(yǎng)我們綜合運(yùn)用電子課程中的理論知識(shí)解決實(shí)際性問題的能力。讓我們對(duì)電子電路、電子元器件、proteus仿真等方面的知識(shí)進(jìn)一步加深認(rèn)識(shí),同時(shí)在軟件編程、排錯(cuò)調(diào)試、相關(guān)儀器設(shè)備的使用技能等方面得到較全面的鍛煉和提高,為今后能夠獨(dú)立完成某些單片機(jī)應(yīng)用系統(tǒng)的開發(fā)和設(shè)計(jì)打下一個(gè)堅(jiān)實(shí)的基礎(chǔ).2、設(shè)計(jì)方案本次設(shè)計(jì)時(shí)鐘電路,使用了ATC89S52單片機(jī)芯片控制電路,單片機(jī)控制電路簡(jiǎn)單且省去了很多復(fù)雜的線路,使得電路簡(jiǎn)明易懂,使用試驗(yàn)箱上的開關(guān)來調(diào)整時(shí)鐘的時(shí)、分、秒和年、月、日,用一LED來模擬定時(shí)和整點(diǎn)提醒,同時(shí)使用C語言程序來控制整個(gè)時(shí)鐘顯示,使得編程變得更容易,這樣通過四個(gè)模塊:?jiǎn)纹瑱C(jī)定時(shí)器、中斷、開關(guān)、芯片、LED燈、數(shù)碼管顯示(顯示電路用6個(gè)共陰數(shù)碼管分別顯示,小時(shí)(年份)、分鐘(月份)和秒(日),通過動(dòng)態(tài)掃描進(jìn)行顯示,從而避免了譯碼器的使用,同時(shí)節(jié)約了I/0端口,使電路更加簡(jiǎn)單)即可滿足設(shè)計(jì)要求,來設(shè)計(jì)一款單片機(jī)和簡(jiǎn)單外設(shè)控制的電子時(shí)鐘。3、設(shè)計(jì)要求1)使用6位數(shù)碼管,前兩位顯示小時(shí)(24小時(shí)制),中間兩位顯示分鐘,后兩位顯示秒。時(shí)鐘每走1秒,秒數(shù)碼管加1顯示,60秒后分鐘數(shù)碼管加1顯示,60分鐘后小時(shí)數(shù)碼管加1顯示。2)校正時(shí)間功能(即調(diào)整時(shí)間)3)添加“鬧時(shí)"功能,通過點(diǎn)亮LED燈來模擬。4)添加“整點(diǎn)鬧時(shí)”功能。為走時(shí)準(zhǔn)確性設(shè)計(jì)解決算法并編程實(shí)現(xiàn)。5)掌握使用Proteus繪制仿真圖的過程、方法和技巧。6)掌握單片機(jī)開發(fā)軟件Keil的使用和調(diào)試.7)編寫并調(diào)試單片機(jī)定時(shí)及其中斷程序,以實(shí)現(xiàn)電子時(shí)鐘的功能。8)設(shè)計(jì)六位八段數(shù)碼管顯示電路并編寫驅(qū)動(dòng)程序,輸入并調(diào)試拆字程序和數(shù)碼顯示程序.9)完成系統(tǒng)硬件電路的設(shè)計(jì)和制作。10)總結(jié)檢驗(yàn)電路設(shè)計(jì)結(jié)果11)注:年月日初始值2012年1月1號(hào).數(shù)碼管顯示120101.由于開機(jī)時(shí)鐘為6:00:00,鬧鐘為6:00:10。開機(jī)會(huì)報(bào)時(shí)10秒。4。實(shí)驗(yàn)原理附錄一5、硬件電路設(shè)計(jì)及描述5.1位單片機(jī)簡(jiǎn)介1972年,美國(guó)Intel公司首先推出8位微處理器8008,并于1976年9月率先推出MCS—48系列單片機(jī)。在這以后,8位單片機(jī)紛紛面市。例如,莫斯特克和仙童公司合作生產(chǎn)的3870系列,摩托羅拉公司生產(chǎn)的6801系列等.隨著集成電路工藝水平的提高,一些高性能的8位單片機(jī)相繼問世.例如,1978年摩托羅拉公司的MC6801系列及齊洛格公司的Z8系列,1979年NEC公司的UPD78XX系列。這類單片機(jī)的尋址能力達(dá)64KB,片內(nèi)ROM容量達(dá)4-—8KB,片內(nèi)除帶有并行I\O口外,還有串行I\O口,甚至還有A\D轉(zhuǎn)化器功能。8位單片機(jī)由于功能強(qiáng),被廣泛用于自動(dòng)化裝置、智能儀器儀表、智能接口、過程控制、通信、家用電器等各個(gè)領(lǐng)域。5。2STC89S52單片機(jī)主要功能介紹STC89S52單片機(jī)內(nèi)部主要包括累加器ACC(有時(shí)也簡(jiǎn)稱為A)、程序狀態(tài)字PSW、地址指示器DPTR、只讀存儲(chǔ)器ROM、隨機(jī)存取存儲(chǔ)器RAM、寄存器、并行I/O接口P0~P3、定時(shí)器/計(jì)數(shù)器、串行I/O接口以及定時(shí)控制邏輯電路等。這些部件通過內(nèi)部總線聯(lián)接起來,構(gòu)成一個(gè)完整的微型計(jì)算機(jī)。其管腳圖如圖所示:VCC:電源。GND:接地。P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流.P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故.在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故.P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì),當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流.當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下表所示:口管腳備選功能P3。0RXD(串行輸入口)P3。1TXD(串行輸出口)P3。2/INT0(外部中斷0)P3.3/INT1(外部中斷1)P3.4T0(記時(shí)器0外部輸入)P3。5T1(記時(shí)器1外部輸入)P3。6/WR(外部數(shù)據(jù)存儲(chǔ)器寫選通)P3.7/RD(外部數(shù)據(jù)存儲(chǔ)器讀選通)RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。5。3復(fù)位電路單片機(jī)的復(fù)位是由外部的復(fù)位電路來實(shí)現(xiàn)的.復(fù)位引腳RST通過一個(gè)斯密特觸發(fā)器與復(fù)位電路相連,斯密特觸發(fā)器用來抑制噪聲,在每個(gè)機(jī)器周期的S5P2,斯密特觸發(fā)器的輸出電平由復(fù)位電路采樣一次,然后才能得到內(nèi)部復(fù)位操作所需要的信號(hào)。上電復(fù)位:上電復(fù)位電路是—種簡(jiǎn)單的復(fù)位電路,只要在RST復(fù)位引腳接一個(gè)電容到VCC,接一個(gè)電阻到地就可以了。上電復(fù)位是指在給系統(tǒng)上電時(shí),復(fù)位電路通過電容加到RST復(fù)位引腳一個(gè)短暫的高電平信號(hào),這個(gè)復(fù)位信號(hào)隨著VCC對(duì)電容的充電過程而回落,所以RST引腳復(fù)位的高電平維持時(shí)間取決于電容的充電時(shí)間。為了保證系統(tǒng)安全可靠的復(fù)位,RST引腳的高電平信號(hào)必須維持足夠長(zhǎng)的時(shí)間。5.4時(shí)鐘電路時(shí)鐘是單片機(jī)的心臟,單片機(jī)各功能部件的運(yùn)行都是以時(shí)鐘頻率為基準(zhǔn),有條不紊的一拍一拍地工作。因此,時(shí)鐘頻率直接影響單片機(jī)的速度,時(shí)鐘電路的質(zhì)量也直接影響單片機(jī)系統(tǒng)的穩(wěn)定性。常用的時(shí)鐘電路有兩種方式:一種是內(nèi)部時(shí)鐘方式,另一種為外部時(shí)鐘方式。本文用的是內(nèi)部時(shí)鐘方式。電路圖如下:單片機(jī)內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,該高增益反向放大器的輸入端為芯片引腳XTAL1,輸出端為引腳XTAL2.這兩個(gè)引腳跨接石英晶體振蕩器和微調(diào)電容,就構(gòu)成一個(gè)穩(wěn)定的自激振蕩器。按鍵電路按鍵的開關(guān)狀態(tài)通過一定的電路轉(zhuǎn)換為高、低電平狀態(tài)。按鍵閉合過程在相應(yīng)的I/O端口形成一個(gè)負(fù)脈沖。閉合和釋放過程都要經(jīng)過一定的過程才能達(dá)到穩(wěn)定,這一過程是處于高、低電平之間的一種不穩(wěn)定狀態(tài),稱為抖動(dòng).抖動(dòng)持續(xù)時(shí)間的常長(zhǎng)短與開關(guān)的機(jī)械特性有關(guān),一般在5-10ms之間。為了避免CPU多次處理按鍵的一次閉合,應(yīng)采用措施消除抖動(dòng)。本文采用的是獨(dú)立式按鍵,直接用I/O口線構(gòu)成單個(gè)按鍵電路,每個(gè)按鍵占用一條I/O口線,每個(gè)按鍵的工作狀態(tài)不會(huì)產(chǎn)生互相影響。5。5按鍵電路邏輯電平開關(guān)電路如下圖所示。實(shí)驗(yàn)臺(tái)上有八個(gè)開關(guān)K1-K8,與之相對(duì)應(yīng)的K1—K8個(gè)引線孔為邏輯電平輸出端。開關(guān)想上撥相應(yīng)插孔輸出高電平“1”,向下?lián)芟鄳?yīng)插孔輸出低電平“0”。5。6單片機(jī)與8255連接電路圖單片機(jī)通過驅(qū)動(dòng)驅(qū)動(dòng)芯片與8255連接,用來傳送片選地址信號(hào)和數(shù)據(jù)信息,以實(shí)現(xiàn)對(duì)8255的控制。5。78255與數(shù)碼管連接圖8255通過驅(qū)動(dòng)芯片來對(duì)數(shù)碼管進(jìn)行顯示控制。6、電路的軟件設(shè)計(jì)6.1軟件程序主流程圖及總體仿真圖附錄二、附錄三6。2時(shí)間重設(shè)流程圖按鍵處理是先檢測(cè)秒按鍵是否按下,秒按鍵如果按下,秒就加1;如果沒有按下,就檢測(cè)分按鍵是否按下,分按鍵如果按下,分就加1;如果沒有按下,就檢測(cè)時(shí)按鍵是否按下,時(shí)按鍵如果按下,時(shí)就加1;如果沒有按下,就把時(shí)間顯示出來。年月日的重設(shè)原理相同,不在重復(fù). 6.3正常時(shí)間顯示流程圖定時(shí)器中斷時(shí)是先檢測(cè)1秒是否到,1秒如果到,秒單元就加1;如果沒到,就檢測(cè)1分鐘是否到,1分鐘如果到,分單元就加1;如果沒到,就檢測(cè)1小時(shí)是否到,1小時(shí)如果到,時(shí)單元就加1,如果沒到,就顯示時(shí)間。年月日的計(jì)時(shí)原理相同,不再重復(fù)。7程序主要模塊7.1延時(shí)子程序數(shù)碼管的閃爍提示,以及整點(diǎn)提醒等模塊也用到了延時(shí),只是延時(shí)的長(zhǎng)短不同罷了,在此不再贅述。7。2中斷服務(wù)子程序本實(shí)驗(yàn)中,計(jì)數(shù)器T0,T1中斷都有運(yùn)用,標(biāo)準(zhǔn)頻率(11.0592KHz),其中T0中斷為鬧鐘定時(shí)所用,T1中斷為時(shí)鐘定時(shí)所用.T0和T1工作于方式1,計(jì)數(shù)器計(jì)數(shù)9216次,進(jìn)入中斷,計(jì)數(shù)初值為65536—9216,裝滿定時(shí)器需要0.001s的時(shí)間,從而1000次中斷為一秒,一秒之后,判斷是否到60秒,若不到則秒加一,然后返回,若到,則秒賦值為0,分加一,依次類推。包括日期顯示的功能也是如此。外部中斷0用來實(shí)現(xiàn)手動(dòng)關(guān)閉鬧鐘,P3。2引腳外接一個(gè)開關(guān).當(dāng)鬧鐘響應(yīng)(LED燈亮)是,閉合開關(guān)(低電平有效),可以關(guān)閉鬧鐘.NOYESYESNO中斷服務(wù)程序中日歷的實(shí)現(xiàn)較為復(fù)雜,要考慮平年,閏年,因?yàn)橛刑厥獾?月,但是數(shù)碼管只有六個(gè),不能完全顯示年份,所以默認(rèn)2月份有28天。其中1、3、5、7、8、10、12月是每月31天。4、6、9、11月為每月30天。7。3顯示子程序六個(gè)數(shù)碼管輪流進(jìn)行顯示,分別顯示1ms,依賴人的視覺暫留效應(yīng),給人以數(shù)碼管持續(xù)高亮的錯(cuò)覺.7。4調(diào)整程序時(shí)鐘包括很多調(diào)整,如時(shí)分秒,年月日等,本程序,設(shè)計(jì)了相應(yīng)的調(diào)整程序段,通過對(duì)應(yīng)的按鍵,程序跳入調(diào)整模式或功能模式。結(jié)合電路圖整體思路為:1.按1鍵——設(shè)置模式。顯示時(shí)分秒(年月日)且可調(diào)整,通過閃爍來確定設(shè)置時(shí)間的哪個(gè)位。按三次則重新計(jì)時(shí)。時(shí)分秒(年月日)調(diào)整對(duì)應(yīng)鍵如下:3鍵——調(diào)整對(duì)應(yīng)位,按一次該位加14鍵-—調(diào)整對(duì)應(yīng)位,按一次該位減12。按2鍵—-年月日模式。時(shí)間調(diào)整對(duì)應(yīng)鍵如下:1鍵—-設(shè)置模式,調(diào)整年或月或日3鍵——調(diào)整對(duì)應(yīng)位,按一次該位加14鍵——調(diào)整對(duì)應(yīng)位,按一次該位減15.按5鍵關(guān)閉鬧鐘.當(dāng)鬧鐘響時(shí),可以人為地手動(dòng)關(guān)閉鬧鐘。8、程序調(diào)試及仿真本程序通過Keil單片機(jī)開發(fā)平臺(tái)實(shí)現(xiàn)程序的編譯,鏈接,生成HEX文件。程序再編譯過程中可以發(fā)現(xiàn)錯(cuò)位,并及時(shí)改正,在設(shè)計(jì)時(shí)非常重要,使錯(cuò)誤被扼殺在搖籃中。通過Keil和硬件仿真平臺(tái)Proteus的聯(lián)合,可以將設(shè)計(jì)效果仿真出來,根據(jù)效果,有目的的改變?cè)O(shè)計(jì),優(yōu)化程序.在具體的試驗(yàn)箱調(diào)試過程中,我們遇到了很多問題,如數(shù)碼管位選的的問題,我們仿真時(shí)是高電平有效,但是在調(diào)試時(shí)確是低電平有效。開始放真時(shí),我們用了P3。0、P3.1和P3.3口作為普通的I/O口,但是效果很不好,于是我們改用了P1的一些端口才打到理想的效果。8。1普通時(shí)間顯示模式仿真圖顯示時(shí)間是5:59:568。2年月日顯示模式仿真圖表示2012年1月1日8.3鬧鐘顯示仿真圖表示鬧鈴時(shí)刻為6:00:10點(diǎn)8。4調(diào)節(jié)仿真圖由于調(diào)節(jié)過程中,數(shù)字值要閃爍,效果不好,所以這里略去,未進(jìn)行截圖。9、試驗(yàn)箱操作事物圖時(shí)分秒顯示結(jié)果:年月日顯示結(jié)果:鬧鐘顯示結(jié)果:10。設(shè)計(jì)總結(jié)及感想在實(shí)驗(yàn)的開始幾天,基本上沒有收獲,不知何從下手,不知所措.為了看得更遠(yuǎn),不妨站在前人的肩膀上,我在整體思路模糊的情況下,在網(wǎng)上大量招資糧,各種與電子時(shí)鐘相關(guān)的文章,我閱讀了不少。隨著涉獵的點(diǎn)滴積累,我對(duì)電子時(shí)鐘的設(shè)計(jì)方案已經(jīng)慢慢醞釀而成。有了方向和不少知識(shí)儲(chǔ)備后,在接下來的幾天,幾乎每天都有突破,雖然有時(shí)只是一句程序的修改或誕生,但那種收獲的感覺很暖人心。經(jīng)過這次單片機(jī)課程設(shè)計(jì),我從一個(gè)單片機(jī)實(shí)踐的門外漢,已經(jīng)越升為略知一二的新手。雖然還有很多有關(guān)單片機(jī)的應(yīng)用有待學(xué)習(xí),但萬變不離其宗,只要深入了解單片的原理,全部知識(shí)點(diǎn),各個(gè)細(xì)節(jié),一切設(shè)計(jì)皆有可能。實(shí)驗(yàn)中遇到了不少問題,接下來總結(jié)一下,共同探討。10。1操作問題1、按鍵問題。我的設(shè)計(jì)中,很多功能選擇是通過按鍵開關(guān)實(shí)現(xiàn)的。在仿真中發(fā)現(xiàn),調(diào)整數(shù)值時(shí),有時(shí)按鍵反應(yīng)太快,按一次,跳了幾下,使設(shè)置時(shí)間,日期很不方便。但是仿真多了之后,找到了按鍵(實(shí)際上是按鼠標(biāo))的節(jié)奏,對(duì)按鍵的掌控力提高了不少,不怎么會(huì)出現(xiàn)跳變的情況了。有些開關(guān)我采用了長(zhǎng)按鍵的方式來防抖,效果不錯(cuò),但是每次都要長(zhǎng)按鍵,調(diào)整效率太低,我沒有普及.本來想把所有的按鍵都加延時(shí)防抖電路,但仿真中感覺對(duì)鍵盤的控制力沒提高多少,有時(shí)還是會(huì)出問題,這個(gè)方案放棄了。索性將板子焊接出來了在調(diào)試軟件吧,仿真畢竟不是那么“真”??!實(shí)際電路調(diào)試中,按鍵反應(yīng)沒有出現(xiàn)過于靈敏的問題,基本可控制.出現(xiàn)以上問題,我認(rèn)為是電路板上焊接點(diǎn)太多,接觸不是很好,影響了信號(hào)的傳輸時(shí)間,從而解決了按鍵問題!也有可能是按鍵質(zhì)量問題,接觸不良。2、中斷沖突問題,為了實(shí)現(xiàn)秒表,我在T0中斷嵌套了秒表相關(guān)進(jìn)位程序,由于秒表要求精度0。01秒,故我的T0中斷定時(shí)為就剛好0.01秒,中斷100次,剛好1秒。秒表確實(shí)實(shí)現(xiàn)了,但是我的鬧鈴音質(zhì)變差了.一開始以為是鬧鈴程序存太多冗余環(huán)節(jié),影響了T1的音樂輸出中斷,但是檢查程序后,發(fā)現(xiàn)沒什么多余的,裁剪無從下手.3、顯示數(shù)字分隔問題。本實(shí)驗(yàn)中用6個(gè)共陽極數(shù)碼管顯示年月日及時(shí)分秒,但是6個(gè)數(shù)碼管連在一起,顯示過程中不能有效地區(qū)分時(shí),分,秒和年,月,日,數(shù)碼管是兩兩組合起來,形成某位的十位和個(gè)位,故用小數(shù)點(diǎn)在適當(dāng)位置一直保持高亮狀態(tài),形成分隔符,實(shí)現(xiàn)方便的讀取數(shù)據(jù)。10。2設(shè)計(jì)問題1、硬件部分:首先要通過計(jì)算與參考資料等決定參數(shù).而后通過仿真軟件等調(diào)試,然后再在試驗(yàn)箱上進(jìn)行實(shí)際操作。因?yàn)樵囼?yàn)箱上的連線已經(jīng)做好,不用再設(shè)計(jì)連接.2、軟件設(shè)計(jì)部分:設(shè)計(jì)軟件首先要考慮要做的功能,確定出合理的算法。合理的算法不僅要可以實(shí)現(xiàn)功能,而且在添加功能的時(shí)候要方便靈活。有的人為了實(shí)現(xiàn)某種功能用了各種各樣的方法來實(shí)現(xiàn),結(jié)果程序結(jié)構(gòu)吃死,當(dāng)想要添加功能或者修改其他功能的時(shí)候,將修改程序大部分結(jié)構(gòu),也就是說要破壞程序現(xiàn)有的結(jié)構(gòu)。3、關(guān)于調(diào)試:Keil軟件調(diào)試單片機(jī)程序的時(shí)候,編譯通過并不代表程序是正確的。編譯通過只能說明程序沒有語法上的錯(cuò)誤。進(jìn)行軟件仿真或者下載到開發(fā)板上進(jìn)行調(diào)試,經(jīng)常會(huì)出現(xiàn)各種各樣的錯(cuò)誤。許多超出預(yù)期效果的現(xiàn)象往往是一些微小錯(cuò)誤引起的.例如沒有現(xiàn)場(chǎng)保護(hù)跟恢復(fù)現(xiàn)場(chǎng)等,所以養(yǎng)成良好的編程習(xí)慣也很重要。有些想達(dá)成某些功能而添加的語句,實(shí)際上確一點(diǎn)效果也沒有。舉個(gè)編程中的小問題:當(dāng)有按鍵按下時(shí),我們都要有軟件防抖。正常的方法是調(diào)用一個(gè)延時(shí)。在實(shí)際調(diào)試中,要跳過這個(gè)抖動(dòng),需要100MS左右。如果使用正常的延時(shí),會(huì)導(dǎo)致按鍵按下時(shí)CPU100MS內(nèi)無法進(jìn)行其他操作,也就是說。平均1S內(nèi)100MS不調(diào)用顯示子程序,這樣就會(huì)導(dǎo)致亮度降低。這時(shí)候,考慮到顯示子程序一次有十幾毫秒,就特別寫了一個(gè)調(diào)用7次顯示的子程序來作為按鍵防抖的延時(shí),實(shí)際上效果也是很不錯(cuò)的。這個(gè)想法就是在修改了多次程序未達(dá)到想要的效果(有按鍵按下時(shí)顯示亮度不降低)后最終想出來的辦法。我認(rèn)為有些細(xì)節(jié)是仿真軟件不能模擬的,必須要通過開發(fā)板的實(shí)際操作得以驗(yàn)證,PC機(jī)的資源有限,運(yùn)行速度和性能的差異也有可能產(chǎn)生仿真的不同結(jié)果.4、一個(gè)星期天以來的其他體會(huì):態(tài)度要積極,不要認(rèn)為很簡(jiǎn)單就不緊不慢。很多東西并不是自己設(shè)想的那么順利,有時(shí)候一個(gè)小問題可以花上你半天甚至一天的時(shí)間。雖然自己在程序上并沒遇到太大的問題,但是因?yàn)閼B(tài)度不夠積極,對(duì)于沒畫過的PCB圖遲遲不去下手,在周四晚上才解決.本以為周五一天可以做完板并完成整機(jī)調(diào)試,可是各種突發(fā)事件讓自己措手不及.發(fā)現(xiàn)板來不及做完后才將程序功能進(jìn)行擴(kuò)展。這是我在這次實(shí)驗(yàn)中的一個(gè)教訓(xùn),也讓我明白了對(duì)于自己不能太過于自信,態(tài)度決定一切.本次的設(shè)計(jì)使我從中學(xué)到了一些很重要的東西,那就是如何從理論到實(shí)踐的轉(zhuǎn)化,怎樣將我所學(xué)到的知識(shí)運(yùn)用到我以后的工作中去.在大學(xué)的課堂的學(xué)習(xí)只是在給我們灌輸專業(yè)知識(shí),而我們應(yīng)把所學(xué)的用到我們現(xiàn)實(shí)的生活中去,此次的電子時(shí)鐘設(shè)計(jì)給我奠定了一個(gè)實(shí)踐基礎(chǔ),我會(huì)在以后的學(xué)習(xí)、生活中磨練自己,使自己適應(yīng)于以后的競(jìng)爭(zhēng),同時(shí)在查找資料的過程中我也學(xué)到了許多新的知識(shí),在和同學(xué)協(xié)作過程中增進(jìn)同學(xué)間的友誼,使我對(duì)團(tuán)隊(duì)精神的積極性和重要性有了更加充分的理解。通過這次設(shè)計(jì)讓我真正體會(huì)到了,有付出,才會(huì)有收獲,我深刻的認(rèn)識(shí)到計(jì)算機(jī)專業(yè)的路的不平坦,我知道,今后我的路還是很長(zhǎng),我要學(xué)的東西也有很多。我會(huì)以一種良好的態(tài)度去迎接每一個(gè)挫折和挑戰(zhàn)。11、參考文獻(xiàn)[1]陳海宴。51單片機(jī)原理及應(yīng)用[M]。北京:北京航空航天大學(xué),2010.[2]謝自美。電子線路設(shè)計(jì)·實(shí)驗(yàn)·測(cè)試[M].武漢:華中理工大學(xué)出版社,1992。[3]何立民.單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,1993.[4]樓然笛.單片機(jī)開發(fā)[M].北京:人民郵電出版社,1994。

[5]付家才.單片機(jī)控制工程實(shí)踐技術(shù)[M].北京:化學(xué)工業(yè)出版社2004.3。

[6]李光才.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M].北京:北京航空航天大學(xué)出版社2004.

[7]朱定華.單片機(jī)原理及接口技術(shù)實(shí)驗(yàn)[M].北京:北方交通大學(xué)出版社2002.11.[8]劉湘濤.江世明.單片機(jī)原理與應(yīng)用[M]。北京:電子工業(yè)出版社,2006。12、設(shè)計(jì)時(shí)間與安排1、設(shè)計(jì)時(shí)間:2周2、設(shè)計(jì)時(shí)間安排:熟悉實(shí)驗(yàn)設(shè)備、收集資料:2天設(shè)計(jì)圖紙、實(shí)驗(yàn)、計(jì)算、程序編寫調(diào)試:2天編寫課程設(shè)計(jì)報(bào)告:1天答辯:1天附錄一:設(shè)計(jì)原理附錄二:設(shè)計(jì)總體流程圖附錄三:總體仿真圖附錄四:設(shè)計(jì)源程序/*————————--———-——--—————-—————-—————————-——-——-—--—————-———--—--————-—-———-——————-—-——-——--————--—團(tuán)隊(duì)課題名稱:數(shù)字電子時(shí)鐘 團(tuán)隊(duì)成員:4101424胡水仙(隊(duì)長(zhǎng))*4101403李凱*4101406陳文豪*4101431付榮 實(shí)現(xiàn)的功能:1.時(shí)分秒和年與日的顯示; 2。時(shí)分秒和年月日顯示的切換; 3.時(shí)分秒顯示有誤,通過按鍵(撥碼開關(guān)代替)加或減調(diào)整; 4。年月日顯示有誤,通過按鍵(撥碼開關(guān)代替)加或減調(diào)整; 5。鬧鐘功能,當(dāng)?shù)竭_(dá)指定時(shí)間,鬧鐘響應(yīng)(LED燈代替),分為 兩種模式:1。鬧鐘響應(yīng)后若無人處理,十秒后自動(dòng)關(guān)閉, 2。鬧鐘響應(yīng)后可以手動(dòng)關(guān)閉(外部中斷0實(shí)現(xiàn)); 6。整點(diǎn)報(bào)時(shí)功能,當(dāng)?shù)竭_(dá)整點(diǎn)時(shí),鬧鈴響應(yīng)(LED燈代替); 線路連接:1.P1.7口接L1的LED燈,用來模擬鬧鐘(鬧鈴),低電平點(diǎn)亮 2。P1。0、P1。1、P1。2、P1。3分別接K1、K2、K3、K4***P3.2接K5 其中:K1為時(shí)間調(diào)整開關(guān) K2為時(shí)分秒和年月日切換開關(guān) K3為調(diào)整時(shí)間時(shí)加1開關(guān) K4為調(diào)整時(shí)間時(shí)減1開關(guān) K5為外部中斷0輸入開關(guān),下降沿有效—--———--——-—-—--—————-————-——-—-—-—-——--————-—-————--——-——-———-————————-——--—————-————-————————-*/#include<reg52.h>#include〈absacc.h〉 //地址操作頭文件#defineucharunsignedchar#defineuintunsignedintsbitdeng=P1^7; //LED燈的端口(模擬鬧鐘或者鬧鈴)sbitshezhi=P1^0; //時(shí)間設(shè)置開關(guān)sbitjia=P1^2; //設(shè)置時(shí)間時(shí)加1開關(guān)sbitqiehuan=P1^1; //年月日和時(shí)分秒切換開關(guān)sbitjian=P1^3; //設(shè)置時(shí)間時(shí)減1開關(guān)ucharduan1,duan2,duan3,duan4,duan5,duan6;//定義段選相關(guān)變量uintmiao=50,fen=59,shi=6,nian=12,yue=1,ri=1; //年月日、時(shí)分秒標(biāo)志變量uintt0flag=0; //鬧鐘時(shí)間標(biāo)志位uchartimer[3]={6,0,10};//鬧鐘的初始化時(shí)間#defineweiXBYTE[0xff20] //PA口地址#defineduanXBYTE[0xff21] //PB口地址#definecontrolXBYTE[0xff23] //控制寄存器地址ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//數(shù)碼管編碼表/*-——-—-—-—-——--—-————-—--————-—-——-————-—————————--—-——-——-——-———-———-——————-——-———-—-———定時(shí)器初始化子程序-—-———-————-——--————-—--—-—-————————-——-———-—————--—————-———-———--——-———————-———--*/voidtimer_init(void){TMOD=0x11; //定時(shí)/計(jì)數(shù)器0和1使用模式1,16位定時(shí)器TH0=0x00; //給定初值,這里使用定時(shí)器最大值從0開始計(jì)數(shù)一直到65535溢出TL0=0x00;TH1=0x00;TL1=0x00;EA=1;//總中斷打開ET0=1;ET1=1;EX0=1;IT0=1;}/*———-——--———————--——————-——————--————-———-—-———-—-—--——-————--——--—-—--——-—-—-—-—-—-延時(shí)子程序———-——-———-—--——-———--—-—————-——-—-———-——-———-———--——-—-—————--—--———-—-—-——--—-——*/voiddelayms(unsignedcharms){uchari;while(--ms!=0)for(i=0;i〈50;i++);}/*-—-———-—————————-———--——--—-————-——-—-—-—-——-—-———-—--———————--—————-———————--—-—————-——-顯示子程序-———————-—-—-——-———--—-————-——-—--—————-—-——-—-—--—--——————————--—-—--—-—————-—--—————--———--*/voidxianshi(){wei=0xdf;//打開位選,選第一位數(shù)碼管11011111duan=duan1;//打開段選,顯示數(shù)碼關(guān)管第一位delayms(3);wei=0xef;//打開位選,選第二位數(shù)碼管11101111duan=duan2; //打開段選,顯示數(shù)碼關(guān)管第二位delayms(3); wei=0xf7;//打開位選,選第三位數(shù)碼管//11110111 duan=duan3; //打開段選,顯示數(shù)碼關(guān)管第三位delayms(3);wei=0xfb;//打開位選,選第四位數(shù)碼管//11111011 duan=duan4; //打開段選,顯示數(shù)碼關(guān)管第四位delayms(3);wei=0xfd;//打開位選,選第五位數(shù)碼管11111101duan=duan5; //打開段選,顯示數(shù)碼關(guān)管第五位delayms(3);wei=0xfe;//打開位選,選第六位數(shù)碼管11111110duan=duan6; //打開段選,顯示數(shù)碼關(guān)管第六位delayms(3);}/*--—--—-—--——-—-—————--———-—-—-—--—--—————--——-——————-—————--——————-—-—————-—--——-——--—-—-初始化子程序——-—-——-———--——-—-—--—————-—————————————-——-——-—————-——-——--—-——--——--—--—————--——-——--—-—*/voidinit_all(){ shezhi=1;//引腳置高電平作為輸入jia=1;qiehuan=1; jian=1;timer_init(); control=0x80;delayms(3);}/*————-————————--—————————-—--—-———-——-——--———-—--———-——-—-—-—-———-—-———--——-————-—-—-—-—--—主程序———-——-—-—--———--—--—-—-—--———--——-———————-——--——--—-——-——-——-—-—-——-—-—-————-—-—--—--—-—--—-———-*/voidmain(){uintflag=0,j=0,xuanze1=0,xuanze2=0;//定義閃爍標(biāo)志變量flag,閃爍時(shí)間變量j,時(shí)分、、//秒選擇變量xuanze1,年月日選擇變量xuanze2init_all();while(1)//死循環(huán){ if(qiehuan==1)//如果P1。1為高電平則執(zhí)行以下顯示和調(diào)整時(shí)間指令 { xuanze2=0;//日期設(shè)置年月日選擇變量置0,防止日期時(shí)間來回切換時(shí)發(fā)生錯(cuò)誤 if(xuanze1==0) { TR1=1;//如果時(shí)間設(shè)置時(shí)分秒選擇變量為0,說明處于//運(yùn)行狀態(tài),此時(shí)定時(shí)器開啟 flag=1;//爍標(biāo)志位強(qiáng)制置1,不閃爍 if((shi==timer[0])&&(fen==timer[1])&&(miao==timer[2]))//如果時(shí)間達(dá)到//預(yù)設(shè)值,則鬧鐘響(LED燈亮) { deng=0; //燈亮 TR0=1; //開始計(jì)時(shí) } if((fen==0)&&(miao==0)) //如果是整點(diǎn) { deng=0; //燈亮,整點(diǎn)提醒 delayms(2); deng=1; //燈滅,關(guān)閉鬧鈴 } } if(!shezhi)//P1。0設(shè)置按鈕 { xianshi();//延時(shí)去抖,用顯示子程序延時(shí),防止按動(dòng)按鈕時(shí)閃爍 if(!shezhi)//再次確認(rèn)按鍵是否按下,沒有按下則退出 { while(!shezhi)xianshi();//如果確認(rèn)按下按鍵等待按鍵釋放,沒有//釋放則一直執(zhí)行數(shù)碼管掃描,防止閃爍 { TR1=0; xuanze1++; //確定要設(shè)定的時(shí)或分或秒 if(xuanze1==4) xuanze1=0; } } } if(!jia) { xianshi(); //延時(shí)去抖,用顯示子程序延時(shí),防止按動(dòng)按鈕時(shí)閃爍 if(!jia) //再次確認(rèn)按鍵是否按下,沒有按下則退出 { while(!jia)xianshi(); //如果確認(rèn)按下按鍵等待按鍵釋放,沒有釋//放則一直執(zhí)行數(shù)碼管掃描,防止閃爍 { if(xuanze1==1) //時(shí)加 shi++; if(shi==24) shi=0; if(xuanze1==2) //分加 fen++; if(fen==60) fen=0; if(xuanze1==3) //秒加 miao++; if(miao==60) miao=0; } } } if(!jian) { xianshi(); //延時(shí)去抖,用顯示子程序延時(shí),防止按動(dòng)按鈕時(shí)閃爍 if(!jian) //再次確認(rèn)按鍵是否按下,沒有按下則退出 { while(!jian)xianshi(); //如果確認(rèn)按下按鍵等待按鍵釋放,沒//有釋放則一直執(zhí)行數(shù)碼管掃描,防止閃爍 { if(xuanze1==1) //時(shí)減 shi——; if(shi==—1) shi=23; if(xuanze1==2) //分減 fen-—; if(fen==—1)fen=59; if(xuanze1==3) //秒減 miao—-; if(miao==—1) miao=59; } } } If(flag==1)//閃爍標(biāo)志位為1,所有數(shù)碼管都亮,//與下面的flag=0構(gòu)成閃爍程序 { If(shi〈10)//滅零判斷,如果小時(shí)數(shù)小于10則第//一位數(shù)碼管熄滅 duan1=0xff; else duan1=table[shi/10];//分解顯示信息 duan2=table[shi%10]; duan3=table[fen/10]; duan4=table[fen%10]; duan5=table[miao/10]; duan6=table[miao%10]; } if(flag==0)//閃爍標(biāo)志位為0,對(duì)應(yīng)數(shù)碼管熄滅 { if(xuanze1==1) { duan1=0xff;//當(dāng)設(shè)置小時(shí)時(shí),第一二位數(shù)碼管閃爍 duan2=0xff; } if(xuanze1==2) { duan3=0xff; duan4=0xff; } if(xuanze1==3) { duan5=0xff; duan6=0xff; } } } if(qiehuan==0)//如果P1.1為低電平則執(zhí)行以下顯示和調(diào)整日期指令 { xuanze1=0;//時(shí)間設(shè)置時(shí)分秒選擇變量置0,防止日期時(shí)間來回切換時(shí)發(fā)生錯(cuò)誤 if(xuanze2==0) flag=1; if(!shezhi) { xianshi(); if(!shezhi) { while(!shezhi)xianshi(); { xuanze2++; //確定要設(shè)定的年或月或日 if(xuanze2==4) xuanze2=0; } } } if(!jia) { xianshi(); //延時(shí)去抖,用顯示子程序延時(shí),防止按//動(dòng)按鈕時(shí)閃爍 if(!jia) //再次確認(rèn)按鍵是否按下,沒有按下則退出 { while(!jia)xianshi(); //如果確認(rèn)按下按鍵等待按鍵釋放,沒有//釋放則一直執(zhí)行數(shù)碼管掃描,防止閃爍 { if(xuanze2==1) //年加 nian++; if(nian==100) nian=0; if(xuanze2==2) //月加 yue++; if(yue==13) yue=1; if(xuanze2==3) //日加 { ri++; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判斷 { if(ri==32) ri=1; } if(yue==4||yue==6||yue==9||yue==11) { if(ri==31) ri=1; } if(yue==2) { if(ri==29) ri=1; } } } } }if(!jian) { Xianshi(); //延時(shí)去抖,用顯示子程序延時(shí)防止//按動(dòng)按鈕時(shí)閃爍 if(!jian) //再次確認(rèn)按鍵是否按下,沒有按下則退出 { While(!jian)xianshi(); //如果確認(rèn)按下按鍵等待按鍵釋放,沒//有釋放則一直執(zhí)行數(shù)碼管掃描,防止閃爍 { if(xuanze2==1) //年減 nian-—; if(nian==-1) nian=99; if(xuanze2==2) //月減 yue--; if(yue==0) yue=12; if(xuanze2==3) //日減 { ri-—; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判斷 { if(ri==0) ri=31; } if(yue==4||yue==6||yue==9||yue==11) { if(ri==0) ri=30; } if(yue==2) { if(ri==0) ri=28; } } } } } if(flag==1) { duan1=table[nian/10];//分解顯示信息 duan2=table[nian%10]; duan3=table[yue/10]; duan4=table[yue%10]; duan5=table[ri/10]; duan6=table[ri%10]; } if(flag==0) { if(xuanze2==1) { duan1=0xff; //調(diào)整時(shí)間時(shí),年時(shí)間值閃爍 duan2=0xff; } if(xuanze2==2) { duan3=0xff; //調(diào)整時(shí)間時(shí),月時(shí)間值閃爍 duan4=0xff; } if(xuanze2==3) { duan5=0xff; //調(diào)整時(shí)間時(shí),日值閃爍 duan6=0xff; } } } xianshi(); j++; if(20==j)//延時(shí)閃爍時(shí)間 { j=0; flag=!flag;//閃爍標(biāo)志變量 }}}/*————-———-——--——-——--—-—-—-——-——--————--—-——-—--——--——————————--—--——-———-————--——--———-—外部中斷0中斷子程序-————————-—-—-—-————--——--———--———-————--———--——-—-—-—-——-——-—————-———

溫馨提示

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

評(píng)論

0/150

提交評(píng)論