找回密码
 立即注册

QQ登录

只需一步,快速开始

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

论坛里的单片机倒计时代码求指点

[复制链接]
跳转到指定楼层
楼主
ID:520175 发表于 2019-5-23 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大神们好,下面这是论坛里的一段倒计时代码,新手想请教一下各位,它具体是如何实现1秒的倒计时的?求教
#include<reg51.h>
#define KeyPort P1
sbit Key_UP=P1^4;
sbit Key_DOWN=P1^5;
unsigned char KeyV,TempKeyV,num;                                                            
sbit P25=P2^5;//数码管第1位
sbit P26=P2^4;//数码管第2位
sbit P29=P2^3; //数码管第3位
sbit gang=P2^0;          ///分隔符
sbit P27=P2^1;//数码管第3位
sbit P28=P2^2;// 数码管第4位
sbit P12=P1^6;//时间加
sbit P13=P1^7; //时间减

sbit JDQ=P3^4;//继电器

unsigned int js;
unsigned int ds=1000,x,y;//倒计时初始时间,加时,减时  30分钟
unsigned char jsflag;
static unsigned int i;
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
  unsigned char KeyScan(void);//键盘扫描
  void tiaojie(void);
void Delay(unsigned int ii)        //1MS
{
unsigned int jj;
for(;ii>0;ii--)
for(jj=0;jj<125;jj++);
}
void main()
{
           EA = 1;                                        //允许CPU中断
        ET0 = 1;                                 //定时器0中断打开
        ET1=1;                                        //定时器1中断打开
        TMOD = 0x11;                        //设定时器0 1为模式1,16位模式
        TH0=0xB8;
        TL0=0x00;                                //设定时值为(20ms)
        TH1=0xdc;                                        //设定时值为(10ms)
        TL1=0x00;
        TR0 = 1;
        TR1=1;

        KeyV = 0;
        TempKeyV = 0;
        jsflag=0;
while(1);
}

//定时器0中断外理中键扫描和显示
void Key_Time0(void) interrupt 1 using 2
{
  TH0=0xB8;
        TL0=0x00;                                //设定时值为20000us(20ms)
  if (!Key_UP)
    KeyV = 1;
  if (!Key_DOWN)
    KeyV = 2;
        
          if(P12==0)
          {
           Delay(20);
           if(P12==0)
            ds=ds+100;//定时加1分钟         (调节精度)
                while(!P12);
          }
          if(P13==0)
          {
           Delay(20);
           if(P13==0)
           ds=ds-100; //定时减1分钟
           while(!P13);
          }
   if (KeyV!= 0)      //有键按下
    {
      Delay(10);   //延时防抖  按下10ms再测
      if (!Key_UP)
        TempKeyV = 1;
      if (!Key_DOWN)
        TempKeyV = 2;
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键
           {
                      if (KeyV == 1)
                   {
                                   jsflag=0;
                                                      if(ds==0)
                                                   {
                                                   ds=100;
                                                   }
                                                         js=js+1;
                                                        JDQ=1;   //继电器吸合
                                                
                               if(js==50)
                                   {
                                 js=0;
                                 ds=ds-1;
         
                             }
           }
if(KeyV==2)
{
          jsflag=1;
        }
}
}
   if(jsflag==1)
   {
   JDQ=0;
   }
   if(ds==0)
   {
   JDQ=0;
   jsflag=1;
   KeyV=0;
   }

}

void disp_Time1(void) interrupt 3 using 3
{
        TH1=0xdc;
        TL1=0x00;
        x=ds/10000;

           P0=LEDDis[x]; //分钟百位
     P25=0;
     Delay(2);
         P25=1;

          y=(ds%10000)/1000;//分钟十位
      P0=LEDDis[y];
      P26=0;
      Delay(2);
      P26=1;

     P0=LEDDis[((ds%10000)%1000)/100];//分钟各位
     P29=0;
     Delay(2);
     P29=1;                                

P0=0xbf; //分钟与秒的间隔符
gang=0;
Delay(2);
gang=1;

  P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
  if(((ds%1000)%100)/10>=6)          //满60,百位减一
  {
  ds=ds-10;
  P0=LEDDis[6];
  }
  P27=0;
  Delay(2);
  P27=1;

  P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
  P28=0;
  Delay(2);
  P28=1;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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