您的代码遇到了性能和脉冲计数准确性的问题,这是由于中断和定时器处理方式所致。以下是一些洞察和建议,以解决这些问题: 问题分析解决步骤1. 优化ISR执行时间尽量减少ISR中的代码,以确保它能够尽快执行。例如,在timer0_ISR中不要调用显示函数,而是在主循环中设置一个标志并处理显示更新。 bit displayUpdateFlag = 0;
void timer0_ISR(void) interrupt 1
{
TR0 = 0; // 停止Timer0
displayUpdateFlag = 1;
TL0 = 0x18; // 重置Timer0初始值
TH0 = 0xFC;
TR0 = 1; // 重新启动Timer0
}在主循环中检查这个标志,并在需要时调用显示更新函数: void main()
{
Timer0Init();
EX0_Init();
EX1_Init();
EA = 1; // 启用全局中断
while (1)
{
if (displayUpdateFlag)
{
displayUpdateFlag = 0;
display_Service();
}
}
}2. 确保脉冲计数准确尽可能短暂地禁用和重新启用你的ISRs中的中断,以防错过脉冲。 void EX0_ISR() interrupt 0
{
numCnt++;
if (numCnt >= 9999)
numCnt = 0;
}注意,在其ISR中无需禁用EX0,因为进入ISR时中断标志会自动清除。这减少了中断被禁用的时间。 3. 高效使用Timer0定时器ISR应仅负责基于时间的任务,而不是处理复杂操作如更新显示。 最终代码调整以下是根据上述建议修改后的代码: #include <reg51.h>
#include "display.h"
sbit LED = P1^0;
void Timer0Init(void);
void EX0_Init();
void EX1_Init();
void display_Service();
unsigned int numCnt = 0; // 用于存储要显示的脉冲数量
bit displayUpdateFlag = 0;
unsigned char temp0, temp1, temp2, temp3;
void main()
{
Timer0Init();
EX0_Init();
EX1_Init();
EA = 1; // 启用全局中断
while (1)
{
if (displayUpdateFlag)
{
displayUpdateFlag = 0;
display_Service();
}
}
}
void display_Service()
{
temp0 = numCnt / 1000;
temp1 = (numCnt / 100) % 10;
temp2 = (numCnt / 10) % 10;
temp3 = numCnt % 10;
LEDBuf[1] = (numCnt < 1000)? 12 : temp0;
LEDBuf[2] = (numCnt < 100)? 12 : temp1;
LEDBuf[3] = (numCnt < 10)? 12 : temp2;
LEDBuf[4] = temp3;
}
void EX0_Init()
{
IT0 = 1; // 边缘触发中断
EX0 = 1; // 启用EX0
}
void EX1_Init()
{
IT1 = 1; // 边缘触发中断
EX1 = 1; // 启用EX1
}
void Timer0Init(void) // 1ms @ 12.000MHz
{
TMOD &= 0xF0; // 设置定时器模式
TMOD |= 0x01; // 设置定时器模式
TL0 = 0x18; // 设置初始定时器值
TH0 = 0xFC; // 设置初始定时器值
TF0 = 0; // 清除TF0标志
ET0 = 1; // 启用Timer0中断
TR0 = 1; // 启动Timer0
}
void timer0_ISR(void) interrupt 1
{
TR0 = 0; // 停止Timer0
displayUpdateFlag = 1; // 设置标志以更新显示
TL0 = 0x18; // 重置Timer0初始值
TH0 = 0xFC;
TR0 = 1; // 重新启动Timer0
}
void EX0_ISR() interrupt 0
{
numCnt++;
if (numCnt >= 9999)
numCnt = 0;
}
void EX1_ISR() interrupt 2
{
flag = 1;
display_Service();
numCnt = 0; // 清除计数以重置显示
}这应该提高了嵌入式系统的性能和准确性,确保它能处理更高频率的信号并更准确地计数脉冲。
|