下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片 第十六 計數(shù)器與定時—計數(shù)概念的引從選票的統(tǒng)計談起畫正這就是計數(shù)生活中計數(shù)的例子處處可見例機上的計數(shù)器家里面用的電度表汽車上的里程表等等再舉一個工業(yè)生產中的例子線纜行業(yè)在電線生產出來之后要計米也就是測量長度怎么測法呢用尺量不現(xiàn)實太長不說要一邊做一邊量呢怎么辦呢行業(yè)中有很巧妙的方法用一個周長是1米的將電纜繞在上面一周由線帶輪轉這樣輪轉一周不就是線長1米嘛所以只要記下輪轉了多少圈就可以知二計數(shù)器的容不斷落下盆的容量是有限的過一段時間之后水就會逐漸變滿機上的計數(shù)器最多只計到999那么單片機中的計數(shù)器有多大的容量呢8031單片機中有兩個計數(shù)器分別稱T0和T1這兩個計數(shù)器分別是由兩個8位的RAM單元組成的即每個計數(shù)器都是三定時打鈴器電視機定時關機空調定時開關等等那么計數(shù)器是如何作為定時器來用的呢一個鬧鐘我將它定時在個小時后鬧響換言之也可以說是秒針走了次確十分相關那么它們的關系是什么呢那就是秒針每一次走動的時間正好是結論只要計數(shù)脈沖的間隔相等則計數(shù)值就代表了時間的流逝由此單片機中的定時器和計數(shù)器是一個東西只不過計數(shù)器是記錄的外界發(fā)生的事情而定時器則是由單片機提供一個非常穩(wěn)定的計數(shù)源那么提供組定時器的是計數(shù)源是什么呢看圖 分頻后獲得的一個脈沖源晶振的頻率當然很準所以這個計數(shù)脈沖的時間間隔也很準問題一個 M的晶振它提供給計數(shù)器的脈沖時間間隔是多少呢當然這很容易就是12M/12等于1M也就是1個微秒結論計數(shù)脈沖的間隔與晶振有關12M的晶振計數(shù)脈沖的間隔是1微秒四溢出水滿了這時如果再有一滴水落下就會發(fā)生什么現(xiàn)象水會漫出來用個術語來講就是溢出水溢出是流到地上而計數(shù)器溢出后將使得TF0變?yōu)?TF0是什么我們稍后再談一旦TF0由0變成1就是產生了變化產生了變化就會事件就象定時的時間一到鬧鐘就會響一樣至于會什么事件我們下次課再介紹現(xiàn)在我們來研究另一個問題要有多少個計數(shù)脈沖才會使TF001五任意定時及計數(shù)的方法剛才已研究過計數(shù)器的容量是16位也就是最大的計數(shù)值到65536因此計數(shù)計到6553665536個計數(shù)值的要求如包裝線上一打為12瓶一瓶藥片為100粒怎么樣來滿足這個要求呢提示如果是一個空的盆要1萬滴水滴進去才會滿我在開始滴水之前就先放入一勺水還需要10000滴嘛對了我們采用預置數(shù)的方法我要計100先放進65436再來100個脈沖不就到了65536了嗎定時也是如此每個脈沖是1微秒則計滿65536個脈65.53610毫秒就可以了怎么辦1010000個微秒所以只要在計數(shù)器里面放進55536就可以了單片 第十七 定時/計數(shù)器的方式控制從上一節(jié)我們已經(jīng)得知單片機中的定時/計數(shù)器都可以有多種用途那么我怎樣才能讓它們工作于我所需要的用途呢這就要通過定時/計數(shù)器的方式控制字來設置在單片機中有兩個特殊功能寄存器與定時/TMODTCON順便說一下TMODTCON是名稱我們在寫程序時就可以直接用這個名稱來指定它們當然也可以直接用它們的地址89H88H來指定它們其實用名稱也就是直接用地址匯編軟件幫你翻譯一下而已1中我們可以看出TMOD4T1至于這里面是什么意思我們下面介紹2中我們可以看出TCON也被分成兩部份高4位用于定時/計數(shù)器低4位則用于中斷我們暫不管而TF10我們上節(jié)課已提到了當計數(shù)溢出后TF10就由0變?yōu)?原來TF10在這兒那么TR0TR1又是什么呢看上節(jié)課的圖計數(shù)脈沖要進入計數(shù)器還真不容易有層層關要通過最起碼就是TR01要為1開關才能合上脈沖才能過來因此TR0 1稱之為運行控制位可用指令SETB來置位以啟動計數(shù)器/定時器運行用指令CLR來關閉定時/定時/計數(shù)器的四種工作方式工作方式定時器/計數(shù)器的工作方式0稱之為13位定時/計數(shù)方式它由 1/0的低5位 0/1的8位構成13位的計數(shù)器此時TL1/0的高3位未用 定時/計數(shù)器一共有四種工作方式就是用M1M0來控制的2位正好是四種組合C/T前面我們 定時/計數(shù)器即可作定時用也可用計數(shù)用到底作什么用由我們根據(jù)需要自行決定也說是決定權在我們編程者如果C/T為0就是用作定時器開 如果C/T為1就是用作計數(shù)器開關往下打 順便提一下一個定時/計數(shù)器同一時刻要么作定時用要么作計數(shù)用不能同時用的這是個極普通的幾乎沒有教材會提這一點但很多初學者卻會有此困惑GATE看圖當我們選擇了定時或計數(shù)工作方式后定時/計數(shù)脈沖卻不一定能到達計數(shù)器端中間還有一個開關顯然這個開關不合上計數(shù)脈沖就沒法過去那么開關什么時候過去呢有兩種情況GATE=0分析一下邏輯GATE1進入或門或門總是輸出1和或門的另一個輸INT1TR1TR11開關就合上計數(shù)脈沖得以暢通無阻而如果TR1等于0則開關打開計數(shù)脈沖無法通過因此定時/計數(shù)是否工作只取決于TR1GATE=1在此種情況下計數(shù)脈沖通的開關不僅要由TR1來控制而且還要受到INT1TR11INT1個特性可以用來測量一個信號的高電平的寬度想想看怎么測13165148系列兼容而設的一種工作式如果你覺得用得不順手那就干脆用第二種工作方式工作方式116位的定時/計數(shù)方式將M1M001工作方式在介紹這種式方式之前先讓我們思考一個問題上一次課我們提到過任意計數(shù)及任意定時的問題比如我要計1000個數(shù)可是16位的計數(shù)器要計到65536才滿怎么辦呢我們討論后得出的辦法是用預置數(shù)先在計數(shù)器里放上64536再來1000個脈沖不就行了嗎是的但是計滿了之后我們又該怎么辦呢要知道計數(shù)總是不斷重復的流水線上計滿后馬上又要開始下一次計數(shù)下一次的計數(shù)還是1000嗎當計滿并溢出后計數(shù)器里面的值變成了0為什么可以參面課程的說明 因此下一次將要計滿65536后才會溢出這可不符合要求怎么辦當然辦法很簡單就是每次一溢出時執(zhí)行一段程序這通常是需要的要不然要溢出干嗎可以在這段程序中做把預置數(shù)64536送入計數(shù)器中的事情所以采用工作方式0或1都要在溢出后做一個重置預置數(shù)的工作做工作當然就得要時間一般來說這點時間不算什么可是有一些場合我們還是要計較的所以就有了第三種工作方式既然要自動得新裝入預置數(shù)那么預置數(shù)就得放在一個地方要不然裝什么呢那么預置數(shù)放在什么地方呢它放在T0/1的高8位那么這樣高8位不就不能參與計數(shù)了嗎是的在工作方式28位參與計數(shù)而高8位不參與計數(shù)用作預置數(shù)的存放這樣計數(shù)范圍就小多了當然做任可事總有代價的關鍵是看值不值如果我根本不需要計那么多數(shù)那么就可以用這種方式看圖4每當計數(shù)溢出就會打開T0/1的高低8位之間的開關計預置數(shù)進入低8位這是由硬件自動完成的不需要由人工干預 定時器就是為了提供一個時間基準計數(shù)溢出后不需要做事情要做的僅僅只有一件就是重新裝入預置數(shù)再開始計數(shù)而且中間不要任何延遲可見這個任務用工作方式2來完成是最工作方式/02個獨立的定時/計數(shù)器來用其中TL0可8位的定時器或計數(shù)器的工作方式而TH0則只能作為定時器來用我們知道作定時計數(shù)器來用需要控制計滿后溢出需要有溢出標記T0被分成兩個來用那就要兩套控制及溢出標記了從何而來呢TL0還是用原來的T0的標記而TH0則借用T1的標記如此T1不是無標記控制可用了嗎是的一般情況處只有在T1以工作方式2運行當波特率發(fā)生器用時才讓T0工作于方式3的定時器/計數(shù)器的定時/計數(shù)范圍013位定時/計數(shù)方式因此最多可以計到213次方也就是8192116位定時/21665536例流水線上一個包裝是12盒要求每到12來控制應當預置多大的值呢對了就是8192-以上是計數(shù)明白了這個道理定時也是一樣這面的課程已提到我們不再重復請 單片機第十八課中斷系有關中斷的概念什么是中斷我們從一個生活中的例子引入你正在家中看書突然鈴響了你放下書本去接和來的人交談然后放下回來繼續(xù)看你的書這就是生活中的“中斷”學習單片機的中斷也很有好處第一什么可經(jīng)引起中斷生活中很多事件可以引起中斷有人按了門鈴了鈴響了你的鬧鐘鬧響了你燒的水開了.等等諸如此類的事件我們把80315兩個外部中斷兩個計數(shù)/定時器中斷一個串行口中斷中斷的嵌套與優(yōu)先級處理設想一下我們正在看書鈴響了同時又有人按了門鈴你該先做那樣呢如果你正是在等一個很重要的你一般不會去理會門鈴的而反之你正在等一個重要的客人則可能就不會去理會了如果不是這兩者即不等也不是等人上門你可能會按個中斷產生的情況比如你正接有人按門鈴的情況或你正開門與人交談又有響了情況考慮一下我們會怎么辦吧中斷的響應過程當有事件產生進入中斷之前須先記住現(xiàn)在看書的第幾頁了或拿一個書簽放在當前頁的位置然后去處理不同的事情因為處理完了我們還要回來繼續(xù)看書鈴我們要到放的地方去門鈴響我們要到門那邊去也說是不同的中斷我們要在不同的地點處理而這個地點通常還是固定的計算機中也是采用的這種方法五個中斷源每個中斷的指令的地址以便處理完中斷后回到原來的地方繼續(xù)往下執(zhí)行程序具體地說中斷響應可以分為以下幾個步驟1保護斷點即保存下一將要執(zhí)行的指令的地址就是把這個地址送入堆棧2尋找中斷根據(jù)5個不同的中斷源所產生的中斷查找5個不同的地址以上工作是由計算機自動完成的與編程者無關在這5個地址處存放有中斷處理程序這是程序編寫時放在那兒的如果沒把中斷程序放在那兒就錯了中斷程序就不能被執(zhí)行到3執(zhí)行中斷處理程序4中斷返回執(zhí)行完中斷指令后就從中斷處返回到主程序繼續(xù)執(zhí)行究竟單片機是怎么樣找到中斷程序所在位置又怎么返回的呢我們稍后再
1ES
EX0EX0 0EX0 EX0 0EX0 源允許如圖所示由與中斷有關的特殊功能寄存器中斷順序查詢邏輯電路等組成包括5個中斷請求源4IEIPECONSCON斷的開關和各種中斷源的優(yōu)先級確定中斷請求源1外部中斷請求源01INT0INT1也就P3.2P3.3TCONIT0INT0式控制位可由軟件進和置位和復位IT0=0INT0為低電平觸發(fā)方式IT0=1INT0跳變觸發(fā)方式這兩種方式的差異將在以后再談IE0INT0中斷請求標志位當有外部的中斷請求時這位就會置1這由硬件來完成在CPU響應中斷后由硬件將IE0清0IT1IE1IT0IE0內部中斷請求源T0T0TF0當CPU后再由硬件將TF00TF1TF0類似TIRI串行口發(fā)送接收中斷在串口中再講解2中斷允許寄存器IE在MCS51中斷系統(tǒng)中中斷的允許或是由片內可進行8IE來控制的見下表EAXEA0則所有中斷都不允許ES串行口中斷允許ET1定1中斷允EX1外1ET0定0EX0外0中斷允許如果我們要設置允許外中斷1定時器1中斷允許其它不允許則IEEAX8CH當然我們也可以用位操作指令SETBEASETBET1SETBEX1五個中斷源的自然優(yōu)先級與中斷服務地址外中00003H定時器0000BH外中斷10013H定時器1001BH串口 級由高到低排列寫到這里大家應當明白為什么前面有一些程序一始我們這樣寫ORG0000HLJMPORG0030H這樣寫的目的就是為了讓出中斷源所占用的向量地址當然在程序中沒用中斷時直接從0000H開始寫程序在原理上并沒有錯但在實際工作中最好不這樣做優(yōu)先級單片機采用開機時每個中斷都處于低優(yōu)先級我們可以用指令對優(yōu)先級進行設置看表2中斷優(yōu)先級中由中斷優(yōu)先級寄存器IP來高置的IP1相應的中斷就是高優(yōu)先級否則就T0外中斷1設為高優(yōu)先級其它為低優(yōu)先級求IP的值IP3位沒用可任意取值設為000后面根據(jù)要求寫就可以了因此最終IP06H例在上例中如果5個中斷請求同時發(fā)生求中斷響應的次序響應次序為定時器0101串行中斷MCS51斷響1中斷響應的條講到這兒我們依然對于計算機響應中斷感到神奇我們人可以響應外界的事件是因為我們有多種“傳感器“――眼耳可以接受不同的信息計算機是如何做到這點的呢其實說穿了一點都不希奇MCS51工作時在每個機器周期中都會去查詢一下各個中斷標記 如果是1就說明有中斷請求了所以所謂中斷其實也是查詢不過是每個周期都查一下而已這要換成人來說就相當于你在看書的時候每一秒鐘都會抬起頭來看一看查問一下是不是有人按門鈴是否有 很蠢不是嗎可計算機本來就是這樣它根本沒人聰明了解了上述中斷的過程就不難解中斷響應的條件了在下列三種情況之一時CPU將對中斷的響應2現(xiàn)行的機器周期不是當前正執(zhí)行指令的最后一個周期我們知道單片機有單周期雙指令都執(zhí)行完了才能響應中斷因為中斷查詢是在每個機器周期都可能查到的3當前正執(zhí)行的指令是返回批令RETI或IPIE寄存器的指令則CPU至少再執(zhí)行一條指令才應中斷這些都是與中斷有關的如果正IPIE則可能會開關中斷或改變中斷的優(yōu)先級而中斷返回指令則說明本次中斷還沒有處理完所以都要等本指令處理結束再執(zhí)行一條指令才可以響應中斷2中斷響應過程CPU址送入堆棧然后根據(jù)中斷標記將相應的中斷地址送入PCPC是程序指針CPU取指令就根據(jù)PC中的值PC中是什么值就會到什么地方去取指令所以程序就會轉到中斷入口處繼續(xù)執(zhí)行這些工作都是由硬件來完成的不必我們去考慮這里還有個問題大家是否注意到每個中斷向量地址只間隔了8個單元如0003000B在如此少的空間中如何完LJMP指令不就可以把中斷程序跳轉到任何地方了嗎一個完整的主程序看起來應該是這樣的ORG0000HLJMPSTARTORG0003HLJMP RETI沒有用定時器0中斷在此放一條RETI萬一“不“產生了中斷也不會有太中斷程序完成后一定要執(zhí)行一條RETI指令執(zhí)行這條指令后CPU將會把堆棧中保存著的地址取出送回PC那么程序就會從主程序的中斷處繼續(xù)往下執(zhí)行了注意CPU所程序中用到了如APSW等在中斷程序中又要用它們還要保證回到主程序后這里面的數(shù)據(jù)還是沒執(zhí)行中斷以前的數(shù)據(jù)就得自己保護起來單片機第十九課定時中斷練做不很恰當為什么呢我們的主程序做了燈的閃爍就不能再干其它的事了難道單片機只能這樣工作嗎當然不是我們可以用定時器來實現(xiàn)燈的閃爍的功能1查詢方式ORG0000HAJMPSTARTORG30HMOVP1,#0FFHMOVTMOD,# MOVTH0,#15HMOVTL0,#0A0HLOOP:JBCTF0,NEXTTF01則清TF0NEXTNEXT:CPLP1.0MOVTH0,#15HMOVTL0,#9FH;重置定時/計數(shù)器的初值AJMPLOOPENDAJMPLOOP鍵入程序看到了什么燈在閃爍了這可是用定時器做的不再是主程序的循環(huán)了JBC呢TF00的溢出標記位當定時器產011后要用軟件001所以用了JBC轉移的同時還將該位清以上程序是可以實現(xiàn)燈的閃爍了可是主程序除了讓燈閃爍外還是不能做其他的事啊不不對我們可以在LOOP 和AJMPLOOP指令之間插入一些指令來做其他的事情只要保證執(zhí)行這些指令的時間少于定時時間就行了那我們在用軟件延時程序的時候不是也可以用一些指令來替代DJNZ嗎是的但是那就要求你精確計算所用指令的時間然后再減去相應的DJNZ循環(huán)次數(shù)很不方便而現(xiàn)在只要求所用指令的時間少于定時時間就行顯然要求低了當然這樣的方法還是不好所以我們常用以下的方法來實現(xiàn)2用中斷實現(xiàn)ORG0000HAJMPORG000BH0ORG30HMOVP1,#0FFHMOVTMOD,# MOVTH0,#15HMOVTL0,#0A0HSETBEASETBET00LOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHCPLP1.0MOVTH0,#15HMOVTL0,#0A0HPOPPSWPOPACC上面的例子中定時時間一到TF0由0變1就會中斷CPU將自動轉至000B處8理程序所以在000B處安排一條跳轉指令轉到實際處理中斷的程序處這樣中斷程序可以寫在任意地方也可以寫任意長度了進入定時中斷后首先要保存當前的一些狀態(tài)ACCPSW實際工作中應該根據(jù)需要將可能會改變的單元的值都推入堆棧進行保護本程序中實際不需保存護任何值這里只作個演示553660000個脈沖就是定時時間到這60000個脈沖的時間是多少呢我們的晶振是12M所以就是60000微秒即60毫秒因此速度是非??斓娜绻麑崿F(xiàn)一個1S的定時該怎么辦呢在該晶振瀕率下最長的定時也就是65536個毫秒啊上面給出一個例子ORG0000HAJMPORG000BH;定時器0的中斷向量地址ORG30HMOVP1,#0FFHMOV30H,#00HMOVTMOD,# MOVTH0,#3CHMOVTL0,#0B0HSETBEASETBET00LOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHINC30HMOVA,30HT_L1:CPLP1.0MOV30H,#0MOVMOVTL0,#9FHPOPPSW050P10而是將軟件計數(shù)器中的值加1如果軟件計數(shù)器計到了20就取反P10并清掉軟件計數(shù)器中的值否則直接返回這樣就變成了20P10因此定時時間就延長了成了20*50即1000毫秒了這個思路在工程中是非常有用的有的時候我們需要若干個定時器可51中總共才有2個怎么辦呢其實只要這幾個定時的時間有一定的公約數(shù)我們就可以用軟件定時器加P101SP112S對了我們用兩個計數(shù)器一個在它計到20時取反P10并清零就如上面所示另一個計到40P11然后清0不就行了嗎這部份的程序如下ORG0000HAJMPORG000BH;定時器0的中斷向量地址ORG30HMOVP1,#0FFHMOV30H,#00HMOVTMOD,# MOVTH0,#3CHMOVTL0,#0B0HSETBEASETBET00LOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHINCINC31HMOVT_L1:CPLP1.0;到了,取反P10MOV30H,#0MOVCPLMOVMOVTL0,#9FHPOPPSW ; B;定時/計數(shù)器0工作于方式1 則清TF0并轉NEXT ;定時器0的中斷向量地址 ; B;定時/計數(shù)器0工作于方式1 EA; ;定時器0的中斷處理程序 ;PSWACC POPPSW ;定時器0的中斷向量地址 ; B;定時/計數(shù)器0工作于方式1 EA; ;0 ;PSWACCINC POPPSW ;定時器0的中斷向量地址 ; B;定時/計數(shù)器0工作于方式1 EA; ;0 ;PSWACCINCINC31H;兩個計數(shù)器都加1 POPPSW您能用定時器的方法實現(xiàn)前面講的流水燈嗎試試看單片機第二十 定時/計數(shù)器實驗第一將計數(shù)的值顯示出來第二計數(shù)值到一定程度即中斷第一種如各種計數(shù)器里程表第二種如前面例中講到的生產線上的計數(shù)先看第一種吧我們的硬件中是這樣連線的324構成的振蕩器連到定時/1T1把問題復雜化我們用P18LED來顯示計到的數(shù)據(jù)ORG0000HORG30HMOVMOVTMOD,# SETBTR1;啟動計數(shù)器1開始運行.LOOP:MOVA,TL0MOVP1,AAJMPLOOP324T1連通(印板上有焊盤)的位置放置LM324放在左手邊LED排列是按從到低們排列看到什么隨著324后接的LED的閃爍單片機的8LED也在不斷變化注意觀察是不是按二進制這樣的順序在變呢這就對了這就是TL0中的數(shù)據(jù)ORG0000HORG001BHORGMOVTMOD,# MOVTH1,#0FFHSETBAJMP$PUSHACCPUSHMOVTH1,#0FFHPOPPSW6P10因此實驗的結果應當是LM324LED亮滅6次則P10LED亮或滅一次這實際就程序三外部中斷實驗ORG0000HORG0003H外部中斷地直AJMPINT0ORGSTART:MOVSP,#5FHMOVP3,#0FFHP3SETBEASETBEX0$PUSHACCCPLP1.0POPPSWPOPACC本程序的功能很簡單按一次按鍵1接在12引腳上的就一次中斷0取反一次0因此理論上按一下燈亮按一下燈滅但在實際做實驗時可能會發(fā)覺有時不靈按了它沒反應但在大部份時候是對的這是怎么回事呢我們在講解鍵盤時再作解釋這個程序 B;定時/計數(shù)器1作計數(shù)用,0不用全置0 ;啟動計數(shù)器1開始運行. CPLA ;B ;1開始運行$ $PUSHPUSHPSWCPLP1.0POPPSWPOPACC單片機第二十一 串行接 串行通訊:數(shù)據(jù)一位一位順序發(fā)送或接收參看下異步通訊它用一個起始位表示字符的開始用停止位表示字符的結束其每幀的格式如下在一幀格式中先是一個起始位0然后是8個數(shù)據(jù)位規(guī)定低位 在后接下來是奇偶校驗位可以省略 最后是停止位1 用這種格式表示字符則字符可以一個接一在異步通訊中CPU與外設之間必須有兩項規(guī)定即字符格式和波特率字符格式的規(guī)定01由制定但從通用方便的角度出發(fā)一般還是使用一些標準為好如采用ASCII標準波特率即數(shù)據(jù)傳送的速率其定義是每秒鐘傳送的二進制數(shù)的位數(shù)例如數(shù)據(jù)傳送的速率120字符/s10數(shù)位則傳送波特率為1200波特開始要用同步字符來指示同時要求由時鐘來實現(xiàn)發(fā)送端與接收端之間的同步故硬件較復在甲乙兩機之間的雙向傳遞稱之為雙工傳送在雙工傳送方式中又分為半雙工傳送和全雙280518051串行接口是一個可編程的全雙工串行通訊接口它可用作異步通訊方式UART與串行傳送信息的外部設備相連接或用于通過標準異步通訊協(xié)議進行全雙工的8051多機系統(tǒng)也可以通過同步方式使用TTLCMOS移位寄存器來擴充I/O口8051單片機通過引腳RXDP3.0串行數(shù)據(jù)接收端和引腳TXDP3.1串行數(shù)據(jù)發(fā)送端與外界通訊SBUF是串行口緩沖寄存器包括發(fā)送寄存器和接收寄存器它們有相同名字和地址空間但不會出現(xiàn)因為它們兩個一個只能被CPUCPU寫入串行口控制寄存器SCONSM0SM1 0010111Fosc/64111SM2多機通訊控制位在方式0時SM2一定要等于0在方式1中當SM2=1則只有接收到有效停止位時RI才置1在方式2或方式3當SM2=1且接收到的第九位數(shù)據(jù)RB8=0時RI才置1REN接收允許控制位由軟件置位以允許接收又由軟件清0來接TB8:9位在方式23中要發(fā)送的第9位數(shù)據(jù)根據(jù)需要由軟10RB8接收到的數(shù)據(jù)的第9位在方式0中不使用RB8在方式1中若SM2=023中RB89 發(fā)送中斷標志在方式0中第8位發(fā)送結束時由硬件置位在其它方式的發(fā)送停止位前由硬件置位TI置位既表示一幀結束同時也是申請中斷可根據(jù)需要用TI必須用軟件清0 接收中斷標志位在方式0當接收完第8位數(shù)據(jù)后由硬件置位在其它方式中在接收到停止位的中間時刻由硬件置位例外情況見于SM2的說明 RI置位表示一幀數(shù)據(jù)接收完畢可用查詢的方法獲知或者用中斷的方法獲知RI也必須用軟件清0 805140為移位寄存器輸入/I/O口也可以外接同步輸入/輸出設備8位串行數(shù)據(jù)者是從RXD輸入或輸出TXD用來輸出同步脈沖RXD引腳輸出TXD引腳輸出移位脈沖CPU將數(shù)據(jù)寫入發(fā)送寄存器時立即啟動發(fā)送將8位數(shù)據(jù)以fos/12的固定波特率從RXD輸出低位在后發(fā)送完一幀數(shù)據(jù)后發(fā)送中斷標志TI由硬件置位0接收時先置位允許接收控制位REN此時RXD為串行數(shù)據(jù)輸入端TXD仍為同步脈沖移位輸出端當RI=0和REN=1同時滿足時開始接收8CPUSBUF時就啟動發(fā)送串行數(shù)據(jù)從引腳輸出發(fā)送完一幀數(shù)據(jù)后就由硬件置位輸入在REN=1時串行口采樣RXD引腳當采樣到1至0的跳變時確認是開始0就開始接收一幀數(shù)據(jù)只有當RI=0且停止位為1或者SM2=0時停止位才進入RB88位數(shù)據(jù)才能進入接收寄存器并由硬件置位中斷標志RI否則信息丟失所以在方式1接收時應先用軟件清零RISM2標志11UART1109位輸出TXD119SCON寄存器的TB8位用軟件置位或復位它可作為多機通訊中地址/數(shù)據(jù)信息的標志位也可以作為數(shù)據(jù)的奇偶校驗位當CPU執(zhí)行一條數(shù)據(jù)寫入SUBF的指令時就啟動發(fā)送器發(fā)送發(fā)送一幀信息后置位中斷標志TI輸入:在REN=1時串行口采樣RXD引腳當采樣到1至0的跳變時確認是開始 就開始接收一幀數(shù)據(jù)在接收到附加的第9位數(shù)據(jù)后當RI =0或者SM2=0時第9位數(shù)據(jù)才進入RB88位數(shù)據(jù)才能進入接收寄存器并由硬件置位中斷標志RI否則信息丟失且不置位RI 再過一位時間后不管上述條件時否滿足接收電路即行復位并重新檢測RXD上從1到0的跳變311UART方式除波特率外其余與方式2相同如前所述在串行通訊中收發(fā)雙方的數(shù)據(jù)傳送率波特率要有一定的約定在8051串02的波特率是固定的而方式13的波特率是可變的由定時器T1的溢出率控制來決定可由下式表示波特率=2SMOD64foscSMOD=1SMOD=0時波特率為 T1作為波特率發(fā)生器其公式如下波特率 定時器T1溢出T1溢出率T1計數(shù)率/式中T1計數(shù)率取決于它工作在定時器狀態(tài)還是計數(shù)器狀態(tài)當工作于定時器狀態(tài)時T1計fosc/12;T1fosc/24產生溢出所需周期與定時器T1的工作方式T1的預置值有關T10溢出所需周期數(shù)=8192-xT11溢出所需周期數(shù)=65536-x定時器T1工作于方式2溢出所需周期數(shù)=256-x28位定時器/11.0592MHZ起來怪的晶振就是這個道理TH110000單片機第二十二 串行口應用編程實 的移位寄存器就可以擴展一個并行口例用8051串行口外接CD4094擴展8位并行輸出口如圖所示8位并行口的各位都接一個發(fā)光二極管要求發(fā)光管呈流水燈狀態(tài) 串行口方式0的數(shù)據(jù)傳送可采用中斷方式也可采用查詢方式無論哪種方式都要借助于TI或RI標志串行發(fā)送時可以靠TI置位發(fā)完一幀數(shù)據(jù)后引起中斷申請在中斷服務程序中發(fā)送下一幀數(shù)據(jù)或者通過查詢TI的狀態(tài)只要TI為0就繼續(xù)查詢TI為1就結束查詢發(fā)送下一幀數(shù)據(jù)在串行接收時則由RI引起中斷或對RI查詢來確定何時接收下一幀數(shù)據(jù)無論采用什么方式在開始通訊之前都要先對控制寄存器SCON進行初始化在方式0中將將00H送SCON就可以了ORG2000HMOVA,#80H;最燈先亮CLRP1.0;關閉并行輸出避象傳輸過程中LED的"暗紅"現(xiàn)象OUT0:MOVSBUF,A開始串行輸出OUT1:JNBTI,OUT1;輸出完否CLRTI;完了TISETBP1.0;打開并行口輸出ACALLDELAY延時一段時間RRA;循環(huán)右移CLRP1.0關閉并行輸出JMPOUT0;循環(huán)說明DELAYP1二異步通訊org0000HORG30HmovTMOD,#20hT1:2movPCON,#80h;SMOD=1movTH1,#0FDH;初始化波特率參見表movSCON,#50hStandardUARTsettingsMOVR0,#0AAH;準備送出的數(shù)SETBREN;允許接收SETBTR1T1開始工作CPLAMOVSBUF,AJBCTI,WAIT1TI1TIWAIT1AJMPWAITWAIT1:JBCRI,READRI1RIREADAJMPWAIT1MOVP1,AMOVR7,#0ffHDJNZR7,$將程序編譯通過寫入插入實驗板用通讀電纜將實驗板與主機的串口相連就可以實驗了上面的程序功能很簡單就是每隔一段時間向主機輪流送數(shù)55HAAH并把主機送去的數(shù)送到P1口可以在PC端用串口精靈來做實驗串口精靈在我主頁上有運行串口精靈后按主界面上的“設置參數(shù)”按鈕進入“設置參數(shù)”框按下面的參數(shù)進行設置注意我的機器上用的是串口2如果你不是串口2請自行更改串口的設置設置完后按確定返回主界面注意右邊有一個下拉列表應當選中“16進制”然后按“開始發(fā)送”“開始接收”就可以了按此設置實驗板上應當有兩只燈亮6只燈滅大家可以自行更改設置參數(shù)中的發(fā)送字符如5500FF等等觀察燈的亮滅并分析原因也可以在主界面上更改下拉列表中的“16進制”為“10進制”或“ASCII字符”細分析這對于大家理解16進制10進制ASCII字符也是很有好處的程序本身很簡單又有注釋這里就不詳加說明了三上述程序的中斷版本org0000Horg0023hAJMPSERIAL;ORG30HmovTMOD,#20hT1:2movPCON,#80h;SMOD=1movTH1,#0FDHmovSCON,#50h;StandardUARTsettingsMOVR0,#0AAH;準備送出的數(shù)SETBREN;允許接收SETBTR1T1開始工作SETBEA;開總中斷SETBES開串口中斷SJMP$MOVP1,ACLRRI單片機第二十三 LED數(shù)碼顯示器的連接與編亮度高使用電壓低 長的特點因此使用非常廣泛八段LED顯示引入還記得我們小時候玩的“火柴棒游戲”嗎幾根火柴棒組合起來可以拼成各種各樣的圖形LED顯示器實際上也是這么一個東西賀點形的發(fā)光管在顯示器的右下角作為顯示小數(shù)點用它能顯示各種數(shù)字及部份英文字母LED8LED下圖所示`共陰和共陽結構的LED顯示器各筆劃段名和安排位置是相同的當二極管導通時相應的筆劃段發(fā)亮由發(fā)亮的筆劃段組合而顯示的各種字符8個筆劃段hgfedcba對應于一個字節(jié)8位的D7D6D5D4D3D2D1D0,于是用8位二進制碼就可以表示欲顯示字符的字形代碼例如對于共陰LED顯示器當公共陰極接地為零電平而陽極hgfedcba各 時顯示器顯示"P"字符即對于共陰極LED顯示器“P”字符的字形碼是73H如果是共陽LED顯示器公共陽極接高電平顯示“P”字符的字形代碼應為 這里必須注意的是很多產品為方便接線常不按規(guī)則的方法去對應字段與位的關系這時字形碼就必須根據(jù)接線來自行設計了后面我們會給出一個例子靜態(tài)顯示接口I/O單片機只要把要顯示的字形代碼發(fā)送到接口電路就不用管它了直到要顯示新的數(shù)據(jù)時再發(fā)送新的字形碼因此使用這種方法單片機中CPU的開銷小可以提供單獨鎖存的I/O74LS164MCS-51單片機串行口方式0為移位寄存器方式外接674LS164作為6LED顯示器的靜態(tài)顯示接口把8031RXD作為數(shù)據(jù)輸出線TXD74LS164TTL單向8位移位寄存器可實現(xiàn)串行輸入并行輸出其中AB第12腳為串行數(shù)據(jù)輸入端2個引腳按邏輯與運算規(guī)律輸入信號公一個輸入信號時可并接T第8腳TXDT端時移位寄存器移一位8個時鐘脈沖過后8位二進制數(shù)全部移入74LS164中R第9腳為復位當R=0時移位寄存器各位復0只有當R=1時時鐘脈沖才起作用Q1Q8第3-6和10-13引腳并行輸出端分別接LED顯示器的hg---a各段對應的引腳上關于74LS164還可以作如下的介紹所謂時鐘脈沖端其實就是需要高低高低的脈沖不管這個脈沖是怎么來的比如我們用根電線一端接T一端用手拿著分別接高電平低電平那也是給出時鐘脈沖在74LS164獲得時鐘脈沖的瞬間再講清楚點是在脈沖的沿如果數(shù)據(jù)輸12引腳是高電平則就會有一個174LS164的內部如果數(shù)據(jù)輸入端0874LS164數(shù)據(jù)到達了最然后再來一個脈沖會有什么發(fā)生呢再來一個脈沖第一個脈沖就會從最移出就象車站排隊買票欄桿就那么長要從后面進去一個人前面必須要從前面搞清了這一點下面讓我們來看電路6片7LS164首尾相串而時鐘端則接在一起這樣當輸入8個脈沖時從單片機RXD端輸出的數(shù)據(jù)就進入到了第一片74LS164中了而當?shù)诙€8個脈沖到來后這個數(shù)據(jù)就進入了第二片74LS164而新的數(shù)據(jù)則進入了第一片74LS164這樣當?shù)诹鶄€8個脈沖完成后首次送出的數(shù)據(jù)被送到了最左面的164中其他數(shù)據(jù)依次出現(xiàn)在第一二三四五片74LS164中有個問題在第一個脈沖到來時除了第一片74LS164中接收數(shù)據(jù)外其他各片在干嗎呢它們也在接收數(shù)據(jù)因為它們的時鐘端都是被接在一起的可是數(shù)據(jù)還沒有送到其他各片呢它們在接收什么數(shù)據(jù)呢其實所謂數(shù)據(jù)不過是一種說法而已實際就是電平的高低當?shù)谝粋€脈沖到來時第一片164固然是從單片機接收數(shù)據(jù)了而其它各片也接到前一片的Q8上而Q8是一根電線在數(shù)字電路中它只可能有兩種狀態(tài)低電平或高電平也就是“0”和“1” 74LS164也相當于是在接收數(shù)據(jù)啊只是接收的全部是0或1而已這個問題放在這兒說明可能有朋友不屑一顧而有的朋友可能還是不清楚這實際上涉及到數(shù)的本質的問題如果不懂的請仔細思考并找一些數(shù)字電路的數(shù)理解164的工作原理再來看這個問題或者去看看我的另一篇文章初學單片機易掌握的概念務必搞懂搞懂了這一點你的級別就高過初學者可謂入門者了碼管LED0-LED56DISP:MOVSCON,#00H0MOVR1,#06H;顯示6位數(shù)MOVR0,#65H;60H-65H為顯示緩沖區(qū)MOVDPTR,#SEGTAB;字形表的地址MOVA,@R0;取最的待顯示數(shù)據(jù)MOVCA,@A+DPTRMOVSBUF,ADELAY:JNBTI,DELAYCLRTIDECR0DJNZR1,LOOP6SETTAB:DB03H9FH27H0DH99H49H41H1FH01H09H0123456789ORG0000HAJMPSTARTORG30HSTART:MOVSP,#6FHMOV65H,#0MOV64H,#1MOV63H,#2MOV62H,#3MOV61H,#4MOV60H,#5LCALLDISPSJMP$543210012345“標準”字形的對應關系并列一個表如下設為共陽型也就是相應的輸出位為0時筆如何字形表會做了吧就是這樣列個表格根據(jù)要求0亮或1亮寫出相應位的0和1就成了做個練習寫出A-F的字形碼吧表啊以新實驗板為例共陽型接線如下P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0CEHDGFAB A-F本來這里是講解顯示器的靜態(tài)接口的到此應當可算結束了但是我還想接著上面講到我們會被這些術語的相關語義所迷惑以致不能進一步認清他們的本質由此往往陷入困惑的境界只有深入地了解了74LS164的工作特性才能真正理解何謂串行的數(shù)據(jù)有的單片機第二十四 動態(tài)掃描顯示接8a-hCOMI/OCPUCOMI/O控制的所以我們就可以自行決定何時顯示哪一位了而所謂動態(tài)掃描就是指我們采用分時的方法輪流控制各個顯示器的COM端在輪流點亮掃描過程中每位顯示器的點亮時間是極為短暫的約1ms但由于人的視覺暫留現(xiàn)象及發(fā)光二極管的效應盡管實際上各位顯示器并非同時點亮但只要掃描的速度足夠快給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù)不會有閃爍感下圖所示就是我們的實驗板上的動態(tài)掃描接口由89C51P0口能灌入較大的電流1N4004PNP8550如果8550導通則相應的數(shù)碼管就可以亮而如果8550截止則對應的數(shù)碼管就不可能亮8550P2.7P2.6P27P26FIRSTEQUP2.7;第一位數(shù)碼管的位控制SECONDEQUP2.6;第二位數(shù)碼管的位控制DISPBUFFEQU5AH5AH5BHORG0000HAJMPSTARTORG30HMOVSP,#5FHMOVP1,#0FFHMOVMOVP2,#0FFH;初始化所顯示器LEDMOVDISPBUFF,#0;第一位顯示0LCALLDISPAJMPLOOPPUSHACC;ACCPUSHPSWPSWMOVA,DISPBUFFMOVDPTR,#DISPTAB;字形表首地址MOVCA,@A+DPTR;取字形碼MOVP0,AP0CLRFIRST;開第一位顯示器位口LCALLDELAY;延時1毫秒SETBFIRST;關閉第一位顯示器開始準備第二位的數(shù)據(jù)MOVA,DISPBUFF+1MOVDPTR,#DISPTABMOVCCLRSE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DSA護理中的兒科護理與護理
- 孕期乳房護理與母乳喂養(yǎng)準備
- 護理教學中的學生主體性發(fā)揮
- 九年級上冊語文期末作文押題??贾黝}范文6篇
- 第二章第三節(jié)河流第1課時
- 地址識別與反欺詐系統(tǒng)設計
- 房地產 -日內瓦辦公室2025年第三季度 Snapshot Office Geneva Q3 2025
- 城市發(fā)展戲劇影響
- 2026 年中職康復治療技術(言語治療)試題及答案
- 辦公樓網(wǎng)絡升級服務協(xié)議2025
- 2025-2026學年教科版小學科學新教材三年級上冊期末復習卷及答案
- 中投公司高級職位招聘面試技巧與求職策略
- 2026中國大唐集團資本控股有限公司高校畢業(yè)生招聘考試歷年真題匯編附答案解析
- 2025福建三明市農業(yè)科學研究院招聘專業(yè)技術人員3人筆試考試備考題庫及答案解析
- 統(tǒng)編版(部編版)小學語文四年級上冊期末測試卷( 含答案)
- 養(yǎng)老金贈予合同范本
- 2025年南網(wǎng)能源公司社會招聘(62人)考試筆試參考題庫附答案解析
- 2025年河南中原國際會展中心有限公司社會招聘44名筆試備考題庫附答案解析
- 推廣示范基地協(xié)議書
- 消防員心理健康教育課件
- 2025年服裝行業(yè)五年發(fā)展時尚產業(yè)與可持續(xù)發(fā)展報告
評論
0/150
提交評論