AT89C51是一種帶4K字節(jié)FLASH存儲(chǔ)�(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電�、高性能CMOS 8�微處理器,俗�(chēng)單片�(jī)�
AT89C51是一種帶4K字節(jié)FLASH存儲(chǔ)器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電�、高性能CMOS 8位微處理�,俗�(chēng)單片�(jī)。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器的單片�(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反�(fù)擦除1000�。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技�(shù)制�,與工業(yè)�(biāo)�(zhǔn)的MCS-51指令集和輸出管腳相兼�。由于將多功�8位CPU和閃速存�(chǔ)器組合在單�(gè)芯片�,ATMEL的AT89C51是一種高效微控制�,AT89C051是它的一種精�(jiǎn)版本。AT89C51單片�(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。外形及引腳排列如圖所��
�(xiàn)在AT89S51/52已經(jīng)取代了AT89C51/52�
與MCS-51 兼容
4K字節(jié)可編程FLASH存儲(chǔ)�
壽命�1000�(xiě)/擦循�(huán)
�(shù)�(jù)保留�(shí)間:10�
全靜�(tài)工作�0Hz-24MHz
三級(jí)程序存儲(chǔ)器鎖�
128×8位內(nèi)部RAM
32可編程I/O�
兩�(gè)16位定�(shí)�/�(jì)�(shù)�
5�(gè)中斷�
可編程串行通道
低功耗的閑置和掉電模�
片內(nèi)振蕩器和�(shí)鐘電�
AT89C51 提供以下�(biāo)�(zhǔn)功能�4k 字節(jié)Flash 閃速存�(chǔ)器,128字節(jié)�(nèi)部RAM�32 �(gè)I/O 口線,兩�(gè)16位定�(shí)/�(jì)�(shù)器,一�(gè)5向量?jī)�?jí)中斷�(jié)�(gòu),一�(gè)全雙工串行通信口,片內(nèi)振蕩器及�(shí)鐘電�。同�(shí),AT89C51可降�0Hz的靜�(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模�??臻e方式停止CPU的工�,但允許RAM,定�(shí)/�(jì)�(shù)�,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的�(nèi)�,但振蕩器停止工作并禁止其它所有部件工作直到下一�(gè)硬件�(fù)位�
VCC:供電電��
GND:接地�
P0口:P0口為一�(gè)8位漏�(jí)�(kāi)路雙向I/O�,每腳可吸收8TTL門(mén)電流。當(dāng)P0口的管腳次寫(xiě)1�(shí),被定義為高阻輸�。P0能夠用于外部程序�(shù)�(jù)存儲(chǔ)�,它可以被定義為�(shù)�(jù)/地址的低八位。在FIASH編程�(shí),P0 口作為原碼輸入口,當(dāng)FIASH�(jìn)行校�(yàn)�(shí),P0輸出原碼,此�(shí)P0外部必須接上拉電��
P1口:P1口是一�(gè)�(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸�4TTL門(mén)電流。P1口管腳寫(xiě)�1�,被�(nèi)部上拉為�,可用作輸入,P1口被外部下拉為低電平�(shí),將輸出電流,這是由于�(nèi)部上拉的緣故。在FLASH編程和校�(yàn)�(shí),P1口作為低八位地址接收�
P2口:P2口為一�(gè)�(nèi)部上拉電阻的8位雙向I/O�,P2口緩沖器可接收,輸出4�(gè)TTL門(mén)電流,當(dāng)P2口被�(xiě)�1”時(shí),其管腳被內(nèi)部上拉電阻拉�,且作為輸入。并因此作為輸入�(shí),P2口的管腳被外部拉�,將輸出電流。這是由于�(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部�(shù)�(jù)存儲(chǔ)器�(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址�1”時(shí),它利用�(nèi)部上拉優(yōu)�(shì),當(dāng)�(duì)外部八位地址�(shù)�(jù)存儲(chǔ)器�(jìn)行讀�(xiě)�(shí),P2口輸出其特殊功能寄存器的�(nèi)�。P2口在FLASH編程和校�(yàn)�(shí)接收高八位地址信號(hào)和控制信�(hào)�
P3口:P3口管腳是8�(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸�4�(gè)TTL門(mén)電流。當(dāng)P3口寫(xiě)入�1”后,它們被�(nèi)部上拉為高電平,并用作輸�。作為輸�,由于外部下拉為低電�,P3口將輸出電流(ILL)這是由于上拉的緣��
P3口也可作為AT89C51的一些特殊功能口,如下表所示:
口管� 備選功能
P3.0 RXD(串行輸入口�
P3.1 TXD(串行輸出口�
P3.2 /INT0(外部中�0�
P3.3 /INT1(外部中�1�
P3.4 T0(計(jì)�(shí)�0外部輸入�
P3.5 T1(計(jì)�(shí)�1外部輸入�
P3.6 /WR(外部數(shù)�(jù)存儲(chǔ)器寫(xiě)選通)
P3.7 /RD(外部數(shù)�(jù)存儲(chǔ)器讀選通)
P3口同�(shí)為閃爍編程和編程校驗(yàn)接收一些控制信�(hào)�
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩�(gè)�(jī)器周期的高電平時(shí)間�
ALE/PROG:當(dāng)訪問(wèn)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的低位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率�1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每�(dāng)用作外部�(shù)�(jù)存儲(chǔ)器時(shí),將跳過(guò)一�(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此�(shí)� ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另�,該引腳被略微拉高。如果微處理器在外部�(zhí)行狀�(tài)ALE禁止,置位無(wú)��
/PSEN:外部程序存�(chǔ)器的選通信�(hào)。在由外部程序存�(chǔ)器取指期�,每�(gè)�(jī)器周期兩�/PSEN有效。但在訪�(wèn)外部�(shù)�(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)�
/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存�(chǔ)�。注意加密方�1�(shí)�/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平�(shí),此間內(nèi)部程序存�(chǔ)�。在FLASH編程期間,此引腳也用于施�12V編程電源(VPP��
XTAL1:反向振蕩放大器的輸入及�(nèi)部時(shí)鐘工作電路的輸入�
XTAL2:來(lái)自反向振蕩器的輸��
振蕩器特�:
XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩�。石晶振蕩和陶瓷振蕩均可采用。如采用外部�(shí)鐘源�(qū)�(dòng)器件,XTAL2�(yīng)不接。有余輸入至�(nèi)部時(shí)鐘信�(hào)要通過(guò)一�(gè)二分頻觸�(fā)�,因此對(duì)外部�(shí)鐘信�(hào)的脈寬無(wú)任何要求,但必須保證脈沖的高低電平要求的寬度�
整�(gè)PEROM陣列和三�(gè)鎖定位的電擦除可通過(guò)正確的控制信�(hào)組合,并保持ALE管腳處于低電�10ms �(lái)完成。在芯片擦操作中,代碼陣列全被寫(xiě)�1”且在任何非空存�(chǔ)字節(jié)被重�(fù)編程以前,該操作必須被執(zhí)��
此外,AT89C51�(shè)有穩(wěn)�(tài)邏輯,可以在低到零頻率的條件下靜�(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式�,CPU停止工作。但RAM,定�(shí)�,計(jì)�(shù)�,串口和中斷系統(tǒng)仍在工作。在掉電模式�,保存RAM的內(nèi)容并且凍�(jié)振蕩�,禁止所用其他芯片工作,直到下一�(gè)硬件�(fù)位為��
串口通訊
單片�(jī)的結(jié)�(gòu)和特殊寄存器,這是你編�(xiě)軟件的關(guān)鍵。至于串口通信需要用到那些特殊功能寄存器�,它們是SCON,TCON,TMOD,SCON�,各代表什么含義呢�
SBUF�(shù)�(jù)緩沖寄存器這是一�(gè)可以直接尋址的串行口�(zhuān)用寄存器。有朋友這樣�(wèn)起過(guò)“為何在串行口收�(fā)�,都只是使用到同一�(gè)寄存器SBUF?而不是收�(fā)各用一�(gè)寄存�?!睂?shí)際上SBUF 包含了兩�(gè)�(dú)立的寄存器,一�(gè)是發(fā)送寄�,另一�(gè)是接收寄存器,但它們都共同使用同一�(gè)尋址地址�99H。CPU 在讀SBUF �(shí)�(huì)指到接收寄存�,在�(xiě)�(shí)�(huì)指到�(fā)送寄存器,而且接收寄存器是雙緩沖寄存器,這樣可以避免接收中斷�(méi)有及�(shí)的被響應(yīng),數(shù)�(jù)�(méi)有被取走,下一幀�(shù)�(jù)已到�(lái),而造成的數(shù)�(jù)重疊�(wèn)�。發(fā)送器則不需要用到雙緩沖,一般情況下我�?cè)�?xiě)�(fā)送程序時(shí)也不必用到發(fā)送中斷去外理�(fā)送數(shù)�(jù)。操作SBUF寄存器的方法則很�(jiǎn)�,只要把這�(gè)99H 地址用關(guān)鍵字sfr定義為一�(gè)變量就可以對(duì)其�(jìn)行讀�(xiě)操作�,如sfr SBUF = 0x99;�(dāng)然你也可以用其它的名�(chēng)。通常在標(biāo)�(zhǔn)的reg51.h 或at89x51.h 等頭文件中已�(duì)其做了定�,只要用#include 引用就可以了�
SCON 串行口控制寄存器通常在芯片或�(shè)備中為了�(jiān)視或控制接口狀�(tài),都�(huì)引用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存�。它的尋址地址�98H,是一�(gè)可以位尋址的寄存器,作用就是監(jiān)視和控制51 芯片串行口的工作狀�(tài)�51 芯片的串口可以工作在幾�(gè)不同的工作模式下,其工作模式的設(shè)置就是使用SCON 寄存�。它的各�(gè)位的具體定義如下�
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 為串行口工作模式�(shè)置位,這樣兩位可以�(duì)�(yīng)�(jìn)行四種模式的�(shè)�。串行口工作模式�(shè)��
SM0 SM1 模式 功能 波特�
0 0 0 同步移位寄存� fosc/12
0 1 1 8位UART 可變
1 0 2 9位UART fosc/32 或fosc/64
1 1 3 9位UART 可變
在這里只說(shuō)明最常用的模�1,其它的模式也就一一略過(guò),有興趣的朋友可以找相關(guān)的硬件資料查�。表中的fosc 代表振蕩器的頻率,也就是晶振的頻�。UART �(Universal Asynchronous Receiver)的英文縮寫(xiě)�
SM2 在模�2、模�3 中為多處理機(jī)通信使能�。在模式0 中要求該位為0�
REM 為允許接收位,REM �1 �(shí)串口允許接收,置0 �(shí)禁止接收。REM 是由軟件置位或清�。如果在一�(gè)電路中接收和�(fā)送引腳P3.0,P3.1 都和上位�(jī)相連,在軟件上有串口中斷處理程�,當(dāng)要求在處理某�(gè)子程序時(shí)不允許串口被上位�(jī)�(lái)的控制字符產(chǎn)生中�,那么可以在這�(gè)子程序的�(kāi)始處加入REM=0 �(lái)禁止接收,在子程序結(jié)束處加入REM=1 再次打開(kāi)串口接收。大家也可以用上面的�(shí)際源碼加入REM=0 �(lái)�(jìn)行實(shí)�(yàn)�
TB8 �(fā)送數(shù)�(jù)�8,在模式2 �3 是要�(fā)送的�9 �。該位可以用軟件根據(jù)需要置位或清除,通常這位在通信�(xié)議中做奇偶位,在多處理機(jī)通信中這一位則用于表示是地址幀還是�(shù)�(jù)幀�
RB8 接收�(shù)�(jù)�8,在模式2 �3 是已接收�(shù)�(jù)的第9 �。該位可能是奇偶位,地址/�(shù)�(jù)�(biāo)�(shí)�。在模式0 中,RB8 為保留位�(méi)有被使用。在模式1 中,�(dāng)SM2=0,RB8 是已接收�(shù)�(jù)的停止位�
TI �(fā)送中斷標(biāo)�(shí)�。在模式0,發(fā)送完�8 位數(shù)�(jù)�(shí),由硬件置位。其它模式中則是在發(fā)送停止位之初,由硬件置位。TI 置位�,申�(qǐng)中斷,CPU 響應(yīng)中斷�,發(fā)送下一幀�(shù)�(jù)。在任何模式�,TI 都必須由軟件�(lái)清除,也就是�(shuō)在數(shù)�(jù)�(xiě)入到SBUF �,硬件發(fā)送數(shù)�(jù),中斷響�(yīng)(如中斷打開(kāi)�,這時(shí)TI=1,表明發(fā)送已完成,TI 不會(huì)由硬件清�,所以這時(shí)必須用軟件對(duì)其清��
RI 接收中斷�(biāo)�(shí)�。在模式0,接收第8 位結(jié)束時(shí),由硬件置位。其它模式中則是在接收停止位的半中間,由硬件置位。RI=1,申�(qǐng)中斷,要求CPU 取走�(shù)�(jù)。但在模�1 �,SM2=1�(shí),當(dāng)未收到有效的停止�,則不會(huì)�(duì)RI 置位。同樣RI 也必須要靠軟件清�。常用的串口模式1 是傳�10 �(gè)位的�1 位起始位�0,8 位數(shù)�(jù)�,低位在��1 位停止位�1。它的波特率是可變的,其速率是取決于定時(shí)�1 或定�(shí)�2 的定�(shí)值(溢出速率�。AT89C51 和AT89C2051 �51 系列芯片只有兩�(gè)定時(shí)�,定�(shí)�0 和定�(shí)�1,而定�(shí)�2�89C52 系列芯片才有��
波特率在使用串口做通訊�(shí),一�(gè)很重要的參數(shù)就是波特�,只有上下位�(jī)的波特率一樣時(shí)才可以�(jìn)行正常通訊。波特率是指串行端口每秒�(nèi)可以傳輸?shù)牟ㄌ匚粩?shù)。有一些初�(xué)的朋友認(rèn)為波特率是指每秒傳輸?shù)淖止?jié)�(shù),如�(biāo)�(zhǔn)9600 �(huì)被誤�(rèn)為每秒種可以傳�9600�(gè)字節(jié),而實(shí)際上它是指每秒可以傳�9600 �(gè)二�(jìn)�,而一�(gè)字節(jié)�8 �(gè)二�(jìn)�,如用串口模�1 �(lái)傳輸那么加上起始位和停止�,每�(gè)�(shù)�(jù)字節(jié)就要占用10 �(gè)二�(jìn)��9600 波特率用模式1 傳輸�(shí),每秒傳�?shù)淖止?jié)�(shù)�9600÷10=960 字節(jié)�51 芯片的串口工作模�0的波特率是固定的,為fosc/12,以一�(gè)12M 的晶振來(lái)�(jì)�,那么它的波特率可以�(dá)�1M。模�2 的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決于PCON 寄存器中的SMOD�,如SMOD �0,波特率為focs/64,SMOD �1,波特率為focs/32。模�1 和模�3 的波特率是可變的,取決于定時(shí)�1 �2�52 芯片)的溢出速率。那么我�?cè)趺慈�?jì)算這兩�(gè)模式的波特率�(shè)置時(shí)相關(guān)的寄存器的值呢?可以用以下的公式去�(jì)��
波特�=�2SMOD÷32)×定�(shí)�1 溢出速率
上式中如�(shè)置了PCON 寄存器中的SMOD 位為1 �(shí)就可以把波特率提�2 �。通常�(huì)使用定時(shí)�1 工作在定�(shí)器工作模�1下,這時(shí)定時(shí)值中的TL1 做為�(jì)�(shù),TH1 做為自動(dòng)重裝� ,這�(gè)定時(shí)模式�,定�(shí)器溢出后,TH1 的值會(huì)自動(dòng)裝載到TL1,再次開(kāi)始計(jì)�(shù),這樣可以不用軟件去干�(yù),使得定�(shí)更準(zhǔn)�。在這�(gè)定時(shí)模式1下定�(shí)�1 溢出速率的計(jì)算公式如下:
溢出速率=(計(jì)�(shù)速率�/(256-TH1)
上式中的“計(jì)�(shù)速率”與所使用的晶體振蕩器頻率有關(guān),在51 芯片中定�(shí)器啟�(dòng)后會(huì)在每一�(gè)�(jī)器周期使定時(shí)寄存器TH 的值增加一,一�(gè)�(jī)器周期等于十二�(gè)振蕩周期,所以可以得�51 芯片的計(jì)�(shù)速率為晶體振蕩器頻率�1/12,一�(gè)12M 的晶振用�51 芯片上,那么51 的計(jì)�(shù)速率就為1M。通常�11.0592M 晶體是為了得到標(biāo)�(zhǔn)的無(wú)誤差的波特率,那么為何呢?計(jì)算一下就知道�。如我們要得到9600 的波特率,晶振為11.0592M �12M,定�(shí)�1 為模�2,SMOD �(shè)�1,分別看看那所要求的TH1 為何�。代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1�249.49
上面的計(jì)算可以看出使�12M 晶體的時(shí)候計(jì)算出�(lái)的TH1 不為整數(shù),而TH1 的值只能取整數(shù),這樣它就�(huì)有一定的誤差存在不能�(chǎn)生精確的9600 波特�。當(dāng)然一定的誤差是可以在使用中被接受�,就算使�11.0592M 的晶體振蕩器也會(huì)因晶體本身所存在的誤差使波特率產(chǎn)生誤�,但晶體本身的誤差對(duì)波特率的影響是十分之小的,可以忽略不�(jì)�
51系列單片�(jī)DIP封裝�
圖一系列單片�(jī)DIP封裝圖給出了雙列直插式封�(DIP. Dualln-line Package), DIP封裝與MCS一51系列單片�(jī)的引腳完全兼�,可互換使�。[1]
CMOS 工藝制造的低功耗芯片也采用塑封方型扁平式封�(PQFP, Plastic Quad Flat Package)和塑封有引線芯片載體封簇(PLCC, Plastic Leaded Chip Carrier)形式.這兩種封裝采�44�(gè)引腳,其中4�(gè)引腳不用,其引腳排列如圖二51系列單片�(jī)PQFP和PLCC封裝��