2.2 MCS-51單片機系統及應用舉例
MCS-51單片機在一片芯片上集成了計算機的基本功能部件,功能較強,在實際應用中,可以根據需要加上輸入、輸出接口電路組成智能儀器,根據智能儀器功能的不同及選用的CPU芯片的不同,會有相應不同的系統構成。
2.2.1 8051/8751/8951的最小系統
所謂最小系統,是指能滿足要求的最小配置系統。由于MCS-51系列單片機內部沒有集成時鐘電路所需的晶體振蕩器,也沒有復位電路,因此最小系統必須外接這些部件。這幾種芯片都有片內4KB程序存儲器,區別僅在于8951內部為E2PROM,8051內部為ROM,8751內部為EPROM,如果系統要處理的工作不太復雜,程序加數據不超過4KB,那么這些芯片只要外接晶體振蕩器和復位電路就可以構成最小系統,如圖2.5所示,其主要特征包括以下幾點。
(1)有4KB內部程序存儲器(地址是0000H~0FFFH),EA引腳要接高電平。
(2)有128B內部數據存儲器(地址是00H~7FH)。
(3)因為沒有用到外部程序存儲器和數據存儲器,所以P0~P3口可以全部作為I/O接口。
圖2.5中電源引腳和接地引腳也要接上,一般在電路原理圖中因為電源引腳Vcc總是接+5V,接地引腳總要接地,所以不畫出來,接線時要注意。最小系統的構成非常簡單,可以利用它進行實驗和開發小產品。

圖2.5 8051/8751/8951的最小系統
2.2.2 單片機系統的并行擴展
當CPU選用8031,或者系統的程序比較長,需要存儲的數據比較多,上面的最小系統不能滿足要求時,就需要外接程序存儲器和數據存儲器,通常稱為單片機系統的擴展。
MCS-51系列單片機一般用74LS373配合其擴展,以8051為例,只接一片27128(16KB)外部程序存儲器和一片62256(32KB)外部數據存儲器,擴展后的單片機系統電路接法如圖2.6所示。其主要特征如下。
(1)有16KB外部程序存儲器(地址是0000H~3FFFH),EA引腳要接地,內部沒有程序存儲器。
(2)有32KB外部數據存儲器(地址是0000H~7FFFH),內部仍有128B的數據存儲器可用。

圖2.6 擴展后的單片機系統
(3)因為P0和P2口要作為地址線和數據線,所以不能作為I/O接口,只有P1和P3口可以作為I/O接口,且P3.6和P3.7要作為外部數據存儲器的讀/寫控制線,也不能用,可見I/O端口減少了很多,但程序和數據存儲量擴大了。
(4)圖2.6中RST引腳直接接高電平,通電后就一直工作。沒有重啟按鈕。
2.2.3 單片機系統的串行擴展
在單片機應用系統中,現在常用到帶有I2C串行總線接口的芯片,因為采用這種I2C串行總線接口的芯片與單片機連接簡單,連接線少,結構緊湊,使用比較方便。
I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線,它由數據線SDA和時鐘線SCL構成,可發送和接收數據。各種采用I2C總線標準的器件均并聯在總線上,每個器件內部都有I2C接口電路,器件的地址由芯片內部的硬件電路和外部地址引腳共同決定,并建立了簡單的主從關系,每個器件既可以作為發送器,又可以作為接收器。
作為例子,圖2.7給出了8051單片機與串行存儲E2PROM芯片CAT24WC04的接口電路,8051單片機的P1.0,P1.1作為I2C總線與CAT24WC04的SDA和SCL相連,連接時注意I2C總線須通過上拉電阻接電源,P1.2與WP相連,CAT24WC04的地址線A2、A1、A0直接接地,片選地址為000,因此CAT24WC04的器件地址碼的高7位為1010000。存儲容量為4KB。
從圖2.7中可以看到,這種用I2C總線串行擴展的單片機系統既增加了單片機的程序存儲器,又保留了很多I/O接口,且接線也簡單。圖中所用到的CAT24WCXX系列是美國CATALYST公司出品的串行(CMOS)E2PROM芯片,有1~256KB不同容量的芯片,如CAT24WC04就是64KB存儲容量的芯片。

圖2.7 8051單片機與串行存儲E2PROM的接口電路
2.2.4 應用舉例
1.MCS-51系列單片機在調速系統中的應用
在單片機控制的小功率直流電機調速系統中,利用單片機的內部定時器產生占空比不同的矩形波,可以改變電機定子電壓接通和斷開的時間,從而控制電機轉速。
【例2.1】 若要求單片機輸出頻率為10kHz的矩形波,占空比為2∶1(高電平時間長),單片機頻率為12MHz,寫出有關程序。
分析:輸出頻率為10kHz的矩形波,即周期為100μs。高電平持續時間為66.7μs,低電平持續時間為33.3μs。由于定時時間短,定時器采用模式2即8位定時器/計數器模式(并具有自動重裝載功能)。
定時33.3μs,初值=2 8-33.3=DFH
定時66.7μs,初值=2 8-66.7=BDH
方法:利用定時器的模式2自動重裝載功能,只要每次計數溢出,就自動重新裝入TH0中的值(時間常數),使定時器能交替實現66.7μs和33.3μs定時。
程序清單:
MOV TMOD,#02H ;TMOD為8051的內部寄存器,設置T0為模式2 MOV TL0,#0BDH ;送初值,高電平持續時間 MOV TH0,#0DFH ;低電平持續時間 MOV A,#0BDH ;高電平持續時間送到A寄存器 SETB TR0 ;啟動T0 SETB P1.0 ;P1.0引腳輸出高電平 L0: JNB TF0,L0 ;循環等待,定時時間是否到?這里也可以用中斷 CLR TF0 ;清定時器0溢出標志 CPL P1.0 ;P1.0引腳輸出取反 XCH A,TH0 ;交換時間常數,為下次定時做準備 SJMP L0 END
2.利用單片機的內部定時器測量外部脈沖寬度
【例2.2】 用定時器測量INT1引腳上正脈沖的寬度(機器周期數)。
分析:T0、T1定時器/計數器中有一個門控信號GATE,當該信號被設置為“1”時,只有TR1=1,并且INT1為1時才能啟動定時器。利用此信號可以檢測外部某一個脈沖的寬度。
測量過程為:初始設置T1工作在方式1,定時狀態,時間常數初值為0,GATE=1。當外部待測脈沖由INT1(P3.3)輸入時,啟動T1。當INT1上再次出現高電平時,開始計數,直到INT1出現低電平為止。此時讀出的時間常數就是對機器周期的計數次數,此數乘以機器周期即為正電平寬度。其過程如圖2.8所示。

