单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位

2020-01-16来源: eefocus关键字:单片机  51基础篇  STC89C52  系统复位

用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的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)

image.png


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等待时间参考表

image.png

   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单片机的软件复位功能让单片机复位。


 1 #include

 2 #define uchar unsigned char//宏定义 

 3 #define uint unsigned int 

 4 sbit dula=P2^6; //段控制位 

 5 sbit wela=P2^7; //位控制位 

 6 uchar miao,fen,aa,n1,n2,n3,n4; 

 7 uchar code table[]={ //显示编码 

 8 0x3f,0x06,0x5b,0x4f, 

 9 0x66,0x6d,0x7d,0x07, 

10 0x7f,0x6f,0x77,0x7c, 

11 0x39,0x5e,0x79,0x71};

12 

13 void delay(uint z); //延时程序声明 

14 void init(void);//初始化程序声明 

15 void display(uchar n1 ,uchar n2,uchar n3,uchar n4); //显示程序声明

16 

17 

18 void main(){ //主程序 

19     init(); //调用初始化程序 

20     while(1){  //进入大循环 

21         if(aa==20){ //判断是否到了1S  

22             miao++; //秒数加1 

23             if(miao==60){ //判断是否到了60秒  

24                 miao=0; //秒数清0 

25                 fen++; //分数加1 

26                 if(fen==60){ //判断是否到了60分 

27                     fen=0; //分数到60则清0 

28                 }

29                 n1=fen/10; //第一个数码管显示分的十位 

30                 n2=fen%10; //第二个数码管显示分的个位 

31                 n3=miao/10; //第三个数码管显示秒的十位 

32                 n4=miao%10; //第四个数码管显示秒的个位 

33             } 

34             display(n1,n2,n3,n4);

35         }

36     } 

37 }

38 

39 void delay(uint z){ //延时程序  

40     uint x,y; 

41     for(x=z;x>0;x--) 

42     for(y=110;y>0;y--);

43 }

44 

45  

46 

47 void display(uchar n1 ,uchar n2,uchar n3,uchar n4) {

48     dula=1; //开段选 

49     P0=table[n1]; //送分的十位 

50     dula=0; //关段选 

51     P0=0xff; //消隐 

52     wela=1; //开位选 

53     P0=0xfe; //选通分的十位 

54     wela=0; //关位选 

55     P0=0xff; //消隐 

56     delay(1); //延时

57 

58     dula=1; //开段选 

59     P0=table[n2]; //送分的个位 

60     dula=0; //关段选 

61     P0=0xff; //消隐 

62     wela=1; //开位选 

63     P0=0xfd; //选通分的个位 

64     wela=0; //关位选 

65     P0=0xff; //消隐 

66     delay(1); //延时

67 

68     dula=1; //开段选 

69     P0=table[n3]; //送秒的十位 

70     dula=0; //关段选 

71     P0=0xff; //消隐 

72     wela=1; //开位选 

73     P0=0xfb; //选通秒的十位 

74     wela=0; //关位选 

75     P0=0xff; //消隐 

76     delay(1); //延时

77 

78     dula=1; //开段选 

79     P0=table[n4]; //送秒的个位 

80     dula=0; //关段选 

81     P0=0xff; //消隐 

82     wela=1; //开位选 

83     P0=0xf7; //选通秒的个位 

84     wela=0; //关位选 

85     P0=0xff; //消隐 

86     delay(1); //延时 

87 }

88 

89 void init(void){

90 

91 }

92 

93 void timer0(void) interrupt 1 using 1 {

94     TH0=(65536-50000)/256; //求模 

95     TL0=(65536-50000)%256; //求余 

96     aa++;

97 }


分析:


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


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


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

关键字:单片机  51基础篇  STC89C52  系统复位 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485881.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机成长之路(51基础篇) - 006 在Linux下搭建开发烧写环境
下一篇:单片机成长之路(51基础篇) - 002 STC冷启动和复位区别

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

基于单片机的DHT11温度湿度采集系统
DHT11温度湿度采集原理图:DHT11的单片机源程序:***************************************************************/#include <reg52.h>#define uint unsigned int #define uchar unsigned char#include <intrins.h>typedef bit BOOL  ; sbit io = P1^1 ;//(口线定义)sbit bee=P1^0;sbit rs = P2^5 ; sbit rw = P2^6 ;sbit ep = P2
发表于 2020-01-09
基于单片机的DHT11温度湿度采集系统
单片机贪吃蛇程序Lcd12864显示
贪吃蛇的单片机源程序如下:/***********************************************************功能说明:贪吃蛇编译环境:keil4MCU     :STC89C52RC时钟频率: 22.1184MHz注意:该例程中“过关”不能在keil4编译环境中正常显示************************************************************//*****************************************************************     
发表于 2020-01-09
51单片机+ULN2003驱动5V减速步进电机程序
51单片机      步进电机/*******************************************************ULN2003驱动5V减速步进电机程序Target:STC89C52RC-40CCrystal:12MHzAuthor:战神单片机工作室Platform:51&avr单片机最小系统板+ULN2003步进电机驱动套件*******************************************************接线方式:IN1 ---- P00IN2 ---- P01IN3 ---- P02IN4 ---- P03+   
发表于 2020-01-09
单片机16*16点阵汉字显示仿真加源码 用74hc595驱动芯片
单片机16*16点阵仿真原理图如下点阵由于电流比较大不能直接接单片机所以用74hc595驱动串转并芯片,还可以实现用很少的io口来控制.  单片机源程序如下:#include "reg51.h"#define uchar unsigned char#define uint  unsigned int#define Lie   P1sbit SHCP = P2^0;sbit  DS  = P2^1;sbit STCP = P2^2;uchar code led[ ] ={0x00
发表于 2020-01-09
单片机16*16点阵汉字显示仿真加源码 用74hc595驱动芯片
单片机与PC机的串口通信课程设计
1.1设计目的单片机与PC机串行通信端口在系统控制的范畴中一直占据着及其重要的地位,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。作为一种基本而又灵活方便的通信方式,串口通信被广泛应用于PC与PC或者PC与单片机之间的数据交换以及其他工业控制与自动控制中。如今,在很多场合中,要求单片机不仅能独立完成单机的控制任务,还要能与其他数据控制设备(单片机、PC机等)进行数据交换。因此如何实现PC机与单片机之间的通信具有非常重要的现实意义。1.2设计内容以单片机与PC机为核心,实现单片机与PC机机的串口通信。2系统硬件电路设计2.1系统设计框图图2-1 系统设计框图2.2串口通信基本原理所谓"串行通信
发表于 2020-01-09
单片机与PC机的串口通信课程设计
51单片机的ADC0808数字电压表设计
摘要近些年来,数字电压表逐渐进入人们的视线中,它主要采取数字化测量技术。与传统的指针式仪表相比,它的功能有了进一步的完善,并且精度也有了很大的提高。数字电压表主要采用单片机和模/数转换模块,这样不仅提高了测量速度,而且抗干扰能力强、使用便捷、可扩展性强、测量准确。本文主要采用AT89C51单片机和ADC0808芯片制作的简易数字电压表,可以采集0~5V和5~10V的模拟直流电压进行测量,其测量结果在液晶LCD1602上显示。该设计硬件电路主要有三个模块组成:A/D转换模块、数据处理模块及输出显示模块。数据处理由单片机AT89C51来完成,它主要把ADC0808传送来的数值经一定的数据处理,然后送至显示模块进行显示,同时控制显示芯片
发表于 2020-01-09
51单片机的ADC0808数字电压表设计
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved