单片机反汇编 2023-01-20 22:14 采纳率: 15.4%
浏览 8

PIC18F452 程序不停的重启

PIC18F452 程序只有有一句 DDRB=0X03; // PB1 PB0输入,程序就会不停的重启

没开看门狗, 搞不懂为什么会不停的重启


void test_job1(void)
{
    u8 data1;
    u16 Cnt1;
    
    
    DDRD=0;
    //DDRB=0X03;          // 不能有这一句  不然会不停的重启
    
    T1CON=0X90;             // FOSC/4/2 // 2MHZ
   
    TMR1ON=1;                   // 打开定时器

    PORTD=0XFF;
    Delay_1F4(200);             // 产生脉冲,会不停的产生,说明一直在重启
    PORTD=0;
    Delay_1F4(200);
    
    PORTD=0XFF;
    Delay_1F4(200);
    PORTD=0;
    Delay_1F4(200);
    
    data1=1;
    while(data1)
    {
        CheckTimer1();
    }
    T1CON &= ~BITS(0);        // TMR1ON=0;    // 关闭定时器    
}


void CheckTimer1(void)
{
    if(TMR1IF==1)
    {
        //定时器中断后,要重置初值,以备下次中断
        TMR1H=(65536-2000)/256;         // 2000*0.5us =1ms    
        TMR1L=(65536-2000)%256;         
        // Bit TMR0IF must be cleared in software by the Timer0 module Interrupt Service Routine
        // before re-enabling this interrupt. 解释了为什么要清零
        //溢出中断标志位清零     只有T0IF出现上升沿,才会产生中断,所以中断发生之后要清零。        
        TMR1IF=0;            
        


        // 执行中断处理程序,也就是中断产生了,我们想要执行什么功能
        timerCnt1++;
        if(timerCnt1>=1000)        //2ms中断一次,再计次250次后就是500ms
        {
            timerCnt1=0;
            
            
            led_state=~led_state;
            if(led_state & 0x01)PORTD |= BITS(0);   // LED闪烁
            else PORTD &= ~BITS(0); 
           
        }
 
    }
}


  • 写回答

1条回答 默认 最新

  • 快撑死的鱼 2023-01-21 00:51
    关注

    回答不易,求求您采纳点赞哦

    这个问题可能是因为在初始化 DDRB 寄存器时,对应的端口可能已经被其他程序占用或者其他硬件连接到了该端口,导致程序重启。您可以先检查一下这两个端口是否已经被占用或者有其他硬件连接,如果没有,您可以尝试在初始化 DDRB 寄存器之前对端口进行一些配置,例如配置为上拉输入等。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月20日