找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6141|回复: 2
打印 上一主题 下一主题
收起左侧

关于定时器中断函数问题求解

[复制链接]
跳转到指定楼层
楼主
ID:125673 发表于 2016-7-15 23:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器时间溢出进入中断函数,中断函数内是不是要先关闭定时器TR0=0,当中断函数内程序运行到最后,定时器启动TR0=1.中断结束,定时器开始工作。这样写是不是正确。看到好多例子,在中断函数内都不管定时器,如果定时器的时间小于或者大于中断函数时间,这样的定时器进入中断函数的值会不会有变化。
下面是加定时器关闭的程序,关闭定时器与不关闭定时器有什么影响。求大神指导。
void InterruptTimer0()  interrupt 1               //中断函数的特殊写法,数字’1’为中断入口号
{
    static unsigned char j = 0;
    TR0=0;   //加入定时器关闭程序
    TH0 = 0xFC;    //溢出后进入中断重新赋值
     TL0 = 0x67;
    counter++;    //计数值counter加1
    P0 = 0xFF;    //消隐
     switch(j)
    {
         case 0: ADDR0=0; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[0]]; break;
        case 1: ADDR0=1; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[1]]; break;
         case 2:  ADDR0=0; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[2]]; break;
         case 3:  ADDR0=1; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[3]]; break;
        case 4:  ADDR0=0; ADDR1=0; ADDR2=1; j++; P0=LedChar[LedNumber[4]]; break;
         case 5:  ADDR0=1; ADDR1=0; ADDR2=1; j=0; P0=LedChar[LedNumber[5]]; break;
        default: break;
     }      //动态刷新
    TR0=1;     //加入定时器打开程序中断结束开始计时
}   
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:67175 发表于 2016-7-16 09:56 | 只看该作者
如果未关中断而且中断处理函数中处理数据过多;因为定时器时间已到它就会又进入下一个中断处理函数,也就是这个中断处理函数还没有处理完下一个中断又来了。这样会造成结果错误或异常。
回复

使用道具 举报

板凳
ID:130180 发表于 2016-7-16 15:52 | 只看该作者
开定时器中断表示可以进入定时器中断函数,执行完中断函数后,你想怎么操作就怎么操作看你的需求了。至于定时时间和函数执行时间,最好的是不要在中断函数中执行太多的步骤,容易造成错误。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表