/******************************************************************** * 文件名 : 宏晶看门狗.c * 描述 : 看门狗是单片机开发中很重要的一个实验。可以说每个工程开发的单片机代码中,都会用到看门狗。 每隔一定时间就要进行“喂狗”,如果没有操作,那么代码就会开头重新开始运行。 看门狗可以解决程序经过干扰,程序跑飞后,程序的自己恢复。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sfr WDTRST = 0xA6; //声明看门狗寄存器 uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Count; /******************************************************************** * 名称 : Time0_Init() * 功能 : 定时器的初始化,定时时间可用光碟中软件计算,11.0592MZ晶振,10ms * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Time0_Init() { TMOD = 0x01; IE = 0x82; TH0 = 0xee; TL0 = 0x00; TR0 = 1; } /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时,延时时间为 10ms * del * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Time0_Int() * 功能 : 定时器中断,中断中实现 Count 加一 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Time0_Int() interrupt 1 { TH0 = 0xee; TL0 = 0x00; Count++; //长度加1 WDTRST = 0x1e; //这里进行喂狗,如果没有这两行,单片机就为因为没有喂狗,单片机就会运行5毫秒,就重新复位,就会一直看到开发板上显示的00? WDTRST = 0xe1; } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { uchar LED_Buffer; Time0_Init(); WDTRST = 0x1e; WDTRST = 0xe1; while(1) { Count = 0; while(Count<20) { P0 = table[LED_Buffer / 10 % 10]; P2 = 6; Delay_1ms(5); P0 = table[LED_Buffer % 10]; P2 = 7; Delay_1ms(5); } LED_Buffer++; } }
/******************************************************************** * 文件名 : 宏晶看门狗.c * 描述 : 看门狗是单片机开发中很重要的一个实验。可以说每个工程开发的单片机代码中,都会用到看门狗。 每隔一定时间就要进行“喂狗”,如果没有操作,那么代码就会开头重新开始运行。 看门狗可以解决程序经过干扰,程序跑飞后,程序的自己恢复。 数码管上会显示0--9,如果没有“喂狗”,就会重新显示0开始。大家可以改变看门狗的相关值。 ***********************************************************************/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sfr WDT_CONTR = 0xE1; //声明寄存器 uchar table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Count; /******************************************************************** * 名称 : Time0_Init() * 功能 : 定时器的初始化,定时时间可用光碟中软件计算,11.0592MZ晶振,10ms * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Time0_Init() { TMOD = 0x01; IE = 0x82; TH0 = 0x4c; TL0 = 0x00; TR0 = 1; } /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时,延时时间为 10ms * del * 输入 : del * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i) { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Time0_Int() * 功能 : 定时器中断,中断中实现 Count 加一 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Time0_Int() interrupt 1 { TH0 = 0x4c; TL0 = 0x00; Count++; //长度加1 } /******************************************************************** * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { uchar LED_Buffer; Time0_Init(); WDT_CONTR = 0x3f; while(1) { Count = 0; while(Count<20) { P0 = table[LED_Buffer / 10 % 10]; P2 = 6; Delay_1ms(5); P0 = table[LED_Buffer % 10]; P2 = 7; Delay_1ms(5); } LED_Buffer++; //WDT_CONTR = 0x3f; //没有这条语句时,当看门狗溢出时(这里设的是9秒),看门狗会复位。 } }