找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6816|回复: 19
收起左侧

有关单片机看门狗问题请教大神

[复制链接]
ID:108715 发表于 2017-3-22 21:26 来自手机 | 显示全部楼层 |阅读模式
我的是stc12c5608ad单片机。官方手册只有汇编例程,没有c语言的。网上例程也很少,以下例程我想移植到5608单片机上,因为与传统8051速度不一样,所以请问大神怎么设置。还有我看到有些例程的sfr不是0xA6,这个是不是不统一,修改有什么规律?还有我不用for循环执行i++  500次,喂狗程序怎么改?

另外激活看门狗这个=0x1e和0xe1怎么定义的,代表什么?为什么是1e和e1?
第一次接触看门狗,资料好少,不知道怎么下手。求高手帮忙。


/*-----------------------------------------------
  名称:看门狗溢出实验
  编写:shifang
  日期:2009.5
  修改:无
  内容:通过按键模拟看门狗溢出
------------------------------------------------*/
#include<reg52.h>

sfr  WDTRST  =   0xA6;                                 

sbit key = P3^1;                 

/*------------------------------------------------
                    喂狗
------------------------------------------------*/
void Rst_Watchdog( void )
{
        WDTRST  = 0x1E; //先赋值1E 然后赋值E1
    WDTRST  = 0xE1;
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main( void )
{
        int i;
                                    // 设置看门狗时间为1个时钟循环后
        Rst_Watchdog();
                                         //关看门狗一个时钟循环
        for( i = 0; i < 500; i++)
        {
                Rst_Watchdog();               
        }
    P1=0x00;
        while(!key)                 //按下按键不松开,表示程序一直在按键处循环,
                                //并用LED显示0x55
        {
         P1=0x55;                         //模拟出错 正常情况应该一直显示LED,
                                //但是加看门狗之后不间断复位,倒是LED闪烁
        }
}
回复

使用道具 举报

ID:123289 发表于 2017-3-23 02:32 | 显示全部楼层
看stc12c5608ad的手册
回复

使用道具 举报

ID:7485 发表于 2017-3-23 08:07 | 显示全部楼层
stc12c5608ad的狗的地址是0E1H吧?
回复

使用道具 举报

ID:7485 发表于 2017-3-23 08:08 | 显示全部楼层
使用看门狗要看手册的。
回复

使用道具 举报

ID:7485 发表于 2017-3-23 08:23 | 显示全部楼层
看了手册和头文件,我也糊涂了:
//--------------------------------------------------------------------------------
//新一代 1T 8051系列 单片机看门狗定时器特殊功能寄存器
sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
//                                      7     6     5      4       3      2   1   0     Reset Value
//                                  WDT_FLAG  -  EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0    xx00,0000
//-----------------------

//--------------------------------------------------------------------------------

捕获.JPG
回复

使用道具 举报

ID:169871 发表于 2017-3-23 11:03 | 显示全部楼层
要软件喂狗
回复

使用道具 举报

ID:108715 发表于 2017-3-24 19:50 来自手机 | 显示全部楼层
yzwzfyz 发表于 2017-3-23 02:32
看stc12c5608ad的手册

问题是官网下的手册只有汇编的没有C的,汇编的看不懂不会。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:01 | 显示全部楼层
所谓看门狗,就是一个“伪”独立于单片机的一个计数器。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:03 | 显示全部楼层
起动它就是将它的连接开关接通,实现的方法“通常”是将特殊寄存器中的某个位置1(不排除有其它大同小异的方式)。实际就是将其CLK与接通(有的是系统时钟,有的是独立的振荡器,与CPU的硬件结构有关)。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:04 | 显示全部楼层
计数器计数之前,总是要先预置一个起始的数字吧(不置就会默认一个数),这个数就是看门狗的动作时间。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:05 | 显示全部楼层
如果没有对计数器进行干预,计数器必计满的时候,并溢出一个信号,看门狗的这个溢出信号是通过一个“开关”与CPU的复位连在一起的。
如果这个开关是开通的(通常它也是特殊寄存器中的某个位置),也就是你允许了看门狗工作。溢出时,单片机就被看门狗复位了。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:07 | 显示全部楼层
也就是:当你允许看门狗工作(将溢出与CPU的RESET连接),并起动看门狗之后(将CLK接通),过一段时间,CPU将被复位就是必然的了!
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:13 | 显示全部楼层
这时你有没有阻止看门狗(计数器)溢出,不让它复位单片机的办法呢?
理论上没有,但却有一个办法延长它的溢出时间,就是在看门狗溢出之前,改小计数器的数字,让它远离计满,最简单常用的方法就是重新将初始值付于看门狗。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:15 | 显示全部楼层
使用看门狗复位成初始值的动作,就叫“喂狗”,明显,只要给计数器一个SET脉冲即可!CPU做这件事的方法是向看门狗与一个数(发一个脉冲)。为了防止误操作,故意要求写两个字节。
至于为什么是“1e和e1”呢?其实不是它也可以,你来给个数字,不过你给了以后,我也会这样来问你!总要给一个吧,它是设计看门狗的设计师定的。
回复

使用道具 举报

ID:123289 发表于 2017-3-24 22:22 | 显示全部楼层
可见,喂狗,只能暂时阻止看门狗复位单片机,但不能彻底阻止它复位单片机。
人们利用这个特点达成了以下目的:
如果在看门狗溢出之前喂狗,就能阻止它复位单片机。一但不喂狗了(程序“跑飞”,走不到喂狗程序),CPU过一段时间必被看门狗复位!就可以将“跑飞”的程序,“拉回来”。
回复

使用道具 举报

ID:183272 发表于 2017-3-25 13:33 | 显示全部楼层
太难了


回复

使用道具 举报

ID:183290 发表于 2017-3-25 13:51 | 显示全部楼层
有源码没?
回复

使用道具 举报

ID:103038 发表于 2017-3-25 14:57 | 显示全部楼层

《新概念51单片机C语言教程》里面有详细的看门狗范例,是C语言写的,写的挺详细的。
回复

使用道具 举报

ID:182429 发表于 2017-3-25 20:30 | 显示全部楼层
我用过其他单片机,喂狗时是写入0x5A,0xA5的,可设定喂狗周期,两个周期没喂就会RESET。当软件有BUG或静电干扰时有可会死机然后两周期没喂狗之后RESET。
0x5A,0xA5可能是单片机设计时定下来的。
回复

使用道具 举报

ID:155507 发表于 2017-3-26 14:25 | 显示全部楼层
  1. /*-----------------------------------------------
  2.   名称:看门狗溢出实验 按键不停喂狗
  3.   内容:通过按键喂狗防止溢出复位 看门狗演示程序  
  4.         在16383个机器周期内必须至少喂狗一次
  5.         标准AT89s52单片机试验通过。
  6. ------------------------------------------------*/
  7. #include <reg52.h>

  8. sfr WDTRST = 0xE1;

  9. sbit  K1 = P3^0;
  10. sbit  K2 = P3^1;
  11. sbit  LED1=P1^1;
  12. sbit  LED2=P1^2;

  13. void DelayUs2x(unsigned char t);//us级延时函数声明
  14. void DelayMs(unsigned char t); //ms级延时
  15. /*------------------------------------------------
  16.                     主函数
  17. ------------------------------------------------*/
  18. main()
  19. {
  20.    LED1=0;
  21.    DelayMs(100);
  22.    LED1=1;
  23.    DelayMs(100);

  24.    TMOD=0x01;
  25.    TH0=0xc6;      //定时16ms
  26.    TL0=0x66;
  27.    EA=1;
  28.    ET0=1;

  29.    WDTRST=0x1e;   //在程序初始化中激活看门狗。
  30.    WDTRST=0xe1;   //先送1E,后送E1

  31.    if(K1==0)
  32.    {
  33.      TR0=1;
  34.    }

  35.    while(1)
  36.    {   
  37.      if(K2==0)
  38.      {
  39.        TR0=0;
  40.      }
  41.          LED2=1;
  42.          LED1=1;
  43.          DelayMs(100);
  44.          LED2=0;
  45.          DelayMs(100);
  46.    }
  47. }
  48. /*------------------------------------------------
  49.               定时器中断函数
  50. ------------------------------------------------*/
  51. void Time0(void) interrupt 1
  52. {
  53.    TH0=0xc6;      //定时16ms
  54.    TL0=0x66;

  55.    WDTRST=0x1e;   //喂狗指令
  56.    WDTRST=0xe1;
  57. }

  58. /*------------------------------------------------
  59. uS延时函数,含有输入参数 unsigned char t,无返回值
  60. unsigned char 是定义无符号字符变量,其值的范围是
  61. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  62. 长度如下 T=tx2+5 uS
  63. ------------------------------------------------*/
  64. void DelayUs2x(unsigned char t)
  65. {   
  66. while(--t);
  67. }
  68. /*------------------------------------------------
  69. mS延时函数,含有输入参数 unsigned char t,无返回值
  70. unsigned char 是定义无符号字符变量,其值的范围是
  71. 0~255 这里使用晶振12M,精确延时请使用汇编
  72. ------------------------------------------------*/
  73. void DelayMs(unsigned char t)
  74. {
  75.      
  76. while(t--)
  77. {
  78.      //大致延时1mS
  79.      DelayUs2x(245);
  80.          DelayUs2x(245);
  81. }
  82. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表