使用Keil uVision使用8051 C进行中断处理

时间:2013-12-31 20:40:10

标签: c 8051 keil

我一直在做一个关于家庭自动化的项目,我必须在8051微控制器上使用定时器中断。我构造了以下代码,但是无法让中断工作。似乎该程序根本没有进入计时器ISR。我使用buton来模拟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);
    }
}

1 个答案:

答案 0 :(得分: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)中断1使用1”强制它使用寄存器组1进行中断功能操作。