京卓電子嵌入式學習9單片機_第1頁
京卓電子嵌入式學習9單片機_第2頁
京卓電子嵌入式學習9單片機_第3頁
京卓電子嵌入式學習9單片機_第4頁
京卓電子嵌入式學習9單片機_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、何謂單片機一臺能夠工作的計算機要有這樣幾個部份構成:CPU(進行運算、控制、RAM(數據ROM(程序、輸入/輸出設備(例如:串行口、并行輸出口等。在個人計算機上這些部份被分成若干塊芯就稱為單片(單)機,而且有一些單片機中除了上述部份外,還集成了其它部份如A/D,D/A等。不,價格并不高,從幾元到幾十元,體積也不大,一般用40腳封裝,當然功能多一些單片機也有的生產量很大,技術也很成熟,51系列的單片機已經做了十幾年,所以價格就低了。既然如此,單片機的功能肯定不強,干嗎要學它呢?話不能這樣說,實際工作中并不是任何需要計算機的場合都要求計算機有很高以8051出來十多年,依然沒有被淘汰,還在不斷的發(fā)展中。2、MCS51單片機和、、C518051803189C51,它們之間究竟是什么關系?MCS51是指由IN公司(對了,就是大名鼎鼎的IN)生產的一系列單片機型的產品,該系列其它單片機都是在8051的基礎上進行功能的增、減、改變而來的,所以人們習慣于用8051公司將MCS51的技術給了很多其它公司,所以有很多公司在做以8051為的單片機,當然,功能公司開發(fā)生產的。以后用89C51來完成一系列的實驗。單片單片 第二課:單片機的內部、外部結構(一拿到一塊,想要使用它,首先必須要知道怎樣連線,我們用的一塊稱之為89C51的,下面我們就看一18、19131中畫法連好,至于復位是何含義及為何需要復要復位,在單片機功能中介紹。4、EA引腳:EA引腳接到正電源端。至此,一個單片機就接好,通上電,單片機就開始工作了。535個,LED1腳相連。(1R1是限流電阻)1腳是高電平時,LED1腳是低電平時,LED1不能就叫它一腳吧?叫它什么名字呢?設計51的IN公司已經起好了,就叫它P1.0,這是規(guī)定,不可以寫CLRP1.0就可以了。計算機也說一聲了事吧。要解決這個問題,還得有幾步要走。第一,計算機看不懂SETBCLR之類的指令,我 子,把片子插入做好的電路板,接通電源什么?燈不亮?這就對了,因為我們寫進去的指令就是讓2P10輸出高電平,燈當然不亮,要是亮就錯了?,F在我們再撥下這塊,重新放回到編程器上,將編緝區(qū)的內(C2H,90H 三、單片機內部結構分析我們來思考一個問題,當我們在編程器中把一條指令寫進單片要內部,然后取下單片然可以保持這條指令不會丟失,這是個什么地方呢?這個地方就是單片機內部的只讀器即ROM(READ 只是一些電子元器件,怎么可以進行數算呢?我們做數學題如37+45是這樣做的,先在紙上寫37,然后在0011 011100101110我們來看,這個000,001,101不就是我們學過的的二進制數嗎?本來,燈的亮和滅只是一種物理現象,可當和0100,01,10,1103,而三根可以表達0-780-25525688位就(BYTE1234有了這么一個構造,我們就可以開始存放數據了,想要放進一個數據12,也就是,我們只要把第二號32種狀態(tài),24種狀態(tài),3根線可以代表幾種,256種狀態(tài)又需要幾根線代表?8種,8根線,所以為數據總線,總線英文名為BUS,總即車道,誰者可以走。而十六根地址線也是連在一起的,稱之為地址類似于我們的書本,發(fā)到我們手回之后,我們只能讀里面的內容,不可以隨意更改書本上的內容。只讀存儲器的英文縮寫為ROM(READONLYMEMORY)以用黑板擦擦掉重寫。隨機器的英文縮寫為RAM(READRANDOMMEMORY)這兩種器的英文縮寫EPROM,稱之為紫外線擦除的可編程只讀器。它里面的內容寫上去之后,如果覺得不滿意,可以用一種特多了,也就不靈光了,所以這種可以擦除的次數也是有限的——幾百次吧。FLASH,稱之為閃速器,它和EPROM類似,寫上去的東西也可以擦掉重寫,但它要方便一些,不需要光 SETBP10CLRP10……SETBP10后,延時一段時間(幾秒或零點幾以下先給出程序(后面括號中的數字是為了便于講解而寫的,實際不用輸入LOOP:SETB(1)(2)CLR(3)(4)(5)(6)D1:MOV(7)D2:DJNZ(8)DJNZ(9)(10)(11)是轉去執(zhí)行第一條指令。第二和第四條實現的原理稍后談,先看第五條,LJMP是一條指令,意思是轉移,往什LOOP被稱之為標號,它的LOOP呢?當然不是,起什么名字,完全由編程序的人決定,可以稱它為A,X等等,當然,這時,第五條指令LJMP后面的名字也得跟著改了。第二條和第四條指令的用途是延時,它是怎樣實現的呢?指令的形式是LCALL,這條指令稱為調用子程序LCALLLCALL后面的標號所標定的程序處執(zhí)行,如果RETLCALL指令的下面的一條指令繼續(xù)執(zhí)行,從第六行開始9條指令后將遇到第10條令:RET,執(zhí)行該條指令后,程序將回來執(zhí)行第三條指令,即將P10,使燈亮,6,7,8,9,105條指令,第5條指令就是讓程序回到第1條開始執(zhí)行,如此周而復始,燈就在不斷地亮、滅了。DELAYRET這一行中的所有程序,這是一段延時程序,大概延時零點幾秒,至于 單片機內部結構分析:為了知道延時程序是如何工作的,需首先了解延時程序中出現的一些符號,就從算690 結果,我們又不得不先算出690,并記下來,這其實是一個中間結果,計算機中做運算和這個類似,為了要得到ROM中可以嗎?顯然不行,因為計算機要將結果寫進去,而ROM是不可以寫的,所以在單片機中另有一個區(qū)將RAM中分出一塊區(qū)域,稱為工作寄存器區(qū) DELAYDELAY:MOVR7,#250 D1:MOVR6,#250 (7)D2:DJNZR6,D2 (8)DJNZR7,D1 (9) (10)MOVR6,#250是什么意思,應當不用分析了吧。D2是什么。D2在本行的前面,我們已學過,這稱之為標號。標號的用途是什么呢?就是給本行起一個名字。DJNZ1,然后看一下,這個000,就轉移,轉到什么地方去呢?可能大家已猜到了,轉是,在原地轉圈250次。話將被執(zhí)行250*250=62500次,執(zhí)行這么多次同一條指令干嗎?就是為了延時。是指執(zhí)行一條指令的時間。IN125要點分析:1255。2、如何分配兩個數。還沒有開始執(zhí)行,是在做準備工作。顯然,準備工作不需要太長的時間,復位只需要5ms的時間就可以了。如RST5ms。為了達到RST引腳上為高電平,然后電源通過電阻對電容充電,RST端電壓慢慢下降,降到一定程序,即為低電平,單片機開始正常工作。單片單片 P10P11��P17LED相連,下面讓我們來做一MAIN:MOVP1,#0FFHLCALLDELAYMOVP1,#00HLCALLDELAYLJMPMAIND1:MOVR6,#250D2:DJNZR6,D2DJNZR7,D1P10��P17P32個引腳都是可以點亮燈的,也就是說:這32個引腳都可以作為輸出使用,如果不用來點亮LED,可以用來控制繼電器,可以用來控制其它的執(zhí)行機構。#0FFH,第三句:原來是CLRP1.0,現在改為MOVP1.0,#00H。從中可以看出,P1P1.0��P1.7的全P1MOV指令。為什么用這條MAIN:MOVP3,#0FFHLOOP:MOVA,P3MOVP1,AP3MOVA,P3MOV已經見,是送數的意思,這條指令的意思就3P12P12P1P3口AP1P3P12位輸出電平的。P3P32位的按鈕根數據總線是出自于CPU,讓我們回想一下,數據總線是一根大家公用的線,很多的器件和它連在一起,在不為要先做這么一個準備工作,所以我們稱之為“準雙向I/O口”。P1口的一位的結構,P1口其它各位的結構與之相同,而其它三個口:P0、P2、P3則除入作為輸入輸出口之外還有,所以結構要稍復雜一些,但其用于輸入、輸出的結構是相同的。看圖(。對我們來說,單片單片 第七課:單片機內部結構分析(五在一個51單片機的內部包含了這么多的東西。那么對于定時/計數器,串行I/O口等怎么用呢?在單片機中有一些獨立的單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR。事實上,我們已接觸過P1這個特殊功能寄存器了,還有哪些呢?看表1BB數據地址指針(8位數據地址指針(8位ACCA表示。這是個什么東西,可不能從名字上理解,它是一個寄存器,而不是一個做加法ACC中的緣故吧。它的名字特殊,也特殊,稍后學到指令,可以發(fā)現,所有的運算類指令都離不開它。PCY:進位標志。80518位的運算器,我們知道,80-255,如果做加法的話,兩數相加可能會超過255,這樣最就會丟失,造成運算的錯誤,怎么辦?最就進到這里來。 0。 DPL:?27H28H、29H了。所以利用堆棧這種方法來放數據可以簡化操作?51這個問題?分不好干脆就不分了,把分的權利給用戶(編程者51單片機中堆棧27H51機中,開始指針所指的位置并非就是數據存放的位置,而是數據存放的前一27H28H27H單元,為什么會單片機第八課(尋址方式與指令系統單片機第八課(尋址方式與指令系統指令,我們已學了幾條指令,但很零散,從現在開始,要系統地學習8051的指令部份。是為難我們人了,太難記了,于是有另一種格式,助記符格式,如MOVP1,#0FFH,這樣就好記了。這兩種格讓我們先來復下我們學過的一些指令:MOVP1,#0FFH,MOVR7,#0FFH這些指令都是將一些數據送到相應要工作,一共有28條指令(單片機共111條指令)。下面我們就從數據傳遞類指令開始吧。MAIN:SETB LCALLDELAYCLR LCALL AJMP

DELAY:MOVR7,#250 D1:MOVR6,#250 D2:DJNZR6,D2 DJNZ MAIN:SETB MOV30H,#255LCALLDELAY;CLR MOVLCALL AJMP DELAY:MOVR7,30H D1:MOVR6,#250 D2:DJNZR6,D2 DJNZ 這樣一來,次調用延時程序延時的時間都是相同的(大致都是0.13S),如果我提出這樣的要求:燈亮后并不固定,而是根據30H單元中傳過來的數確定。這樣就可以滿足要求。作寄存器中,從工作寄存器中尋找數據,則稱之為寄存器尋址。例:MOVA,R0R0R0RAM00H,MOVA,00H,MOVA,R0這么斤斤計較!不就差了一個周期嗎,如果是12M的晶振的話,也就1個微秒時間了,一個字節(jié)又能有多少?不對,如果這條指令只執(zhí)行一次,也許無所謂,但一條指令如果執(zhí)行上1000次,就是1毫秒,如果要執(zhí)行 值加1,還是執(zhí)行同一條指令,可是取數的對象卻不一樣了,不是嗎。通過例子來說明吧。MOVMOVR0,#30HLOOP:MOVA,@R0INCDJNZ0,2030H20A用R0或R1存放等尋找的數據。 1)MOVMOVA,directMOVA,@RiMOVA,#data才講過的。第四條指令是將立即數data送到A中。2)以寄存器Rn為目的操作的指令MOVMOVRn,directMOVRn,#dataMOVdirect,AMOV20H,AMOVdirect,RnMOV20H,R1MOVdirect1,direct2MOV20H,30HMOVdirect,@RiMOV20H,@R1MOVdirect,#dataMOV20H,#34HMOV@Ri,A:MOV@R0,AMOV@Ri,directMOV@R1,20HMOV@Ri,#dataMOV@R0,#34HMOVDPTR,#data168051816下面兩條指令:MOVDPH,#35H,MOVDPL,#12H。則就相當于執(zhí)行了MOVDPTR,#3512H。綜合練習:MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,#22HMOVR1,12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0DOSWAVE1個文件,如果不存在這個文件,則新建一個文件(見圖3)邊的工作寄存器及A累加器中的值的變化。DATA“一段”的所示的內存20H、21H、22H、23H中的值分別是FBH、0EH、E8H、30H。56CTRL+F2也可以菜單進行。CTRL+F2是程序復位,用RUN菜單。窗口用WINDOWS菜單。本頁較多,如果大家受它的等待,請 MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVXRAMARAM的區(qū)別了,內部送入另一個單元(0200H單元0100HA0200H單元中去。RAMRAMDPTR中的。而的數量比較少,少于或等于256個,就只需要提供8位地址就夠了。例:將外部RAM100H單元中的內容送入外部RAM200H單元中。MOVDPTR,#0100HMOVXA,@DPTRMOVDPTR,#0200HMOVX@DPTR,AMOVCA,@A+DPTRROMA中。本指令也被稱為查表指令,常用此指令來查一個已做好在ROM中的表格說明:令時,將A和DPTR中的數加起為,就成為要查找的單元的地址。R0中,要求用查表的方法確定它的平方值(0-5)MOVDPTR,#TABLEMOVCA,@A+DPTR也就是到這個單元中去取數,取到的是4,顯然它正是2的平方。其它數據也可以類推。地址。事實上,CPU正是通過這個地址才找到這段程序的。MOVDPTR,#100HMOVA,R0ORG0100H.DBR02100H為H102H4。這個可以看懂了吧?機��指PC機去做了。POPdirect以SP中的值為地址的RAM單元中。例:MOVA,#100MOVB,#20PUSHACCPUSHBB中的值送入到61H單元中,即執(zhí)行完本條指令后,61H單元中的值變?yōu)?0。然后SP減1。POPB中的值是100。這有什么意義呢?ACC100,B20,是的,在本例中,的確沒有意義,但在實PUSHBA中的值,B中的值改掉,所以在程序的結束,如果我們要把A和B中的值恢復原值,那么這些指令就有意義了。BMOVA,60H,MOVB,61HPOP指令,不是也一樣嗎?是的,從結果上看是一樣的,MOV30H,#12MOV31H,#23PUSH30HPUSH31H ADDA,direct例:ADDA,10HADDA,Rn;例:ADDA,R7例:MOVA,#30HMOV34H,#10HMOVR0,#13HMOVA,34HADDA,R0MOVR1,#34HADDA,@R1ADDCA,@Ri達的數的范圍就可以達到0-65535。如何合并呢?其實很簡單,讓我們看一個10進制數的例子:66+786+8(低位6+7,這是9168位的,如果兩數相加產生了進位,也要“點一下”做個標記,這個標記就是進位位C,在PSW中。在進行加法是將這個C加進去。例:1067H+10A0H,先做67H+A0H=107H,于是100H。然后再做10H+10H+CY,結果是21H,所以最終的結果是2107H。SUBBA,@RiH(R2)=55H,CY=1說明:沒有不帶借位的減法指令,如果需要做不帶位的減法指令(在做第一次相減時只要將CY即可。為0,而CY總是0。()=4EH(DH那么0V=1。1指令INCAINCRnINCdirectINC@RiINCDPTR(=2H(R0=3H(2H=3H(3H=2HDPR=1234HINCA(A)=13HINCR2(R0)=34HINC21H(21H)=33HINC@R0INCDPTR(INCAPSW位,如(A)=0FFH,INCA后(A)=00HCY依然保持不變。如果地址增加等用途。另外,加法類指令都是以A為的��其中一個數必須放在A中,而運算結果也必須放在A中,而加1類指令的對象則廣泛得多,可以是寄存器、內存地址、間址尋址的地址等等。11指令DECADECRNDECdirectDEC@RiMOVA,#12HMOVR0,#24HMOV21H,#56HADDA,#12HMOVDPTR,#4316HADDA,DPHCLRCSUBBA,DPLINCAINCR0SUBBA,R0MOV24H,#16HCLRC 73H化為二進制為 逐位取反即 ,RLCA,是將(A)中的值帶上進位位(C)進行移位。例:A68H,C1,RLCA 后,結果是0 RRA和RRCA就不多談了,請大家參考上面兩個例子自行練習吧。 CPLRLCLRRRCASETBCRLCASWAPAORG0000HLJMPSTARTORG30HMOVSP,#5FHMOVA,#80HMOVP1,ARLALCALLDELAYLJMPLOOPmovr7,#255d1:movr6,#255d2:nopdjnzr6,d2djnzr7,d1先讓程序寫入片中,裝進實驗板,看一看現象。 是0,兩個同是1,結果才是1。MOVA,#45H;(A)=45HMOVR1,#25H;(R1)=25HMOV25H,#79H;(25H)=79HANLA,@R1;45H79HA41H(A)=41HMOVA,#24HMOVR0,#37HORLA,R0XRLA,#29HMOV35H,#10HORL35H,#29HMOVR0,#35HANLA,@R0AJMPaddr11LJMPaddr16SJMPrel是跳轉到一個標號處。事實上,LJMP標號,面的例程中我們已接觸過,并且也知道如何來使用了。而AJMPJMPMOVA,R0;從R0中取數(詳見下面說明)MOVB,#2JMPA,@A+DPTR;跳轉TAB:AJMPS1AJMPS2AJMPMOVDPTR,#TAB,DPTRTAB,第二句此,執(zhí)行此句程序后,將會跳到TAB+2這個地址繼續(xù)執(zhí)行??匆豢丛赥AB+2這個地址里面放的是什么?就是AJMPS2AJMPS2S2什么取得鍵值后要乘2?如果例程下面的所有指令換成LJMP,即:LJMPS1,LJMPS2…判A內容是否為0轉移指令JZrelJNZrel理解:JZ標號。即轉移到標號處。下面舉一例說明:JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFHL2:SJMPL2R00MOVR1,#00HR1中的值等于A0,就轉移。把上面的那個例子中的JZ改成JNZ試試吧,看看程序執(zhí)行的結果是什么?CJNEA,#data,relCJNEA,direct,relCJNEAdata比較,如果兩者相等,就順序執(zhí)行(執(zhí)行本指令的下一條指令rel理解成標號,即:CJNEA,#data,標號。這樣利用這條指令,我數比data大還是小了。MOVA,R0CJNEA,#10H,L1MOVR1,#0FFHAJMPL3L1:JCAJMPL3L2:MOVR1,#0FFHL3:SJMPL3A當中的值和直接地址中的值比較,第三條則是將直接地;CJNE10H,#35H10H35HCJNE@R0,#35HR035H比較DJNZRn,relDJNZdirect,relDJNZ10道算術題,經過觀察,每一道題中都調用子程序了嗎?那可就沒完沒了了……。參考圖1LCALLaddr16長調用指令; ret指令 就顯示有些麻煩,所以在8031單片機中特意引入一個位處理機制。MCS-51單片機的硬件結構中,有一個位處理器(又稱布爾處理器),它有一套位變量處理的指令集。在進行位這16個字節(jié)單元即128個位單元,還有自已的位I/O空 間(即 用的RAM,及端口是完全相同的,或者說這些RAM及端口都可以有兩種用法。MOVC,BITMOV是多少啦)CLRCCLRbit0。例:CLRP1.0P1.0SETBCSETBbit1。例:SETBP1.0P.0例:CPLP1.0例:ANLORG0000HAJMPSTARTORG30HSTART:MOVSP,#5FHMOVP1,#0FFHSETBANLORLC,bitORLC,/bitJCrelJNCrel樣理解:JC標號,如果等于1就轉到標號處執(zhí)行。這條指令我們在上節(jié)課中已講到,不再重復。JBbit,relJNBbit,relORG0000HLJMPSTARTORG30HSTART:MOVSP,#5FHMOVP1,#0FFHMOVJNBP3.3,L3;P3.3上接有一只按鍵,它按下時,P3.3=0LJMPL1L2:MOVP1,#00HLJMPL1L3:MOVP1,#0FFHLJMPL1再轉去L1,如此循環(huán)不已。 二、計數器的容量從一個生活中的例子看起:一個水盆在水龍頭下,水龍沒關緊,水一滴滴地滴入盆中。水滴片機中的計數器有多大的容量呢?8031T0T1,這兩個計數器分別是由8RAM單元組成的,即每個計數器都是16位的計數器,最大的計數量是65536。是秒針每一次走動的時間正好是1秒。112分頻后獲得的一個脈沖源。晶振的頻率當然很12M/121M1個微秒。結論:計數脈沖的間隔與晶振有關,12M的晶振,計數脈沖的間隔是1微秒。我們下次課再介紹,現在我們來研究另一個問題:要有多少個計數脈沖才會使TF0由0變?yōu)?。1665536,因此計101000055536單片單片 在單片機中有兩個特殊功能寄存器與定時/TMODTCON。順便說一下,TMODTCON89H88H來指定出,TMOD被分成兩部份,每部份4位。分別用于控制T1T0,至于這里面是什么意思,我們下面介紹。出,TCON4位用于定時/4位則用于中斷(我們暫不管TF1(0)我們上TR0(1)1,開關才能合上,脈沖才工作方式0極普通的,幾乎沒有會提這一點,但很多初學者卻會有此困惑。TR1TR11,開關就合上,計數脈沖得以暢通無阻,而如果TR1等于0則開關打開,計數脈沖無法通過,因此定時/計數是否工作,只取決于TR1。TR11INT1引腳也是高電平,開關才合上,計數脈沖才得以通過。這個特性可以用來測量一個信號的高13165148系列兼容而設的一種工作式,645361000個脈沖,不就行了嗎?是的,但是計滿了之后我們又該怎么辦呢?要知道,計數總是1000嗎?當計滿并溢出后,計數器里面的值變成了0(為什么,可以參面課程的說明因此下一次將要計滿65536后才會溢出,這可不符合之間的開關,計預置數進入低8位。這是由硬件自動完成的,不需要由人工干預。通常這種式作方式用于波特率發(fā)生器(在串行接口中講解,用于這種用途時,定時器就是為了提供一個任何延遲,可見這個任務用工作方式2來完成是最妙不過了。這種式作方式之下,定時/02個獨立的定時/計數器來用。其中,TL08位的定時器或計數器的工作方式,而TH0則只能作為定時器來用。我們知道作定時、計數器來用,需要控制,計滿后溢出需要TH0則借用T1的標記。如此T1不是無標記、控制可用了嗎?是的。的值呢?對了,就是8192-12=8180。 口,根據5個不同的中斷源所產生的中斷,查找5個不同的地址。以上工作是由計算如圖(抱歉,本圖請找本51書看一下)所示,由與中斷有關的特殊功能寄存器、中斷、順序查詢邏輯電路在以后再談。IE0:INT01(這由硬件來完成)CPU的允許或是由片內可進行位尋址的8位中斷允許寄存器IE來控制的。見下表EAX中斷允許,其它不允許,則IE可以是EAXSETBET1SETBEX1ORG0000HLJMPSTARTORG0030HSTART:器IP來高置的,IP中某位設為1,相應的中斷就是高優(yōu)先級,否則就是低優(yōu)先級。值,設為000,后面根據要求寫就可以了XX定時器0->外中斷1->外中斷0->實時器1->串行中斷。 些都是與中斷有關的,如果正IP、IE則可能會開、關中斷或改變中斷的優(yōu)先級,而中斷返回指令則說明本2CPU(就是中斷返回后將要執(zhí)行的指令)的地址送80003-000B,在如LJMPORG0000HLJMPSTARTORG0003HLJMPINT00ORG1:查詢方式ORG0000HAJMPSTARTORG30HMOVP1,#0FFHMOVTMOD,# MOVTH0,#15HMOVTL0,#0A0HNEXT:CPLP1.0MOVTH0,#15HMOVTL0,#9FH;重置定時/計數器的初值AJMPLOOPENDAJMPLOOP指令,該指位在判1轉移的同時,還將該位清0。ORG0000HAJMPORG000BH;定時器0的中斷向量地址AJMPTIME0ORG30HMOVP1,#0FFHMOVTMOD,# MOVTH0,#15HMOVTL0,#0A0HSETBEALOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHCPLP1.0MOVTH0,#15HMOVTL0,#0A0HPOPPSWPOPACC1S65。536ORG0000HAJMPORG000BH;定時器0的中斷向量地址AJMPTIME0ORG30HMOVP1,#0FFHMOV30H,#00HMOVTMOD,# MOVTH0,#3CHMOVTL0,#0B0HSETBEALOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHINC30HMOVA,30HT_L1:CPLP1.0;到了,取反P10MOV30H,#0MOVMOVTL0,#9FHPOPPSWPOPACC0因此定時時間就延長了成了20*50即1000毫秒了。零,就如上面所示,另一個計到40取反P11,然后清0,不就行了嗎?這部份的程序如下ORG0000HAJMPORG000BH;定時器0的中斷向量地址AJMPTIME0ORG30HMOVP1,#0FFHMOV30H,#00HMOVTMOD,# MOVTH0,#3CHMOVTL0,#0B0HSETBEALOOP:AJMPLOOPTIME0:;定時器0的中斷處理程序PUSHINCMOVA,30HT_L1:CPLP1.0;到了,取反P10MOV30H,#0MOVCPLMOV31H,#0P11,清計數器,返回MOVMOVTL0,#9FHPOPPSWPOPACC單片 程序一代碼程序二代碼程序三代碼程序四代碼單片 為了避免把問題復雜化,我們用P1口的8LED來顯示計到的數據。ORG0000HORG30HMOVTMOD,# SETBTR1;啟動計數器1開始運行.MOVP1,A324T1連通(印板上有焊盤)運行這種程序,注意將板按正確的位置放置(LM324放在ORG0000HORG001BHORGMOVTMOD,# MOVTH1,#0FFH;AJMP$MOVTH1,#0FFHPOPPSWORG0000HORG0003H外部中斷地直AJMPINT0ORGSTART:MOVSP,#5FHSETBEASETBEX0$CPLP1.0POPPSWPOPACC 并行通訊:數據的各位同時發(fā)送或接收。串行通訊:省略1。用這種格式表示字符,則字符可以一個接一個地傳送。般還是使用一些標準為好,如采用ASCII標準。UART位寄存器來擴充I/O口。兩個一個只能被CPU讀出數據,一個只能被CPU寫入數據。串行口控制寄存器SCON0010111111SM20時,SM201中,當(SM2)=1則只有接收到有效停止位時,RI123當(SM2)=1RB8=0時,RI1。23中,RB89TI置位既表示一幀結束,同時也是申請中斷,可根據需要,用軟件查詢的方法獲得數據已發(fā)送完畢的信息,或用中斷的方式來發(fā)送下一個數據。TI必須用軟件清0。間時刻由硬件置位(SM2的說明。RI置位表示一幀數據接收完畢,可用查詢的方法獲知或者用中斷的方法獲知。RI也必須用軟件清0。PCON是為了在OS的80C51單片機上實現電源控制而附加的。其中最是SMOD。0為移位寄存器輸入/I/O口,也可以外接同步輸入/輸出設備。8位串行數據者是從RXD輸入或輸出,TXD用來輸出同步脈沖。RXD引腳輸出,TXD引腳輸出移位脈沖。CPU將數據寫入發(fā)送寄存器時,立即啟動發(fā)送,將0REN。此時,RXD為串行數據輸入端,TXD仍為同步脈沖移位輸出端。當(RI)=0和(REN)=18位數據時,將數據移入接收寄存器,并由硬件置位RI。止位1。CPUSBUFTXD引腳輸出,發(fā)送完一幀數據后,就由硬件置位TI。(REN)=1RXD100,就開始接收一幀數據。只有當(RI)=01或者(SM2)=0RB8,8位數據才能進入接收寄存器,并由硬件置位中斷標志RI;否則信息丟失。所以在方式1接收時,應先用軟件RI和SM2標志。輸出TXD119SCONTB8位,用軟件置寫入SUBF的指令時,就啟動發(fā)送器發(fā)送。發(fā)送一幀信息后,置位中斷標志TI。輸入在(REN)=1RXD100,就開始接收一幀9位數據后,當(RI)=0或者(SM2)=09RB8,8位數據才能否滿足,接收電路即行復位,并重新檢測RXD上從10的跳變。方式2特率為1/64fosc波特率 定時器T1溢出T1溢出率T1計數率/T1計數率取決于它工作在定時器狀態(tài)還是計數器狀態(tài)。當工作于定時器狀態(tài)時,T1fosc/12;當工作于計數器狀態(tài)時,T1fosc/24T1的工作方式、T1的預置值有關。T10:溢出所需周期數=8192-x定時器T1工作于方式2:溢出所需周期數=256-x10000 8051CD40948位并行輸出口,如圖所示,8位并行口的各位都接一個發(fā)光二極管,要0的數據傳送可采用中斷方式,也可采用查詢方式,無論哪種方式,都要TIRITI置位(發(fā)完一幀數據后)引起中斷申請,在中斷服務程序中發(fā)送先對控制寄存器SCON進行初始化。在方式0中將,將00HSCON就可以了。ORGMOVA,#80H;最燈先亮OUT1:JNBTI,OUT1;輸出完否SETBP1.0;打開并行口輸出RRA;循環(huán)右移CLRP1.0關閉并行輸出JMPOUT0;循環(huán)org0000HORG30HmovTMOD,#20hT1:2movPCON,#80h;SMOD=1movTH1,#0FDH初始化波特率(參見表)movSCON,#50h;StandardUARTsettingsMOVR0,#0AAH;準備送出的數SETBREN;允許接收SETBTR1T1開始工作MOVA,R0CPLAMOVR0,AMOVSBUF,AAJMPWAITAJMPWAIT1MOVP1,AMOVR7,#0ffHDJNZR7,$精靈來做實驗。串口精靈在我主頁上有。運行串口精靈后,按主界面上的“設置參數”按鈕進入“設置參數”對設置完后,按確定返回主界面,注意右邊有一個下拉列表,應當選中“16進制”。然后按“開始發(fā)送”、“開始接ASCII字符”16進制、10進制、ASCII字符也是很有好處的。程序本org0000Horg0023hORG30HmovTMOD,#20hT1:2movPCON,#80h;SMOD=1movTH1,#0FDH初始化波特率(參見表)movSCON,#50h;StandardUARTsettingsMOVR0,#0AAH;準備送出的數SETBREN;允許接收SETBTR1T1開始工作SETBEA;開總中斷SETBES開串口中斷SJMP$MOVP1,ACLRRI單片單片 LED引入:還記得我們小時候玩的“火柴棒游戲”嗎,幾根火柴棒組合起來,可以拼成各種各樣的圖形,LED稱之為共陰極LED顯示器。如下圖所示。`劃段組合而顯示的各種字符。8個筆劃段hgfedcba對應于一個字節(jié)(8位)的D7D6D5D4D3D2D1D0,于是極hgfedcba各段為 是共陽LED顯示器,公共陽極接高電平,顯示“P”字符的字形代碼應為 A、B(1、2)為串行數據輸入端,274LS16474LS16486DISP:MOVSCON,#00H0MOVR1,#06H;顯示6位數MOVR0,#65H;60H-65H為顯示緩沖區(qū)MOVDPTR,#SEGTAB;字形表的地址MOVA,@R0;取最的待顯示數據MOVCA,@A+DPTR;查表獲取字形碼MOVSBUF,A;送串口顯示DELAY:JNBTI,DELAYCLRTIDJNZR1,LOOP;直到6個數據全顯示完。DB03H9FH27H0DH99H49H41H1FH01H09H0FFH0123456789ORG0000HAJMPSTARTORG30HSTART:MOVSP,#6FHMOV65H,#0MOV64H,#1MOV63H,#2MOV62H,#3MOVMOV60H,#5LCALLDISPSJMP$表如下(設為共陽型,也就是相應的輸出位為0時筆)寫出A-F的字形碼吧。P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0CEHDGFAB 何謂串行的數據。有的朋友還可以再看看我上“其他資料”中的“銀行利率屏的設計 89C51P0FIRSTEQUP2.7;第一位數碼管的位控制SECONDEQUP2.6;第二位數碼管的位控制DISPBUFFEQU5AH5AH5BHORG0000HAJMPSTARTORG30HMOVSP,#5FHMOVP1,#0FFHMOVMOVP2,#0FFH;初始化,所顯示器,LEDMOVDISPBUFF,#0;第一位顯示0LCALLDISPAJMPLOOPPUSHACCACCPUSHPSW;PSWMOVA,DISPBUFFMOVDPTR,#DISPTAB;字形表首地址MOVCA,@A+DPTR;取字形碼CLRFIRST;開第一位顯示器位口LCALLDELAY;延時1毫秒SETBFIRST(開始準備第二位的數據)MOVA,DISPBUFF+1;取顯示緩沖區(qū)的第二位MOVDPTR,#DISPTABMOVCA,@A+DPTRCLRSECOND;開第二位顯示器LCALLDELAY;延時SETBSECONDPOPPSWPOPACCPUSHPSWSETBRS0MOVR7,#50D1:MOVR6,#10D2:DJNZR6,$DJNZPOPPSWDISPTAB:DB28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60HCounterEQU59HFIRSTEQUP2.7;第一位數碼管的位控制SECONDEQUP2.6;第二位數碼管的位控制DISPBUFFEQU5AH5AH5BHORG0000HAJMPORG000BHT0AJMPDISPORG30HMOVSP,#5FHMOVP1,#0FFHMOVMOVP2,#0FFH;初始化,所顯示器,LEDMOV MOVTH0,#HIGH(65536-2000)MOVTL0,#LOW(65536-2000)SETBTR0SETBEASETBMOVCounter,#0MOVA,#0INCALCALLDELAYCJNEA,#10,LOOPMOVA,#0AJMPLOOPPUSHACC;ACCPUSHPSW;PSWMOVTL0,#LOW(65536-2000)SETBFIRSTSETBSECONDMOVA,#DISPBUFFADDA,CounterMOVMOVA,@R0MOVDPTR,#DISPTAB;字形表首地址MOVCA,@A+DPTRMOVA,CounterCLRSECONDAJMPDISPNEXTCLRFIRSTMOVA,CounterDECAJZRSTCOUNTAJMPDISPEXITMOVCounter,#001POPPSWPOPACCPUSHPSWSETBRS0MOVR7,#255D1:MOVR6,#255D2:NOPDJNZR6,D2DJNZR7,D1POPPSWDISPTAB:DB28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60HS未被按下時,P1。0輸入為高電平,S閉合后,P1。0輸入為低電平。由于按鍵是機械觸點,當機械觸點斷P1。0S110毫秒或更長一些時間后再P1。0S1的確按下了,這實際上是避開了按鍵按下時的抖動時間。而在檢測到按鍵釋放后(P1。0為高)再延時5-10個毫秒,消除后沿的抖動,然后再對鍵值處理。不過一般情況下,我們通11/0I/O3所示是P3.2、P3.3、P3.4P3.5。對于這種鍵各程序可以采用不斷查詢的方UpDownEQU00H;上下行標志StartEndEQU01H;起動及停止標志LAMPCODEEQU21H存放流動的數據代碼ORG0000HORG30HMOVSP,#5FHCLRUpDown啟動時處于向上的狀態(tài)CLRStartEnd;啟動時處于停止狀態(tài)MOVLAMPCODE,#0FEH單燈流動的代碼JNBF0,LNEXT;如果無鍵按下,則繼續(xù)ACALLKEYPROC否則調用鍵盤處理程序AJMPLOOP反復循環(huán),主程序到此結束MOVR7,#100D1:MOVR6,#100DJNZR6,$DJNZR7,D1

JBACC.3,KeyOverJBAJMPKEY_RE

溫馨提示

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

評論

0/150

提交評論