找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 16782|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

stc89c52單片機(jī)的軟件復(fù)位(熱啟動(dòng))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1 發(fā)表于 2010-1-2 19:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

   用戶應(yīng)用程序在運(yùn)行過程中,有時(shí)會(huì)有特殊需求,需要實(shí)現(xiàn)單片機(jī)系統(tǒng)復(fù)位(熱啟動(dòng)之一),傳統(tǒng)的8051單片機(jī)由于硬件上未支持此功能,用戶必須用軟件模擬實(shí)現(xiàn),實(shí)現(xiàn)起來較麻煩。STC單片機(jī)增加了相應(yīng)的硬件功能,內(nèi)部的ISP/IAP控制寄存器ISP_CONTR便可以實(shí)現(xiàn)此功能。用戶只需簡(jiǎn)單的控制ISP_CONTR特殊功能寄存器的其中兩位SWBS和SWRST就可以實(shí)現(xiàn)系統(tǒng)復(fù)位。
ISP/IAP控制寄存器(ISP_CONTR)

STC單片機(jī)ISP/IAP控制寄存器在特殊功能寄存器中的字節(jié)地址為E7H,不能位尋址,該寄存器用來管理和ISP/IAP相關(guān)的功能設(shè)定及是否軟件復(fù)位等。單片機(jī)復(fù)位時(shí)該寄存器全部被清0。其各位的定義如表4.3.1所示。

 

表1 ISP/IAP控制寄存器(ISP_CONTR)

位序號(hào)

D7

D6

D5

D4

D3

D2

D1

D0

位符號(hào)

ISPEN

SWBS

SWRST

--

--

WT2

WT1

WT0

 

       ISPEN:ISP/IAP 功能允許位。0:禁止ISP/IAP編程改變Flash。1:允許編程改變Flash。

       SWBS:軟件選擇從用戶應(yīng)用程序區(qū)啟動(dòng)(0),還是從ISP程序區(qū)啟動(dòng)(1)。要與SWRST直接配合才可以實(shí)現(xiàn)。

       SWRST:0:不操作;1:產(chǎn)生軟件系統(tǒng)復(fù)位,硬件自動(dòng)清零。 

WT2、WT1、WT0:ISP/IAP編程時(shí)設(shè)定CPU等待的最長(zhǎng)時(shí)間。ISP/IAP編程時(shí)可對(duì)Flash進(jìn)行讀操作、寫操作、擦除操作,當(dāng)進(jìn)行這些操作時(shí),時(shí)鐘將被CPU鎖定只進(jìn)行這些操作,而不同的操作將會(huì)耗費(fèi)CPU不同的時(shí)間,這里我們通過人為設(shè)定可以給CPU一個(gè)最長(zhǎng)的等待時(shí)間,若在此時(shí)間段內(nèi)相應(yīng)的操作未完成,數(shù)據(jù)將丟失或錯(cuò)誤。以下給出芯片廠商推薦的等待時(shí)間關(guān)系表,如表3.4.2所示:

 

表2 ISP/IAP編程CPU等待時(shí)間參考表

設(shè)置等待時(shí)間

CPU等待時(shí)間(機(jī)器周期)

WT2

WT1

WT0

讀操作

寫操作

擦除操作

