打印
[MCU]

单片机的系统复位

[复制链接]
273|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开心阳|  楼主 | 2020-9-3 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

        在单片机构成的系统中,由于单片机的工作有可能受到来自外来电磁场的干扰而出现程序跑飞的现象,从而陷入死循环,出于对单片机运行状态进行实时性的监控的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称看门狗(watch dog)

        看门狗的工作过程如下:

看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过单片机的程序控制,使他定时的往看门狗芯片的这个引脚送入高电平(或者是低电平)这一个程序语句是分散在单片机的其他控制语句中的,一旦单片机由于干扰造成程序跑飞而陷入死循环时,给看门狗引脚送电平的程序便不能被执行到,这时,看门狗电路就会由于得不到单片机送来的信号,便对他送入一个复位信号,使单片机从程序存储器的起始位置重新开始执行程序,这样便实现了单片机的自动复位。

        示例代码:

        用软件观察看门狗的喂狗现象:如果在while循环中屏蔽这一局,那么在看门狗的作用下,程序将会不断

        //不断的复位,这是看到的现象是在看门狗的作用下,led灯不断的闪烁

        #include

        #define uchar unsigned char

        #define uint unsigned int

        sfr WDT_CONTR = 0xe1;//51系列的单片机的看门狗的位置

        sbit led1 = P1^0;

        void delayms(uint x)

        {

        uint i,j;

        for(i = x;i》0;i--)

        for(j = 110;j》0;j--);

        }

        main()

        {

        WDT_CONTR = 0x35;//0011 0101表示喂狗,时间是2.095m要喂一次

        led1 = 0;

        delayms(500);

        led1 = 1;

        while(1)

        {

        delayms(1000);

        // WDT_CONTR = 0x35;如果在while循环中屏蔽这一局,那么在看门狗的作用下,程序将会不断

        //不断的复位,这是看到的现象是在看门狗的作用下,led灯不断的闪烁

        }

        }

        看门狗的寄存器为WDT_CONTR,字节地址是e1,不能位寻址,实现喂狗功能一般是在程序中插入

        sfr WDT_CONTR = 0xe1 ;

        WDT_CONTR= 0x35;//0011 0000这里可以查看专门的书籍看寄存器的相关位的设置

        用软件实现单片机的系统复位:

        STC单片机增加了响应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能,用户只需要简单的控制ISP_CONTR特殊功能寄存器中的SWBS和SWRST两位便可以实现系统的复位

        示例代码:

        #include

        #define uint unsigned int

        #define uchar unsigned char

        sfr ISP_CONTR = 0xe7;

        sbit dula = P2^6;

        sbit wela = P2^7;

        uchar num ,gw,sw,aa;

        uchar code table[]={0x3f,0x06,0x5b,0x4f,

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

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

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

        void init()//初始化函数

        {

        TMOD = 0x01;

        TH0 = (65535-50000)/256;

        TL0 = (65535-50000)%256;

        EA = 1;

        ET0 = 1;

        TR0 =1;

        }

        void delayms(uint x)//延时函数

        {

        uint i,j;

        for(i = x;i》0;i--)

        for(j=110;j》0;j--);

        }

        void display(uchar gw,uchar sw)//显示函数

        {

        dula = 1;

        P0 = table[sw];

        dula = 0;

        P0 = 0xff;

        wela = 1;

        P0 = 0xfe;

        wela = 0;

        delayms(5);

        P0 = 0x0;//消影

        dula = 1;

        P0 = table[gw];

        dula = 0;

        P0 = 0xff;

        wela = 1;

        P0 = 0xfd;

        wela = 0;

        delayms(5);

        }

        void main()

        {

        init();

        while(1)

        {

        if(aa ==20)

        {

        aa =0;

        num++;

        if(num == 99)

        num =0;

        if(num ==10)

        {

        ISP_CONTR = 0x20;//0010 0000,操控寄存器实现软件复位

        }

        gw = num%10;

        sw = num/10;

        }

        display(gw,sw);

        }

        }

        void timer0()interrupt 1

        {

        TH0 = (65536-50000)/256;

        TL0 = (65536-50000)%256;

        aa ++;

        }

        实验现象,数码管以秒速递增,递增到10后,系统复位,之后重新开始从0计时

        说一下STC单片机的寄存器ISP/IAP寄存器,这个寄存器的地址是E7H,不能位寻址,在这里只需要将寄存器的第五个bit设置为1,便可以实现软件的复位

        因此代码通常是

        sfr ISP_CONTR = 0xe7;

        ISP_CONTR = 0x20;//0010 0000

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

190

帖子

0

粉丝