PIC单片机看门狗程序,关闭看门狗程序正常,打开后异常。请指点错误之处,谢谢 代码如下 5
//MPLABIDEv8.63//PICC9.82//PIC16F873A//**********************************************...
//MPLAB IDE v8.63
//PICC 9.82
//PIC16F873A
//****************************************************************************
//程序的主要功能是测试单片机的看门狗信号,疑问点看门狗关闭运行 RB4灯闪烁 RC2灯一直亮
// 看门狗打开运行 RB4灯一直亮 RC2灯一直亮
//****************************************************************************
#include <pic.h> //包含头文件
#define clrwdt asm("CLRWDT")
#define uint unsigned int
__CONFIG(FOSC_XT&WDTE_ON&PWRTE_ON &BOREN_ON&LVP_ON);
//__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON &BOREN_ON&LVP_OFF);
unsigned int delay_key;
//**************************************************************
//TMR0周期=256×(2的8次方-计数初值)×指令周期(4M为1us)
//**************************************************************
void fun_initializtion(void) //初始化函数
{
OPTION_REG=0b11000111; //位7 禁止B端口上拉、位6 RB0/INT上升沿触发中断、位5 内部指令周期,位4 不用RA4,
//位3是0 将预分频指派给TMR0、位2-0 分频比选择位 111为1:256
INTCON =0b11110000; //全局中断、外设中断、TMR0溢出中断允许、RB0/INT外部中断允许
ADCON1 =0b00000110; //RA端口为数字I/O口
//LED默认熄灭
TRISB = 0b00000000;
//PORTB = 0b00000000;
TRISC = 0b00000000;
//PORTC = 0b00000000;
}
void mDelay(unsigned int Delay) //延时函数
{
unsigned int i;
for(;Delay>0;Delay--)
{
//for(i=0;i<34;i++) //4MHZ 501us
for(i=0;i<16;i++); //4MHZ 249us
/*{clrwdt;}*/
}
}
static void interrupt isr(void) // 中断函数
{
if(TMR0IF) //判断TMR0是否有溢出 =1为溢出
{ //timer interrupt
TMR0=215; //256×40×1 =80us 4M
TMR0IF=0; //clear the interrupt flag 软件清零
clrwdt;
delay_key++; //记录TMR0的溢出次数 每10ms加1
if(delay_key>=100) //1s时间 值为100
{
delay_key=0;
RB4 = 1;
mDelay(4000); //1S时间
RB4 = 0;
}
}
}
void main()
{
clrwdt;
fun_initializtion(); //调用初始化函数
interrupt isr();
while(1)
{
mDelay(4); //0.01S时间
//mDelay(4000); //1S时间
RC2 = 1;
clrwdt;
}
} 展开
//PICC 9.82
//PIC16F873A
//****************************************************************************
//程序的主要功能是测试单片机的看门狗信号,疑问点看门狗关闭运行 RB4灯闪烁 RC2灯一直亮
// 看门狗打开运行 RB4灯一直亮 RC2灯一直亮
//****************************************************************************
#include <pic.h> //包含头文件
#define clrwdt asm("CLRWDT")
#define uint unsigned int
__CONFIG(FOSC_XT&WDTE_ON&PWRTE_ON &BOREN_ON&LVP_ON);
//__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON &BOREN_ON&LVP_OFF);
unsigned int delay_key;
//**************************************************************
//TMR0周期=256×(2的8次方-计数初值)×指令周期(4M为1us)
//**************************************************************
void fun_initializtion(void) //初始化函数
{
OPTION_REG=0b11000111; //位7 禁止B端口上拉、位6 RB0/INT上升沿触发中断、位5 内部指令周期,位4 不用RA4,
//位3是0 将预分频指派给TMR0、位2-0 分频比选择位 111为1:256
INTCON =0b11110000; //全局中断、外设中断、TMR0溢出中断允许、RB0/INT外部中断允许
ADCON1 =0b00000110; //RA端口为数字I/O口
//LED默认熄灭
TRISB = 0b00000000;
//PORTB = 0b00000000;
TRISC = 0b00000000;
//PORTC = 0b00000000;
}
void mDelay(unsigned int Delay) //延时函数
{
unsigned int i;
for(;Delay>0;Delay--)
{
//for(i=0;i<34;i++) //4MHZ 501us
for(i=0;i<16;i++); //4MHZ 249us
/*{clrwdt;}*/
}
}
static void interrupt isr(void) // 中断函数
{
if(TMR0IF) //判断TMR0是否有溢出 =1为溢出
{ //timer interrupt
TMR0=215; //256×40×1 =80us 4M
TMR0IF=0; //clear the interrupt flag 软件清零
clrwdt;
delay_key++; //记录TMR0的溢出次数 每10ms加1
if(delay_key>=100) //1s时间 值为100
{
delay_key=0;
RB4 = 1;
mDelay(4000); //1S时间
RB4 = 0;
}
}
}
void main()
{
clrwdt;
fun_initializtion(); //调用初始化函数
interrupt isr();
while(1)
{
mDelay(4); //0.01S时间
//mDelay(4000); //1S时间
RC2 = 1;
clrwdt;
}
} 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询