简易数字时钟

来源:互联网 发布:代运营淘宝骗局 编辑:程序博客网 时间:2024/04/29 17:07

功能描述:用四个7段数码管来显示时间,并可以用两个按键来调整时间。

 

电路原理图:

 

程序:

#include<reg52.h>
sbit hou_shi=P3^6;
sbit hou_ge=P3^7;
sbit min_shi=P3^5;
sbit min_ge=P3^4;
sbit sec_dian=P3^0;
int num=0,hou=23,min=59,sec=0;

/***************时钟子程序*******************/
void clock()
{
 if(num==20)
 {
  num=0;
  sec++;
 }
 if(sec==60)
 {
  sec=0;
  min++;
 }
 if(min==60)
 {
  min=0;
  hou++;
 }
 if(hou==24)
 {
  hou=0;
 }
}

/****************延时子程序******************/
void delay(void) 
{
    unsigned char a,b;
    for(a=40;a>0;a--)
        for(b=100;b>0;b--);
}

/****************分钟显示子程序******************/
void display_min(num_min)
{
 int a,b;
 a=num_min/10;
 b=num_min%10;
 min_shi=1;    //开锁存器
 switch(a)
 {
  case 0:P2=0x3F;delay();break;
  case 1:P2=0x06;delay();break;
  case 2:P2=0x5B;delay();break;
  case 3:P2=0x4F;delay();break;
  case 4:P2=0x66;delay();break;
  case 5:P2=0x6D;delay();break;
  case 6:P2=0x7D;delay();break;
  case 7:P2=0x07;delay();break;
  case 8:P2=0x7F;delay();break;
  case 9:P2=0x6F;delay();break;
  default:break;
 }
 min_shi=0;   //关锁存器
 //delay();   //延时
 min_ge=1;
 switch(b)
 {
  case 0:P2=0x3F;delay();break;
  case 1:P2=0x06;delay();break;
  case 2:P2=0x5B;delay();break;
  case 3:P2=0x4F;delay();break;
  case 4:P2=0x66;delay();break;
  case 5:P2=0x6D;delay();break;
  case 6:P2=0x7D;delay();break;
  case 7:P2=0x07;delay();break;
  case 8:P2=0x7F;delay();break;
  case 9:P2=0x6F;delay();break;
  default:break;
 }
 min_ge=0;
}

/***************小时显示程序*******************/
void display_hou(num_hou)
{
 int a,b;
 a=num_hou/10;
 b=num_hou%10;
 hou_shi=1;
 //delay();
 switch(a)
 {
  case 0:P1=0x3F;delay();break;
  case 1:P1=0x06;delay();break;
  case 2:P1=0x5B;delay();break;
  case 3:P1=0x4F;delay();break;
  case 4:P1=0x66;delay();break;
  case 5:P1=0x6D;delay();break;
  case 6:P1=0x7D;delay();break;
  case 7:P1=0x07;delay();break;
  case 8:P1=0x7F;delay();break;
  case 9:P1=0x6F;delay();break;
  default:break;
 }
 hou_shi=0;
 //delay();
 hou_ge=1;
 switch(b)
 {
  case 0:P1=0x3F;delay();break;
  case 1:P1=0x06;delay();break;
  case 2:P1=0x5B;delay();break;
  case 3:P1=0x4F;delay();break;
  case 4:P1=0x66;delay();break;
  case 5:P1=0x6D;delay();break;
  case 6:P1=0x7D;delay();break;
  case 7:P1=0x07;delay();break;
  case 8:P1=0x7F;delay();break;
  case 9:P1=0x6F;delay();break;
  default:break;
 }
 hou_ge=0;
}

/***************闪烁灯*******************/
void display_sec(num_sec)
{
 if(num_sec%2==0)
  sec_dian=0;
 if(num_sec%2==1)
  sec_dian=1;
}

 /****************主程序******************/
void main()
{
 IE=0x8d;  //开总中断(EA=1),开定时器1(ET1=1),
     //开外部中断1(EX1=1),开外部中断0(EX0=1).
 TMOD=0x10;             //选择定时器1的工作方式为方式1
 TH1=(65536-39990)/256; //装初值
 TL1=(65536-39990)%256;
 TCON=0x45;              //启动定时器1(TR1=1),设置INT0和INT1负边沿触发。
 while(1)
 {
  clock();
  display_sec(sec);
  display_min(min);
  display_hou(hou);
 }
}

void time1() interrupt 3   //定义定时器1
{
 TH1=(65536-39990)/256;
 TL1=(65536-39990)%256;
 num++;
}

void interrupt1() interrupt 2  //定义外部中断1
{
 hou++;
 sec=0;
}

void interrupt0() interrupt 0   //定义外部中断0
{
 min++;
 sec=0;
}

 

原创粉丝点击