官术网_书友最值得收藏!

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
主站蜘蛛池模板: 建平县| 确山县| 娄底市| 崇州市| 二手房| 宁安市| 邵东县| 辽宁省| 天长市| 望奎县| 马公市| 扶风县| 新龙县| 色达县| 长沙市| 东乌珠穆沁旗| 二连浩特市| 论坛| 云霄县| 格尔木市| 梓潼县| 新昌县| 通山县| 航空| 沭阳县| 新田县| 安平县| 宁国市| 江安县| 苏尼特右旗| 舟山市| 南丹县| 连山| 富源县| 英超| 永平县| 昭苏县| 响水县| 石景山区| 克东县| 临潭县|