設(shè)置等待時間 |
CPU等待時間(機器周期) |
WT2 |
WT1 |
WT0 |
讀操作 |
寫操作 |
擦除操作 |
要求系統(tǒng)時鐘 |
0 |
1 |
1 |
6 |
30 |
5741 |
小于5MHz |
0 |
1 |
0 |
11 |
60 |
10942 |
小于10MHz |
0 |
0 |
1 |
22 |
120 |
21885 |
小于20MHz |
0 |
0 |
0 |
43 |
240 |
43769 |
小于40MHz |
SWBS與SWRST組合情況如下:
從用戶應用程序區(qū)(AP區(qū))軟件復位并切換到用戶應用程序區(qū)(AP區(qū))開始執(zhí)行程序:
ISP_CONTR=00100000B,SWBS=0(選擇AP區(qū)),SWRST=1(軟復位)。
從系統(tǒng)ISP監(jiān)控程序區(qū)軟件復位并切換到用戶應用程序區(qū)(AP區(qū))開始執(zhí)行程序:
ISP_CONTR=00100000B,SWBS=0(選擇AP區(qū)),SWRST=1(軟復位)。
從用戶應用程序區(qū)(AP區(qū))軟件復位并切換到系統(tǒng)ISP監(jiān)控程序區(qū)開始執(zhí)行程序:
ISP_CONTR=01100000B,SWBS=1(選擇ISP區(qū)),SWRST=1(軟復位)。
從系統(tǒng)ISP監(jiān)控程序區(qū)軟件復位并切換到系統(tǒng)ISP監(jiān)控程序區(qū)開始執(zhí)行程序:
ISP_CONTR=01100000B,SWBS=1(選擇ISP區(qū)),SWRST=1(軟復位)。
本復位是整個系統(tǒng)復位,所有的特殊功能寄存器都會復位到初始值,I/O口也會被初始化。
用戶應用程序區(qū)(AP區(qū))指僅僅是用戶自己編寫的程序區(qū)。
ISP監(jiān)控程序區(qū)ISP區(qū)是指芯片出廠時就已經(jīng)固化在單片機內(nèi)部的一段程序,STC單片機可以進行ISP串行下載程序,這就是因為芯片在出廠時已經(jīng)在單片機內(nèi)部固化了ISP引導碼,程序首次上電時先會從ISP區(qū)開始執(zhí)行代碼,體現(xiàn)在實際實驗中時,就是我們在下載程序時,先要點擊下載軟件界面上的下載,然后再開啟單片機電源,當單片機檢測到上位機有下載程序的需要時,便啟用ISP下載功能給單片機下載程序。若經(jīng)過短暫的時間沒有檢測到上位機有下載程序的需求,單片機便會從用戶應用程序區(qū)(AP區(qū))開始執(zhí)行代碼。
接下來我們通過一個例程,為大家演示如何使用STC單片機的軟件復位功能實現(xiàn)運行中的程序突然復位。
【例】:在實驗板上實現(xiàn)如下描述,在數(shù)碼管前兩位顯示以秒遞增數(shù),到增加到10時,利用STC單片機的軟件復位功能讓單片機復位。
程序代碼如下:
#include<reg51.h>
#define uchar unsigned char//宏定義
#define uint unsigned int
sbit dula=P2^6; //段控制位
sbit wela=P2^7; //位控制位
uchar miao,fen,aa,n1,n2,n3,n4;
uchar code table[]={ //顯示編碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z); //延時程序聲明
void init(void);//初始化程序聲明
void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //顯示程序聲明
void main() //主程序
{
init(); //調(diào)用初始化程序
while(1) //進入大循環(huán)
{
if(aa==20) //判斷是否到了1S
{
miao++; //秒數(shù)加1
if(miao==60) //判斷是否到了60秒
{
miao=0; //秒數(shù)清0
fen++; //分數(shù)加1
if(fen==60) //判斷是否到了60分
{
fen=0; //分數(shù)到60則清0
}
n1=fen/10; //第一個數(shù)碼管顯示分的十位
n2=fen%10; //第二個數(shù)碼管顯示分的個位
n3=miao/10; //第三個數(shù)碼管顯示秒的十位
n4=miao%10; //第四個數(shù)碼管顯示秒的個位
}
display(n1,n2,n3,n4);
}
}
}
void delay(uint z) //延時程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar n1 ,uchar n2,uchar n3,uchar n4)
{
dula=1; //開段選
P0=table[n1]; //送分的十位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xfe; //選通分的十位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時
dula=1; //開段選
P0=table[n2]; //送分的個位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xfd; //選通分的個位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時
dula=1; //開段選
P0=table[n3]; //送秒的十位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xfb; //選通秒的十位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時
dula=1; //開段選
P0=table[n4]; //送秒的個位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xf7; //選通秒的個位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時
}
void init(void)
{
}
void timer0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256; //求模
TL0=(65536-50000)%256; //求余
aa++;
}
分析:
(1)“sfr ISP_CONTR=0xe7;”定義ISP/IAP控制寄存器。
(2)“ISP_CONTR=0x20;”用軟件復位到用戶應用程序區(qū)(AP區(qū)),重新開始執(zhí)行程序。
(3)從演示結(jié)果可看出,當數(shù)碼管上的數(shù)字顯示到“09”,再加一秒時,數(shù)字立即變成“00”,則說明程序復位從頭開始執(zhí)行了。