您的代碼遇到了性能和脈沖計(jì)數(shù)準(zhǔn)確性的問(wèn)題,這是由于中斷和定時(shí)器處理方式所致。以下是一些洞察和建議,以解決這些問(wèn)題: 問(wèn)題分析低頻問(wèn)題: 脈沖計(jì)數(shù)準(zhǔn)確性:
解決步驟1. 優(yōu)化ISR執(zhí)行時(shí)間盡量減少I(mǎi)SR中的代碼,以確保它能夠盡快執(zhí)行。例如,在timer0_ISR中不要調(diào)用顯示函數(shù),而是在主循環(huán)中設(shè)置一個(gè)標(biāo)志并處理顯示更新。 bit displayUpdateFlag = 0;
void timer0_ISR(void) interrupt 1
{
TR0 = 0; // 停止Timer0
displayUpdateFlag = 1;
TL0 = 0x18; // 重置Timer0初始值
TH0 = 0xFC;
TR0 = 1; // 重新啟動(dòng)Timer0
}在主循環(huán)中檢查這個(gè)標(biāo)志,并在需要時(shí)調(diào)用顯示更新函數(shù): void main()
{
Timer0Init();
EX0_Init();
EX1_Init();
EA = 1; // 啟用全局中斷
while (1)
{
if (displayUpdateFlag)
{
displayUpdateFlag = 0;
display_Service();
}
}
}2. 確保脈沖計(jì)數(shù)準(zhǔn)確盡可能短暫地禁用和重新啟用你的ISRs中的中斷,以防錯(cuò)過(guò)脈沖。 void EX0_ISR() interrupt 0
{
numCnt++;
if (numCnt >= 9999)
numCnt = 0;
}注意,在其ISR中無(wú)需禁用EX0,因?yàn)檫M(jìn)入ISR時(shí)中斷標(biāo)志會(huì)自動(dòng)清除。這減少了中斷被禁用的時(shí)間。 3. 高效使用Timer0定時(shí)器ISR應(yīng)僅負(fù)責(zé)基于時(shí)間的任務(wù),而不是處理復(fù)雜操作如更新顯示。 最終代碼調(diào)整以下是根據(jù)上述建議修改后的代碼: #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; // 用于存儲(chǔ)要顯示的脈沖數(shù)量
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; // 邊緣觸發(fā)中斷
EX0 = 1; // 啟用EX0
}
void EX1_Init()
{
IT1 = 1; // 邊緣觸發(fā)中斷
EX1 = 1; // 啟用EX1
}
void Timer0Init(void) // 1ms @ 12.000MHz
{
TMOD &= 0xF0; // 設(shè)置定時(shí)器模式
TMOD |= 0x01; // 設(shè)置定時(shí)器模式
TL0 = 0x18; // 設(shè)置初始定時(shí)器值
TH0 = 0xFC; // 設(shè)置初始定時(shí)器值
TF0 = 0; // 清除TF0標(biāo)志
ET0 = 1; // 啟用Timer0中斷
TR0 = 1; // 啟動(dòng)Timer0
}
void timer0_ISR(void) interrupt 1
{
TR0 = 0; // 停止Timer0
displayUpdateFlag = 1; // 設(shè)置標(biāo)志以更新顯示
TL0 = 0x18; // 重置Timer0初始值
TH0 = 0xFC;
TR0 = 1; // 重新啟動(dòng)Timer0
}
void EX0_ISR() interrupt 0
{
numCnt++;
if (numCnt >= 9999)
numCnt = 0;
}
void EX1_ISR() interrupt 2
{
flag = 1;
display_Service();
numCnt = 0; // 清除計(jì)數(shù)以重置顯示
}這應(yīng)該提高了嵌入式系統(tǒng)的性能和準(zhǔn)確性,確保它能處理更高頻率的信號(hào)并更準(zhǔn)確地計(jì)數(shù)脈沖。
|