|
單片機的作用,不是關起門來在自個肚子里運行程序,而是要用來控制外部設備,而其控制外部設備的唯一途徑,對于我們現在已發明的數字設備來說,就是向外部設備輸出高低電位,這個,就是我們稱之為輸出的功能。 可以說,絕大多數場合下,單片機要控制外部設備以達成我們的愿望,還必須獲取外部信息,比如說你設計了一個流水燈,但是如果有一個燈壞了,如果你想要做到讓單片機自己能夠立即知道這個情況,那么,這個單片機就得有接收相關信息的能力,而要想讓單片機接收到這個信息,唯一的途徑,就是外部設備有控制單片機端口電位高低的能力,并且單片機能將端口的電位高低狀況讀入其內部并按預設程序進行處理,這個,就是我們稱之為輸入的功能,所以說,單片機的輸入功能,是其最重要最基本的能力之一,學好這個,理解好這個,就為我們用好單片機打下了堅實的基礎。 下面,就讓我們來體驗一下單片機的輸入功能,在這里,我會設計兩個實驗: 第一個:用撥碼開關控制一個電路某點的電位高低,然后將此點連接到單片機的端口。為了直觀觀察這個點的電位的高低,我們再在此點接入能直觀顯示其電位高低的裝置(在此處,我們接入一個LED燈);同樣也是為了實驗的效果更好,我們一次做八個這樣的電路,接入單片機的一組八個端口(這里我們用P2端口)。完成電路搭建后,編制程序,讓單片機讀取這組端口的電位,送入另外一組端口上(這里我們用P1端口)。為了直觀地觀察到P2端口的電位是否被送到了P1端口,我們在P1端口接上八只LED燈,當我們用撥碼開關改變P2端口的電位時,如果P1口的八只LED燈亮滅的順序與P2口的相同,就說明這個實驗成功了。 實驗電路圖如下:
輸入實驗電路圖.png (17.24 KB, 下載次數: 0)
下載附件
2025-11-25 07:10 上傳
電路搭建完成后,將撥碼開關八個位全部處于關的位置,然后連接好電腦,在STC下載軟件中的程序文件窗口中輸入75 90 FF 75 A0 FF 80 EF這一組八個十六進制數(里面的兩個FF就是置P1、P2這兩組端口電位全部為高,換算成二進制就是11111111),再按“下載/編程”按鈕將程序下載入單片機,然后檢查這十六個燈是否全亮,然后再將撥碼開關全部撥到開的位置以檢查P2口的八個燈是否全滅,這兩項檢查完成,基本可以說明電路搭建無問題。 搭建完成的實物圖如下:
輸入實驗電路實物.jpg (60.91 KB, 下載次數: 0)
下載附件
2025-11-25 07:16 上傳
接下來就開始做實驗了,編程將P2的電位讀入單片機并送入P1,其二進制程序代碼為85 A0 90 80 FE,C語言代碼就是P1=P2。下載到單片機中后,我們可以任意開關那個八位撥碼開關讓其控制的八個LED燈中的任意個亮滅,然后讓單片機重啟(可以簡單地用插撥電源線的方式重啟),然后觀察這兩組燈的亮滅次序是否一致。 接下來,我們讓單片機自己將其P2端口輸出全部置低電位(二進制75 A0 00;C語言P2=0;),然后再讓單片機將P2端口電位狀況送入P1端口(全部代碼二進制75 A0 00 85 A0 90 80 FE;C語言兩條語句P2=0;P1=P2;),然后我們發現,無論怎樣動撥碼開關,P2口這邊的燈都不會亮。這個實驗說明了一個電路的基本道理,只有當單片機端口輸出為高電位時,外界才能控制其電位為高為低;如果單片機自己向這個端口輸出了低電位,外界是無法強行將這個端口處的電位拉高的,所以,這個程序設計中,單片機應該先讓端口輸出高電位(P2=255,255對應二進制就是11111111。這個行為稱之為交出端口的電位控制權)之后,才能進行端口電位的讀取。 那為什么我們之前沒有P2=255這條語句也能成功呢?這就得談到單片機芯片設計中的“復位值”這個在芯片手冊和教材中經常看到的概念,對于端口來說,這個意思,就是單片機上電之后,其端口電位的高低,對于STC89C52這個單片機來說,在設計上,它就是上電后即為高電位,所以,我們可以不用加上P2=255這條語句也能成功,但編程應該嚴謹,要養成好習慣,特別是,其它廠家型號的單片機,其復位值不一定設計成這樣。 上面的程序中有一個問題,就是每次改變撥碼開關之后,都要重啟單片機才能進行觀察,我們能不能做到不用重啟、而是在改變開關狀態之后立即就能觀察到現象呢?簡單,讓單片機不斷重復“讀取并將P2口的狀況送入P1口”這個動作就行了,C語言主程序內容如下: P2=256; //置P2組端口為高電位,交出端口電位控制權 While(1) //程序一直重復執行下面大括號內的語句 {P1=P2;} //讀取P2的電位狀態并送入P1 第一個實驗基本就這樣了。 第二個實驗:在以上電路的基礎上,加一個按鈕開關連到單片機的某一引腳,當我們改變撥碼開關之后,單片機機并不立即讀取P2口狀況,而是等我們按下這個按鈕開關之后,才讀取并送入P1。 這里,我們選擇用P3這一組端口的第八個引腳(引腳圖上的P37)來連接按鈕,按鈕開關的另一端連到地(見上面的電路圖)。 完整程序如下: #include "reg52.h" //這個是頭文件 sbit key=P3^7; //給P37引腳起一個好記的名字叫key void main() //主程序 { P2=255; //置P2組端口為高電位,交出端口電位控制權 key=1; //置P37引腳為高電位,交出端口電位控制權 while(1) //程序一直重復執行下面大括號內的語句 { if(key==0) //對P37引腳的電位進行檢測,如果檢測到為低電位,也就是按鈕被按下,則執行下面大括號內的語句 {P1=P2;} //讀取P2端口的電位狀態并送入P1 } } 說明一下,為了讓程序流程表達清晰,沒有做簡化程序。 搭建好電路并下載我們編制好的程序,我們就可以開始實驗了。隨意改變撥碼開關的開關狀態,可以看到P2口的燈亮滅有變化,但P1口的燈并無變化;然后按一下按鈕開關,我們就可以看到,P1口的燈與P2口的燈的亮滅狀態一致了。 這個實驗,可以說是進一步證明了我們的單片機具備將其端口電位高低的控制權交給外部設備、讀取端口電位并進行處理的能力。 可以說,這個按鈕控制實驗是我們單片機輸入實驗中的一個極其重要也非常基礎的實驗,我們在學習1602顯示屏或12864顯示屏時,就會用到這一功能和方法。我們在進行數據傳輸時,不管是外部設備向單片機傳送數據,還是單片機向外部設備傳送數據,或者是單片機向單片機傳送數據,都要解決一個問題,那就是,作為接收方,我得知道對方已經將數據放在端口上了,然后我就可以開始讀入數據了。方法有很多種,而在本實驗中,采用的是單片機檢測到按鈕開關按下了,就知道已經可以讀數據了。這里還要說明一下的是,本實驗中,我們設計的是按鈕開關按下后端口電位為低則表示按鈕開關按下了,其實我們也可以設計成按鈕開關按下后端口電位為高來表示按鈕開關按下了,當然,我們還可以設計成只要端口的電位發生了變化、電位由高變化成低(下降沿)、電位由低變化成高(上升沿)等來表示可以讀數據了。 單片機對于讀入的數據的處理功能,我們還可以進行一個升級實驗來體驗,就是對讀入的數據進行算術運算之后,再將其運算結果送入P1,方法很簡單,比如說將P1=P2這條語句改為P1=P2+1、P1=P2*2等等的,然后我們去觀察結果。 PS:本人水平實在有限,懇請諸位用力批評指正:)
|