1

我一直在做一个关于家庭自动化的项目,我必须在 8051 微控制器上使用定时器中断。我已经构建了以下代码,但是我无法让中断工作。似乎该程序根本没有进入定时器 ISR。我使用一个按钮来模拟 PIR 输入,因此触发了lampControl,不用担心。我用作图书馆。

任何想法或帮助将不胜感激:

void timer0_isr(void) interrupt 1  //Timer 0 Interrupt
{
        TH0 = 0xDC;
        TL0 = 0x00;
        TR0 = 1;
        if (++lamp_interrupt_count == 6000)
        {
            sendCharacterShowAsHex(0x8F); 

            lamp_interrupt_count = 0;                

            TR0 = 0;
        }   
}



void main()
{  
    unsigned char chr;

    IE = 0x93;    
    while(1)
    {
        serialInput();
        if (getPIRInput() == 0x00)
        {
            lampControl(0x80);
        }

        ....
                ....
                ....
}




void lampControl(unsigned char serial_data_in)
{
    if (serial_data_in == 0x80)
    {
        sendCharacterShowAsHex(0x80);

        //enable interrupts
        IE = 0x93;  

        device_interrupt = 2; //Lamp

        TMOD = 0x21; // Timer0 Gate=0, Mode 1, 16bit timer
        TH0 = 0xDC;
        TL0 = 0x00;
        TR0 = 1; 

    }
    else if(serial_data_in == 0x8F)
    {
        sendCharacterShowAsHex(0x8F);
    }
}
4

1 回答 1

2

您需要先配置定时器和中断,然后才能使用它们。在 main() 中,您至少需要设置以下配置位才能使用“TR0 = 1;”打开定时器 :

首先在 main() 中设置这些位,这应该可以解决问题:

TMOD = 0x01;        // 16-bit no auto reload
TH0 = 0xDC;         //Set high and low bits to count 0xFFFF - 0xDC00 = 0x23FF counts
TL0 = 0x00;
ET0 = 1;            // Enable timer0 interrupt
EA = 1;             // Enable all interrupts
//TR0 = 1;          //Enable Timer0 immediately

您的其余代码应该可以正常运行。

注意:您可以将中断函数定义更改为:“void timer0_isr(void) interrupt 1 using 1”以强制它使用寄存器组 1 进行中断函数操作。

于 2013-12-31T20:59:55.757 回答