用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。STC单片机增加了相应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能。用户只需简单的控制ISP_CONTR特殊功能寄存器的其中两位SWBS和SWRST就可以实现系统复位。 
ISP/IAP控制寄存器(ISP_CONTR)

STC单片机ISP/IAP控制寄存器在特殊功能寄存器中的字节地址为E7H,不能位寻址,该寄存器用来管理和ISP/IAP相关的功能设定及是否软件复位等。单片机复位时该寄存器全部被清0。其各位的定义如表4.3.1所示。

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

位序号

D7

D6

D5

D4

D3

D2

D1

D0

位符号

ISPEN

SWBS

SWRST

--

--

WT2

WT1

WT0

ISPEN:ISP/IAP 功能允许位。0:禁止ISP/IAP编程改变Flash。1:允许编程改变Flash。

SWBS:软件选择从用户应用程序区启动(0),还是从ISP程序区启动(1)。要与SWRST直接配合才可以实现。

SWRST:0:不操作;1:产生软件系统复位,硬件自动清零。

WT2、WT1、WT0:ISP/IAP编程时设定CPU等待的最长时间。ISP/IAP编程时可对Flash进行读操作、写操作、擦除操作,当进行这些操作时,时钟将被CPU锁定只进行这些操作,而不同的操作将会耗费CPU不同的时间,这里我们通过人为设定可以给CPU一个最长的等待时间,若在此时间段内相应的操作未完成,数据将丢失或错误。以下给出芯片厂商推荐的等待时间关系表,如表3.4.2所示:

表2 ISP/IAP编程CPU等待时间参考表

设置等待时间

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^; //段控制位
sbit wela=P2^; //位控制位
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(){ //进入大循环
if(aa==){ //判断是否到了1S
miao++; //秒数加1
if(miao==){ //判断是否到了60秒
miao=; //秒数清0
fen++; //分数加1
if(fen==){ //判断是否到了60分
fen=; //分数到60则清0
}
n1=fen/; //第一个数码管显示分的十位
n2=fen%; //第二个数码管显示分的个位
n3=miao/; //第三个数码管显示秒的十位
n4=miao%; //第四个数码管显示秒的个位
}
display(n1,n2,n3,n4);
}
}
} void delay(uint z){ //延时程序
uint x,y;
for(x=z;x>;x--)
for(y=;y>;y--);
} void display(uchar n1 ,uchar n2,uchar n3,uchar n4) {
dula=; //开段选
P0=table[n1]; //送分的十位
dula=; //关段选
P0=0xff; //消隐
wela=; //开位选
P0=0xfe; //选通分的十位
wela=; //关位选
P0=0xff; //消隐
delay(); //延时 dula=; //开段选
P0=table[n2]; //送分的个位
dula=; //关段选
P0=0xff; //消隐
wela=; //开位选
P0=0xfd; //选通分的个位
wela=; //关位选
P0=0xff; //消隐
delay(); //延时 dula=; //开段选
P0=table[n3]; //送秒的十位
dula=; //关段选
P0=0xff; //消隐
wela=; //开位选
P0=0xfb; //选通秒的十位
wela=; //关位选
P0=0xff; //消隐
delay(); //延时 dula=; //开段选
P0=table[n4]; //送秒的个位
dula=; //关段选
P0=0xff; //消隐
wela=; //开位选
P0=0xf7; //选通秒的个位
wela=; //关位选
P0=0xff; //消隐
delay(); //延时
} void init(void){ } void timer0(void) interrupt using {
TH0=(-)/; //求模
TL0=(-)%; //求余
aa++;
}

分析:

  (1)“sfr ISP_CONTR=0xe7;”定义ISP/IAP控制寄存器。

  (2)“ISP_CONTR=0x20;”用软件复位到用户应用程序区(AP区),重新开始执行程序。

  (3)从演示结果可看出,当数码管上的数字显示到“09”,再加一秒时,数字立即变成“00”,则说明程序复位从头开始执行了。

单片机成长之路(51基础篇) - 004 STC89C52MCU 软件实现系统复位的更多相关文章

  1. 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二

    本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...

  2. 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)

    本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别

    STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...

  5. Sass进阶之路,之一(基础篇)

    Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...

  6. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  7. C++自学成长之路(第一篇)

    今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...

  8. 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字

    标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语 ...

  9. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

随机推荐

  1. 深度学习中的batch_size,iterations,epochs等概念的理解

    在自己完成的几个有关深度学习的Demo中,几乎都出现了batch_size,iterations,epochs这些字眼,刚开始我也没在意,觉得Demo能运行就OK了,但随着学习的深入,我就觉得不弄懂这 ...

  2. Kafka 概念、单机搭建与使用

    目录 Kafka 概念.单机搭建与使用 基本概念介绍 Topic Producer Consumer Kafka单机配置,一个Broker 环境: 配置zookeeper 配置Kafka 使用Kafk ...

  3. Docker 搭建 Tomcat + Mysql

    Docker 搭建 Tomcat + Mysql 准备 虚拟机 虚拟机安装Docker 在纯净的Centos镜像上搭建 Centos镜像准备 虚拟机上拉取 Centos 镜像: docker pull ...

  4. 有关python 函数参数

    # def foo(x):# print(x)### foo(1)# foo('a')# foo({'a':2}) #形参与实参:# def foo(x,y): #x=1,y=2# return x+ ...

  5. Django——photo

    要点: models 图片类型文件要使用models.ImageField(upload='文件夹名') 普通文件使用FileField 时间类型使用DatetimeField(auto_now_ad ...

  6. JS 单体内置对象

    内置对象: 由ECMAScript提供的.不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了. 不必由开发人员显式地实例化内置对象 比如: Object Array Str ...

  7. ajax请求json中的数据

    在这里不多说,直接可以运行代码看效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 改变下blog思维

    自言自语 总是希望我写出来的东西都是精品或者尽我的努力使其接近精品,所以写一个就会消耗不少时间. 但是进来实在太忙,就没办法写:以至于断更了一大段时间.所以从现在开始记录一些很简小的东西直到我又开始有 ...

  9. 通过pip安装python web

    提示 No module named 'utils' 我就pip install utils 提示 No module named 'db' 然后我就 pip install db 报错 No mod ...

  10. 安装 VS2017 的正确姿势

    自从装了长城带宽,我的肠子就变成青色的了. 国内的网络环境,真的是有很大的不同,有的人装 VS 的时候,号称满速,有的人(其实就是我)要等它下载很久,还告诉我有个组件没有安装成功.很久很久以前,VS ...