zoukankan      html  css  js  c++  java
  • 单片机成长之路(51基础篇)

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

     1 #include<reg51.h>
     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”,则说明程序复位从头开始执行了。

  • 相关阅读:
    mysql系列二、mysql内部执行过程
    mysql系列一、mysql数据库规范
    Centos6.5使用yum安装mysql——快速上手必备
    linux安装tomcat
    linux安装jdk
    tar 解压缩命令
    java并发编程系列四、AQS-AbstractQueuedSynchronizer
    JS数组方法汇总 array数组元素的添加和删除
    如何提升工作效率
    Excel学习笔记
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/9051953.html
Copyright © 2011-2022 走看看