單片微型計(jì)算機(jī)(Single Chip Microcomputer)簡稱單片機(jī),是把組成微型計(jì)算機(jī)的主要功能部件(CPU、RAM、ROM、I/O口、定時(shí)/計(jì)數(shù)器、串行口等)集成在一塊芯片中,構(gòu)成一個(gè)完整的微型計(jì)算機(jī)。
單片機(jī)主要面對測控對象,突出的是控制功能,所以它的芯片內(nèi)集成了很多面向測控對象的接口電路,如ADC(Analog to Digital Converter,模數(shù)轉(zhuǎn)換器)、DAC(Digital to Analog Converter,數(shù)模轉(zhuǎn)換器)、高速I/O口、PWM(Pulse Width Modulator,脈沖寬度調(diào)制器)、WDT(Watch Dog Timer,監(jiān)視定時(shí)器,俗稱“看門狗”)等。這些接口電路已經(jīng)突破了傳統(tǒng)的微型計(jì)算機(jī)體系結(jié)構(gòu),所以單片機(jī)也稱MCU(Micro-Controller Unit,微控制器)。
單片機(jī)的種類十分廣泛,現(xiàn)在市場上主流的有PIC系列、STM32系列、AVR等等。51系列單片機(jī)是對所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱,它們都是Intel公司1981年制造8位MCU Intel 8051衍生兼容品,其指令集稱為MCS-51。這里以此為例介紹單片機(jī)工作原理。
51單片機(jī)的通常采用的是40引腳的雙列直插式封裝(Dual In-line Package,DIP),引腳功能的定義如上圖所示。
除去基本的電源引腳,其中:
* VSS:電源引腳,需要接地(GND)。
* XTAL1、XTAL2(External Crystal):時(shí)間引腳,在片內(nèi)XTAL1是振蕩器反相放大器和時(shí)鐘發(fā)生器的輸入端,XTAL2是振蕩器反相放大器的輸出。分別外接由兩個(gè)電容與晶振的并聯(lián)諧振時(shí)鐘電路時(shí),XTAL1接外部晶振和微調(diào)電容的一端,XTAL2接外部晶振和微調(diào)電容的另一端;使用外部時(shí)鐘時(shí),XTAL1接地或懸空,XTAL2引腳接外部時(shí)鐘的輸入。
* RST(Reset):復(fù)位引腳,出現(xiàn)持續(xù)兩個(gè)機(jī)器周期的高電平將導(dǎo)致單片機(jī)復(fù)位。
* ALE/PROG(Address Latch Enable/):作ALE,為地址鎖存允許控制,用于在訪問外部存儲(chǔ)器時(shí)鎖存P0口輸出的低8位地址,脈沖的頻率大約為振蕩器頻率的1/6。作PROG,當(dāng)內(nèi)部程序存儲(chǔ)器(EPROM)編程時(shí),由此輸入編程脈沖信號(hào)。
* PSEN(Programme Store Enable):外部程序存儲(chǔ)器選通信號(hào)。
* EA/Vpp(External Enable):作EA功能,為外部程序存儲(chǔ)器使能信號(hào),低電平時(shí),只能訪問外部程序存儲(chǔ)器。作Vpp,對EPROM編程時(shí),用以施加編程電壓。
* P0、P1、P2、P3:四個(gè)并行I/O口,每并行口8個(gè)引腳。
51單片機(jī)的32個(gè)I/O引腳,組成P0~P3四個(gè)8位的并行雙向I/O口,內(nèi)部的**特殊功能寄存器(Special Function Register,SFR)**P0~P3分別是它們的端口鎖存器,此外每個(gè)口還分別包含一個(gè)輸出驅(qū)動(dòng)器和輸入緩沖器。四個(gè)并行口可以按字節(jié)操作,也可以按位操作。
P0可作一般I/O口使用,應(yīng)用系統(tǒng)采用外部總線結(jié)構(gòu)時(shí),也可以分時(shí)復(fù)用作為雙向數(shù)據(jù)總線(Data Bus)和低8位地址總線(Address Bus)。
上圖為P0口某一位的結(jié)構(gòu)原理圖。
當(dāng)P0作I/O口時(shí),CPU發(fā)出控制信號(hào)C=0,封鎖與門,使場效應(yīng)管V2截至,同時(shí)將下面的數(shù)據(jù)選擇器(Multiplexer,MUX)撥到下方,將鎖存器的Qˉˉˉ端與場效應(yīng)管(Field Effect Transistor)V1的柵極接通。
輸出數(shù)據(jù)時(shí),內(nèi)部總線數(shù)據(jù)經(jīng)鎖存器、MUX、V1輸出到引腳;輸入數(shù)據(jù)后,上下兩個(gè)三態(tài)輸入緩沖器用以內(nèi)部的讀操作,分別實(shí)現(xiàn)讀引腳和讀鎖存器。
要注意的是,P0口作為I/O口輸出時(shí),由于輸出級為漏極開路電路,需要外接上拉電阻,才能輸出高電平;輸入后讀取數(shù)據(jù)時(shí),V1導(dǎo)通將輸入的高電平拉為低電平造成誤讀,所以在進(jìn)行輸入操作前,要先向端口輸出鎖存器寫“1”。
當(dāng)P0口作地址/數(shù)據(jù)總線時(shí),CPU發(fā)出控制信號(hào)C=1。由P0輸出地址/數(shù)據(jù)信息時(shí),與門打開,MUX將CPU內(nèi)部地址/數(shù)據(jù)總線反向后與V1的柵極接通,V1和V2兩個(gè)FET管構(gòu)成推拉式輸出電路,負(fù)載能力大大加強(qiáng);輸入數(shù)據(jù)時(shí),是由下面的三態(tài)輸入緩沖器進(jìn)入內(nèi)部數(shù)據(jù)的。
P1四個(gè)I/O口中功能最簡單,可做一般I/O口使用。其某一位的結(jié)構(gòu)原理圖如下。
其內(nèi)部已有上拉電阻,可直接輸出高電平,驅(qū)動(dòng)拉電流負(fù)載。和P0一樣,端口輸入后讀取數(shù)據(jù)時(shí),要先向端口輸出鎖存器寫“1”。
P2可作一般I/O口使用,在應(yīng)用系統(tǒng)采用外部總線結(jié)構(gòu)時(shí),僅用作高8位地址總線。其某一位的結(jié)構(gòu)原理如下圖:
MUX打向左邊時(shí),作一般I/O口使用,此時(shí)于前面介紹的I/O口工作原理基本一致。Q輸出為0時(shí)V1導(dǎo)通,外部引腳輸出低電平;輸出1時(shí)V1截止,由于存在內(nèi)部上拉電阻,外部引腳輸出高電平。輸入后也可分為讀引腳狀態(tài)和讀鎖存器狀態(tài)。而且端口輸入后讀取數(shù)據(jù)時(shí),要先向端口輸出鎖存器寫“1”。
P3可作一般I/O口使用外,每個(gè)引腳都具有第二功能。其某一位的結(jié)構(gòu)原理如下圖:
作一般I/O口用,原理同P2。使用引腳的第二功能時(shí),對應(yīng)的鎖存器里必須為“1”,否則圖中的與非門輸出始終為1,V1導(dǎo)通,引腳始終在低電平,不能正常工作。
每個(gè)引腳的第二功能如下表:
引腳 第二功能 說明P3.0 RXD(Receive External Data) 串行輸入端
P3.1 TXD(Transmit External Data) 串行輸出端
P3.2 INT0(Interrupt) 外部中斷0
P3.3 INT1 外部中斷1
P3.4 T0(Timer) 計(jì)數(shù)器0外部輸入
P3.5 T1 計(jì)數(shù)器1外部輸入
P3.6 WR(Write Enable) 外部數(shù)據(jù)存儲(chǔ)器寫選通
P3.7 RD(Read Enable) 外部數(shù)據(jù)存儲(chǔ)器讀選通
四個(gè)I/O口中,P1、P2、P3口可驅(qū)動(dòng)4個(gè)LS TTL(Low-power Schottky TTL,低功耗肖特基TTL)負(fù)載,即輸出電流不小于400uA; P0口的輸出緩沖器可驅(qū)動(dòng)8個(gè)LS TTL負(fù)載,作一般I/O使用時(shí)為開漏輸出,需要外加上拉電阻,做數(shù)據(jù)/地址總線使用時(shí)不需要外加上拉電阻。
內(nèi)部微體系結(jié)構(gòu)51系列單片機(jī)內(nèi)部包含:
運(yùn)算器(包括邏輯運(yùn)算器ALU(Arithmetic and Logic Unit)、累加器ACC(Accumulator)、寄存器B、程序狀態(tài)字寄存器PSW(Program Status Word))、程序計(jì)數(shù)器PC(Program Counter)、指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)、數(shù)據(jù)指針DPTR(Data Pointer)等組成的8位CPU。
4KB ROM 程序存儲(chǔ)器、128B RAM 數(shù)據(jù)存儲(chǔ)器
可尋址64KB外部數(shù)據(jù)存儲(chǔ)、控制電路
21個(gè)特殊功能寄存器SFR
32條可編程I/O端口線
2個(gè)16位定時(shí)/計(jì)數(shù)器
1個(gè)可編程全雙工串行口
5個(gè)中斷源、兩個(gè)優(yōu)先級嵌套中斷結(jié)構(gòu)
1個(gè)片內(nèi)振蕩器及時(shí)鐘電路
CPUCPU用以產(chǎn)生各種控制信號(hào),是單片機(jī)的核心。
ALU完成數(shù)據(jù)的算數(shù)運(yùn)算、邏輯運(yùn)算,并將運(yùn)算結(jié)果的狀態(tài)送往PSW。
PC是一個(gè)16位具有自動(dòng)加一功能的寄存器,用來存放即將取出的指令地址,可對64KB程序存儲(chǔ)器直接尋址。
IR是用來暫存待執(zhí)行指令的8位寄存器。ID對其中的指令進(jìn)行譯碼,將指令轉(zhuǎn)變?yōu)閳?zhí)行此指令所需要的電信號(hào)。
DPTR是一個(gè)16位專用地址指針寄存器,用來存放16位地址,作間址寄存器使用。
存儲(chǔ)器51單片機(jī)的存儲(chǔ)器按功能可分為數(shù)據(jù)存儲(chǔ)器(RAM)和程序存儲(chǔ)器(ROM),按位置分又可以分為片外存儲(chǔ)器和片內(nèi)存儲(chǔ)器 。
ROM51單片機(jī)通常包含只4KB的程序存儲(chǔ)器,而以PC作為地址指針,通過16位地址總線,最大可尋址216B即64KB的地址空間,所以一般進(jìn)行外部存儲(chǔ)器進(jìn)行拓展。
引腳EA}決定了程序存儲(chǔ)器的0000~0FFFH 4KB地址范圍在單片機(jī)內(nèi)部還是外部。當(dāng)EA=1時(shí),程序存儲(chǔ)器的地址分為片內(nèi)的0000~0FFFH 4KB地址范圍和片外程序存儲(chǔ)器的1000~FFFFH 60KB地址范圍;否則,當(dāng)EA=0時(shí),只能尋址外部程序存儲(chǔ)器,0000~FFFFH全部64KB地址空間都在片外。
系統(tǒng)復(fù)位后PC的內(nèi)容為0000H,也就是說單片機(jī)上電后都是從程序存儲(chǔ)器的0000H單元開始取指令執(zhí)行程序,一般在此地址單元設(shè)置轉(zhuǎn)移指令,使之轉(zhuǎn)向用戶主程序處。此外,0003~0023H單元被保留用作5個(gè)中斷服務(wù)程序的入口地址:
入口地址 所屬中斷0003H 外部中斷0入口地址
000BH 定時(shí)器0中斷入口地址
0013H 外部中斷1入口地址
001BH 定時(shí)器1中斷入口地址
0023H 串口中斷入口地址
故中斷服務(wù)程序個(gè)主程序一般都被放置在0030H單元以后。
RAM128B的內(nèi)部數(shù)據(jù)存儲(chǔ)器是用得最多的地址空間,所有的操作指令的操作數(shù)據(jù)只能在此地址空間或SFR中。
RAM區(qū)結(jié)構(gòu)如上圖。其中,00H~1FH共32個(gè)單元為工作寄存器區(qū),分為4組,每組8個(gè)單元組成通用寄存器,都用R0~R7表示??梢酝ㄟ^改變PSW的RS1和RS0、RS1兩位的狀態(tài)來選擇CPU當(dāng)前使用的工作寄存器組,如下表所示。這樣可以提高CPU的操作效率和響應(yīng)中斷的速度,利于現(xiàn)場的保護(hù)及恢復(fù)。
20H~2FH共16個(gè)字節(jié)128位組成位尋址區(qū),可用位尋址方式訪問,位地址為00H~7FH。位尋址區(qū)的位地址如下表:
最頂層的30H~7FH共80個(gè)單元為用戶RAM區(qū),作為堆?;蛘邤?shù)據(jù)緩存器。
普通51子系列單片機(jī)中,地址為00H~7FH的低128B區(qū)域?yàn)镽AM區(qū),而地址為80H~FFH的高128B區(qū)域即為SFR。增強(qiáng)型52子系列中,有地址為00H~FFH的256B的RAM,而SFR的地址和RAM的高128字節(jié)地址80H~FFH是重合的,需要通過不同的尋址方式來區(qū)分它們。
SFRSFR是專門用于控制、選擇、管理、存放單片機(jī)內(nèi)部各部分的工作方式、條件、狀態(tài)、結(jié)果的寄存器,不同的SFR用于管理不同的硬件模塊。
51單片機(jī)內(nèi)的21個(gè)SFR中,有5個(gè)是16位寄存器 ,11個(gè)可以進(jìn)行位尋址。它們的地址分布及功能如下表:
其中PSW用于存放程序運(yùn)行是的各種狀態(tài)信息,其各位定義如下:
位地址 D7H D6H D5H D4H D3H D2H D1H D0H定義 CY AC F0 RS1 RS0 OV F1 P
CY(Carry):進(jìn)位標(biāo)志位,運(yùn)算過程最高為產(chǎn)生進(jìn)位或借位,則CY=1。
AC(Assistant Carry):輔助進(jìn)位標(biāo)志位,運(yùn)算過程中低四位向高位有進(jìn)位或借位,則AC=1。
F0/F1:軟件標(biāo)志位,可作為用戶自定義的標(biāo)志位,由用戶置位或復(fù)位。
RS0和RS1(Register Select):RAM中的4組工作寄存器選擇位。
OV(Overflow):溢出標(biāo)志位,運(yùn)算過程中產(chǎn)生溢出,OV=1。
P(Parity):奇偶標(biāo)志位,執(zhí)行指令是會(huì)根據(jù)ACC中1的個(gè)數(shù)的奇偶自動(dòng)令P置位或清零,奇為1,偶為0;串行通信時(shí),可以由此位驗(yàn)證傳輸?shù)目煽啃浴?/p> 時(shí)鐘和復(fù)位
單片機(jī)內(nèi)部的時(shí)鐘信號(hào)用來提供單片機(jī)內(nèi)部各種操作的時(shí)間基準(zhǔn),復(fù)位操作使單片機(jī)內(nèi)的電路初始化。
時(shí)鐘電路、單位51單片機(jī)的時(shí)鐘信號(hào)通常由內(nèi)部振蕩或外部振蕩方式來獲得。接法如圖所示:
在XTAL1和XTAL2引腳外接晶體振蕩器或者陶瓷諧振器,即構(gòu)成內(nèi)部振蕩方式。晶振通常選用6、12或24MHz,單片機(jī)內(nèi)部有一個(gè)高增益反向放大器,外接晶振將構(gòu)成自激振蕩,產(chǎn)生振蕩時(shí)鐘脈沖,電容C1、C2可以穩(wěn)定振蕩頻率,電容值一般為5~30pF。
外部振蕩就是把已有的時(shí)鐘信號(hào)引入單片機(jī)內(nèi)。
單片機(jī)以晶振的振蕩周期(或外部輸入的時(shí)鐘周期)為最小的時(shí)序單位,片內(nèi)的各種微操作都以此周期為時(shí)序基準(zhǔn);振蕩頻率經(jīng)單片機(jī)內(nèi)的二分頻器分頻后形成狀態(tài)周期,所以,1個(gè)狀態(tài)周期包含2個(gè)振蕩周期;而6個(gè)狀態(tài)周期組成1個(gè)機(jī)器周期,所以,1個(gè)機(jī)器周期包含12個(gè)振蕩周期;執(zhí)行一條指令需要1~4個(gè)機(jī)器周期,這個(gè)時(shí)間便稱為指令周期。
例如,單片機(jī)外接12MHz的晶振時(shí):
振蕩周期=1fosc=112Mhz=0.0833us
狀態(tài)周期=2fosc=212Mhz=0.167us
機(jī)器周期=12fosc=1212Mhz=1us
指令周期=1?4個(gè)機(jī)器周期=1?4us
時(shí)序圖51單片機(jī)的指令執(zhí)行及存儲(chǔ)器讀取時(shí)序圖如下:
取指時(shí)序:
外部ROM讀時(shí)序:
外部RAM讀取時(shí)序:
復(fù)位電路當(dāng)51單片機(jī)的復(fù)位引腳RST出現(xiàn)兩個(gè)機(jī)器周期以上高電平時(shí),單片機(jī)即完成復(fù)位操作。復(fù)位操作通常有上電復(fù)位和開關(guān)復(fù)位兩種形式,接法如圖所示:
單片機(jī)復(fù)位后,PC=0000H,P0~P3=FFH,SP=07H,其他寄存器都回到初始的0狀態(tài)。
更新歷史:
* 2017.11.22 完成初稿
原文鏈接
評論