单片机电子时钟设置 要求12小时制,初始时间11.59.55 求编写程序
答案:2 悬赏:80 手机版
解决时间 2021-01-24 20:43
- 提问者网友:战魂
- 2021-01-24 11:18
单片机电子时钟设置 要求12小时制,初始时间11.59.55 求编写程序
最佳答案
- 五星知识达人网友:第幾種人
- 2021-01-24 11:37
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=55,min=59,hour=12,scanled;
unsigned char key,mode,time;
unsigned char disdat[8];
sbit key1=P1^4;
sbit key2=P1^5;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>12)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x04;
P2=~ledtab[disdat[5]];
break;
case 1:
P3=0x08;
P2=~ledtab[disdat[4]]&0x7f;
break;
case 2:
P3=0x10;
P2=~ledtab[disdat[3]];
break;
case 3:
P3=0x20;
P2=~ledtab[disdat[2]]&0x7f;
break;
case 4:
P3=0x40;
P2=~ledtab[disdat[1]];
break;
case 5:
P3=0x80;
P2=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
if(key1==0)
{
while(key1==0);
TR0=1;
}
if(key2==0)
{
while(key2==0);
TR0=0;
}
}
}
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=55,min=59,hour=12,scanled;
unsigned char key,mode,time;
unsigned char disdat[8];
sbit key1=P1^4;
sbit key2=P1^5;
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>12)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=59;min--;}
else if(hour>0){sec=59;min=59;hour--;}
else {hour=0;min=0;sec=0;}
}
break;
}
dischg();
}
void t1isr() interrupt 3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P3=0x04;
P2=~ledtab[disdat[5]];
break;
case 1:
P3=0x08;
P2=~ledtab[disdat[4]]&0x7f;
break;
case 2:
P3=0x10;
P2=~ledtab[disdat[3]];
break;
case 3:
P3=0x20;
P2=~ledtab[disdat[2]]&0x7f;
break;
case 4:
P3=0x40;
P2=~ledtab[disdat[1]];
break;
case 5:
P3=0x80;
P2=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
mode=0;
dischg();
while(1)
{
if(key1==0)
{
while(key1==0);
TR0=1;
}
if(key2==0)
{
while(key2==0);
TR0=0;
}
}
}
全部回答
- 1楼网友:摆渡翁
- 2021-01-24 12:42
那可以用p3.3作外部中断输入,是int1,还可以用p3.4或p3.5输入时钟脉冲,用定时器t0或t1,工作在计数状态,也可以的。
如果整个p3口都用于数码管了,那就不能用中断方式输入了,采用查询方式会影响精度。
其实,外加了一个50hz的固定脉冲,也未必就是非常准确吧。用一个12mhz的晶振,用内部定时器计时,也可以做到很准确的吗,也不会比外部的固定脉冲误差大的。
最好的方法是用一片时钟芯片,ds1302,这是做电子钟的典型配置,计时精确,还可以带备用电池,计时不间断。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