基于51单片机的简单时钟电路
1.实现功能:日期、时间显示功能,定时功能
2.所用器件:89C52最小系统,按键,LED灯,八位七段数码管,74ls138,74ls245
3.各部分功能:138:选择数码管的位置,245:驱动数码管显示字符,按键依次是:调整位数,暂停时间,调整个数,切换显示功能(时间,日期,定时)
4.
``
#include<reg52.h>
#define uChar unsigned char
#define uInt unsigned int
uChar
a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选表 共阴极
uChar
b[8]={0xff,0xfb,0xf7,0xf3,0xef,0xeb,0xe7,0xe3}; //为选表 共阴极
uChar
second=10,minute=25,hour=12,year=19,month=11,day=21,count,timinghour=12,timingminute=13;
sbit Key1 = P3^1; //计时停止
sbit Key2 = P3^0; //调位
sbit Key3 = P3^2; //加一
sbit Key4 = P3^3; //切换
sbit Buzzer = P3^4; //报警器
/*延迟函数/
void Delay(uInt t)
{
while(t)
{
t--;
}
}
/**时,分,秒显示函数/
void Dispaly1(uChar second,uChar
minute,uChar hour) //秒,分,时
{
/第一位数码管/
P2=b[0]; //选择数码管
P0=a[hour/10]; //显示小时的十位
Delay(200); //延时
/第二位数码管/
P2=b[1];
P0=a[hour%10]; //显示小时的个位
Delay(200);
/第三位数码管/
P2=b[2];
P0=0x40; //显示分隔符
Delay(200);
/第四位数码管/
P2=b[3];
P0=a[minute/10]; //显示分钟的十位
Delay(200);
/第五位数码管/
P2=b[4];
P0=a[minute%10]; //显示分钟的个位
Delay(200);
/第六位数码管/
P2=b[5];
P0=0x40; //显示分隔符
Delay(200);
/第七位数码管/
P2=b[6];
P0=a[second/10]; //显示秒钟的十位
Delay(200);
/第八位数码管/
P2=b[7];
P0=a[second%10]; //显示秒钟的个位
Delay(200);
}
/*年,月,日显示函数/
void Dispaly2(uChar day,uChar month,uChar
year) //日,月,年
{
P2=b[0]; //选择数码管
P0=a[day/10]; //显示日的十位
Delay(200);
//延时
P2=b[1];
P0=a[day%10]; // 显示日的个位
Delay(200);
P2=b[2];
P0=0x40; //显示分隔符
Delay(200);
P2=b[3];
P0=a[month/10]; //显示月的十位
Delay(200);
P2=b[4];
P0=a[month%10]; //显示月的个位
Delay(200);
P2=b[5];
P0=0x40; //显示分隔符
Delay(200);
P2=b[6];
P0=a[year/10]; //显示年的十位
Delay(200);
P2=b[7];
P0=a[year%10]; //显示年的个位
Delay(200);
}
/时钟按键扫描函数/
void Keyscan1()
{
static
uChar i=0,j=0; //定义两个内部静态变量i和j
if(Key1==0)
//扫描按键k1按下一次i变量加一
{
Delay(10);
//消抖
if(Key1==0)
while(!Key1); //等待按键弹开
i++;
i=i%2; //让i在0和1之间循环
}
/*时钟暂停功能*/
if(i==1)
{
TR0=0; //如果是1按键自然关闭定时器0
}
if(i==0)
{
TR0=1; //如果是0按键则打开定时器0
}
/*时钟调位和数值加一功能*/
if(Key2==0)
{
Delay(10);
if(Key2==0)
while(!Key2);
j++;
j=j%3; //让j在0,1,2之间循环
}
if(j==0) //调节秒钟
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
second++;
if(second==60)
second=0;
}
}
if(j==1) //调节分钟
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
minute++;
if(minute==60)
minute=0;
}
}
if(j==2) //调节时钟
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
hour++;
if(hour==24)
hour=0;
}
}
}
/日期按键扫描函数/
void Keyscan2()
{
static
uChar m=0,n=0; //定义两个内部静态变量
if(Key1==0)
{
Delay(10);
if(Key1==0)
while(!Key1);
m++;
m=m%2; //让m在0和1之间循环
}
if(m==1)
{
TR0=0; /*奇数次按键则关闭定时器0*/
}
if(m==0)
{
TR0=1; /*偶数次按键则打开定时器0*/
}
if(Key2==0)
{
Delay(10);
if(Key2==0)
while(!Key2);
n++;
n=n%3;
//让n在0,1,2之间循环
}
/*日期调位和日期加一功能*/
if(n==0) //调节日期
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
day++;
if(day==30)
day=0;
}
}
if(n==1) //调节月份
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
month++;
if(month==12)
month=0;
}
}
if(n==2) //调节年份
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
year++;
if(year==99)
year=0;
}
}
}
/定时按键扫描函数/
void Keyscan3()
{
static
uChar j=0; //定义两个内部静态变量i和j
/*定时调位和数值加一功能*/
if(Key2==0)
{
Delay(10);
if(Key2==0)
while(!Key2);
j++;
j=j%2; //让j在0,1之间循环
}
if(j==0) //调节小时
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
timinghour++;
if(timinghour==24)
timinghour=0;
}
}
if(j==1) //调节分钟
{
if(Key3==0)
{
Delay(10);
if(Key3==0)
while(!Key3);
timingminute++;
if(timingminute==60)
timingminute=0;
}
}
}
/************************************************/
/主函数************/
/************************************************/
void main()
{
TMOD=0x01;
/*定时器以方式一工作*/
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; /*10ms计时*/
EA=1;
//允许打开中断
ET0=1; /*允许定时器0中断*/
TR0=1; /*打开定时器0*/
while(1)
{
static
uChar h=0; //定义内部静态变量
/*时钟和日期切换功能*/
if(Key4==0)
{
Delay(10);
if(Key4==0)
while(!Key4);
h++;
h=h%3;
}
if(h==0)/*如果按键为0则显示时钟*/
{
Dispaly1(second,minute,hour);
Keyscan1();
}
if(h==1)/*如果按键为1则显示日期*/
{
Dispaly2(year,month,day);
Keyscan2();
}
if(h==2)
/如果按键为2则显示闹钟时间/
{
Dispaly1(00,timingminute,timinghour);
Keyscan3();
}
}
}
/中断函数****/
void time0_int(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
if(count==100)/*每一秒计时一次*/
{
count=0; //每一秒将count清零一次
second++; //秒钟计时
if(second==60) //满60秒产生分钟计时
{
second=0; //秒钟清零
minute++; //分钟加一
if(minute==60) //满60分钟产生小时计时
{
minute=0; //分钟清零
hour++; //小时加一
if(hour==24) //满24小时产生天数计时
{
hour=0; //小时清零
day++; //天数加一
if(day==30)
//满30天产生月进位
{
day=0;
//天数清零
month++; //月数加一
if(month==12) //满12月产生年进位
{
month=0; //月数清零
year++; //年数加一
if(year==99) //满99直接清零
{
year=0;
}
}
}
}
}
}
}
/*判断整点提醒*/
if((hour==timinghour)&&(minute==timingminute))
Buzzer=1;
else
Buzzer=0;
}
``
5仿真: