原创 菜地里来了一条疯狗(中断养狗喂狗演示)

2006-12-30 01:57 5465 12 12 分类: MCU/ 嵌入式
菜地里来了一条疯狗(中断养狗喂狗演示)
mood25.gif HotPower 发表于 7/23/2004 9:04:26 PM 侃单片机 ←返回版面 按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入收藏夹



#include
#include
#include //最新版


/*------------------------------------------------
AT89S5X
--------------------------------------------------*/
sfr   WDTRST  = 0xa6;//内狗

sbit  WDT     = P1^0;//外狗
//#define GF0_    0x04//PCON.4软狗
void main(void)
{
/*--------------------------------------------------
  为了演示,省去了很多。。。。
---------------------------------------------------*/
  IE  = 0;
  _start_();//hotins.h内有定义,执行2次reti
  IP  = 0;
  PT2 = 1;//设置T2中断最高级
  TR2 = 1;
  ET2 = 1;
  EX0 = 1;
  IT0 = 1;
  EX1 = 1;
  IT1 = 1;
  ET0 = 1;
  ET1 = 1;
  ES  = 1;
  TI  = 0;
  RI  = 0;
  EA  = 1;
  while (1) {//主循环,特别注意标志GF0_
    PCON |= GF0_ | IDL_;//进入空闲状态(GF0=1)
/*-----------------------------------------------------------------
  P1.7 = 0 (主程序死循环,等待T2中断捕捉)模拟主程序的错误
-------------------------------------------------------------------*/
    if (!P1_7)//在在菜单Peripherals/IO-Ports/Port 1中点击P1.7死循环
      while(1);//主程序死循环,等待T2中断捕捉
  }
}

void ClrWdt(void)//喂狗
{
  WDT    = 0;//内狗
  WDTRST = 0x1e;//89s52内狗
  WDTRST = 0xe1;//89s52内狗
  WDT    = 1;//内狗
}

/*------------------------------------
         外部INT0中断服务程序
------------------------------------*/
void int0proc() interrupt IE0_VECTOR
{
//在菜单Peripherals/IO-Ports/Port 3中点击P3.2死循环
  while(1);//Int0死循环,等待T2中断捕捉
}

/*------------------------------------
         外部INT1中断服务程序
------------------------------------*/
void int1proc() interrupt IE1_VECTOR
{
//在菜单Peripherals/IO-Ports/Port 3中点击P3.3死循环
  while(1);//Int1死循环,等待T2中断捕捉
}

/*------------------------------------
         定时器T0中断服务程序(XX.XXmS)
------------------------------------*/
void t0proc() interrupt TF0_VECTOR
{
//在菜单Peripherals/Timer/Timer 0中点击TR0死循环
  while(1);//T0死循环,等待T2中断捕捉
}

/*------------------------------------
         定时器T1中断服务程序(XX.XXmS)
------------------------------------*/
void t1proc() interrupt TF1_VECTOR
{
//在菜单Peripherals/Timer/Timer 1中点击TR1死循环
  while(1);//T1死循环,等待T2中断捕捉
}

/*------------------------------------
         串口SIO中断服务程序
------------------------------------*/
void sioproc() interrupt SIO_VECTOR
{
  if (TI) {//在菜单Peripherals/Serial中点击TI死循环
   TI = 0;
   while(1);//发送死循环,等待T2中断捕捉
  }
  if (RI) {//在菜单Peripherals/Serial中点击RI死循环
   RI = 0;
   while(1);//接收死循环,等待T2中断捕捉
  }
}

/*------------------------------------
         定时器T2中断服务程序(XX.XXmS)
------------------------------------*/
void t2proc() interrupt TF2_VECTOR
{
  TF2 = 0;
  if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗
    ClrWdt();//清除看门狗计数器
    PCON &= ~GF0_;//清除标志
  }
  else {//软件狗复位入口
/*-----------------------------------------------------------
  在下句中设置断点可以T2外的任何错误,条件T2能中断
------------------------------------------------------------*/
    IE = 0;//关闭所有中断
    _reset_();//hotins.h内有定义,执行2次reti并跳入0x0000
  }

/*-----------------------------------------------------------
  P1.2 = 0 (T2死循环,等待硬狗复位)模拟T2不能中断后的错误
------------------------------------------------------------*/
  if (!P1_2)//在菜单Peripherals/IO-Ports/Port 1中点击P1.2死循环
    while(1);//T2死循环,等待硬狗复位
/*-----------------------------------------------------------
  也可用更狠毒的方法,在菜单Peripherals/Timer/Timer 2中
  点击TR2关闭定时器T2,强迫硬狗复位
------------------------------------------------------------*/
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
12
关闭 站长推荐上一条 /3 下一条