数码可调时钟(加闹钟)

来源:互联网 发布:淘宝装修案例 编辑:程序博客网 时间:2024/04/30 03:26

#include"reg52.h"
#define shuma P0
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar count=0;
uchar sec=0;
uchar min=25;
uchar hou=14;
uchar Nhou=14,Nmin=26; /*****闹钟时间*****/
uchar key_num,flag;
sbit smg_a=P1^0;
sbit smg_d=P1^1;
sbit smg_g=P1^2;
sbit smg_h=P1^3;
sbit keystop=P3^3;
sbit keycon=P3^4;//控制启动和停止定时器
sbit key_set=P3^5;//多功能键调时模式选择
sbit key_up=P3^6;
sbit key_down=P3^7;
sbit SPK = P1^5;//闹钟蜂鸣器
void init();
void keyscan();
void didi();
void display(uchar shi,uchar fen);
void naozhong();
/**********延时子程序**********/
void delay10ms(void)
{
uchar i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void delay_ms(uint ms)
{
  uint i,j;
  for (i=ms;i>0;i--)
     for(j=124;j>0;j--);
}
void delay(void)
{
uchar i=10;
while(i--);
}

void main(void)
{
 init(); //调用初始化程序
 while(1)
 {
 keyscan();
 if(count==20)
 {
  count=0;
  sec++;
  if(sec==60)
  {
   sec=0;
   min++;
   if(min==60)
   {
 min=0;
 hou++;
 if(hou==24)
 {
  hou=0;
 }
   }
  }
  }
   display(hou,min);
   naozhong();
 }
}
/********按键处理子程序******************/
void keyscan()       //时间调节子程序
{
 if(keycon==0)
 {
  delay10ms(); //去抖动
  if(keycon==0)
  {
    while(!keycon)
 TR0=~TR0;//按键启动和停止计数器T0
  }
 }
 if(key_set==0)
 {
  delay10ms();
  if(key_set==0)
  {
   while(!key_set);
   SPK=0;
   delay_ms(15);
   SPK=1;
   key_num++;
   if(key_num==3)
   {
   key_num=0;
   //TR0=1;
   }
 }  
  }
 if(key_num!=0)
   {
    if(key_up==0) //+键检测
   {
    delay10ms();
    if(key_up==0)
    {
      while(!key_up);
   SPK=0;
   delay_ms(15);
   SPK=1;
      if(key_num==1)
      {
       min++;    //分钟加一
       if(min==60)
        min=0;     
      }
      if(key_num==2)
      {
       hou++; //时钟加一
       if(hou==24)
        hou=0;  
      }     
    }
      
   }
   if(key_down==0)//-键检测
   {
    delay10ms();
    if(key_down==0)
    {
      while(!key_down);
   SPK=0;
   delay_ms(15);
   SPK=1;
      if(key_num==1)
      {
       min--;
       if(min==-1)
        min=59;           
      }
      if(key_num==2)
      {
       hou--;
       if(hou==-1)
        hou=23;    
      }   
    }
   }  
  }
}
 //*******闹钟功能(到点了蜂鸣器响)*************//
  void naozhong()//闹钟功能
  {
  if(hou==Nhou&&min==Nmin)
  {
  flag=1; 
  }
  if(flag==1)
  {
   didi();
   }
  }
 
 void didi()
{
  SPK=0;
  delay_ms(10);
  
}
/*****初始化子程序******/
void init()
{
 key_set=key_up=key_down=1;
 count=0;
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
}
/*****定时器0中断函数*****/
void timer() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 count++;
}
/******显示子程序*******/
void display(uchar hou,uchar min)
{
smg_a=0;
shuma=table[hou/10];
delay();
shuma=0xff;
smg_a=1;

smg_d=0;
shuma=table[hou%10];
if(count>=10)//小数点半秒交替显示
shuma&=0x7f;
delay();
shuma=0xff;
smg_d=1;

smg_g=0;
shuma=table[min/10];
delay();
shuma=0xff;
smg_g=1;

smg_h=0;
shuma=table[min%10];
delay();
shuma=0xff;
smg_h=1;
}