圖2.8 測量過程示意圖
程序清單:
MOV TMOD,#90H ;設置T1為模式1,且GATE=1 MOV TL0,#00H ;定時初值為0 MOV TH0,#00H WAIT1: JB P3.3,WAIT1 ;等待INT1變低電平,開始啟動TR1 SETB TR1 ;啟動定時器 WAIT2: JNB P3.3,WAIT2 ;等待INT1=1,開始計數 WAIT3: JB P3.3,WAIT3 ;等待P3.3變低電平 CLR T ;結束計數 MOV A,TL1 MOV B,TH1 ;存放計數值 END
若f=12MHz,則A、B中的數值是以微秒為單位的正電平的寬度。也可以把該數通過顯示器顯示出來。
3.利用中斷實現故障報警
【例2.3】 用一個中斷源顯示故障的發生。如圖2.9所示的電路,當系統正常工作時,四個故障源的輸出均為高電平,顯示燈全不亮。當其中任意一個故障源出現故障時,其相應的輸出為低電平,相應的二極管顯示燈亮。

圖2.9 用中斷實現故障報警
分析:當某一故障信號輸入線由高電平變為低電平時,與門輸出為0,并通過INT0申請中斷(邊沿觸發)。在中斷服務程序中,通過查詢與故障信號相連接的P1.0、P1.2、P1.4、P1.6的值,確定故障的位置,并使相應的發光二極管亮。
程序清單:
ORG 0000H AJMP MAIN ;跳過中斷服務程序 ORG 0003H ;外部中斷0中斷矢量 AJMP zd
主程序:
MAIN: ANL P1,#55H ;P1.0、P1.2、P1.4、P1.6輸入,P1.1、P1.3、P1.5、P1.7輸出 SETB EX0 ;允許外部輸入 SETB IT0 ;邊沿觸發 SETB EA ;CPU開中斷 SJMP $ ;循環等待,需要時這里也可以執行別的程序
中斷服務子程序:當INT0引腳出現低電平時,CPU自動執行這段程序。
zd: JB P1.0,L1 ;若P1.0=1,轉L1 SETB P1.1 ;故障1,P1.1腳輸出高電平,則相應的二極管亮 L1: JB P1.2,L2 ;若P1.2=1,轉L2 SETB P1.3 ;故障2,P1.3腳輸出高電平,則相應的二極管亮 L2: JB P1.4,L3 ;若P1.4=1,轉L3 SETB P1.5 ;故障3,P1.5腳輸出高電平,則相應的二極管亮 L3: JB P1.6,L4 ;若P1.6=1,轉L4 SETB P1.7 ;故障4,P1.7腳輸出高電平,則相應的二極管亮 L4: RETI ;中斷返回 END
4.利用中斷進行定時控制外部操作
【例2.4】 用中斷進行定時控制。即要求每間隔一定時間,對現場數據實施一次采集、傳送、取數等操作,而間隔時間未到,CPU可進行數據處理、數據顯示等主程序的工作。
要求每隔150ms,從外部P1口讀一次數據,并把數據存入到內部RAM 30H(首地址)開始的存儲器中,供主程序進行處理,如果數據多的話,也可以存放在外部RAM 1000H單元(首地址)開始的數據存儲區,單片機的晶振頻率f=6MHz。
分析:實現150ms定時,采用定時器T0定時50ms、軟件計數器計數3次的方式實現。定時初值為:X=2 16-50×10-3×3×10 6/6=40536=9E58H
程序清單:
ORG 0000H AJMP MAIN ;跳過中斷服務程序 ORG 000BH ;定時器0中斷矢量 AJMP TCT0
主程序:
ORG 0100H MAIN: MOV TMOD,#01H ;定時器T0,方式1 MOV TH0,#9EH MOV TL0,#58H MOV DPTR,#1000H ;外部RAM首地址 MOV R0,#30H ;內部RAM首地址
MOV R3,#03H ;軟件計數次數 SETB ET0 ;允許T0中斷 SETB EA ;CPU開中斷 SETB TR0 SJMP $ ;等待中斷 ;如果需要,可在此放置顯示傳送次數等程序
中斷服務程序:
ORG 0150H TCT0: MOV TH0,#9EH ;重裝初值 MOV TL0,#58H DJNZ R3,NEXT1 ;定時不到150ms,返回 MOV A,P1 MOVX @DPTR,A ;從外部RAM向內部RAM傳送數據 MOV @R0,A INC DPTR INC R0 NEXT1: RETI ;開中斷返回 END