我一直在做一个关于家庭自动化的项目,我必须在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);
}
}
答案 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进行中断功能操作。