课程设计做了个数字钟,带日历和闹钟。
/*********************************************************************
* 功能:能显示时间,月,日,星期,整点报时,闹钟设定,同时能够调整, *
* 0号键切换时间,年份,闹钟显示;1号键切换设定值,2号键为加1键,*
* 3号键为减1键,4号键为闹钟开启与关闭 *
* 日期:2009年5月29日 *
*********************************************************************/
#include <reg52.h>
#include "jianpan.h"
#define uchar unsigned char
#define uint unsigned int
uchar sec,min,h,mon,day,week; //秒,分,时,月,日,星期
uchar nz_sec,nz_min,nz_h; //闹钟的时,分,秒
uchar set_1,set_2; //切换模式标志
uchar count;
uchar a;
uint year;
uchar key;
uchar tt=0;
sbit led0=P1^0; //调整时间标志信号
sbit led1=P1^1; //调整日期标志信号
sbit led2=P1^2; //调整闹钟标志信号
sbit led3=P1^3; //闹钟开启关闭标志信号
sbit beep=P0^7; //蜂鸣器
uchar disp[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9}; //段选
uchar disbit[]={0xff,0xef,0xcf,0xbf,0x9f,0x8f}; //位选
uchar buffer[]={0x00,0x00,0x00,0x00,0x00,0x00}; //显示缓冲区
uchar table1[]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void init();
void display();
void key0();
void key1();
uchar add1(uchar m);
uchar dec1(uchar n);
void set_time();
void set_data();
void set_nz();
void zdbaoshi();
void naozhong();
/*********主函数************/
void main()
{
init(); //初始化
while(1)
{
key=keyscan(); //调用键盘值
key0(); //切换时间,年份,闹钟
key1(); //调整时间,日期,闹钟
set_time(); //设置时间
set_data(); //设置日期
set_nz(); //设置闹钟
zdbaoshi(); //整点报时
naozhong(); //闹钟
}
}
/**********初始化函数**************/
void init()
{
TMOD=0x011; //用定时器1和2
TH0=0x4c; //定时器1设为50ms
TL0=0x00;
TH1=(65536-1000)/256; //定时器2设为1ms
TL1=(65536-1000)%256;
ET0=1;
ET1=1;
EA=1;
TR0=1;
TR1=1;
sec=50;min=59;h=11;
nz_sec=0;nz_min=1;nz_h=12;
year=2009;mon=5;day=29;week=5;
}
/*********切换显示函数*************/
void key0()
{
if(key==0)
{
set_2=0;
set_1++;
while(key==0) //等待按键释放
{
key=keyscan();
if(key!=0)
break;
}
}
if(set_1==6)
set_1=0;
}
/*************调整函数*************/
void key1()
{
if(key==1)
{
set_2++;
while(key==1) //等待按键释放
{
key=keyscan();
if(key!=1)
break;
}
}
if(set_2==3)
set_2=0;
}
/**********加1函数****************/
uchar add1(uchar m)
{
if(key==2)
{
m++;
while(key==2) //等待按键释放
{
key=keyscan();
if(key!=2)
break;
}
}
return(m);
}
/***********减1函数*************/
uchar dec1(uchar n)
{
if(key==3)
{
n--;
while(key==3) //等待按键释放
{
key=keyscan();
if(key!=3)
break;
}
}
return(n);
}
/*********设置时间函数***********/
void set_time()
{
if(set_1==1)
{
if(set_2==0) //设置秒
{
sec=add1(sec);
if(sec==60)
sec=0;
sec=dec1(sec);
if(sec>=60)
sec=59;
}
if(set_2==1) //设置分
{
min=add1(min);
if(min==60)
min=0;
min=dec1(min);
if(min>=60)
min=59;
}
if(set_2==2) //设置小时
{
h=add1(h);
if(h==24)
h=0;
h=dec1(h);
if(h>=24)
h=23;
}
}
}
/*************设置日期函数**************/
void set_data()
{
if(set_1==3)
{
if(set_2==0) //设置星期
{
week=add1(week);
if(week==8)
week=1;
week=dec1(week);
if(week>=8)
week=7;
}
if(set_2==1) //设置天
{
day=add1(day);
if(day==32)
day=0;
day=dec1(day);
if(day>=32)
day=31;
}
if(set_2==2) //设置月
{
mon=add1(mon);
if(mon==13)
mon=1;
mon=dec1(mon);
if(mon>=13)
mon=12;
}
}
}
/************设置闹钟函数**************/
void set_nz()
{
if(set_1==5)
{
if(set_2==0) //设置闹钟秒
{
nz_sec=add1(nz_sec);
if(nz_sec==60)
nz_sec=0;
nz_sec=dec1(nz_sec);
if(nz_sec>=60)
nz_sec=59;
}
if(set_2==1) //设置闹钟分
{
nz_min=add1(nz_min);
if(nz_min==60)
nz_min=0;
nz_min=dec1(nz_min);
if(nz_min>=60)
nz_min=59;
}
if(set_2==2) //设置闹钟小时
{
nz_h=add1(nz_h);
if(nz_h==24)
nz_h=0;
nz_h=dec1(nz_h);
if(nz_h>=24)
nz_h=23;
}
}
}
/**************整点报时函数****************/
void zdbaoshi()
{
if(min==0&&(sec==0)&&set_1==0)
{
beep=0;
}
}
/*************闹钟函数********************/
void naozhong()
{
if(key==4) //闹钟开启关闭
{
tt++;
while(key==4) //等待按键释放
{
key=keyscan();
if(key!=4)
break;
}
}
if(tt==2) tt=0;
if(tt==0) led3=1;
if(tt==1)
{
led3=0;
if(nz_h==h&&nz_min==min&&nz_sec==sec)
{
while(sec<10&&key!=4)
{
key=keyscan();
beep=0;
}
}
}
}
/***************中断函数T0*************/
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
count++;
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
h++;
if(h==24)
{
h=0;
week++;
day++;
if(week==8)
{
week=1;
}
if(year%4==0&&year%100!=0||year%400==0) //闰年
{
if(day==table1[mon]+1)
{
day=1;
mon++;
if(mon==13)
{
mon=1;
year++;
}
}
else
{
if(day==table2[mon]+1) //非闰年
{
day=1;
mon++;
if(mon==13)
{
mon=1;
year++;
}
}
}
}
}
}
}
}
}
/*********中断T1显示函数**************/
void timer1() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
if(set_1==0||set_1==1) //时间显示
{
if(set_1==0)
{ led0=1;led1=1;led2=1; }
if(set_1==1)
{
TR0=0; //关定时器
switch(set_2)
{
case 0: led0=1;led2=0;break;
case 1: led2=1;led1=0;break;
case 2: led1=1;led0=0;break;
}
}
buffer[0]=sec%10;
buffer[1]=sec/10;
buffer[2]=min%10;
buffer[3]=min/10;
buffer[4]=h%10;
buffer[5]=h/10;
P0=disp[buffer[a]]&disbit[a];
}
if(set_1==2||set_1==3) //日期显示
{
TR0=1; //开定时器
if(set_1==2)
{ led0=1;led1=1;led2=1; }
if(set_1==3)
{
switch(set_2)
{
case 0: led0=1;led2=0;break;
case 1: led2=1;led1=0;break;
case 2: led1=1;led0=0;break;
}
}
buffer[0]=week%10;
buffer[1]=week/10;
buffer[2]=day%10;
buffer[3]=day/10;
buffer[4]=mon%10;
buffer[5]=mon/10;
P0=disp[buffer[a]]&disbit[a];
}
if(set_1==4||set_1==5||set_1==6) //闹钟显示
{
if(set_1==4)
{ led0=1;led1=1;led2=1; }
if(set_1==5)
{
switch(set_2)
{
case 0: led0=1;led2=0;break;
case 1: led2=1;led1=0;break;
case 2: led1=1;led0=0;break;
}
}
buffer[0]=nz_sec%10;
buffer[1]=nz_sec/10;
buffer[2]=nz_min%10;
buffer[3]=nz_min/10;
buffer[4]=nz_h%10;
buffer[5]=nz_h/10;
P0=disp[buffer[a]]&disbit[a];
}
a++;
if(a==6)
a=0;
}