📄 clock.c
字号:
//******************************************//
//本程序为单片机89c51控制时钟的实例。 //
//1键调整时间,进入后2键调时,3键调分 //
//2键秒显示 ,进入后按1键返回原始状态 //
//3键调整闹铃,进入后2键调时,3键调分 //
//4键起停闹铃,按键启动,再按键撤销 //
//******************************************//
#include<reg51.h>
#include<MAX7_9.h>
#define uchar unsigned char
sbit Beep =P0^7; /*“1”闹铃输出*/
sbit S_settime=P3^2; //1键调整时间
sbit S_secdisp=P3^3; //2键秒显示
sbit S_setalam=P3^4; //3键调整闹铃
sbit S_runalam=P3^5; //4键起停闹铃
uchar click; //中断次数计数器变量,40次=1s
uchar delay_time; //延时时间,主要是用于进入其他程序分支后能够退出
/*定义计时变量*/
uchar time_sec;
uchar time_min;
uchar time_hor;
/*定义闹铃变量*/
uchar alarm_min=10;
uchar alarm_hor=07;
/*启动闹钟标志*/
uchar Aflag;
/*定义显示缓冲*/
unsigned char max7219buf[4]; //max7219 buffer set //led初始时间显示'--.--'
void delay(uchar x) //对于12M晶振延时1ms j取125 6M j取75=1ms
{
uchar j;
while(x--)
{
for (j=0;j<75;j++)
{;}
}
}
/*时间位分离子程序*/
void time_depart(uchar t_min,uchar t_hor)
{
uchar minL,minH,horL,horH,i;
minL=t_min%10;
minH=t_min/10;
horL=t_hor%10;
horH=t_hor/10;
//0.5s点亮一次小数点
if(click<=19)
{
horL=horL|0x80;
}
else
{
horL=horL;
}
if (Aflag==1)
{
minL=minL|0x80;
}
else
{
minL=minL;
}
max7219buf[0]=horH;
max7219buf[1]=horL;
max7219buf[2]=minH;
max7219buf[3]=minL;
for (i=0;i<4;i++) send(i+1,max7219buf[i]);
}
//键盘扫描子程序
uchar keyscan(void) //判断按键并返回键值,无键按下P3=0x3c
{ /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
if((~P3&0x3c)!=0) //如果有键按下
{
delay(20); //延时10ms去抖动
if((~P3&0x3c)!=0) //有键按下
{
if(S_settime==0) //功能键按下
return 1;
if(S_secdisp==0) //调时键按下
return 2;
if(S_setalam==0) //调分键按下
return 3;
if(S_runalam==0) //闹铃键按下
return 4;
}
}
return 0;
} /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
//时间调整子程序
void SetTime(void)
{ /*----------------------*/
uchar key;
delay_time=0;
while(1)
{
key=keyscan();
if (key==2) //调时键按下
{
delay_time=0;
key=0;
if(++time_hor>=24)
{
time_hor=0;
}
delay(250);
}
if (key==3) //调分键按下
{
delay_time=0;
key=0;
if(++time_min>=60)
{
time_min=0;
}
delay(250);
}
if(4<=delay_time) break;
time_depart(time_min,time_hor);
}
} /*----------------------*/
//秒显示子程序
void disp_sec(void)
{ /*########################*/
uchar key;
uchar s;
while(1)
{
s=0;
time_depart(time_sec,s);
key=keyscan();
if(key==1) break; //若功能键按返回正常显示状态
}
} /*########################*/
//定时调整子程序
void SetAlarm(void) //判断按键并返回键值,无键按下P3=0x3c
{ /*@@@@@@@@@@@@@@@@@@@@@@@@@*/
uchar key;
uchar p;
delay_time=0;
while(1)
{
key=keyscan();
if (key==2) //调时键按下
{
delay_time=0;
p=delay_time;
key=0;
if(++alarm_hor>=24)
{
alarm_hor=0;
}
delay(250);
}
if (key==3) //调分键按下
{
delay_time=0;
p=delay_time;
key=0;
if(++alarm_min>=60)
{
alarm_min=0;
}
delay(250);
}
if(4<=delay_time) break;
time_depart(alarm_min,alarm_hor);
}
} /*@@@@@@@@@@@@@@@@@@@@@@@@@*/
/*定时器中断子程序*/
void timer0 (void) interrupt 1 using 2
{ /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
TH0=-10000/256;
TL0=-10000%256;
if(++click>=40) //定时25ms //更新时间子循环
{
delay_time++;
click=0;
if(++time_sec>=60)
{
time_sec=0;
if(++time_min>=60)
{
time_min=0;
if(++time_hor>=24)
{
time_hor=0;
}
}
}
}
//判断闹铃报时
if (Aflag==1)
{
if (time_hor==alarm_hor)
if (time_min==alarm_min)
{Beep=1;}
else
{Beep=0;}
}
//判断正点报时
if (time_min==0)
{
if (time_sec==0)
{Beep=1;}
else
{Beep=0;}
}
} /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
void main(void)
{ /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
uchar key_value;
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256; //定时25ms
EA=1; //开CPU中断
ET0=1; //开定时器中断
TR0=1;
Beep=0;
max7_9_init();
while(1)
{
time_depart(time_min,time_hor);
key_value=keyscan(); //扫描键盘
if (key_value==1) //启动调时功能
{
key_value=0;
SetTime();
}
else if (key_value==2) //启动秒显功能
{
key_value=0;
disp_sec();
}
else if (key_value==3) //启动调整闹铃功能
{
key_value=0;
SetAlarm();
}
else if (key_value==4) //启动闹铃,Aflag==1,闹铃ON,Aflag==0,闹铃OFF
{
key_value=0;
if (Aflag==1)
{
Aflag=0;
}
else
{
Aflag=1;
}
}
}
} /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -