这不是好办法。不用处理速度最快的变量,2ms都不一定能把深层分支走完。
正常的8位机应该用单字节变量,定时中断应该是这样:
void timer_2ms_isr(void) interrupt xxx
{
static u8 cnt_2ms=0;
static u8 cnt_10ms=0;
static u8 cnt_100ms=0;
static u8 cnt_1s=0;
F_2ms = 0;//供主程序使用的2ms标记
cnt_2ms++;
if(cnt_2ms>=5)
{
cnt_2ms=0
F_10ms = 0;//供主程序使用的10ms标记
cnt_10ms++;
if(cnt_10ms>=10)
{
cnt_10ms=0
F_100ms = 0;//供主程序使用的100ms标记
cnt_100ms++;
if(cnt_100ms>=10)
{
cnt_100ms=0
F_1s = 0;//供主程序使用的1s标记
}
}
}
}
//主程序
void main(void)
{
......初始化
while(1)
{
if(F_2ms)//供主程序使用的2ms标记
{
func_2MS();//所有需要2ms处理一次的函数都放里面去
F_2ms = 0;
}
if(F_10ms)//供主程序使用的10ms标记
{
func_10MS();//所有需要10ms处理一次的函数都放里面去
F_10ms = 0;
}
if(F_100ms)//供主程序使用的100ms标记
{
func_100MS();//所有需要100ms处理一次的函数都放里面去
F_100ms = 0;
}
if(F_1s)//供主程序使用的1s标记
{
func_1S();//所有需要1s处理一次的函数都放里面去
F_1s = 0;
}
}
}
|