单片机成长之路(51基础篇) - 004 STC89C52MCU 软件实现系统复位
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的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 软件实现系统复位的更多相关文章
- 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二
本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...
- 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)
本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别
STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...
- Sass进阶之路,之一(基础篇)
Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- 单片机成长之路(51基础篇) - 008 C51 的标示符和关键字
标准 C 语言定义了 32 个关键字,如下表(ANSI C的32个关键字): C51在此基础上针对单片机功能进行了扩展,详情见下表(C51编译器扩充关键字): C 51的数据类型 51单片机使用的C语 ...
- 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境
在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...
随机推荐
- httpd的rpm包及源码安装配置
httpd的rpm包及源码安装配置 1.rpm包安装 系统环境: [root@zhaochj ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel ...
- TF:TF之Tensorboard实践:将神经网络Tensorboard形式得到events.out.tfevents文件+dos内运行该文件本地服务器输出到网页可视化—Jason niu
import tensorflow as tf import numpy as np def add_layer(inputs, in_size, out_size, n_layer, activat ...
- POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接> 题目大意: 给出一个初始值全为0的矩阵,对其进行两个操作. 1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0. 2.查询某个坐标的点的值. ...
- python & MySQLdb(two)
实现python封装 # encoding=utf8 import MySQLdb #定义类 class MysqlHelper(): def __init__(self,host,port,db,u ...
- js 解析json
一 ,eval var dataObj=eval("("+data+")"); 1,这种形式将使得性能显著降低,因为它必须运行编译器 2,eval函数还减弱了你 ...
- 治愈 JavaScript 疲态的学习计划【转载】
来源:伯乐在线 - Rose Wang 像其他人一样,最近我读了 Jose Aguinaga 的文章 <How it feels to learn JavaScript in 2016>. ...
- refine OpenRefine 3.0
refine 英[rɪˈfaɪn] 锐烦嗯 美[rɪˈfaɪn] vt. 提炼; 改善; 使高雅; == explore 英 [ɪkˈsplɔ:(r)] 一颗四普罗 美 [ɪkˈsplɔr] vi.勘 ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)
BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...
- Error watching file for changes: EMFILE
运行reactnative项目时在编译过程中报错 Error watching file for changes: EMFILE 故障原因: 是升级后watchman不可用了,需要重装watchman ...