AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得AT89S52在眾多嵌入式控制應用系統中得到廣泛應用。
AT89S52主要性能:
1、與MCS-51單片機產品兼容;
2、8K字節在系統可編程Flash存儲器;
3、1000次擦寫周期;
4、全靜態操作:0Hz-33MHz;
5、三級加密程序存儲器;
6、32個可編程I/O口線;
7、三個16位定時器/計數器;
8、6個中斷源;
9、全雙工UART串行通道;
10、低功耗空閑和掉電模式;
11、掉電后中斷可喚醒;
12、看門狗定時器;
13、雙數據指針;
14、掉電標識符。
? ? ? ? AT89S52單片機組成結構:
AT89S52引腳結構:
AT89S52 具有PDIP、PLCC、TQFP3 種封裝形式以適用于不同的使用場合。各封裝引腳定義如下圖所示。
AT89S52各引腳的功能:
下面簡單介紹AT89S52各引腳的功能,更多信息請查閱Atmel公司的技術文檔。 VCC:電源。 GND:地。
P0 口:P0 口是一個8 位漏極開路的雙向I/O 口。作為輸出口,每位能驅動8 個TTL邏輯電平。對P0 端口寫“1”時,引腳用做高阻抗輸入。當訪問外部程序和數據存儲器時,P0 口也被作為低8 位地址/數據復用。在這種模式下,P0 具有內部上拉電阻。在Flash編程時,P0 口也用來接收指令字節;在程序校驗時,輸出指令字節。在程序校驗時,需要外部上拉電阻。
P1 口:P1 口是一個具有內部上拉電阻的8 位雙向I/O 口,P1 輸出緩沖器能驅動4 個TT
邏輯電平。當對P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。當作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。此 外,P1.0 和P1.2 分別作為定時器/計數器2 的外部計數輸入(P1.0/T2)和定時器/計數器2的觸發輸入(P1.1/T2EX),具體如表1-1 所示。在Flash編程和校驗時,P1口接收低8 位地址字節。
P2 口:P2 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4 個TT邏輯電平。對P2 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。當作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。在訪問
表1口部分管腳的第二功能
外部程序存儲器或用16 位地址讀取外部數據存儲器(如執行MOVX @DPTR)時,P2 口送出高8 位地址。在這種應用中,P2 口使用很強的內部上拉發送1。在使用8 位地址(如MOVX @RI)訪問外部數據存儲器時,P2口輸出P2鎖存器的內容。在Flash編程和校驗時,P2 口也接收高8位地址字節和一些控制信號。 P3 口:P3 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4 個TT
邏輯電平。對P3 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。當作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。P3 口也作為AT89S52 特殊功能(第二功能)使用,如表1-2所示。在Flash編程和校驗時,P3口也接收一些控制信號。
表2 P3口部分管腳的第二功能
RST: 復位輸入。在晶振工作時,RST腳持續兩個機器周期高電平將使單片機復位。看門狗計時完成后,RST 腳輸出96 個晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO 位可以使此功能無效。在DISRTO 默認狀態下,復位高電平有效。
ALE/PROG:地址鎖存控制信號(ALE)在訪問外部程序存儲器時,鎖存低8 位地址的輸出脈沖。在Flash編程時,此引腳(PROG)也用做編程輸入脈沖。 在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE 脈沖將會跳過。如果需要,通過將地址為8EH的SFR的第0 位置“1”,ALE 操作將無效。這一位置“1”,ALE 僅在執行MOVX 或MOVC指令時有效。否則,ALE 將被微弱拉高。這個ALE 使能標志位(地址為8EH的SFR的第0 位)的設置對微控制器處于外部執行模式下無效。
PSEN:外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。當AT89S52從外部程序存儲器執行外部代碼時,PSEN 在每個機器周期被激活兩次,而在訪問外部數據存儲器時,PSEN將不被激活。
EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH 的外部程序存儲器讀取指令,EA必須接GND。為了執行內部程序指令,EA應該接VCC。在Flash編程期間,EA也接收12伏VPP電壓。
XTAL1:振蕩器反相放大器和內部時鐘發生電路的輸入端。 XTAL2:振蕩器反相放大器的輸出端。
AT89S51單片機看門狗定時器的使用
T89S51看門狗定時器由一個14位定時器及WDTRST(地址為6AH)寄存器構成。開啟看門狗定時器后,14位定時器會自動計數,每16384(214)個機器周期溢出一次,并產生一個高電平復位信號,使系統復位。對于12MHZ的時鐘脈沖每16384us(約0.016s)產生一個復位信號。
如果啟動看門狗定時器,當系統超過0.016s沒有動作(程序跑飛),看門狗定時器自動復位,讓系統歸復于正常運作狀態。為了系統既能正常工作又不會出現死機(程序跑飛),在0.016s內必須喂狗一次,即對看門狗定時器進行復位,看門狗的啟動和復位的方法是一樣的。
在匯編語言中啟動或復位看門狗定時器的命令如下。
MOV 6AH, #1EH
MOV 6AH, #0E1H
若要在C語言中使用看門狗定時器功能,由于reg51.h中并沒有聲明WDTRST寄存器,所以必須先聲明WDTRST寄存器。
Sfr WDTRST=0xa6;
進行聲明以后可以用一下命令啟用或復位看門狗定時器。
WDTRST=0x1e;
WDTRST=0xe1;
下面用一個C語言進行說明
#include 《reg51.h》
Sfr WDTRST=0xa6;
Main()
{ ……;
WDTRST=0x1e;
WDTRST=0xe1;
While(1)
{ WDTRST=0x1e;
WDTRST=0xe1;
……;
……; 這部分執行時間必須少于0.016s } }
以上程序中系統在做一個無限循環的動作,通過看門狗定時器可以防止程序在執行過程中跑飛。因為只要程序一跑出while()循環,看門狗定時器溢出以后得不到復位,所以自動復位系統,讓程序從mian()開始重新運行。
但是在C語言應用看門狗定時器也特別小心,一定要在看門狗定時器啟動后的0.016s內喂一次狗。
注:在匯編語言中每條指令的執行時間都是可以準確算出來,下面是一個匯編語言編寫的8路led向左移程序應用看門狗定時器的實例。
ORG 00H 1 1us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
START: MOV A,#0FEH 4 1us
LOOP: MOV P2,A 5 1us
CALL DELAY 6 2us
RL A 7 2us
JMP LOOP 8 2us
DELAY: MOV R7,#200 9 1us
DV: MOV R6,#250 10 1us
DJNZ R6,$ 11 2us
MOV 0A6H,#1EH 2 1us
MOV 0A6H,#0E1H 3 1us
DJNZ R7,DV 12 2us
RET 13 2us
END 14 2us
在程序的每個行標號后面是12MHZ時鐘脈沖下的指令執行時間,為了讓系統正常工作且不死機將看門狗定時器啟動指令放在1和2之間,將看門狗定時器復位指令放在11和12之間。
現在一起通過執行時間來計算看門狗定時器復位指令放在那里比較合適。
程序執行順序:1 2 3 4 5 6 9 10 11 12 9 10 ……
運行時間: 1us 1 1 1 1 2 1 1 2*250 us (1+250*2+2)*199
程序運行到11的時候用的時間是2*250+6=506us《16384us
程序運行到12的時候用的時間是506+(1+250*2+2)*199=10063us》16384us
從比較結果可以看出,看門狗定時器的喂狗指令必須放在11和12之間。可以想一下放在12和13之間會是什么效果。
評論
查看更多