gpt4 book ai didi

c - 使用 Keil uVision 的 8051 C 中断处理

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:23 26 4
gpt4 key购买 nike

我一直在做一个关于家庭自动化的项目,在这个项目中我必须使用带有 8051 微 Controller 的定时器中断。我已经构建了以下代码,但是我无法设法让中断工作。该程序似乎根本没有进入定时器 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);
}
}

最佳答案

您需要先配置定时器和中断,然后才能使用它们。在 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 进行中断功能操作。

关于c - 使用 Keil uVision 的 8051 C 中断处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20862964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com