📄 clockof51mcu.txt
字号:
/*************************************************************\
项目名称:数字钟
功能:日历,时间,码表,闹钟
备注:晶振11.0592
\*************************************************************/
#include<at89x52.h>
#include<intrins.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define set P3_7
#define key1 P3_6
#define key2 P3_5
#define nr P3_4
#define ringing P1_3
bit rng; // 全局铃声控制
uint count; // 用于计次,单位 10ms
uint mcount; // 码表计数
uchar rcount; // 响铃时间,单位 10ms
uchar cstate; // 显示的状态,也是全局状态
uchar kstate; // 按键的状态
bit stop;
uchar time[]={52,37,8};
uchar date[]={30,5,7,20};
uchar alarm[]={40,8};
uchar makeit[]={0x00,0x00,0x00,0x00};
//时间数组,分别为秒,分,时(3);日,月,年(4);码表(4);闹钟(2)
uchar k[] ={0x02,0x04,0x01,0x08,0x20,0x40,0x10,0x80}; //数码管的位置,片选数码管
uchar dat[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //数码管的数据
uchar leddata[]={
0x41, //"0"
0xF5, //"1"
0x29, //"2"
0x31, //"3"
0x95, //"4"
0x13, //"5"
0x03, //"6"
0x75, //"7"
0x01, //"8"
0x11, //"9"
0x05, //"A"
0x83, //"B"
0x4B, //"C"
0xA1, //"D"
0x0B, //"E"
0x0F, //"F"
0x85, //"H"
0xCB, //"L"
0x45, //"n"
0xC1, //"u"
0x0D, //"P"
0xA3, //"o"
0xBF, //"-"
0xFF, //熄灭
0xF5 //自定义
};
void delay(int m) //0.1MS
{
m*=20;
while(m--){}
}
void time_init()
{
EA = 1; /* 开总中断 */
ET0 = 1; /* 允许定时器0中断 */
ET1 = 1; /* 允许定时器1中断 */
TMOD = 0x11; /* 定时器工作方式选择 */
TL0 = 0xFF;
TH0 = 0xDB; /* 定时器赋予初值 10MS*/
TL1 = 0xFF;
TH1 = 0xDB; /* 定时器赋予初值 10MS*/
TR0 = 1; /* 启动定时器 0*/
// TR1 = 1; /* 启动定时器 1*/
count=0; //10MS指针为0
}
void timer0(void) interrupt 1 using 0
{
TR0 = 0;
TL0=0xFF;
TH0=0xDB;
TR0 = 1;
count++;
} /* 定时器0中断 */ //10MS 中断一次
void timer1(void) interrupt 3 using 0
{
TR1 = 0;
TL1=0xFF;
TH1=0xDB;
rcount--;
mcount++;
TR1 = 1;
if (rcount==0&&stop==1) TR1 = 0;ringing=0;
} /* 定时器1中断 */
void show() //LED显示数据
{
uchar i; //扫描第i个数码管
uchar j; //第j遍
for (j=0;j<3;j++) {
for(i=0;i<8;i++) {
P2=0xff-k[i];
P0=leddata[dat[i]];
delay(10) ;
}
}
}
void ring(bit rt) //响铃
{
if (rt) rcount=10;
else rcount=500;
if (rng) ringing=1;
else {ringing=0;
return;}
TR1 = 0;
TL1 =0xFF;
TH1 =0xDB;
TR1 = 1;
return;
}
void main()
{
/**************系统初始化*****************/
int k1; //一个计数变量
k1=0;
time_init();
cstate=0;
kstate=0;
P3=0xff;
stop=0;
rng=1;
/*****************************************/
while(1)
{
switch(cstate)
{ case 0:
dat[0]=time[0]%10;
dat[1]=time[0]/10;
dat[2]=time[1]%10;
dat[3]=time[1]/10;
dat[4]=time[2]%10;
dat[5]=time[2]/10;
dat[6]=23;
dat[7]=23;
show();
switch(kstate){ //这部分用于按键识别
case 0:
if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}
else kstate=0;
break;
case 1:
if (set==0) kstate=2;
if (key1==0) kstate=3;
if (key2==0) kstate=4;
if (nr==0) kstate=5;
if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
break;
case 2:
if (set==1) {kstate=0;cstate=1;k1=0;}
break;
case 3:
if (key1==1) {kstate=0;k1++;if(k1==3) k1=0;}
break;
case 4:
if (key2==1) {kstate=0;time[k1]++; }
break;
case 5:
if (nr==1) {kstate=0;rng=!rng;}
break;
}
break;
case 1:
dat[0]=date[0]%10;
dat[1]=date[0]/10;
dat[2]=date[1]%10;
dat[3]=date[1]/10;
dat[4]=date[2]%10;
dat[5]=date[2]/10;
dat[6]=date[3]%10;
dat[7]=date[3]/10;
show();
switch(kstate){ //这部分用于按键识别
case 0:
if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}
else kstate=0;
break;
case 1:
if (set==0) kstate=2;
if (key1==0) kstate=3;
if (key2==0) kstate=4;
if (nr==0) kstate=5;
if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
break;
case 2:
if (set==1) {kstate=0;cstate=2;k1=0;}
break;
case 3:
if (key1==1) {kstate=0;k1++;if(k1==3) k1=0;}
break;
case 4:
if (key2==1) {kstate=0;date[k1]++;}
break;
case 5:
if (nr==1) {kstate=0;rng=!rng;}
break;
} break;
case 2: //这里是闹钟
dat[0]=alarm[0]%10;
dat[1]=alarm[0]/10;
dat[2]=alarm[1]%10;
dat[3]=alarm[1]/10;
dat[4]=23;
dat[5]=23;
dat[6]=23;
dat[7]=23;
show();
switch(kstate){ //这部分用于按键识别
case 0:
if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}
else kstate=0;
break;
case 1:
if (set==0) kstate=2;
if (key1==0) kstate=3;
if (key2==0) kstate=4;
if (nr==0) kstate=5;
if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
break;
case 2:
if (set==1) {kstate=0;cstate=3;k1=0; }
break;
case 3:
if (key1==1) {kstate=0;k1++;if(k1==2) k1=0;}
break;
case 4:
if (key2==1) {kstate=0;alarm[k1]++;if(alarm[0]>=60){alarm[1]++;alarm[0]=0;}
if(alarm[1]>=24){alarm[1]=0;} } //在这里加上闹铃进位
break;
case 5:
if (nr==1) {kstate=0;rng=!rng;}
break;
} break;
case 3: //这里是码表
dat[0]=makeit[0]%10;
dat[1]=makeit[0]/10;
dat[2]=makeit[1]%10;
dat[3]=makeit[1]/10;
dat[4]=makeit[2]%10;
dat[5]=makeit[2]/10;
dat[6]=makeit[3]%10;
dat[7]=makeit[3]/10;
show();
switch(kstate){ //这部分用于按键识别
case 0:
if ((set==0)||(key1==0)||(key2==0)||(nr==0)) {delay(20);kstate=1;}
else kstate=0;
break;
case 1:
if (set==0) kstate=2;
if (key1==0) kstate=3;
if (key2==0) kstate=4;
if (nr==0) kstate=5;
if ((set==1)&&(key1==1)&&(key2==1)&&(nr==1)) kstate=0;
break;
case 2:
if (set==1) {kstate=0;cstate=0;k1=0;
{mcount=0;makeit[0]=0;makeit[1]=0;makeit[2]=0;makeit[3]=0;k1=0;}
}
break;
case 3: //start
if (key1==1) {kstate=0; stop=0;ringing=0; TR1 =1;}
break;
case 4: //stop and clear
if (key2==1) {kstate=0; rcount=0;stop=1; TR1 =0;
if(k1) {mcount=0;makeit[0]=0;makeit[1]=0;makeit[2]=0;makeit[3]=0;k1=0;}
else k1=1;
}
break;
case 5:
if (nr==1) {kstate=0; rng=!rng;}
break;
}
makeit[0]=mcount;
if (mcount>=100) {mcount=0;}
if (makeit[0]>=100) {makeit[1]++;makeit[0]=0;}
if (makeit[1]>=60) {makeit[2]++;makeit[1]=0;}
if (makeit[2]>=60) {makeit[3]++;makeit[2]=0;}
if (makeit[3]>=24) {makeit[3]=0;}
//码表
}/* 全局显示*/
/*下面为时钟累加*/
if (count>=100) {time[0]++; count=0;}
if (time[0]>=60) {time[1]++;time[0]=0;}
if (time[1]>=60) {time[2]++;time[1]=0;}
if (time[2]>=24) {date[0]++;time[2]=0;}
switch(date[1]){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if (date[0]>=32) {date[1]++;date[0]=1;} break;
case 4:
case 6:
case 9:
case 11: if (date[0]>=31) {date[1]++;date[0]=1;} break;
case 2: if ((date[2]!=0 && (date[2]%4==0))||(date[2]==1&&date[3]%4>0))
{if (date[0]>=30) {date[1]++;date[0]=1;}}
else {if (date[0]>=29) {date[1]++;date[0]=1;}} break;
}
if (date[1]>=13) {date[2]++;date[1]=1;}
if (date[2]>=100) {date[2]=0;}
if (date[3]>=100) {date[3]=0;}
P1=P3;
if (time[1]==alarm[0]&&time[2]==alarm[1]) ring(0);
//在这里加入闹铃比对
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -