打印

52单片机的三个定时中断器

[复制链接]
2749|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzh510781|  楼主 | 2010-1-18 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
HWM| | 2010-1-18 18:56 | 只看该作者
每个计数器都是并行独立工作的,只要设计好中断的优先级并合理地分配给具体的定时或计数对象即可。另外MCS-51系列单片机的UART串行通讯口还必须占用一个计数器作为其波特率的分频器,因此如果系统用到UART时还会使用计数器中的一个。所以通常情况下,会显得计数器还不够用,而不会嫌多的。

使用特权

评论回复
板凳
mohanwei| | 2010-1-18 19:10 | 只看该作者
普通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
……
剩下的事都归定时器中断了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

6

帖子

0

粉丝