單片機的I/O引腳(輸出篇)
一、I/O引腳的特性
單片機的外部屬性就是它有眾多的I/O引腳,如40腳封裝的51系列,就有32個腳是I/O引腳。它們也叫單片機的并口。
這32個I/O引腳全是數(shù)字的(即只會出現(xiàn)或只允許0、1變化)。
這32個I/O引腳分成4組,每組8位(即8根I/O引腳),用P0、P1、P2、P3標注,每組里的各位用Px.y區(qū)別,如P0口的8位標記為P0.0~P0.7(x=0~3;y=0~7)。
當然,這四個口P0、P1、P2、P3是有區(qū)別的,它們都有另外的功能;若只做一般的I/O引腳用,可視它們是一樣的(我們這一講只考慮做一般的I/O引腳用)。
二、I/O引腳的尋址
這四個口P0、P1、P2、P3(共32根引線)在內部映射有4個8位專用寄存器,名字也叫P0、P1、P2、P3,對這4個寄存器進行操作,也就可對32根引線進行操作(它們一一對應),很方便。
這里介紹一下字操作、字節(jié)操作、位操作的概念:字是由字節(jié)組成的,一個字節(jié)為8位二進制。字的位數(shù)由CPU的位數(shù)(或CPU里寄存器的位數(shù))決定,即字長;若CPU為8位機,則字長為8位,正好等于一個字節(jié);若CPU為16位機,則字長為16位,所以字操作時,一次就對兩個字節(jié)進行處理,同理,我們就知道當CPU為32位機、64位機時,字操作所處理的字節(jié)數(shù)了。所謂字節(jié)操作,就是一次對8位二進制同時進行操作。說到這里,大家肯定能回答什么叫位操作了,即對一個字節(jié)里的某一位進行操作。再次強調一下,以上所講的操作、處理,就是對I/O引腳的尋址、就是執(zhí)行指令的過程,執(zhí)行的結果就是各位變0或1。
有了以上概念,我們就可以告訴大家,這四個口P0、P1、P2、P3即可字節(jié)操作,也可位操作。(同學們好好想一想,拿P1口做例,字節(jié)操作是怎么回事?位操作又是怎么回事?)再進一步,操作的含義是什么呢?答:輸入和輸出,即I/O。這32根線,每一根都可以輸入和輸出,輸入是單片機從外部接收數(shù)據(jù)和命令、感知外部世界的過程;輸出是單片機根據(jù)設定、經過運算、甚至是智能的對外部世界作出反應,進行控制的過程。從指令的角度看,輸入和輸出稍有不同,輸入稍復雜一些,所以,51單片機的這32個輸入和輸出口,也叫準雙向口。我們下邊先講簡單的輸出過程,而把輸入過程放在后邊的講座里。
三、I/O引腳的輸出
在第一講里,在最小系統(tǒng)的電路圖里,大家已知P1口和P3口接了16只發(fā)光二極管,現(xiàn)在我們將這兩個口作為輸出口用,很明白,當其中的某個腳為1時,該腳所接的LED是“滅”的;反之,為0時,則“亮”。如下圖所示?梢姡@里的亮或滅是由硬件的接法決定的(若換一種接法,亮滅的電平會顛倒的)。
由此我們也看出,學習單片機,軟、硬件是分不開的,這是它的顯著的特點。
下面給大家介紹幾條I/O引腳輸出的指令:
先介紹指令格式
【標號:】操作碼操作數(shù)1,操作數(shù)2 【,操作數(shù)n】【;注釋】
以上的指令格式中,方括號內的內容可有可無,若要的話,一定注意標點符號不能省略;操作碼必有,它是簡單的英語單詞以助記符形式出現(xiàn),便于記憶,它說明了操作的性質;操作數(shù)可有可無,可多可少,中間以逗號分隔,它和操作碼之間至少空一格,它說明了操作的具體內容;注釋也是可有可無,但規(guī)范和專業(yè)的做法是要有詳細的注釋,且不是簡單的指令說明,而是其物理的、硬件的、實質性的解釋。
字節(jié)輸出的指令
Mov P1,#00000000B ;該指令可使P1口的8個腳(P1.0~P1.7)全部變?yōu)榈碗娖,當然,P1口的8只發(fā)光管都會點亮;(指令中的操作數(shù)2也可寫成#0、#0H,前者是10進制寫法,后者是16進制寫法,均可)
Mov P1,#11111111B ;這條指令相反,8只發(fā)光管都會滅。
位輸出的指令
Clr P1.0 ;該指令使P1口的0腳變?yōu)榈碗娖,它所接的那只發(fā)光管亮,不會影響其他。
而 Setb P1.0 這條指令就使P1口的0腳變?yōu)楦唠娖健?/p>
有了以上這些準備,下面我們就來編一段程序,讓P1口和P3口的發(fā)光管輪流點亮,每個發(fā)光管點亮200ms,輪流不息,俗稱“流水燈”。
四、流水燈編程
1.字節(jié)方式處理
;****************************************
Org 0000H
;org為偽指令,告訴匯編程序,下面的指令從ROM的0000H處開始放
Main: Mov P1,#11111110B
Mov P3,#11111110B
;可見,以上兩條指令使P1口的P1.0腳和P3口的P3.0腳所接發(fā)光管點亮
Lcall ys200ms
;上面是一條調用子程序指令,用意是讓CPU執(zhí)行一些其他無關的指令,耗費掉200ms的時間,讓剛亮的兩只發(fā)光管能亮200ms時間,否則,由于CPU執(zhí)行指令太快,我們將無法分清哪只發(fā)光管亮了。
Mov P1,#11111101B
Mov P3,#11111101B ;很顯然,換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#11111011B
Mov P3,#11111011B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#11110111B
Mov P3,#11110111B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#11101111B
Mov P3,#11101111B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#11011111B
Mov P3,#11011111B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#10111111B
Mov P3,#10111111B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
Mov P1,#01111111B
Mov P3,#01111111B ;很顯然,又換了兩只發(fā)光管亮
Lcall ys200ms
;到此為止,P1口和P3口的發(fā)光管輪流亮了一遍
Ljmp main
;我們應該讓CPU返回開始處,再次開始亮燈循環(huán),上邊這條指令就是無條件跳轉指令,命令CPU跳回標號為main處,繼續(xù)執(zhí)行指令,永遠往復。
以下給出延時子程序,以保持程序的完整性,但不講解,以后再說。
Ys200ms: Mov r7,#4
Ys0: Mov r6,#100
Ys1: Mov r5,#250
Djnz r5,$
Djnz r6,ys1
Djnz r7,ys0
Ret
End
;************************************************************
位處理方式
;**************************************************
Org 0000H
Main: Mov P1,#0FFH
Mov P3,#0FFH ;先做準備工作,使所有LED全滅
Loop: Clr P1.0 ;P1.0腳所接發(fā)光管點亮
Clr P3.0 ;P3.0腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.0
Setb P3.0 ;在點亮下一只前,關掉已點亮的
Clr P1.1 ;P1.1腳所接發(fā)光管點亮
Clr P3.1 ;P3.1腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.1
Setb P3.1 ;在點亮下一只前,關掉已點亮的
Clr P1.2 ;P1.2腳所接發(fā)光管點亮
Clr P3.2 ;P3.2腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.2
Setb P3.2 ;在點亮下一只前,關掉已點亮的
Clr P1.3 ;P1.3腳所接發(fā)光管點亮
Clr P3.3 ;P3.3腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.3
Setb P3.3 ;在點亮下一只前,關掉已點亮的
Clr P1.4 ;P1.4腳所接發(fā)光管點亮
Clr P3.4 ;P3.4腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.4
Setb P3.4 ;在點亮下一只前,關掉已點亮的
Clr P1.5 ;P1.5腳所接發(fā)光管點亮
Clr P3.5 ;P3.5腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.5
Setb P3.5 ;在點亮下一只前,關掉已點亮的
Clr P1.6 ;P1.6腳所接發(fā)光管點亮
Clr P3.6 ;P3.6腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.6
Setb P3.6 ;在點亮下一只前,關掉已點亮的
Clr P1.7 ;P1.7腳所接發(fā)光管點亮
Clr P3.7 ;P3.7腳所接發(fā)光管點亮
Lcall ys200ms
Setb P1.7 ;P1.7腳所接發(fā)光管滅
Setb P3.7 ;P3.7腳所接發(fā)光管滅
Ljmp Loop ;跳至標號LOOP處繼續(xù)反復
;***********************************************************
延時子程序同上,不再重復。
以上我們可看出,完成相同的任務,但編寫程序的方法卻不一樣,其實還有更多的方法完成這一任務。由此,我們的同學們應該領會到,“指令是死的,人是活的”,“條條大道通北京”,只要發(fā)揮我們的聰明才智,總是可以達到目的的。
最后強調一下,做這些發(fā)光管亮滅實驗的意義何在?它的意義就在于:我們能使發(fā)光管隨心所欲的亮和滅,且有精確的時間控制,就能對任何其他的外部設備進行控制,如彩燈、電動機、車床等,只是變一變相應的電路而已。
編輯:admin 最后修改時間:2023-04-07