- 51單片機應用基礎(C51版)
- 胡進德 丁如春 劉愛榮
- 2508字
- 2019-11-27 11:56:38
學習單元三 單片機如何控制外部器件
通過前面的學習,我們了解到空調系統的功能、相應的功能部件和單片機I/O引腳三者之間有內在聯系,這種關系如表1-1所示。
表1-1 空調系統與單片機的I/O口控制

上表說明,單片機的I/O引腳的確是雙向的,單片機的每一個引腳都可以感受外部器件、控制外部器件。那么,單片機是如何控制外部器件的呢?或者說,單片機控制外部器件的工作原理是怎樣的呢?
我們先看看現實生活中如何用一個開關控制LED指示燈(即發光二極管)。如圖1-8所示的電路圖中,當開關K閉合時,無電流流過LED指示燈,指示燈熄滅;當開關K斷開時,只要選擇合適的限流電阻R,就會有電流流過指示燈,指示燈就會發光。所以,開關K能夠控制指示燈的亮和滅。

圖1-8 開關K控制LED指示燈電路圖
圖1-8所示的開關K控制LED指示燈電路原理與單片機控制外部器件的工作原理有什么聯系呢?
其實,單片機控制LED指示燈和其他外部器件與圖1-8用開關K控制LED指示燈類似,原因是單片機內部已經集成了電源Vcc、電阻R和“開關K”,如圖1-9所示。