要求系統(tǒng)時(shí)鐘

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組合情況如下:

   從用戶應(yīng)用程序區(qū)(AP區(qū))軟件復(fù)位并切換到用戶應(yīng)用程序區(qū)(AP區(qū))開始執(zhí)行程序:

   ISP_CONTR=00100000B,SWBS=0(選擇AP區(qū)),SWRST=1(軟復(fù)位)。

   從系統(tǒng)ISP監(jiān)控程序區(qū)軟件復(fù)位并切換到用戶應(yīng)用程序區(qū)(AP區(qū))開始執(zhí)行程序:

    ISP_CONTR=00100000B,SWBS=0(選擇AP區(qū)),SWRST=1(軟復(fù)位)。

    從用戶應(yīng)用程序區(qū)(AP區(qū))軟件復(fù)位并切換到系統(tǒng)ISP監(jiān)控程序區(qū)開始執(zhí)行程序:

   ISP_CONTR=01100000B,SWBS=1(選擇ISP區(qū)),SWRST=1(軟復(fù)位)。

    從系統(tǒng)ISP監(jiān)控程序區(qū)軟件復(fù)位并切換到系統(tǒng)ISP監(jiān)控程序區(qū)開始執(zhí)行程序:

    ISP_CONTR=01100000B,SWBS=1(選擇ISP區(qū)),SWRST=1(軟復(fù)位)。

    本復(fù)位是整個(gè)系統(tǒng)復(fù)位,所有的特殊功能寄存器都會(huì)復(fù)位到初始值,I/O口也會(huì)被初始化。

    用戶應(yīng)用程序區(qū)(AP區(qū))指僅僅是用戶自己編寫的程序區(qū)。

    ISP監(jiān)控程序區(qū)ISP區(qū)是指芯片出廠時(shí)就已經(jīng)固化在單片機(jī)內(nèi)部的一段程序,STC單片機(jī)可以進(jìn)行ISP串行下載程序,這就是因?yàn)樾酒诔鰪S時(shí)已經(jīng)在單片機(jī)內(nèi)部固化了ISP引導(dǎo)碼,程序首次上電時(shí)先會(huì)從ISP區(qū)開始執(zhí)行代碼,體現(xiàn)在實(shí)際實(shí)驗(yàn)中時(shí),就是我們?cè)谙螺d程序時(shí),先要點(diǎn)擊下載軟件界面上的下載,然后再開啟單片機(jī)電源,當(dāng)單片機(jī)檢測(cè)到上位機(jī)有下載程序的需要時(shí),便啟用ISP下載功能給單片機(jī)下載程序。若經(jīng)過短暫的時(shí)間沒有檢測(cè)到上位機(jī)有下載程序的需求,單片機(jī)便會(huì)從用戶應(yīng)用程序區(qū)(AP區(qū))開始執(zhí)行代碼。

    接下來我們通過一個(gè)例程,為大家演示如何使用STC單片機(jī)的軟件復(fù)位功能實(shí)現(xiàn)運(yùn)行中的程序突然復(fù)位。

    【例】:在實(shí)驗(yàn)板上實(shí)現(xiàn)如下描述,在數(shù)碼管前兩位顯示以秒遞增數(shù),到增加到10時(shí),利用STC單片機(jī)的軟件復(fù)位功能讓單片機(jī)復(fù)位。

         程序代碼如下:

 

#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); //延時(shí)程序聲明
void init(void);//初始化程序聲明
void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //顯示程序聲明


void main() //主程序
{
init(); //調(diào)用初始化程序
while(1) //進(jìn)入大循環(huán)
{
if(aa==20) //判斷是否到了1S
{
miao++; //秒數(shù)加1
if(miao==60) //判斷是否到了60秒
{
miao=0; //秒數(shù)清0
fen++; //分?jǐn)?shù)加1
if(fen==60) //判斷是否到了60分
{
fen=0; //分?jǐn)?shù)到60則清0
}


n1=fen/10; //第一個(gè)數(shù)碼管顯示分的十位
n2=fen%10; //第二個(gè)數(shù)碼管顯示分的個(gè)位
n3=miao/10; //第三個(gè)數(shù)碼管顯示秒的十位
n4=miao%10; //第四個(gè)數(shù)碼管顯示秒的個(gè)位
}
display(n1,n2,n3,n4);
}

}
}

void delay(uint z) //延時(shí)程序
{
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); //延時(shí)

dula=1; //開段選
P0=table[n2]; //送分的個(gè)位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xfd; //選通分的個(gè)位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時(shí)

dula=1; //開段選
P0=table[n3]; //送秒的十位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xfb; //選通秒的十位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時(shí)


dula=1; //開段選
P0=table[n4]; //送秒的個(gè)位
dula=0; //關(guān)段選
P0=0xff; //消隱
wela=1; //開位選
P0=0xf7; //選通秒的個(gè)位
wela=0; //關(guān)位選
P0=0xff; //消隱
delay(1); //延時(shí)
}

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;”用軟件復(fù)位到用戶應(yīng)用程序區(qū)(AP區(qū)),重新開始執(zhí)行程序。

   (3)從演示結(jié)果可看出,當(dāng)數(shù)碼管上的數(shù)字顯示到“09”,再加一秒時(shí),數(shù)字立即變成“00”,則說明程序復(fù)位從頭開始執(zhí)行了。

[此貼子已經(jīng)被作者于2010-1-2 19:47:54編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:74719 發(fā)表于 2015-5-4 10:26 | 只看該作者
咋個(gè)沒看見ISP_CONTR使用???
回復(fù)

使用道具 舉報(bào)

板凳
ID:445069 發(fā)表于 2019-3-7 11:53 | 只看該作者
STC51 軟復(fù)位,是遠(yuǎn)程升級(jí)程序所必需的。
回復(fù)

使用道具 舉報(bào)

地板
ID:294123 發(fā)表于 2020-5-15 21:16 | 只看該作者
學(xué)到了,原來51系列還有這么多知識(shí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表