單片機(jī)相關(guān)畢業(yè)設(shè)計.doc_第1頁
單片機(jī)相關(guān)畢業(yè)設(shè)計.doc_第2頁
單片機(jī)相關(guān)畢業(yè)設(shè)計.doc_第3頁
單片機(jī)相關(guān)畢業(yè)設(shè)計.doc_第4頁
單片機(jī)相關(guān)畢業(yè)設(shè)計.doc_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第一章 緒論1.1 MCS-51發(fā)展?fàn)顩r單片機(jī)于1976年由Intel公司推出MCS-48開始,迄今已有二十多年了。由于單片機(jī)集成度高、功能強(qiáng)、可靠性高、體積小、功耗低、使用方便、價格低廉等一系列優(yōu)點,目前已經(jīng)滲入到人們工作的方方面面,幾乎“無所不在,無所不為”單片機(jī)的應(yīng)用領(lǐng)域已從面向工業(yè)控制、通訊、交通、智能儀表等迅速發(fā)展到家用消費(fèi)品、辦公自動化、汽車電子、PC機(jī)外圍以及網(wǎng)絡(luò)通訊等廣大領(lǐng)域。單片機(jī)有兩種基本結(jié)構(gòu)形式:一種是在通用微型計算機(jī)中廣泛采用的,將程序存儲器和數(shù)據(jù)存儲器合用一個存儲器空間的結(jié)構(gòu),成為普林斯頓結(jié)構(gòu)。另一種是將程序存儲器和數(shù)據(jù)存儲器截然分開,分別尋址的結(jié)構(gòu),一般需要較大的程序存儲器,目前采用程序存儲器和數(shù)據(jù)存儲器截然分開的結(jié)構(gòu)為多。本文討論的單片機(jī)多功能定時器的核心是目前應(yīng)用極為廣泛的51系列單片機(jī),配置了外圍設(shè)備,構(gòu)成了一個可編程的計時定時系統(tǒng),具有體積小,可靠性高,功能強(qiáng)等特點。不僅滿足所需要求而且還有很多的功能可供開發(fā),有著廣泛的應(yīng)用領(lǐng)域MCS-51系列單片機(jī)是美國Inter公司在1980年推出的高新能8位單片機(jī),它包含51和52 兩個子系列。對于51子系列,主要有8031、8051、8751三種機(jī)型,它們的指令系統(tǒng)和芯片引腳完全兼容,僅片內(nèi)程序存儲器有所不同,8031芯片不帶ROM,8051芯片帶4KB的ROM,8751芯片帶4KB的EPROM。對于52子系列,有8032、8052、8752 三種機(jī)型。52子系列與51子系列大部分相同,不同之處在于:52子系列的片內(nèi)數(shù)據(jù)存儲器曾至256B;8032芯片不帶ROM,8052帶8KB的ROM,8752芯片帶8KB的EPROM;有3個16位定時器/計數(shù)器,6個中斷源。1.2 研究的主要內(nèi)容目前市面上的數(shù)字時鐘種類繁多,有可愛型的,有帶計算型的,有數(shù)碼管顯示的,有液晶顯示的等等。(1)本設(shè)計為鞏固所學(xué)知識,對單片機(jī)的功用和軟件編程進(jìn)行更深入的學(xué)習(xí)。(2)修改時間功能:a 要求鍵入“A”鍵,停止計時(顯示時間不變)。 b 然后依次從鍵盤上輸入小時十位、小時個位、分十位、分個位、秒十位、秒個位(鍵入數(shù)字時顯示器上要同步顯示出修改的時間值),秒個位一旦鍵入完畢則立即恢復(fù)計時。(3)設(shè)定鬧鐘功能:要求按“B”鍵一次,顯示以前設(shè)定的鬧鐘時間,如果再按“B”鍵一次則跳過鬧鐘時間的設(shè)定,恢復(fù)計時顯示。當(dāng)鬧鐘時間到了,就響起鬧鈴。(4)繪制電路原理圖。(5)繪制主要程序流程圖。1.3時鐘工作原理 設(shè)計中的電子時鐘的定時計數(shù)是利用了單片機(jī)內(nèi)部的定時/計數(shù)器,通過對定時/計數(shù)器工作方式寄存器和控制寄存器的選取,對定時/計數(shù)器的初始值進(jìn)行計算和編寫,從而使其具有了簡單的計時能力。在設(shè)定了計時單元后,通過中斷軟件的編寫,對計時單元進(jìn)行無數(shù)次重復(fù)利用。有計數(shù)器對中斷次數(shù)進(jìn)行計數(shù)和進(jìn)位,再通過接口電路將其依次顯示出來。MCS-51 單片機(jī)有兩個16位的定時計數(shù)器T0和T1,當(dāng)工作在定時方式時,計數(shù)脈沖來自單片機(jī)內(nèi)部,振蕩器信號12分頻后做計數(shù)脈沖,美國機(jī)器周期的時間使計數(shù)器加一,由于計數(shù)脈沖的頻率是固定的(即每個脈沖為1個機(jī)器周期的時間),故可通過設(shè)定計數(shù)初值來實現(xiàn)定時功能。如果要實現(xiàn)定時100,當(dāng)晶振為6MHz時,每個機(jī)器周期為2,讓T0計50個數(shù)后溢出,產(chǎn)生中斷告訴CPU定時,100時間到。本實驗定時器每100中斷一次,在中斷服務(wù)程序中,對中斷次數(shù)進(jìn)行計數(shù),100計數(shù)1000次就是1s然后再對秒計數(shù)得到分和小時值,并送入顯示緩沖區(qū),最后用LCD液晶示出來。第二章 設(shè)計要求與方案論證2.1 設(shè)計要求本設(shè)計為鞏固所學(xué)知識,對單片機(jī)的功用和軟件編程進(jìn)行更深入的學(xué)習(xí),對本次設(shè)計的電子時鐘提出了以下要求。(1)具有修改時間功能: a 要求鍵入“A”鍵,停止計時(顯示時間不變)。 b 然后依次從鍵盤上輸入小時十位、小時個位、分十位、分個位、秒十位、秒個位(鍵入數(shù)字時顯示器上要同步顯示出修改的時間值),秒個位一旦鍵入完畢則立即恢復(fù)計時。 (2)設(shè)定鬧鐘功能:要求按“B”鍵一次,顯示以前設(shè)定的鬧鐘時間,如果再按“B”鍵一次則跳過鬧鐘時間的設(shè)定,恢復(fù)計時顯示。當(dāng)鬧鐘時間到了,就響起鬧鈴。(3)合理繪制電路原理圖。(4)繪制主要程序流程圖。(5)合理編輯程序。2.2 方案論證設(shè)計的電子時鐘是利用8051單片機(jī)內(nèi)部的晶振產(chǎn)生振蕩,每秒頻率為12MHZ,其精度穩(wěn)定,不受外界溫度和濕度的影響,但是會有如下問題出現(xiàn):(1)外界復(fù)雜的電磁環(huán)境,會影響到單片機(jī)信號的輸入、輸出,而且單片機(jī)內(nèi)部運(yùn)行的機(jī)械周期也會使電子時鐘的精度受到影響。方案:在電子時鐘外殼內(nèi)裝備較薄的金屬薄片,屏蔽外部電磁干擾。(2)由于芯片執(zhí)行程序需要一定的時間,從而使定時計數(shù)產(chǎn)生誤差。定時計數(shù)再未進(jìn)行初始化的時候,處于原始狀態(tài),不能進(jìn)行定時和計數(shù),所以需要對定時計數(shù)器里的初始值進(jìn)行計算和調(diào)整,并且選定合適的工作方式。 方案:通過與日常生活中常用的時鐘比較,找出產(chǎn)生誤差的原因,計算誤差的大小,通過對程序的調(diào)整和初始值得設(shè)定,減小誤差,使之達(dá)到使用精度。(3)需隨時對時間進(jìn)行調(diào)整,要求設(shè)置鍵盤,并對鍵盤輸入的穩(wěn)定性進(jìn)行調(diào)整。方案:采用列式鍵盤,按鍵數(shù)為4,編輯去抖動程序。(4)要求對時間進(jìn)行動態(tài)顯示,精確到秒。方案:采用LCD液晶顯示器進(jìn)行動態(tài)顯示。(5)接線復(fù)雜,易出現(xiàn)錯接誤接。方案:采用電路板進(jìn)行連接第三章 總體方案確定與實現(xiàn)3.1 電子時鐘電路設(shè)計框圖 圖3.1-13.2 系統(tǒng)硬件該電路是由MCS8051單片機(jī)為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路也由MCS8051單片機(jī)提供,減少芯片的使用,節(jié)約成本,它可以對年、月、日、周、日、時、分、秒進(jìn)行計時,時間顯示部份采用液晶LM016L(LCD),此次單片機(jī)數(shù)字時鐘的設(shè)計采用MCS8051為主控制芯片,并由其定時器提供時鐘,利用LCD進(jìn)行時間按顯示。其電路原理圖如下所示: 圖3.2-13.3軟件方案進(jìn)行應(yīng)用軟件設(shè)計時采用模塊化程序設(shè)計方法,其優(yōu)點是:(1)每個模塊程序機(jī)構(gòu)簡單,任務(wù)明確,易于編寫,調(diào)試和修改。(2)程序可讀性好,對程序的修改可局部進(jìn)行,其他部分可保持不變,便于功能的擴(kuò)充和版本升級。(3)對于使用頻繁的子程序可以建立子程序庫,便于多模塊調(diào)用。(4)便于分工合作,多個程序員同時進(jìn)行程序的編寫和調(diào)試工作,加快軟件研制進(jìn)度。該程序可劃分為7個模塊:主程序,LCD顯示模塊,當(dāng)前時間計時模塊,輸入鬧鐘模塊,當(dāng)前時間調(diào)整模塊,音頻報警模塊,數(shù)據(jù)轉(zhuǎn)壞模塊。第四章 硬件設(shè)計4.1 LCD顯示模塊在實際應(yīng)用中,用戶很少直接設(shè)計LCD顯示器驅(qū)動接口,一般是直接使用專用的LCD顯示驅(qū)動器和LCD顯示模塊。其中,LCD顯示模塊LCM(LiquidCrystalDisplayModule)是把LCD顯示器、背景光源、線路板和驅(qū)動集成電路等部件構(gòu)成一個整體,作為一個獨(dú)立的部件使用,具有功能較強(qiáng)、易于控制、接口簡單等優(yōu)點,在單片機(jī)系統(tǒng)中應(yīng)用較多。其內(nèi)部結(jié)構(gòu)如圖4.1-1所示。LCD顯示模塊只留一個接口與外部通信。顯示模塊通過這個接口接收顯示命令和數(shù)據(jù),并按指令和數(shù)據(jù)的要求進(jìn)行顯示。外部電路通過這個接口讀出顯示模塊的工作狀態(tài)和顯示數(shù)據(jù)。LCD顯示模塊一般帶有內(nèi)部顯示RAM和字符發(fā)生器,只要輸入ASCII碼就可以進(jìn)行顯示。LCD顯示模塊按功能顯示可分為:LCD段式顯示模塊、LCD字符型顯示模塊、LCD圖形顯示塊三類。液晶顯示器因其功耗低、重量輕而成為便攜式應(yīng)用中的主流顯示技術(shù)。這里所用的字符型液晶模塊是一種用5x7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行16個字、2行20個字等等。液晶顯示有點振式和字符式兩種,在這里采用字符式液晶顯示器1602來實現(xiàn)顯示電路的功能。該設(shè)計采用液晶顯示裝置即把時鐘信號以及溫度信號同時顯示在液晶顯示器上,不僅結(jié)構(gòu)簡單清新可見,而且省電也容易控制。數(shù)據(jù)的傳輸采用P0口進(jìn)行控制, 其引腳VSS接地,VEE接VCC,RS和RW、E是顯示器的控制端分別由單片機(jī)的引腳P1.0、P1.1、P1.3進(jìn)行控制。而VDD是作為液晶顯示器的灰度調(diào)節(jié)引腳,接一變阻器來改變其顯示的清晰度。圖4.1-1 LM016L液晶顯示器LCD驅(qū)動器LCD顯示器LCD控制器VSSVDDVEERSR/WED0-D7圖4.1-2LCD顯示電路由于1602液晶顯示器是本身帶有驅(qū)動模塊的液晶屏,它只有并口線和一些控制線,與單片機(jī)的連接有兩種不同的方法,直接訪問方式和間接訪問方式。直接訪問方式就是微處理器把液晶顯示模塊當(dāng)作存儲器或I/O設(shè)備直接掛在總線上,模塊8位數(shù)據(jù)總線與微處理器的數(shù)據(jù)總線相連,用讀操作或?qū)懖僮餍盘柵c地址信號共同產(chǎn)生控制信號。4.2 CPU 80518051是ROM型16位單片機(jī),共有40個引腳。內(nèi)含4K字節(jié)的ROM。其主要組成如下:(1) 面向控制的8位CPU和指令系統(tǒng)。(2) 4K字節(jié)的程序存儲器(ROM或EPROM)。(3) 128字節(jié)的數(shù)據(jù)存儲器。(4) 可編程的并行I/O口P0P3,有32位雙向輸入/輸出線。(5) 一個全雙工串行口。(6) 兩個16位定時器/計數(shù)器。(7) 五個中斷源,兩個優(yōu)先級中斷機(jī)構(gòu)。(8) 一個片內(nèi)時鐘振蕩器和時鐘電路。(9) 可尋址的64K字節(jié)的程序存儲器和64K字節(jié)的外部數(shù)據(jù)存儲器。MCS-51 的片外三總線結(jié)構(gòu):(1) 地址總線AB:地址總線的寬度為16位,因此外部存儲器直接尋址為64K字節(jié)。16位地址總線中,由P0口經(jīng)地址鎖存器提供低8位地址A0A7:P2口直接提供高8位地址A8 A15。(2) 數(shù)據(jù)總線:數(shù)據(jù)總線寬度為8位,由P0口提供D0D7。(3) 控制總線CB:由P3口的第二功能狀態(tài)和4根獨(dú)立控制線REST,/EA,ALE,和/PSEN組成。 其芯片結(jié)構(gòu)如圖4.2-2所示 圖4.2-24.3 引腳功能Vcc(40):電源電壓 GND(20):接地P0口(32-39):P0口是一個8位雙向I/O接口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位吸收電流的方式驅(qū)動8個TTL邏輯門電路,對端口P0寫“1”時,可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用。P1口(1-8):P1是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路,對端口寫“1”通過內(nèi)部的上拉電阻把端口拉到高電平時,此時可作輸入口。作為輸入品使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。與AT89C51不同之處是,P1.0和P1.1還可以分別作為定時/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX)。P2口(21-28):P2是一個帶有內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路,對端口P2寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平時,此時可作輸入口。作為輸入品使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX DPTR 指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。P3口(10-17):P3是一組帶有內(nèi)部上拉電阻的8位雙向I/O口,P3口輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路,對端口P3寫“1”時,它們被內(nèi)部上拉電阻拉高并可作為輸入端口,此時,被外部拉低的P3口將用上拉電阻輸出電流。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如下表所示:端口引腳第二功能P3.0RXD(串行輸入口)P3.1TXD(串行輸出口)P3.2INT0(外中斷0)P3.3INT1(外中斷1)P3.4T0(定時/計數(shù)器0)P3.5T1(定時/計數(shù)器1)P3.6WR(外部數(shù)據(jù)存儲器寫通道)P3.7RD(外部數(shù)據(jù)存儲器讀通道)表 3-1 P3口的第二功能RST(9):復(fù)位信號輸入端。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機(jī)器周期以上高電平將使單片機(jī)復(fù)位。ALE/PROG(30):地址鎖存有效信號輸出端。當(dāng)訪問片外程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié),一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的,要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。PSEN(29):程序存儲允許輸出端。是片外程序存儲器的讀選通信號,當(dāng)AT89C52由外部程序存儲器取指令(或數(shù)據(jù))時,每個周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。EA/VPP(31):外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000HFFFFH),EA端必須保持低電平(接地),需注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。XTAL1(19):振蕩器反相放大器的及內(nèi)部時鐘發(fā)生器的輸入端。XTAL1(18):振蕩器反相放大器的輸出端。通過XTAL1、XTAL2外接晶振后,即可構(gòu)成自激振蕩器,驅(qū)動內(nèi)部時鐘發(fā)生器向主機(jī)提供時鐘信號。4.4鍵盤模塊采用矩陣式14鍵盤,其行接8051的P1口,列接8051P3口,如圖所示: 圖3.3-1鍵盤掃描:(1) 確定是否有鍵按下。(2) 當(dāng)有鍵按下時,則對鍵進(jìn)行鍵譯碼,找出按下的是那個鍵;當(dāng)無鍵按下時,即返回。(3) 當(dāng)按下的是數(shù)字鍵,則送顯示緩沖單元;當(dāng)按下的是功能鍵,即轉(zhuǎn)到對應(yīng)的鍵服務(wù)程序。(4) 去抖動:按鍵從開啟到閉合穩(wěn)定,或從閉合到完全打開,總要有數(shù)毫秒的彈跳時間(即抖動)。彈跳將引起按一次鍵被多次輸入的誤動作。為此,在鍵盤處理程序中,必須設(shè)法去掉抖動??梢杂糜布ザ秳拥姆椒?,也可以采用硬件去抖動。第五章 軟件設(shè)計 5.1程序流程圖 圖5.1-1 5.2 初始值計算以毫秒為基本計數(shù)單元,采用方式0,定時器1,其計算過程如下:因為方式0采用13位計數(shù)器,8051的時鐘頻率為f=12MHZ,計數(shù)周期為1us,所以其最大定時時間為8192us,選擇定時時間為5ms,再循環(huán)200次,即得到1S延時。 計數(shù)值為5ms/1us=5000 則定時器1的初值為 C=M-計數(shù)值=8192-5000=3192=C78H采用方式0故TMOD=00H5.3主程序設(shè)計MAIN: MOV SP,#30H MOV DPTR,#0E100H MOV A,#03H MOVX DPTR,A MOV TCON,#0 MOV IP,#02H MOV IE,8AH MOV TMOD,#21H MOV TH0,#3CH MOV TL0,0B0H MOV R4,#10 ;設(shè)置定時器T0的走秒用計數(shù)器 MOV 71H,#0 MOV 72H,#0 MOV 73H,#00H MOV 74H,00H MOV CLKBCD,#0 MOV CLKBCD+1,#0 MOV CLKBCD+2,#0 MOV CLKBCD+3,#0 MOV CLKBCD+4,#0 MOV CLKBCD+5,#0SETB TR0 ;啟動計數(shù)走秒REPDISP; MOV R5,#3 ;將計時值存放區(qū)的計時值拆分并存入計時值的BCD數(shù)據(jù)存放區(qū)為顯示時間值做好準(zhǔn)備 MOV RO,#70H MOV R1,#CLKBCD CLR TRO ;暫停計數(shù),以防出現(xiàn)顯示錯誤CHAIREPI: LCALL CHAI ;開始拆分轉(zhuǎn)存 DJNZ R5,CHAIREPI MOV A,TL0 ADD A,#31H MOV TL0,A ADDC A,#0 MOV TH0,A SETB TR0 ;IT;再次啟動計數(shù)走秒 LCALL STARTDISPLAY ;顯示時間值 LCALL TESTKEY ;有鍵入嗎? JZ AL ;沒有鍵入則跳轉(zhuǎn)到ALARM SJMP NOAL ;有鍵入則讀入鍵碼 AL: LJMP AI NOAL: LCALL GETKEY ;有鍵入則讀入鍵碼 CJNZ A,#0AH,BKEY ;是A鍵嗎?不是則跳轉(zhuǎn)到BKEY CLR TRO ;是“A”鍵則暫停計數(shù)走秒 MOV TH0,#3CH MOV TL0,#0B0H MOV R1,#60H MOV R5,#2 LCALL SETTIME ;繼續(xù)檢測有無鍵時間修正值“02”鍵?(時十位) MOV A,60H CJNZ A,#2,NINE MOV R5,#3 SJMP THREE NINE: MOV R5,#9 THREE: LCALL SETTIME ;繼續(xù)檢測有無鍵時間修正值“03”或“09”鍵?(時個位) MOV R5,#5 LCALL SETTIME ;繼續(xù)檢測有無鍵時間修正值“05”鍵?(分十位) MOV R5,#9 LCALL SETTIME ;繼續(xù)檢測有無鍵時間修正值“05”鍵?(分個位) MOV R5,#5 LCALL STETIME ;繼續(xù)檢測有無鍵時間修正值“05”鍵?(秒十位) MOV R5,#9 LCALL SETTIME ;繼續(xù)檢測有無鍵時間修正值“05”鍵?(秒個位) MOV R5,#3 將修正值存入7072H MOV RO,#60H MOV R1,#70HHEREP: LCALL HE DJNZ R5,HEREP SETB TR0 ;恢復(fù)計數(shù)走秒 LJMP A1 BEKY:CJNE A,#0BH,AL ;不是“B”鍵則跳轉(zhuǎn)到ALARM,是“B”鍵則顯示先前設(shè)定的鬧鐘時間 MOV 60H,#0B0H MOV 61H,#10H MOV R5,#2MOV R0,#73H ;顯示先前設(shè)定的鬧鐘時間MOV R1,#62H CHAIREP: LCALL CHAI DJNZ R5,CHAIREP BEKY: LCALL STARTDISPLAYLCALL TESTKEY ;繼續(xù)檢測有無鍵入JZ BKEY1 ;沒有鍵入則繼續(xù)顯示LCALL GERTKEY ;有鍵入則讀入鍵碼CJNE A,#0BH,BKEY2 ;如果再次鍵入“B”鍵則跳過設(shè)定鬧鐘值間的程序段SJMP ENDBKEYBKEY2: CJNE A,#2,JJ1MOV 62H,ASJMP JJ3 JJ1: JNC JJ2 MOV 62H,A SJMP JJ3 JJ2: MOV R1,#62H MOV R5,#2 ;如果既不是“B”鍵又不是“02”之間的鍵,則等待鍵入“02”之間的鍵 LCALL SETTIME JJ3: MOV R1,#63HMOV A,62H ;繼續(xù)檢測是否為鬧鐘時間值“09”或“03”鍵(時個位)CJNE A,#2,NINE1MOV R5,#3SJMP THREE1 NINE1: MOV R5,#9HTHREE1: LCALL SETTIME ;繼續(xù)檢測是否為鬧鐘時間值“09”或“03”鍵?(時個位) MOV R5,#5LCALL SETTIME ;繼續(xù)檢測是否為鬧鐘時間值“05”鍵?(分十位)MOV R5,#2 ;將設(shè)定的鬧鐘時間值存入73H、74H單元MOV R0,#62HMOV R1,#73H HEREP1: LCALL HE DJNZ R5,HEREP1 BKEY3: LCALL STARTDISPLAYLCALL TESTKEY ;繼續(xù)檢測有無鍵入“B”鍵,以便結(jié)束鬧鐘時間設(shè)定JZ BKEY3LCALL GETKEYCJNE A,#0BH,BKEY3 ;不是“B”鍵則繼續(xù)顯示剛才設(shè)定的鬧鐘時間 ENDBKEY: NOP A1: MOV R2,74HCJNE R2,#ALARM ;判斷是否有鬧鐘時間MOV R2,73HCJNE R2,#0,ALARMLJMP ALARM1 A1ARM: MOV A,70HCJNE A,73H,NOA1ARM ;判斷是否到了鬧鈴時間MOV A,71HCJNE A,74H,NOA1ARMLCALL MUSICSJMP A1ARMI NOA1ARM: CLR TR1 A1ARM: LJMP REPDISP注:定時器初始化,將定時器控制寄存器TCON置為0,設(shè)置定時器方式寄存器TMON為21H(#00100001B)即定時器0為方式1,定時器1為方式2.T0作為走秒定時器,T1作為鬧鐘定時器。100Ms的計數(shù)初值為3CB0H,TH0=3CH,TL0=0B0H,將計時值存放區(qū)70H72H放入初始值0,將鬧鐘時間存放區(qū)73H74H放入初始值0 ,將計時值BCD數(shù)據(jù)存放區(qū)置初始值0,啟動定時器T0,將70H小時存放區(qū)拆成時十位和時個位送給計時值BCD數(shù)據(jù)存放區(qū),之后存入70H,將64H,65H合并后存入72H,恢復(fù)計數(shù)走秒。調(diào)用A1判斷是否有鬧鈴時間。A為鍵碼與0BH比較,判斷是否為B鍵,不是B鍵跳轉(zhuǎn)到A1,是B鍵顯示先前設(shè)定的鬧鈴時間。 5.4子程序設(shè)計5.4.1鍵盤掃描程序設(shè)計 TESTKEY: MOV DPTR,#OUTBIT MOV A,#0MOVX DPTR,A ;輸出線置為0MOV DPTR,#INMOVX A,DPTR ;讀入鍵狀態(tài)CPI AANL A,#0FH ;高四位不用RETKEYTABLE: ;數(shù)字鍵碼定義 DB 00H,01H,04H,07HDB 0FH,02H,05H,08HDB 0CH,03H,06H,09HDB 0DH,OCH,0BH,0AHDB 10H,10H,10H,10H DB 10H,10H,10H,10HGETKEY: MOV DPTR,#OUTBITMOV P2,DPHMOV R0,LOW(IN)MOV R1,#00100000BMOV R2,#6KLOOP: MOV A,R1 ;找出鍵所在列CPL AMOVX DPTR,ACPL AMOV R1,A ;下一列MOVX A,R0CPL AANL A,#0FHJNZ GOON1 ;該列有鍵入DJNZ R2,KLOOPMOV R2,#0FFH ;沒有鍵按下,返回0FFHSJMP EXITGOON1: MOV R1,A ;鍵值=列4+行MOV A,R2DCC AR1 AMOV R2,A ;R2=(R2-1)4MOV A,R1 ;R1中為讀入的行值MOV R1,#4LOOPC:RRC A ;移位找出所在行JC EXITINC R2 ;R2=R2+行值DJNZ R1,LOOPCEXIT: MOV A,R2 ;取出鍵碼MOV DPTR,#KEYTABLEMOVC A,A+DPTRMOV R2,AWAITRELEASE: MOV DPTR,#OUTBIT ;等鍵釋放 CLR A MOVX DPTR,AMOV R6,#10CALL DELAYCALL TESTKEYJNZ WAITREICASCMOV A,R2RET5.4.2 時鐘計時程序設(shè)計TORUN:DJNZ R4,BACKPUSH ACCPUSH 01HPUSH 00HSEC: MOV A,72HADD A,#1CJNE A,#5AH,SEC1MOV 72H,#0MOV 65H,#0SJMP MINSEC: CLR CDA AMOV 72H,AMOV R0,#72HMOV R1,#65HLCALL CHAI1SJMP BACK1MIN: MOV A,72HADD A,#1CJNE A,#5AH,MIN1MOV 71H,#0MOV 63H,#0MOV 62H,#0SJMP HOURMIN1: CLR CDA AMOV 71H,AMOV R0,#71HMOV R1,#63HLCALL CHAI1SJMP BACK1HOUR: MOV A,70HADD A,#1CJNE,#24H,HOUR1MOV 70H,#0MOV 61H,#0MOV 60H,#0SJMP BACK1HOUR1: CLR CDA AMOV 70H,AMOV R1,#61HLCALL CHAI1SJMP BACK1BACK1: POP 00HPOP 01HPOP ACCMOV R4,#10BACK: MOV TH0,#3CHMOV TL0,#0B0HRET5.4.3 數(shù)據(jù)轉(zhuǎn)換程序設(shè)計HE: MOV A,R0 ;合并程序SWAP A INC R0ORL A,R0MOV R1,AINC R0INC R1RET CHAI: MOV A,RO ;拆字程序,目的地址增加ANL A,#0F0HSWAP A MOV R1,AINC R1MOV A,R0ANL A,#0FHMOV R1,AINC R0INC R1RET 5.4.4 時間設(shè)置程序設(shè)計SETTIME: PUSH 01h ;設(shè)置實踐值SETTIME1: LCALL STARTDISPLAYLCALL TESTKEY ;檢測有無鍵入時間修正值JZ SETTIME1 ;沒有鍵入時間值繼續(xù)顯示LCALL GETTIME ;有鍵入則讀入鍵碼 POP 01HCJNE A,05H,J1MOV R1,ASJMP J2J1: JNC SETTIMEMOV R1,AJ2: INC R1RET 5.4.5 音樂鬧鈴程序設(shè)計 MUSIC: PUSH DPH PUSH DPLMOV TMOD,#11HMOV IE,#8AHSETB TR0LCALL STARTDISPLAYNO: MOV 30H,#00HNEXT: MOV DPTR,#FIRSTMOV A,30HMOVC A,A+DPTRMOV R2,ACJNZ A,00H,NEXT1CLR TR1POP DPLPOP DPHSETB TR0LCALL STARTDISPLAYRETNEXT: MOV A,R2ANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHMOV R5,AMOV A,R2SWAP AANL A,#0FHJNZ SINGCLR TR1SJMP D1SING: DEC ACLR CRL AMOV 22H,AMOV DPTR,#TABLEMOVC A,A+DPTRMOV THI,AMOV 21H,AMOV A,22HADD A,#1MOVC A,A+DPTRMOV TL1,AMOV 20H,A 取到低位字節(jié)MOV P1,ASETB ET1SETB TR1 啟動定時器T1D1: LCALL DELAYCLR TR1INC 30HSJMP NEXTTISEV: PUSH ACC 保護(hù)現(xiàn)場PUSH PSWCLR TR1MOV TL1,20HMOV TH1,21HCPL P1.0POP PSWPOP ACCRETDELAY1: MOV R7,#3 D2: MOV R4,#250D3: MOV R3,#50HD4: MOV R3,D30DJNZ R4,D3DJNZ R7,D2DJNZ R5,DELAYRETFIRST:DB 81H,81H,93H,83H,0B3H,0A3H,03HDB 81H,81H,93H,83H,0C3H,0B3H,03HDB 81H,81H,0F3H,0D3H,0B3H,0A3H,93HDB 0E1H,0E1H,0D3H,0B3H,0C3H,0B3H,03HDB 12H,42H,01H,41H,42H,62H,52H,01H,41HDB 52H,62H,42H,01H,41H,62H,82H,94H,01H,DB 91H,91H,82H,01H,61H,62H,42H,52H,01HDB 41H,52H,62H,42H,01H,91H,22H,12H,44HDB 01H,92H,82H,61H,62H,42H,52H,01H,41HDB 42H,92H,82H,01H,61H,62H,82H,92H,01HDB 41H,82H,01H,62H,42H,00HTABLE:DB 0F6,6FH,0F7H,24H,0F8H,1BH,0F8,8FH DB 0F9H,5EH,0FAH,17H,0FAH,6BH,0FBH,08H DB 0FBH,92H,0FCH,0EH,0FCH,4BH,0FCH,0AFH DB 0FDH,0CH,0FDH,36H,0FDH,84H,0FDH,0C9H END講解:定時器T1的中斷服務(wù)子程序。先設(shè)置定時器方式寄存器,定時器T0和T1均采用方式0.將碼表(FIRST)的首地址DPTR,將30H初值00送給A,MOVC A,A+DPTR,查表可得A為82H。判斷歌曲是否唱完一遍,若唱完則清零TR0,重新開始唱(歌曲循環(huán)播放)若歌曲未唱完則跳轉(zhuǎn)到ENXT1,將82H分割剝離,取低位02H作為節(jié)拍編碼,取高位為08H作為音符編碼,8-1=7,7*2=14給A,查表(TABLE)得相對應(yīng)的計數(shù)初值的高位和低位,并將計數(shù)初值的低高為存入20H,21H。啟動定時器T1,唱一個音,(30H)加1,跳轉(zhuǎn)到NEXT,TISEV:將ACC,PSW進(jìn)棧保護(hù)起來,從裝計數(shù)初值,對P1.0取反,出棧恢復(fù),啟動TR1,中斷返回。5.5各存儲單元的功用 DAT164(0E102H): 段控制口(接164數(shù)據(jù)位,B口地址) IN(0E103H): 鍵盤輸入口(C口地址) CLKBCD: 計時值的BCD數(shù)據(jù)存放區(qū)(60H65H) LEDBUF: 顯示緩沖區(qū)(66H6BH) 70H: 計時值的小事存放單元 71H: 計時值的分鐘存放單元 72H: 計時值的秒存放單元 73H: 鬧鐘小時存放單元 74H: 鬧鐘分鐘存放單元 5.6 調(diào)試方法 設(shè)置斷點,觀察寄存器的值,跟蹤相應(yīng)的存儲單元內(nèi)容,還可以按下F4將程序指向光標(biāo)處,不斷地按下F7 單步執(zhí)行或按下F6宏單步執(zhí)行。本設(shè)計為實時I/O試驗,因此軟件調(diào)試一般用全速斷點方式運(yùn)行。將斷點分別設(shè)在定時器中斷入口地址上,中斷處理程序結(jié)束處,主程序中。分別以全速斷點運(yùn)行方式開始運(yùn)行,若能碰上斷點,則說明程序的總體結(jié)構(gòu)是正確的。5.7 誤差分析時鐘誤差分析:啟動定時器/計數(shù)去0,使之開始計時,中斷后進(jìn)入中斷程序。自停止計數(shù)到計數(shù)又開始,中間執(zhí)行了7條指令,也就是延遲13個單周期,共用時間26us。這樣,每個中斷的總時間應(yīng)為5.026ms,而原來定時為5ms。所以,每次中斷定時多了26us,這樣,可改變計數(shù)重裝值,使每次中斷時間為4.974ms,加上執(zhí)行7條指令所用的時間,正好5ms,計數(shù)兩百次,剛好1s,這樣就可以得到較精確的計時秒數(shù),然后根據(jù)進(jìn)率,得到時分的值。第六章 總結(jié)與展望6.1 總結(jié)本次設(shè)計中,數(shù)字時鐘的秒

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論