圖1-9 單片機控制LED指示燈的電路模型及電路圖
(a)電子模型(b)P1.0引腳控制LED指示燈電路圖
圖1-9(a)中,LED指示燈的正極與單片機的某一輸入/輸出引腳I/O(英文為Input/Output,簡稱I/O)相連,另一端連接地。集成在單片機內部的電阻R一端與單片機正電源腳Vcc相連,另一端與單片機的I/O腳相連,也就是與指示燈的正極相連。在單片機內部有個“開關K”,它連接單片機的I/O腳和負電源腳GND。需要注意的是,這個“開關K”并不是真正意義上的機械式開關,而是存在于單片機內部的一個“電子開關”,這個電子開關主要由場效應管等構成(見學習情景三中的學習單元一),它也能被隨意地控制其通和斷,于是,指示燈的亮和滅受單片機內部的電子開關K所控制:當電子開關K閉合接負電源腳GND時,指示燈熄滅;反之,當電子開關K斷開時,指示燈亮。關于電子開關K的詳細情況我們將在解剖單片機內部結構時作介紹,剛開始不需要過多地了解,只需要知道這個電子開關的狀態決定了I/O腳的電平狀態是GND(0V)還是Vcc(+5V)。可能有人會問,電子開關由誰來控制呢?由單片機指令。指令是單片機根據人的意圖來執行某種操作的命令。那么指令是什么樣子的呢?
如果我們要在單片機的某一個I/O引腳例如P1.0引腳輸出高電平Vcc驅動LED指示燈[電路見圖1-9(b)],可以采用如下指令:
SETB P1.0;
反之,如果要在P1.0引腳輸出低電平GND,可以采用如下指令:
CLR P1.0;
“SETB”是“set bit”的英文縮寫,意思是置位、置“1”、置高電平,“SETB P1.0”中文含義是把P1.0腳置成高電平;“CLR”是“clear bit”的英文縮寫,意思是清除位、置“0”、置低電平,“CLR P1.0”中文含義是把P1.0腳置成低電平。在單片機學習中,可以先粗略地把高電平理解成Vcc,而把低電平理解成GND。當我們將“SETB P1.0”這條指令事先“裝入”單片機中以后,只要給單片機通上電,單片機會自動找到這條指令,單片機執行這條指令后電子開關K斷開,+5V的電壓通過正電源腳Vcc和內部電阻R從P1.0腳送出,于是從P1.0輸出高電平,指示燈正向導通,指示燈有電流流過從而被點亮。同樣的道理,將指令“CLR P1.0”事先“裝到”單片機中,單片機執行這條指令后電子開關K閉合,0V的電壓通過負電源腳GND和電子開關K與P1.0腳相連,于是從P1.0輸出低電平,指示燈無電流流過而不發光。
以上就是單片機執行指令實現對外部器件控制的最簡單過程。單片機要實現對外部器件的控制,常常需要執行多條指令。由多條指令構成的、用以實現某種特定功能的指令集合通常稱為程序。例如,在圖1-9(b)中,用P1.0引腳控制LED閃亮,程序是怎樣的呢?
要讓接在P1.0引腳上的LED閃亮,實際上就是要LED亮一段時間,再滅一段時間,然后再亮,再滅,如此交替進行。換個說法,就是讓單片機P1.0腳周而復始地輸出高電平和低電平。但如果直接使用下面的兩條指令:
SETB P1.0
CLR P1.0
是否可行呢?
不行!這里有兩個問題:
●單片機執行指令的時間很短,一般只有幾個微秒。當執行完指令“SETB P1.0”后,LED是亮了,但在極短時間(微秒級)后,單片機又執行了“CLR P1.0”指令,LED又滅了,在這么短的時間內根本分辨不出LED曾經亮過。
●在執行完“CLR P1.0”指令后,單片機不會再自動回去執行“SETB P1.0”指令,所以不能正常工作。
為了解決這兩個問題,可以設想如下:
●在執行完“SETB P1.0”指令后,延時一段時間(幾秒或零點幾秒)再執行第二條指令“CLR P1.0”,即可分辨出LED曾經亮過。
●在執行完第二條指令后,同樣延時一段時間(幾秒或零點幾秒),然后再讓單片機回去執行第一條指令“SETB P1.0”,然后再執行第二條……如此不斷循環,LED將亮~延時~滅~延時~亮~延時~滅……,即可實現LED燈的閃爍功能。
由以上設想,編寫的程序如下:
MAIN:SETB P1.0 ;(1)P1.0腳置高電平 ACALL DELAY ;(2)延時一段時間 CLR P1.0 ;(3)P1.0腳置低電平 ACALL DELAY ;(4)延時一段時間 SJMP MAIN ;(5)跳轉至MAIN處再循環
以上指令中,分號后面的文字是為了便于理解指令功能而寫的注釋,不是程序的有效執行部分,不影響程序的執行。
第(1)條指令的作用是讓LED亮。按以上分析,第(2)條指令的作用是延時;第(3)條指令的作用是讓LED熄滅;第(4)條指令同第二條指令相同,也是延時;第(5)條指令轉去執行第(1)條指令。第(5)條指令SJMP的意思是跳轉,在SJMP后面有一個參數是MAIN,而在第(1)條指令的前面有一個MAIN,所以很直觀地可以認識到,它要跳轉到第(1)條指令處。第(1)條指令前面的MAIN被稱之為標號,標號的用途是標識該行程序,便于使用。這里并不一定要給它起名叫MAIN,起什么名字,完全由編程者決定,只要符合一定的規定就行,比如可以稱它為ABC、XYZ等等。當然,這時第(5)條指令SJMP后面的名字也得相應改動。
第(2)條和第(4)條指令的用途是延時。指令的符號是ACALL,稱為子程序調用指令。該條指令后面跟的參數是DELAY。DELAY是一個標號,用于標識一段程序。這條指令的作用是這樣的:當執行ACALL指令時,就調用DELAY所指示的程序段,當DELAY所指示的程序段執行完以后就返回繼續執行后面的指令。如第(2)條指令調用DELAY所指示的程序段后延時一段時間,然后繼續執行第(3)條指令;第(4)條指令調用DELAY所指示的程序段后同樣延時一段時間,然后繼續執行第(5)條指令。
通過單片機的P1.0引腳對LED指示燈的控制實例,我們初步認識了單片機控制外部器件的機制和指令/程序在單片機中的作用。