版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 摘要:3</b></p><p><b> Abstact3</b></p><p><b> 第一章 緒論5</b></p><p> 1.1 設(shè)計意義5</p
2、><p> 1.2 系統(tǒng)的基本要求及本人所做工作5</p><p> 第二章 方案選擇及設(shè)計思想6</p><p> 2.1 系統(tǒng)顯示模塊6</p><p> 2.1.1 1602接口說明6</p><p> 2.1.2 1602A的部分使用說明7</p><p> 2.
3、2 單片機設(shè)計模塊8</p><p> 2.3鍵盤模塊10</p><p> 第三章 硬件設(shè)計10</p><p> 3.1 原理框圖10</p><p> 3.2工作原理11</p><p> 3.2.1 LCD顯示器LCD160211</p><p> 3.2.2時
4、鐘電路11</p><p> 3.2.3復(fù)位電路12</p><p> 3.2.4按鍵電路12</p><p> 3.3 元件清單13</p><p> 3.4 電路圖13</p><p> 第四章 軟件設(shè)計流程及描述14</p><p> 4.1 系統(tǒng)模塊層次結(jié)構(gòu)圖1
5、4</p><p> 4.2 程序流程圖14</p><p> 4.3初始化程序16</p><p> 4.3.1 T0,T1的初始化16</p><p> 4.3.2 LCD初始化16</p><p> 4.4 LCD內(nèi)部程序16</p><p> 4.4.1讀忙判斷程序
6、16</p><p> 4.4.2 寫函數(shù)17</p><p> 4.5 按鍵掃描18</p><p> 第五章 測試19</p><p> 5.1測試工具19</p><p> 5.2 測試結(jié)果19</p><p> 5.3 仿真圖19</p><
7、;p> 第六章 總結(jié)20</p><p><b> 參考文獻20</b></p><p><b> 附錄20</b></p><p><b> 致謝33</b></p><p><b> 籃球計時計分器設(shè)計</b></p&g
8、t;<p><b> 張玲</b></p><p> 物理與電子信息學(xué)院應(yīng)用電子技術(shù)教育專業(yè)07級 指導(dǎo)教師:賴春紅</p><p> 摘要:此次設(shè)計隸屬于計算機控制技術(shù)弱電課程設(shè)計,主要通過基于單片機AT89S51芯片作為本次核心控制元件,利用1602aLCD作為顯示器件,鍵盤輸入電路等相關(guān)的軟件的有機結(jié)合以及喇叭等輔助器件,構(gòu)成了一個滿足基本設(shè)
9、計要求的籃球計時計分器。本系統(tǒng)可滿足倒計時方式顯示單節(jié)比賽剩余時間,可暫停,顯示雙方得分,按鍵輸入可修改分值,如有錯誤可進行分值的相應(yīng)修改。整場比賽結(jié)束時有聲音提示。系統(tǒng)符合一般籃球計時器的工作要求。采用液晶顯示器1602aLCD,因為其微功耗、小體積、使用靈活等諸多優(yōu)點在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中得到越來越廣泛的應(yīng)用,而且有利于硬件實物的成功。設(shè)計的主要方法主要是先通過仿真確定方案的可行性,然后在進行局部測試看實物是否滿足仿真的設(shè)計
10、要求,最后把整體電路搭建完成做最后的測試和調(diào)試。</p><p> 關(guān)鍵詞:AT89S51 按鍵輸入 點陣字符型液晶模塊 1602A, 計數(shù)器 計時器</p><p> The Basketball’s Timing and Score Indicator Design</p><p><b> zhangling</b>&l
11、t;/p><p> School of Physics and Electronic Information, Grade 2007, Instructor:Lai Chunhong</p><p> Abstact:This design belongs to the computer control technology elv curriculum design, mainly th
12、rough based on AT89S51 single-chip microcomputer chip as the core control device, using 1602aLCD as a display device, keyboard input circuit and other relevant software organic combination of the auxiliary devices and sp
13、eakers, constructed a satisfying basic design requirements of basketball timing JiFenQi. This system can satisfy the countdown display single day game remaining time, can pause, show bo</p><p> Keywords: AT
14、89S51 Dot matrix characters 1602A type LCD module counter timer</p><p><b> 第一章 緒論</b></p><p><b> 1.1 設(shè)計意義</b></p><p> 進入21世紀,伴隨著電子、信息技術(shù)的應(yīng)用與迅速普及,人們對電
15、子技術(shù)的要求越來越高。當今社會,科學(xué)技術(shù)日新月異,時代前進的步伐越邁越寬,應(yīng)用自動化設(shè)備,計算機處理,現(xiàn)代化通訊,數(shù)字化信息,現(xiàn)代化顯示設(shè)備等高新技術(shù)而建立的現(xiàn)代化智能。目前單片機滲透到我們生活的各個領(lǐng)域,幾乎很難找到哪個領(lǐng)域沒有單片機的蹤跡。導(dǎo)彈的導(dǎo)航裝置,飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及
16、程控玩具、電子寵物等等,這些都離不開單片機。更不用說自動控制領(lǐng)域的機器人、智能儀表、醫(yī)療器械了。因此,單片機的學(xué)習、開發(fā)與應(yīng)用將造就一批計算機應(yīng)用與智能化控制的科學(xué)家、工程師。通過此次基于單片機設(shè)計的籃球計時計分系統(tǒng),我們可以更清楚詳細的了解單片機程序設(shè)計的基本指令功能、編程步驟和技巧來講述單片機編程,并對AT89S51單片機的結(jié)構(gòu)和原理進行講述,以及基于單片機開發(fā)應(yīng)用的相關(guān)芯片的工作原理,和相關(guān)外圍電路的設(shè)計和調(diào)試過程進一步了解,有助
17、于今后的工作和學(xué)習生活。 </p><p> 本次設(shè)計用由AT89S51編程控制LCD作顯示的球賽計時計分系統(tǒng)。該系統(tǒng)具有賽程時間暫停,及時刷新甲、乙雙方的成績等功能。它具有價格低廉,性能穩(wěn)定,操作方便并且易于攜帶等特點。廣泛適合各類學(xué)?;蛘咝⌒蛨F體作為賽程計時計分。</p><p> 籃球比賽計時計分器是為了解決籃球比賽時計分與計時準確的問題。此裝置利用單片機AT89C51完成了計時
18、和計分的功能。本文詳細地介紹了系統(tǒng)硬件與軟件的設(shè)計過程,采用該裝置可根據(jù)實際情況進行比分修改和時間的準確顯示,具有低功耗,可靠性,安全性以及低成本等特點</p><p> 1.2 系統(tǒng)的基本要求及本人所做工作</p><p> 本系統(tǒng)有三項主要功能:</p><p> 一.倒計時方式顯示單節(jié)比賽剩余時間,可暫停。</p><p> 二
19、.顯示雙方得分,按鍵輸入可修改分值,設(shè)置三個按鍵分別加分1,2,3;如有錯誤可進行分值的相應(yīng)修改設(shè)置一個按鍵每次減1分。</p><p> 三.24秒倒計時顯示,時間結(jié)束喇叭響;且顯示每一個節(jié)次,每一小節(jié)比賽結(jié)束時有喇叭聲音提示。</p><p> 本人在這次課程設(shè)計過程中所做工作如下:查詢資料及硬件操作和后期的外圍電路設(shè)計調(diào)試測試,以及最后的論文撰寫。</p><
20、p> 第二章 方案選擇及設(shè)計思想</p><p> 通過分析題目的要求,此次系統(tǒng)設(shè)計主要可分為三大模塊,一是系統(tǒng)顯示模塊,二是單片機設(shè)計模塊,三是鍵盤輸入模塊。</p><p> 2.1 系統(tǒng)顯示模塊</p><p> 在顯示模塊的設(shè)計中,開始想到了常用的LED顯示,但是考慮的后續(xù)硬件實現(xiàn)的復(fù)雜性(超過10以上的LED實物連接將十分復(fù)雜),于是在同學(xué)
21、的建議下選取了方便但是沒有接觸過的LCD顯示,因此也導(dǎo)致了一定程度的難度。下面將對LCD 1602a作個簡單的介紹。</p><p> 2.1.1 1602接口說明 </p><p> 1602采用標準的16腳接口,如下:</p><p> 第1腳:VSS為地電源</p><p> 第2腳:VDD接5V正電源</p>
22、<p> 第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位調(diào)整對比度。</p><p> 第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p> 第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以
23、寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數(shù)據(jù)。</p><p> 第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。</p><p> 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。</p><p> 第15腳:背光電源正極。</p><p> 第16腳:背光
24、電源負極。</p><p> 1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。 LCD 1602A引腳如表2.1所示。</p>
25、<p> 表2.1 1602a引腳分配表</p><p> 2.1.2 1602A的部分使用說明</p><p><b> 寫數(shù)據(jù)</b></p><p> CPU向數(shù)據(jù)寄存器通道寫入數(shù)據(jù),SPLC780根據(jù)當前地址指針計數(shù)器AC值的屬性及數(shù)值將該數(shù)據(jù)送入相應(yīng)的存儲器的AC所指的單元里。如果AC值為DDRAN地址指針,則認為
26、寫入的數(shù)據(jù)是字符代碼并送入DDRAM的AC所指單元里。如果AC值為CGRAM的地址指針,則認為寫入的數(shù)據(jù)時自定義字符的字模數(shù)據(jù)并送入CGRAM內(nèi)AC所指的單元里。所以CPU在寫數(shù)據(jù)之前需要設(shè)置地址指針或認為的確定地址指針的屬性及數(shù)值。在寫入數(shù)據(jù)后地址指針計數(shù)器AC將根據(jù)最近設(shè)置的輸入方式最大修改。由此可知,CPU在寫數(shù)據(jù)操作之前要做兩項工作,其一是設(shè)置或確認地址指針計數(shù)器AC值的屬性及數(shù)值,以確保所寫數(shù)據(jù)能夠正確到位,其二是設(shè)置或確認輸
27、入方式,以確保連續(xù)寫入數(shù)據(jù)時AC值的修改方式符合要求。</p><p><b> 讀數(shù)據(jù)</b></p><p> 在SPLC780的內(nèi)部運行時序操作下,地址指針計數(shù)器AC值的每一次修改,包括新的AC值的寫入,光標滾動位移所引起的AC值的修改或由CPU讀寫數(shù)據(jù)操作后所產(chǎn)生的AC值的修改,SPLC780都會把當前AC所指單元的內(nèi)容送到數(shù)據(jù)輸出寄存器內(nèi),供CPU讀取。
28、如果AC值為DDRAM地址指針,則認為讀的是DDRAM內(nèi)AC所指的單元的字符代碼,如果AC值為CGRAM的地址指針,則認為讀取的是CGRAM內(nèi)AC所指單元的自定義字符的字模數(shù)據(jù)。</p><p> 2.2 單片機設(shè)計模塊</p><p> 在單片機設(shè)計模塊中,采用Atmel公司的AT89S51單片機作為控制器。該單片機擴展功能強,軟件編程靈活,自由度大,可通過軟件編程實現(xiàn)各種算法和邏輯
29、控制,并具有功耗低、體積小、技術(shù)成熟等優(yōu)點,使其廣泛應(yīng)用于各個電子控制系統(tǒng),完全能滿足本系統(tǒng)的功能需求。</p><p> 單片微型計算機(Single Chip Microcomputer)簡稱單片機,是指在一塊芯片上集成了中央處理器CPU、隨機存儲器RAM、程序存儲器ROM或EPROM、定時器\計數(shù)器、中斷控制器以及串行和并行I\O接口等部件,構(gòu)成一個完整的微型計算機。對于簡單的輸入和輸出控制,51機顯然最
30、合適,51單片機是8位的,采用總線結(jié)構(gòu),但是具有控制簡便,接口簡單,工作可靠,價格經(jīng)濟,能耗少,容易實現(xiàn)系統(tǒng)小型化等特點。</p><p> 本次設(shè)計采用常用的AT89C51,其基本結(jié)構(gòu)框圖如圖2.1。</p><p> 圖2.1單片機結(jié)構(gòu)框圖</p><p> 圖2.2 AT89C51引腳圖</p><p><b> A
31、T89S51簡介</b></p><p> P0:雙向I/O口,尋址外部程序存儲器時分時作為雙向8位數(shù)據(jù)口和輸出低8位地址復(fù)用口;不接外部存儲器時可作為8位準雙向I/O口使用。引腳為39-32。</p><p> P1:8位雙向I/O口,P1口寫入’1’后可作為輸入,引腳為1-8。</p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電
32、路的輸入,引腳為19。</p><p> XTAL2:來自反向振蕩放大器的輸出,引腳為18。</p><p> AT89S51的引腳圖如圖2.2所示。</p><p> P3口介紹如表2.2所示:</p><p> 表2.2 AT89S51的P3口功能表</p><p><b> 2.3鍵盤模塊&
33、lt;/b></p><p> 此部分由按鍵開關(guān)組成,記分器有九個按鍵.其中K0按下得分減一. K9鍵按一下第一個隊得分加一. 其余的鍵分別實現(xiàn)加二,加三,節(jié)次,暫停的控制。</p><p> 調(diào)節(jié)時間的時候,先同時按下K0和K9.這時時間的小時部分會跳閃,表示小時被選中了,這樣就可以 </p><p> 對小時進行設(shè)置:按一下K0時間加一,按一下k
34、9時間減一 ,設(shè)置完后再同時按一下K9和K0,時間的分鐘部分會跳閃。</p><p> 對分鐘數(shù)進行設(shè)置:同樣按一下K0分鐘數(shù)加一,按一下K9分鐘數(shù)減一,設(shè)置完后再同時按一下兩個鍵就可以退出設(shè)置。 </p><p> 因為籃球計分系統(tǒng)電路結(jié)構(gòu)比較簡單,只有按鍵控制和數(shù)碼顯示兩個部分,P0口接6個開關(guān),分別作為比分的加一,加二,加三,減一,設(shè)置節(jié)次,暫停的按鍵控制。P2口和P3口控
35、制LCD的比分及時間顯示。</p><p><b> 第三章 硬件設(shè)計</b></p><p><b> 3.1 原理框圖</b></p><p> 該系統(tǒng)包括單片機AT89S51,時鐘電路,復(fù)位電路,按鍵控制電路,及LCD顯示器五部分。該電路控制簡單,清晰明了,用LCD液晶顯示,避免了用LED的復(fù)雜接線,便于實體
36、硬件電路的焊接。其系統(tǒng)框圖如圖3.1所示。各部分的工作原理見第3.2節(jié)。</p><p> 圖3.1 系統(tǒng)框圖 </p><p><b> 3.2工作原理</b></p><p> 3.2.1 LCD顯示器LCD1602</p><p> 該顯示器的RS,RW,E端與P2相連,引腳的作用分別是:</
37、p><p> RS=0輸入指令,RS=1輸入數(shù)據(jù),RW=0向LCD寫入指令或數(shù)據(jù),RW=1從LCD讀取信息,E是使能信號。D0~D7與P3相連是數(shù)據(jù)總線。</p><p><b> 3.2.2時鐘電路</b></p><p> 時鐘電路在單片機系統(tǒng)中起著非常重要的作用,是為保證系統(tǒng)正常工作的基礎(chǔ),在一個單片機系統(tǒng)中,時鐘是保障系統(tǒng)正常工作的基
38、準震蕩定時信號。圖3.2是晶振電路,主要有晶振和外圍電路組成,晶振頻率大小決定單片機的快慢,我們這里采用的是12MHZ,另外有2個30P的電容。其中接地用來削減諧波對電路的穩(wěn)定性的影響。</p><p> 圖3.2 時鐘電路圖 </p><p><b> 3.2.3復(fù)位電路</b></p><p> 單片機系統(tǒng)的復(fù)位電路我們采用的是上電加
39、按鈕的復(fù)位電路形式,電阻采用220歐的阻值,采用22μ的電容。其電路連接方式如圖3.3。當單片機的復(fù)位引腳RESET出現(xiàn)2個機器周期以上的高電平時,單片機就執(zhí)行復(fù)位操作。</p><p> 圖3.3 復(fù)位電路圖</p><p><b> 3.2.4按鍵電路</b></p><p> 本設(shè)計共有9個設(shè)置按鍵,分別為+1,+2,+3,-1,暫
40、停,設(shè)置節(jié)次按鍵。按鍵與P0口相接。其電路圖如圖3.4。</p><p> 圖3.4 按鍵電路圖</p><p><b> 3.3 元件清單</b></p><p> 三極管9012×2 單片機AT89S51×1 按鈕×10 電阻10K×6 電阻1K×2</p>&l
41、t;p> 液晶顯示屏LCD 1602a×1 電容22μ×1 電容30p×2</p><p><b> 3.4 電路圖</b></p><p> 該設(shè)計的總的原理電路圖如圖3.5所示。當按下不同的按鍵時,顯示器上顯示相應(yīng)的數(shù)據(jù),第一列按鍵從上到下實現(xiàn)的功能分別是得分減一,A對加一分,B對加一分。第二列按鍵從上到下實現(xiàn)的功能
42、分別是倒計時暫停,A對加二分,B對加二分。第三列按鍵從上到下實現(xiàn)的功能分別是節(jié)次顯示,A對加三分,B對加三分。每一節(jié)12分鐘結(jié)束喇叭響。</p><p> 圖3.5 原理電路圖 </p><p> 第四章 軟件設(shè)計流程及描述</p><p> 4.1 系統(tǒng)模塊層次結(jié)構(gòu)圖</p><p> 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每一
43、條指令前要確認模塊的忙標志,低電平便是不忙,否則此指令失效。在對液晶模塊的出事化中要先設(shè)置其顯示模式,在液晶模塊顯示字符是光標是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙狀態(tài)。系統(tǒng)層次結(jié)構(gòu)圖如圖4.1所示。系統(tǒng)開始時需要對定時器和LCD進行初始化。單片機需要對按鍵進行判斷,判斷是否有按鍵按下,并判斷是那個按鍵按下,所以需要寫入按鍵掃描函數(shù)。比賽中需要暫?;蛐菹ⅲ杂中枰獙懭胙訒r函數(shù)。另外顯示器要顯示數(shù)據(jù)也需要寫
44、入程序讓其讀取信號。</p><p> 圖4.1 系統(tǒng)模塊層次結(jié)構(gòu)圖</p><p><b> 4.2 程序流程圖</b></p><p> 定時器T0,T1及LCD的初始化,T0 計每一小節(jié)的倒計時時間,T1計當前時間。按鍵與P0口相接,讀取P0口的數(shù)據(jù)判斷是否有按鍵按下,若沒有按鍵按下則繼續(xù)返回讀取P0口的數(shù)據(jù)。若有按鍵按下就判斷是哪
45、個鍵按下,各個鍵的作用是:A對加一分,加二分,加三分;B對加一分,加二分,加三分;得分減一,暫停/暫停復(fù)位,節(jié)次加一。等待按鍵釋放并將時間,分數(shù),節(jié)次經(jīng)P2,P3口輸出在LCD上顯示。其總的流程圖如圖4.2。</p><p> 圖4.2 總的程序流程圖</p><p><b> 4.3初始化程序</b></p><p> 4.3.1 T0
46、,T1的初始化</p><p> void Timer0Init(void) </p><p><b> {</b></p><p> TMOD=0x11;</p><p> TH0 = 0x3c;</p><p> TL0 = 0xb0; //50ms定時初值</p>
47、;<p><b> TH1=0x3c;</b></p><p> TL1=0xb0; //10MS定時初值(T1計時用)</p><p><b> ET0=1;</b></p><p><b> ET1=1;</b></p><p><b&
48、gt; TR0=1;</b></p><p><b> TR1=1;</b></p><p><b> EA=1;</b></p><p><b> }</b></p><p> 4.3.2 LCD初始化</p><p> voi
49、d Init_LCD(void)</p><p><b> { </b></p><p> Delay(400); //稍微延時,等待LCM進入工作狀態(tài)</p><p> Write_Comm(0x38); //8位2行5*8</p><p> Write_Comm(0x0c); //顯示開/關(guān),光標開
50、閃爍開</p><p> Write_Comm(0x01); //清顯示</p><p> Write_Comm(0x06); //文字不動,光標右移</p><p> Write_Comm(0x02); //光標歸位</p><p><b> }</b></p><p> 4.4 LC
51、D內(nèi)部程序</p><p> 4.4.1讀忙判斷程序</p><p> void Read_Busy(void)</p><p><b> { </b></p><p> uchar i=50;</p><p> Lcd_Port=0xff;</p><p>&l
52、t;b> RS = 0;</b></p><p><b> RW = 1;</b></p><p><b> E = 1;</b></p><p> while((i--)&&Busy);</p><p><b> E=0;</b>&
53、lt;/p><p><b> }</b></p><p><b> 4.4.2 寫函數(shù)</b></p><p><b> 寫指令函數(shù)</b></p><p> void Write_Comm(uchar lcdcomm) </p><p><b
54、> { </b></p><p> Read_Busy();</p><p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p><b> E = 1;</b></p><p>
55、 Lcd_Port=lcdcomm;</p><p><b> E = 0;</b></p><p><b> }</b></p><p><b> 寫字符函數(shù) </b></p><p> void Write_Char(uint num)//寫字符函數(shù)<
56、/p><p><b> { </b></p><p> Read_Busy();</p><p><b> RS = 1;</b></p><p><b> RW = 0;</b></p><p><b> E = 1;</b&g
57、t;</p><p> Lcd_Port = Lcddata[num];</p><p><b> E = 0;</b></p><p><b> }</b></p><p><b> 寫數(shù)據(jù)函數(shù) </b></p><p> void Wr
58、ite_Data(uchar lcddata)</p><p><b> { </b></p><p> Read_Busy();</p><p><b> RS = 1;</b></p><p><b> RW = 0;</b></p><p>
59、;<b> E = 1;</b></p><p> Lcd_Port = lcddata;</p><p><b> E = 0;</b></p><p><b> }</b></p><p><b> 4.5 按鍵掃描</b></p>
60、;<p> void keyscan()</p><p><b> {</b></p><p> uchar i,t=0xef; //1110 1111 </p><p> KEY_IO=0x0f;</p><p> keytemp=(~KEY_IO)&0x0e;</
61、p><p> if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 0001;</p><p><b> {</b></p><p> Delay(20);</p><p> for(i=0;i<3;i+
62、+)</p><p><b> {</b></p><p><b> KEY_IO=t;</b></p><p> keytemp=(~KEY_IO)&0x0e;</p><p> if(keytemp!=0&flag_key==0)</p><p>
63、<b> {</b></p><p> flag_key=1;</p><p> switch(keytemp)</p><p><b> {</b></p><p> case 0x08:key=0*3+i;break;</p><p> case 0x04:k
64、ey=1*3+i;break;</p><p> case 0x02:key=2*3+i;break;</p><p> default:break;</p><p><b> }</b></p><p><b> 第五章 測試</b></p><p><b&
65、gt; 5.1測試工具</b></p><p> 4位半數(shù)字萬用表,5V直流電源。</p><p><b> 5.2 測試結(jié)果 </b></p><p> 倒計時方式顯示單節(jié)比賽剩余時間,可暫停。顯示雙方得分,按鍵輸入可修改分值,設(shè)置三個按鍵分別加分1,2,3,如有錯誤可進行分值的相應(yīng)修改設(shè)置一個按鍵每次減1分。24秒倒計時
66、顯示時間結(jié)束喇叭響,且顯示每一個節(jié)次,比賽結(jié)束時有喇叭聲音提示。</p><p><b> 5.3 仿真圖</b></p><p> 最后的仿真效果圖如圖5.3所示。</p><p><b> 圖5.3 仿真圖</b></p><p><b> 第六章 總結(jié)</b>&
67、lt;/p><p> 通過本次本次課程設(shè)計的實踐,發(fā)現(xiàn)了自己的很多不足,首先是自己知識掌握很多都一知半解,實踐經(jīng)驗及動手能力比較薄弱,不管是程序設(shè)計階段還是實際調(diào)試階段都出現(xiàn)了很多錯誤。</p><p> 在設(shè)計過程中,我經(jīng)歷了很多,也學(xué)到了很多,對于程序的改寫一籌莫展的時候也有,此次設(shè)計是我們專業(yè)課程知識綜合應(yīng)用的實踐訓(xùn)練,這是我們邁向社會,從事職業(yè)工作前一個必不少的過程?!皩嵺`出真知”
68、,通過這次課程設(shè)計,我認識到只有理論聯(lián)系實踐才可以把所學(xué)的東西真正掌握。</p><p> 此次課程設(shè)計讓我進一步了解了單片機的實際設(shè)計過程,了解了基本的設(shè)計方法和調(diào)試過程的基本步驟,以及學(xué)會了制板。在這過程中出現(xiàn)了很多問題,在此特別感謝同學(xué)們的細心指導(dǎo)和幫助,以及指導(dǎo)老師賴春紅對我的系統(tǒng)設(shè)計和硬件調(diào)試過程幫助和指導(dǎo),有了他們我的設(shè)計才有了實物制作成功的保證。</p><p><b
69、> 參考文獻</b></p><p> [1]萬文略編著.單片機原理及應(yīng)用. 重慶:重慶大學(xué)出版社,2004.</p><p> [2]孫德文編著.微型計算機技術(shù). 北京:高等教育出版社,2005.</p><p> [3]張建勛編著.C語言程序設(shè)計教程. 北京:清華大學(xué)出版社,2008.</p><p> [4]
70、于海生編著.計算機控制技術(shù). 北京:機械工業(yè)出版社,2007.</p><p> [5]胡建明編著. MCS-51單片機籃球計分器的設(shè)計[N]. 期刊論文.廣西輕工業(yè).2008-9</p><p> [6]金素華,張尉.單片機調(diào)試方法的討論.電子世界,2004-4-25</p><p> [7] AT89C51 DATA SHEEP Philips Semic
71、onductors 1999.dec</p><p><b> 附錄</b></p><p><b> 源程序代碼</b></p><p> #include <reg51.h></p><p> #include "intrins.h" //_nop
72、_();延時函數(shù)用</p><p> #define uchar unsigned char</p><p> #define uint unsigned int </p><p> #define Lcd_Port P3 //定義數(shù)據(jù)端口</p><p> #define KEY_IO P0 //鍵盤接口
73、 </p><p> sbit RS = P2^1; //定義和LCM的連接端口</p><p> sbit RW = P2^2;</p><p> sbit E = P2^5;</p><p> sbit Busy = P3^7;</p><p> s
74、bit speaker=P1^0;</p><p> uchar data keytemp,key;</p><p> uchar L=0;</p><p> uchar k=0;</p><p> uchar c = 0;</p><p> uchar b=0;</p><p>
75、uchar j=0;</p><p> uchar e=1;</p><p> uchar d = 0;</p><p> uchar hour =0;</p><p> uchar hour1=0;</p><p> uchar min = 11;</p><p> uchar s
76、ec = 59; //賦初值</p><p> uchar data flag=0x00;</p><p> bit flag_key=0; </p><p> uchar code Lcddata[] = {"0123456789:"};</p><p> //uchar code Lcddata[12]={0x
77、C0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf};</p><p> /******************************************************************************************</p><p> * 函數(shù)名稱 :Timer0Init<
78、;/p><p> * 功能描述 :定時器0初始化 </p><p> ******************************************************************************************/</p><p> void Timer0Init(void) </p><
79、;p><b> {</b></p><p> TMOD=0x11;</p><p> TH0 = 0x3c;</p><p> TL0 = 0xb0; //50ms定時初值</p><p><b> TH1=0x3c;</b></p><p> TL
80、1=0xb0; //10MS定時初值(T1計時用)</p><p><b> ET0=1;</b></p><p><b> ET1=1;</b></p><p><b> TR0=1;</b></p><p><b> TR1=1;</b&g
81、t;</p><p><b> EA=1;</b></p><p><b> }</b></p><p> /******************************************************************************************</p>&l
82、t;p> * 函數(shù)名稱 :IsrTimer0</p><p> * 功能描述 :T0 50mS中斷程序 </p><p> ******************************************************************************************/</p><p> voi
83、d IsrTimer0(void) interrupt 1 using 1 //T0 50mS中斷程序</p><p> { static uchar count = 0;</p><p> uchar i=0,b=0;</p><p> TH0 = 0x3c;</p><p> TL0 = 0xb0;</p><
84、p><b> count++;</b></p><p> if(count ==20) //定時1s時間到</p><p><b> { </b></p><p> count = 0; </p><p><b> sec--;</b></p>
85、<p> if(sec == 0) //1分鐘時間到</p><p><b> {</b></p><p> if(min == 0) //12分鐘時間到</p><p><b> {</b></p><p><b> min = 11;</b></
86、p><p><b> sec = 59;</b></p><p><b> TR0=0;</b></p><p> speaker=1;</p><p> for(i=1000;i<=0;i--) //延時5秒</p><p><b> {</
87、b></p><p> for(b=1000;b<=0;b--)</p><p><b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b
88、> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> }</b></p>
89、<p> speaker=~speaker;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> sec = 59;</b></p&
90、gt;<p><b> min--;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p&
91、gt;<p> void IsrTimer1(void) interrupt 3 using 3//T1 50mS中斷程序</p><p> {uchar i=0,m=0,a=0;</p><p> static uchar ta20ms= 0;</p><p><b> TH1=0x3c;</b></p>
92、<p><b> TL1=0xb0;</b></p><p><b> ta20ms++;</b></p><p> if(ta20ms==20*60) //定時1分時間到</p><p><b> {</b></p><p> ta20ms=0; &l
93、t;/p><p><b> hour1++;</b></p><p> if(hour1 ==59) //1小時時間到</p><p> { hour++;hour1 =0;</p><p> if(hour==23)</p><p><b> {</b>
94、</p><p> hour=0;hour1=0;</p><p><b> k=1; </b></p><p><b> L=1;</b></p><p><b> }</b></p><p><b> }</b><
95、;/p><p><b> }</b></p><p><b> }</b></p><p> /******************************************************************************************</p><p>
96、* 函數(shù)名稱 :Delay</p><p> * 功能描述 :延時子程序,延時 (1MS*t) S </p><p> ******************************************************************************************/</p><p> void Dela
97、y(uchar t)</p><p><b> {</b></p><p><b> uchar a;</b></p><p> while(t-- != 0)</p><p><b> { </b></p><p> for(a = 0; a
98、 < 125; a++);</p><p><b> }</b></p><p><b> }</b></p><p> /******************************************************************************************<
99、/p><p> * 函數(shù)名稱 :Read_Busy</p><p> * 功能描述 :讀忙信號判斷 </p><p> ******************************************************************************************/</p><p> voi
100、d Read_Busy(void)</p><p><b> { </b></p><p> uchar i=50;</p><p> Lcd_Port=0xff;</p><p><b> RS = 0;</b></p><p><b> RW = 1;
101、</b></p><p><b> E = 1;</b></p><p> while((i--)&&Busy);</p><p><b> E=0;</b></p><p><b> }</b></p><p>
102、/******************************************************************************************</p><p> * 函數(shù)名稱 :Write_Comm</p><p> * 功能描述 :寫指令函數(shù) ok</p><p> ******************
103、************************************************************************/</p><p> void Write_Comm(uchar lcdcomm) </p><p><b> { </b></p><p> Read_Busy();</p>&l
104、t;p><b> RS = 0;</b></p><p><b> RW = 0;</b></p><p><b> E = 1;</b></p><p> Lcd_Port=lcdcomm;</p><p><b> E = 0;</b>
105、</p><p><b> }</b></p><p> /******************************************************************************************</p><p> * 函數(shù)名稱 :Write_Char</p><p&g
106、t; * 功能描述 :寫字符函數(shù) ok</p><p> ******************************************************************************************/</p><p> void Write_Char(uint num)//寫字符函數(shù)</p><p><
107、b> { </b></p><p> Read_Busy();</p><p><b> RS = 1;</b></p><p><b> RW = 0;</b></p><p><b> E = 1;</b></p><p&g
108、t; Lcd_Port = Lcddata[num];</p><p><b> E = 0;</b></p><p><b> }</b></p><p> /*****************************************************************************
109、*************</p><p> * 函數(shù)名稱 :Write_Data</p><p> * 功能描述 :寫數(shù)據(jù)函數(shù) ok</p><p> ******************************************************************************************/<
110、/p><p> void Write_Data(uchar lcddata)</p><p><b> { </b></p><p> Read_Busy();</p><p><b> RS = 1;</b></p><p><b> RW = 0;<
111、/b></p><p><b> E = 1;</b></p><p> Lcd_Port = lcddata;</p><p><b> E = 0;</b></p><p><b> }</b></p><p> /*********
112、*********************************************************************************</p><p> * 函數(shù)名稱 :Init_LCD</p><p> * 功能描述 :初始化LCD</p><p> **********************************
113、********************************************************/</p><p> void Init_LCD(void)</p><p><b> { </b></p><p> Delay(400); //稍微延時,等待LCM進入工作狀態(tài)</p><p&g
114、t; Write_Comm(0x38); //8位2行5*8</p><p> Write_Comm(0x0c); //顯示開/關(guān),光標開閃爍開</p><p> Write_Comm(0x01); //清顯示</p><p> Write_Comm(0x06); //文字不動,光標右移</p><p> Write_Comm(0x
115、02); //光標歸位</p><p><b> }</b></p><p> /******************************************************************************************</p><p> * 函數(shù)名稱 :Show_Time</p>
116、;<p> * 功能描述 :LCD上顯示當前時間</p><p> ******************************************************************************************/</p><p> void Show_Time(void)</p><p><b&g
117、t; {</b></p><p> Write_Comm(0x80+0x08); //顯示首地址</p><p> Write_Char( hour / 10 );//顯示小時</p><p> Write_Char( hour % 10 );</p><p> Write_Char( 10 ); //顯示":
118、"</p><p> Write_Char( hour1 / 10 );//顯示分</p><p> Write_Char( hour1 % 10 ); </p><p> Write_Comm(0x80+0x4b);</p><p> Write_Char( min / 10 ); //顯示倒計時分鐘</p>
119、;<p> Write_Char( min % 10 );</p><p> Write_Char( 10 ); //顯示“:”</p><p> Write_Char( sec / 10 ); //顯示倒計時秒</p><p> Write_Char( sec % 10 );</p><p> Write_Comm(
120、0x80+0x45);</p><p> Write_Char( c / 10 );</p><p> Write_Char( c % 10 );</p><p> Write_Comm(0x85);</p><p> Write_Char(d / 10 );</p><p> Write_Char(d %
121、10 ); </p><p><b> }</b></p><p> //***************按鍵掃描函數(shù)/*************</p><p> void keyscan()</p><p><b> {</b></p><p> uchar i,
122、t=0xef; //1110 1111 </p><p> KEY_IO=0x0f;</p><p> keytemp=(~KEY_IO)&0x0e;</p><p> if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 000
123、1;</p><p><b> {</b></p><p> Delay(20);</p><p> for(i=0;i<3;i++)</p><p><b> {</b></p><p><b> KEY_IO=t;</b></p
124、><p> keytemp=(~KEY_IO)&0x0e;</p><p> if(keytemp!=0&flag_key==0)</p><p><b> {</b></p><p> flag_key=1;</p><p> switch(keytemp)</p&g
125、t;<p><b> {</b></p><p> case 0x08:key=0*3+i;break;</p><p> case 0x04:key=1*3+i;break;</p><p> case 0x02:key=2*3+i;break;</p><p> default:break;&
126、lt;/p><p><b> }</b></p><p> switch(key)</p><p><b> {</b></p><p> case 0:{d++;j=1;if(d>=99){ Write_Comm(0x84);Write_Data('1');d=0;}b=
127、0;}break;</p><p> case 1:{d++;d++;j=1;if(d>=99){ Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;</p><p> case 2:{d++;d++;d++;if(d>=99){ Write_Comm(0x84);Write_Data('1')
128、;d=0;} j=1;b=0;}break;</p><p> case 3:{c++;if(c>=99){ Write_Comm(0x80+0x44);Write_Data('1');c=0;};b=1;j=0;}break;</p><p> case 4:{c++;c++;if(c>=99){ Write_Comm(0x80+0x44);Write_D
129、ata('1');c=0;}b=1;j=0;}break;</p><p> case 5:{c++;c++;c++;if(c>=99){ Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;</p><p> case 6:{if(j==1){d--;if (d==0) d=0;};
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 籃球計時計分器設(shè)計
- 籃球賽計時計分器畢業(yè)設(shè)計
- 基于51單片機的籃球計時計分器畢業(yè)論文
- 基于at89s52的籃球計時計分器畢業(yè)論文
- 畢業(yè)設(shè)計-籃球場計時計分器的設(shè)計
- 綜合課程設(shè)計--籃球計時計分器
- 課程設(shè)計-- 籃球賽計時計分器
- 基于at89s52的足球籃球雙用計時計分器畢業(yè)論文
- 畢業(yè)設(shè)計---基于單片機的籃球計時計分器設(shè)計
- 籃球計時計分器的設(shè)計與實現(xiàn)設(shè)計72347645
- 單片機課程設(shè)計——籃球計時計分器
- 單片機課程設(shè)計——籃球計時計分器
- 單片機課程設(shè)計—籃球計時計分器
- -基于單片機的籃球計時計分器設(shè)計
- 單片機課程設(shè)計—籃球計時計分器
- 單片機籃球計時計分器課程設(shè)計
- 基于單片機籃球賽計時計分器設(shè)計畢業(yè)設(shè)計
- 基于單片機的籃球計時計分器設(shè)計設(shè)計
- 單片機課程設(shè)計報告-籃球計時計分器
- 單片機課程設(shè)計——籃球計時計分器 - 副本
評論
0/150
提交評論