找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求教关于定时器的问题

[复制链接]
跳转到指定楼层
楼主
ID:38265 发表于 2013-10-14 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请教一下各位,我做了一个倒计时的程序,用了两个定时器,一个扫描数码管一个计时。我想做当分和秒都到0的时候蜂鸣器响1秒,可是程序做好以后别的都正常,就是蜂鸣器响的时候,数码管就会全部熄灭,只有随机一位数码管显示0,蜂鸣器停止后显示才会恢复正常。请教一下各位这是什么情况?前段时间做了一个交通灯也是这样,两个定时器会互相影响。
这是定时器部分的程序:(麻烦大家帮忙看一下哪里有问题)
void time_T0() interrupt 1          //扫描数码管
{
  TH0=0x47;                //定时器0重装初值
  TL0=0x47;
  count++;
  if(count==3)
   {
     count=0;        
         P0=table[dispbuf[dis]];  //数码管 段
         P2=tabwei[dis];                  //数码管 位
         dis++;
         if(dis==8)
            dis=0;
   }
  dispbuf[0]=minute/10;        //显示分十位         
  dispbuf[1]=minute%10;        //显示分个位
  dispbuf[2]=second/10;        //显示秒十位
  dispbuf[3]=second%10;        //显示秒个位
}

void time_T1() interrupt 3          //计时
{
  TH1=0xdb;           //定时器1重装初值
  TL1=0xff;
  time++;
  if(second==0&&minute==0)  //当分和秒同时为0时
   {                              
         TR1=0;        //关闭定时器1
         minute=0;
         second=0;
         beep=0;        //蜂鸣器开
         delayms(1000);        //延时1秒
         beep=1;         //蜂鸣器关
   }
  if(time==100)
   {
     time=0;  //time加到100归零
         second--;        //秒减1
         if(second==-1)
          {                     
                second=59;        //秒减到0时,重新回到59
                minute--;        //分减1                                 
          }
   }
  dispbuf[0]=minute/10;                 
  dispbuf[1]=minute%10;
  dispbuf[2]=second/10;
  dispbuf[3]=second%10;
  dispbuf[4]=num1/10;
  dispbuf[5]=num1%10;
  dispbuf[6]=num2/10;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:27916 发表于 2013-10-14 21:07 | 只看该作者
delayms(1000);导致,这个函数写在了中断里面,导致另一个中断不能及时响应,建议中断里面的程序尽量少、精简
你这个也可以通过修改中断优先级来决解,使T0中断优先级高于T1
回复

使用道具 举报

板凳
ID:38265 发表于 2013-10-14 21:21 | 只看该作者
青苹果 发表于 2013-10-14 21:07
delayms(1000);导致,这个函数写在了中断里面,导致另一个中断不能及时响应,建议中断里面的程序尽量少、精 ...

谢谢指导,还想问一下
if(second==0&&minute==0)  //当分和秒同时为0时
   {                             
         TR1=0;        //关闭定时器1
         minute=0;
         second=0;
         beep=0;        //蜂鸣器开
         delayms(1000);        //延时1秒
         beep=1;         //蜂鸣器关
   }
这段程序如果不放在中断里,放到主程序里也不能正常运行时为什么呢?还有,怎么样修改中断优先级呢?我刚开始学习使用定时中断,麻烦你了,谢谢!
回复

使用道具 举报

地板
ID:38265 发表于 2013-10-14 21:38 | 只看该作者
青苹果 发表于 2013-10-14 21:07
delayms(1000);导致,这个函数写在了中断里面,导致另一个中断不能及时响应,建议中断里面的程序尽量少、精 ...

我知道了,设置PT0=1,把T0设为高级中断,现在问题解决了,谢谢你,非常感谢!!
回复

使用道具 举报

5#
ID:27916 发表于 2013-10-15 09:03 | 只看该作者
放到主程序里,估计会一直叫个不停吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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