标题: 基于51单片机的闹钟 [打印本页]
作者: 1043130291 时间: 2017-8-1 21:52
标题: 基于51单片机的闹钟
(一)设计基本要求
1、用51单片机的中断实现时钟计时功能,数码管显示时、分、秒
2、可以设置一个闹钟,精确到分钟,可以通过按键设置闹钟时间(闹钟响三十秒)
3、可以分别对时、分、秒进行加和减的调整,每次加一或减一
4、最多使用四个按键
5、闹铃响的同时时钟显示不能受到影响
6、显示年月日(提示:换屏显示)
(二)程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
uchar num1,num2,temp1,flag;
uint count;
char xiaoshi,fen,miao,year=16,month=7,day=29,alahour,alafen,alamiao,a1,a2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar a,uchar b,uchar c)
{
uchar a1,a2,a3,a4,a5,a6;
a1=a/10;a2=a%10;
a3=b/10;a4=b%10;
a5=c/10;a6=c%10;
P0=0xfe;
wela=1;
wela=0;
P0=table[a1];
dula=1;dula=0;
delay(3);
P0=0xfd;
wela=1;wela=0;
P0=table[a2];
dula=1;dula=0; delay(1);
P0=0xfb;
wela=1;wela=0;
P0=0x80;
dula=1;dula=0;
delay(3);
P0=0xf7;
wela=1;wela=0;
P0=table[a3];
dula=1;dula=0;
delay(3);
P0=0xef;
wela=1;wela=0;
P0=table[a4];
dula=1;dula=0;
delay(1);
P0=0xdf;
wela=1;wela=0;
P0=0x80;
dula=1;dula=0;
delay(3);
P0=0xbf;
wela=1;wela=0;
P0=table[a5];
dula=1;dula=0;
delay(3);
P0=0x7f;
wela=1;wela=0;
P0=table[a6];
dula=1;dula=0;
delay(3);
}
void init()
{
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
}
void keyscan()
{
if(key4==0)
{
delay(10);
if(key4==0)
{
temp1++;
if(temp1==3)
{
temp1=0;
display(xiaoshi,fen,miao);
num2=0;
}
}
while(!key4);
}
switch(temp1)
{
case 0:display(xiaoshi,fen,miao);break;
case 1:display(year,month,day);break;
case 2:display(alahour,alafen,alamiao);
break;
}
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
num2++;
if(temp1==0)
TR0=0;
}
if(num2==4 && temp1==2)
flag=1;
if(num2==4)
{
num2=0;
//display(xiaoshi,fen,miao);
TR0=1;
}
}
if(num2!=0)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
while(!key2);
if(temp1==0)
{
if(num2==1)
{
miao++;
if(miao==60)
miao=0;
display(xiaoshi,fen,miao);
}
if(num2==2)
{
fen++;
if(fen==60)
fen=0;
display(xiaoshi,fen,miao);
}
if(num2==3)
{
xiaoshi++;
if(xiaoshi==24)
xiaoshi=0;
display(xiaoshi,fen,miao);
}
}
if(temp1==1)
{
if(num2==1)
{ day++;
if(year%4==0 && year%100!=0 || year%400==0)
{
if(month==2)
{
if(day==30)
day=1;
}
}
else
{
if(month==2)
{
if(day==29)
day=1;
}
}
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
{
if(day==32)
day=1;
}
if(month==4 || month==6 || month==9 || month==11)
{
if(day==31)
day=1;
}
display(year,month,day);
}
if(num2==2)
{
month++;
if(month==13)
month=1;
display(year,month,day);
}
if(num2==3)
{
year++;
if(year==100)
year=0;
}
}
if(temp1==2)
{
if(num2==2)
{
alafen++;
if(alafen==60)
alafen=0;
}
if(num2==3)
{
alahour++;
if(alahour==23)
alahour=0;
}
}
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3);
if(temp1==0)
{
if(num2==1)
{
miao--;
if(miao==-1)
miao=59;
display(xiaoshi,fen,miao);
}
if(num2==2)
{
fen--;
if(fen==-1)
fen=59;
display(xiaoshi,fen,miao);
}
if(num2==3)
{
xiaoshi--;
if(xiaoshi==-1)
xiaoshi=23;
display(xiaoshi,fen,miao);
}
}
if(temp1==1)
{
if(num2==1)
{ day--;
if(year%4==0 && year%100!=0 || year%400==0)
{
if(month==2)
{
if(day==-1)
day=29;
}
}
else
{
if(month==2)
{
if(day==-1)
day=28;
}
}
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
{
if(day==-1)
day=31;
}
if(month==4 || month==6 || month==9 || month==11)
{
if(day==-1)
day=30;
}
display(year,month,day);
}
if(num2==2)
{
month--;
if(month==-1)
month=12;
display(year,month,day);
}
if(num2==3)
{
year--;
if(year==-1)
year=99;
}
}
if(temp1==2)
{
if(num2==2)
{
alafen--;
if(alafen==-1)
alafen=59;
}
if(num2==3)
{
alahour--;
if(alahour==-1)
alahour=23;
}
}
}
}
}
if(xiaoshi==alahour && fen==alafen && flag==1 )
{
flag=0;
P1=0x00;
TR1=1;
}
}
void main()
{
init();
while(1)
{
keyscan();
// display(xiaoshi,fen,miao);
}
}
void t1() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
count++;
if(count==600)
{
P1=0xff;
count=0;
TR1=0;
}
}
void t0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{
num1=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
xiaoshi++;
if(xiaoshi==24)
{
xiaoshi=0;
day++;
if(year%4==0 && year%100!=0 || year%400==0)
{
if(month==2)
{
if(day==30)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
}
else
{
if(month==2)
{
if(day==29)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
}
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
{
if(day==32)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
if(month==4 || month==6 || month==9 || month==11)
{
if(day==31)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
}
}
}
}
}
作者: 七円君 时间: 2017-12-13 08:19
有没有仿真电路图
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |