#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,强迫硬狗复位 ------------------------------------------------------------*/ }
|
文章评论(0条评论)
登录后参与讨论