简易数字时钟
来源:互联网 发布:代运营淘宝骗局 编辑:程序博客网 时间: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;
}