找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1367|回复: 8
收起左侧

如何用单片机外部中断做一个倒计时啊?

[复制链接]
ID:979617 发表于 2021-11-21 00:01 | 显示全部楼层 |阅读模式
在做一个比赛计时计分器,要设置一个暂停键。
按下后有30秒倒计时,倒计时结束继续比赛。
觉得可以用外部中断做一个,但是不知道怎么放进去。
有大佬知道怎么办吗,或者可以不用外部中断来完成
回复

使用道具 举报

ID:908826 发表于 2021-11-21 09:07 | 显示全部楼层
写一个子函数,里面写上开启定时器那个就行了呗,最多就是再来个按键扫描,检测那个按键是否按下,然后如果按下就触发这个定时器开关,开启定时器
回复

使用道具 举报

ID:983020 发表于 2021-11-21 09:25 | 显示全部楼层
编程软件写一个定时器的函数,然后根据所需时间写程序,然后烧进单片机不就ok了
回复

使用道具 举报

ID:979617 发表于 2021-11-21 10:28 | 显示全部楼层
13205495918 发表于 2021-11-21 09:07
写一个子函数,里面写上开启定时器那个就行了呗,最多就是再来个按键扫描,检测那个按键是否按下,然后如果 ...

主要是原本就有一个计时器了,想怎么用第二个做暂停,现在这样按下也没反应
  1. void main()                 
  2. {   
  3.                  k7=1;                 
  4.     {qudou();  
  5.      if(k7==0)
  6.      {InitTimer1();}
  7.                  else
  8.                  {InitTimer0();}
  9.                  while(k7==0);}
  10.                  while(1)                     
  11.      {xianshi();         
  12.                  if(kaishi==0)
  13.                           dd=0;
  14.                  if(sjd==0)       
  15.               key();       
  16.                  else
  17.                     bisai();  
  18.                  if(kaishi==0)
  19.                     ts=1;
  20.                  else
  21.                     ts=tishi;       
  22.                  if(xx==1)       
  23.                    {
  24.                                  for(xxx=0;xxx<1000;xxx++)          
  25.                    {
  26.                            ts=0;dd=0;xianshi();
  27.                          }   
  28.                      ts=1;xx=0;
  29.                          }       
  30.    }
  31. }
  32. void InitTimer0Interrupt(void) interrupt 1         

  33. {     TH0=0xb1;
  34.       TL0=0xe0;
  35.            if(shezhi==0)                  
  36.           {if(kaishi==1)          
  37.            {if(sjd==0)                  
  38.       {count++;                  
  39.        if(count==50)       //¼Æêy50′Σ¬¾íêÇò»Ãë
  40.        {count=0;                    //¼ÆêycountÇåáã
  41.              miao--;                   //±èèüê±¼äÃëλ¼õò»
  42.                  if(fen>0)                   //μ±±èèüê±¼ä·Öλ′óóú0ê±
  43.                  {if(miao<0){miao=59;fen--;}}
  44.                  else                   //μ±±èèüê±¼ä·Öλμèóú0ê±
  45.                  {if(miao<=0)       
  46.                   {sjd=1;kaishi=0;fen=0;miao=0;dd=1;xx=1;tishi=1;}  ˉxx=1
  47.                  }
  48.        }
  49.                   }
  50.                  }       
  51.                 }
  52.          
  53.           if(shezhi==0)                //Õy3£×′ì¬ê±
  54.           {if(kaishi==1)        //±èèü¿aê¼
  55.            {if(sjd==0)                //sjd=0Îa±èèüê±¼äûμ½
  56.       {count1++;                 //¶¨ê±¼Æêycount1
  57.        if(count1==25)          //¼Æêy25′Σ¬¾íêÇ0.5Ãë
  58.        {count1=0;                //¼Æêycount1Çåáã
  59.               if(fen==0)        //μ±±èèüê±¼ä·Öλμèóú0ê±
  60.          if(miao=0)        //í¬ê±ÃëλD¡óúμèóú10
  61.                      tishi=!tishi;        //êμÏÖéù1a±¨¾ˉòÔ1HzÆμÂêìáê¾
  62.                 dd=!dd;                //ÏÔê¾ê±¼äμÄ¡°£o¡±òÔ1HzÆμÂêéá˸
  63.        }
  64.                   }
  65.                  }       
  66.                 }

  67.            if(shezhi==0)       
  68.            shanshuo=0;               
  69.            else                               
  70.            {count2++;                
  71.        if(count2==10)         
  72.        {
  73.                                  count2=0;               
  74.                shanshuo=!shanshuo;
  75.                    }
  76.                  }       
  77. }
  78. void InitTimer1Interrupt(void) interrupt 3
  79. {
  80.           fen=0;
  81.                 miao=30;
  82.           TH1 = 0x0B1;
  83.     TL1 = 0x0E0;
  84.                 {count++;                   
  85.        if(count==50)      
  86.        {
  87.                                  count=0;         
  88.                                  miao--;
  89.        }
  90.                          if(miao==0)
  91.                          {
  92.                                  tishi=!tishi;       
  93.                dd=!dd;
  94.                          }
  95.           }
  96. }
复制代码
回复

使用道具 举报

ID:983065 发表于 2021-11-21 13:13 | 显示全部楼层
以AT89S52单片机为核心元件,利用两位7段共阳极数码管作为显示器件。在此设计中共接入2个两位一体7段共阳LED数码管,来显示实时数字,其中1个用于显示十位,1个用于显示个位,通过查表指令分别动态显示个位和十位。2个LED数码管显示范围可达到0-99 。上电时,显示59并开始自动每秒自动减1,当按键1按下时记录当前时间值,当按键2按下时显示当前记录值,显示过之后再次按下按键1时秒表复位为59。
回复

使用道具 举报

ID:123289 发表于 2021-11-23 10:33 | 显示全部楼层
很简单:你在定时中断服务程序中,做一个计时器,但计时再增加一个条件,例:T=1时,它计时,T=0时它不计时。这个简单吧,增加一个IF语句的事!
这个T何时为0,何时为1,你再用外中断+30秒计时来控制它。
回复

使用道具 举报

ID:983681 发表于 2021-11-23 15:16 | 显示全部楼层
按键外部中断,在外部中断函数里启动定时器,计时就可以了
回复

使用道具 举报

ID:983681 发表于 2021-11-23 15:17 | 显示全部楼层
按键触发外部中断函数启动定时器,倒计时就可以了
回复

使用道具 举报

ID:944237 发表于 2021-11-23 20:50 | 显示全部楼层
设置一个1ms进入一次的定时器中断,在中断里设置1s秒数减1,从三十减着下来就可以了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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