设置等待时间 |
CPU等待时间(机器周期) |
WT2 |
WT1 |
WT0 |
读操作 |
写操作 |
擦除操作 |
要求系统时钟 |
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组合情况如下:
从用户应用程序区(AP区)软件复位并切换到用户应用程序区(AP区)开始执行程序:
ISP_CONTR=00100000B,SWBS=0(选择AP区),SWRST=1(软复位)。
从系统ISP监控程序区软件复位并切换到用户应用程序区(AP区)开始执行程序:
ISP_CONTR=00100000B,SWBS=0(选择AP区),SWRST=1(软复位)。
从用户应用程序区(AP区)软件复位并切换到系统ISP监控程序区开始执行程序:
ISP_CONTR=01100000B,SWBS=1(选择ISP区),SWRST=1(软复位)。
从系统ISP监控程序区软件复位并切换到系统ISP监控程序区开始执行程序:
ISP_CONTR=01100000B,SWBS=1(选择ISP区),SWRST=1(软复位)。
本复位是整个系统复位,所有的特殊功能寄存器都会复位到初始值,I/O口也会被初始化。
用户应用程序区(AP区)指仅仅是用户自己编写的程序区。
ISP监控程序区ISP区是指芯片出厂时就已经固化在单片机内部的一段程序,STC单片机可以进行ISP串行下载程序,这就是因为芯片在出厂时已经在单片机内部固化了ISP引导码,程序首次上电时先会从ISP区开始执行代码,体现在实际实验中时,就是我们在下载程序时,先要点击下载软件界面上的下载,然后再开启单片机电源,当单片机检测到上位机有下载程序的需要时,便启用ISP下载功能给单片机下载程序。若经过短暂的时间没有检测到上位机有下载程序的需求,单片机便会从用户应用程序区(AP区)开始执行代码。
接下来我们通过一个例程,为大家演示如何使用STC单片机的软件复位功能实现运行中的程序突然复位。
【例】:在实验板上实现如下描述,在数码管前两位显示以秒递增数,到增加到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(); //调用初始化程序
while(1) //进入大循环
{
if(aa==20) //判断是否到了1S
{
miao++; //秒数加1
if(miao==60) //判断是否到了60秒
{
miao=0; //秒数清0
fen++; //分数加1
if(fen==60) //判断是否到了60分
{
fen=0; //分数到60则清0
}
n1=fen/10; //第一个数码管显示分的十位
n2=fen%10; //第二个数码管显示分的个位
n3=miao/10; //第三个数码管显示秒的十位
n4=miao%10; //第四个数码管显示秒的个位
}
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; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfe; //选通分的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n2]; //送分的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfd; //选通分的个位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n3]; //送秒的十位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xfb; //选通秒的十位
wela=0; //关位选
P0=0xff; //消隐
delay(1); //延时
dula=1; //开段选
P0=table[n4]; //送秒的个位
dula=0; //关段选
P0=0xff; //消隐
wela=1; //开位选
P0=0xf7; //选通秒的个位
wela=0; //关位选
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;”用软件复位到用户应用程序区(AP区),重新开始执行程序。
(3)从演示结果可看出,当数码管上的数字显示到“09”,再加一秒时,数字立即变成“00”,则说明程序复位从头开始执行了。