普通ms级别的定时,基本一个定时器就可以搞定所有了……
给一段程序你看看一个定时器可以做什么:
bit F_10ms=0;//10ms时标
bit F_50ms=0;//50ms时标
bit F_100ms=0;//100ms时标
bit F_250ms=0;//250ms时标
bit F_500ms=0;//500ms时标
bit F_ReadRTC=0;//读取RTC时钟时标
bit F_1s=0;//1s时标
bit F_CheckReader=0;//扫描刷卡头时标
bit F_Read_ADC=1;//扫描模拟输入通道时标
bit F_1s_Disp**=0;//显示屏**切换时标
void Timer0_Isr(void) interrupt TF0_VECTOR
{
static u8 idata cnt_50ms=0;
static u8 idata cnt_100ms=0;
static u8 idata cnt_250ms=0;
static u8 idata cnt_500ms=0;
static u8 idata cnt_1s=0;
static u8 idata cnt_10s=0;
u8 idata i;
u16 idata u16Temp;//临时变量
TH0 =TH0+(u8)TIME0_HIGH;
TL0 =(u8)TIME0_LOW;
cnt_50ms++;
//50ms时标
if(cnt_50ms>=5)
{
cnt_50ms=0;
F_50ms=1;
F_Read_ADC=1;//扫描输入通道时标
//250ms时标
cnt_250ms++;
if(cnt_250ms>=5)
{
cnt_250ms=0;
F_250ms=1;
}
//100ms时标
cnt_100ms++;
if(cnt_100ms>=2)
{
cnt_100ms=0;
F_100ms=1;
F_CheckReader=1;//扫描刷卡头时标
/* ALARM_LED_Flag=~ALARM_LED_Flag;
if(ALARM_LED_Flag)
{
_ALARM_LED_ON;//告警LED亮
}
else
{
_ALARM_LED_OFF;//告警LED灭
} */
F_MenuTimer++;//菜单调用定时器,快速扫描(以便检测菜单里是否有新按键输入)
if(WatchDog100msCounter)
{
WatchDog100msCounter--;
FeedDog();//喂狗
}
else
{
Wait_WDT_Reset();//等待看门狗复位
}
//500ms时标
cnt_500ms++;
if(cnt_500ms>=5)
{
cnt_500ms=0;
F_500ms=1;
/* RUN_LED_Flag=~RUN_LED_Flag;
if(RUN_LED_Flag)
{
_RUN_LED_ON;//运行LED亮
}
else
{
_RUN_LED_OFF;//运行LED灭
} */
//1s时标
cnt_1s++;
if(cnt_1s>=2)
{
cnt_1s=0;
F_ReadRTC=1;
F_1s=1;
F_1s_Disp**=1;
if(menu_auto_return_s)//处理菜单自动返回计数器
{
menu_auto_return_s--;
}
/* if(cnt_LCD_BK>=10)//背光显示10秒
{
cnt_LCD_BK=0;
_LCD_BK_OFF;//熄灭LCD背光
}
else
{
cnt_LCD_BK++;
} */
cnt_10s++;
if(cnt_10s>=10)
{
cnt_10s=0;
F_10s=1;
}
}
}
}
}
Key_In();//扫描按键输入
if(Delay_Tick_Count) //处理定时器0延时函数的计数器(精度很低的)
{
Delay_Tick_Count--;
}
}
实际上里面还删除了很多代码……例如还管理了5个LED、蜂鸣器,外面只需:
SoundLight_ms(_TypeBeep,80);//蜂鸣器发声80ms
SetSoundLight_Flash(_TypeRunLED,500,1000);//运行LED闪烁,亮500ms,周期1000ms
SoundLight_ms(_TypeLcdBkLED,9000);//LCD背光亮9000ms
……
剩下的事都归定时器中断了
|