专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

数码管可调倒计时器

作者:佚名   来源:本站原创   点击数:  更新时间:2012年05月09日   【字体:

调节精度:5分钟   调节范围:0~650分钟 数码管显示格式:000(分钟)-00(秒)
按下P1^0口开始倒计时   P1^1口停止   P1^2加时间    P1^3减时间
#include<reg51.h>
#define KeyPort P1
sbit Key_UP=P1^0;
sbit Key_DOWN=P1^1;
unsigned char KeyV,TempKeyV,num;          
sbit P25=P2^0;//数码管第1位
sbit P26=P2^1;//数码管第2位
sbit P29=P2^2;
sbit gang=P2^3;
sbit P27=P2^4;//数码管第4位
sbit P28=P2^5;
sbit P12=P1^2;//时间加
sbit P13=P1^3; //时间减
sbit JDQ=P3^7;//继电器
 unsigned int js;
 unsigned int ds=6000,x,y;//倒计时初始时间,加时,减时
 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+500;//定时加5分钟  (调节精度)
  while(!P12);
   }
   if(P13==0)
   {
    Delay(20);
    if(P13==0)
    ds=ds-500; //定时减5分钟
    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;
}

关闭窗口

相关文章