万年历程序.docx
《万年历程序.docx》由会员分享,可在线阅读,更多相关《万年历程序.docx(22页珍藏版)》请在冰豆网上搜索。
万年历程序
//*******万年历*********
//****2010年10月23日****
//**********************
#include
#include
#include
charTAB[10]={0x30,0x31,0x32,0x33,//0123
0x34,0x35,0x36,0x37,//4567
0x38,0x39};//89
charTABb[]={"ModTudWedThdFriSatSun"};//1234567
unsignedcharhour=0,min=0,sec=0,num=0;//程序开始时时分秒清零
unsignedcharyearh=20,yearl=0,month=1,day=1,weekday=1;
unsignedcharsigh1=0,sigh2=0,sigh4=0,sigh5=0,sigh6=0;
unsignedcharhh,mm,sigh3=0;
unsignedcharsm=0,ss=0,sn=0;
unsignedcharset1=0,set2=0;
unsignedcharTemph,Templ;
unsignedinttemp;
voidsett0();//设置定时器to
voidsettimer3();
voidsettimer4();//倒计时设置
voiddisplay1();//时分秒显示
voiddisplay2();//日期显示
voiddisplay3();//闹钟显示
voiddisplay4();//倒计时显示
voiddisplay5();//显示温度
voidbz();
//
voidINTI_LCD();
voidWR_COMM();
voidCHECK_BF();
voidWR_DATA();
voidCLS();
//
//
voiddelay20ms(intx);
//
//
voiddelay(unsignedinti)//温度延时
{
while(i--);
}
//
voidinit_DS18B20(void);//初始化
unsignedcharReadOneChar(void);//读一个字节
voidWritdOneChar(unsignedchardat);//写一个字节
unsignedintReadTemperature(void);//读取温度
voiddebouncer(void)
{
inti;
for(i=0;i<2400;i++);
}
//
voiddaojishi();
sbitk1=P3^0;
sbitk2=P3^1;
sbitk3=P3^2;
sbitk4=P3^3;
sbitLED1=P1^2;
sbitLED2=P1^4;
sbitLED3=P1^5;
sbitLED4=P1^7;
//
sbitrs=P2^4;
sbitrw=P2^5;
sbite=P2^6;
sbitbf=P0^7;
sbitDQ=P1^3;
#defineLCDP0
#defineLEDP1
//设置时分秒
voidsettimer1()
{
hour=12;
min=30;
sec=30;
TR0=0;
while(k1==1)
{
if(k2==0){debouncer();if(k2==1){sigh4++;if(sigh4==4){sigh4=0;LED=0xff;}}}
if(sigh4!
=0)
switch(sigh4)
{case1:
LED=0xfe;
if(k3==0){debouncer();if(k3==1){hour++;if(hour==24)hour=0;display1();}}
if(k4==0){debouncer();if(k4==1){hour--;if(hour==0)hour=23;display1();}}
break;
case2:
LED=0xfc;
if(k3==0){debouncer();if(k3==1){min++;if(min==60)min=0;display1();}}
if(k4==0){debouncer();if(k4==1){min--;if(min==0)min=59;display1();}}
break;
case3:
LED=0xf8;
if(k3==0){debouncer();if(k3==1){sec++;if(sec==60)sec=0;display1();}}
if(k4==0){debouncer();if(k4==1){sec--;if(sec==0)sec=59;display1();}}
break;
}
}
LED=0xff;
sigh4=0;
TR0=1;
}
//
//设置年月日
voidsettimer2()
{
TR0=0;
while(k4==1)
{
sigh1=0;
sigh2=0;
if((yearl==0)&&(yearh%4==0))sigh1=1;
if((yearl!
=0)&&(yearl%4==0))sigh2=1;
if(k1==0){debouncer();if(k1==1){sigh4++;if(sigh4==5){sigh4=0;LED=0xff;}}}
if(sigh4!
=0)
{
switch(sigh4)
{
case1:
LED=0xfe;
if(k2==0){debouncer();if(k2==1){yearl++;if(yearl==100)yearl=0;display2();}}
if(k3==0){debouncer();if(k3==1){yearl--;if(yearl==0)yearl=99;display2();}}
break;
case2:
LED=0xfd;
if(k2==0){debouncer();if(k2==1){month++;if(month==13)month=1;display2();}}
if(k3==0){debouncer();if(k3==1){month--;if(month==0)month=12;display2();}}
break;
case3:
LED=0xfb;
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
if(k2==0){debouncer();if(k2==1){day++;if(day==32)day=1;display2();}}
if(k3==0){debouncer();if(k3==1){day--;if(day==0)day=31;display2();}}
break;
case4:
case6:
case9:
case11:
if(k2==0){debouncer();if(k2==1){day++;if(day==31)day=1;display2();}}
if(k3==0){debouncer();if(k3==1){day--;if(day==0)day=30;display2();}}
break;
default:
LED=0x1f;
if(sigh1==1||sigh2==1)
{
if(k2==0){debouncer();if(k2==1){day++;if(day==30)day=1;display2();}}
if(k3==0){debouncer();if(k3==1){day--;if(day==0)day=29;display2();}}
}
else
{
if(k2==0){debouncer();if(k2==1){day++;if(day==29)day=1;display2();}}
if(k3==0){debouncer();if(k3==1){day--;if(day==0)day=28;display2();}}
}
break;
}
LED=0xfb;
break;
case4:
LED=0xf8;
if(k2==0){debouncer();if(k2==1){weekday++;if(weekday==8)weekday=1;display2();}}
if(k3==0){debouncer();if(k3==1){weekday--;if(weekday==0)weekday=7;display2();}}
break;
}
}
}
LED=0xff;
sigh4=0;
TR0=1;
}
//
//LCM初始化子程序
voidINTI_LCD()
{
CLS();
LCD=0x38;WR_COMM();
LCD=0x0C;WR_COMM();
LCD=0x06;WR_COMM();
}
//写指令子程序
voidWR_COMM()
{
rs=0;
rw=0;
e=0;
CHECK_BF();
e=1;
}
//判断忙碌子程序
voidCHECK_BF()
{
loop:
LCD=0xff;
rs=0;
rw=1;
e=0;
_nop_();
e=1;
if(bf==1)
gotoloop;
}
//写数据子程序
voidWR_DATA()
{
rs=1;
rw=0;
e=0;
CHECK_BF();
e=1;
}
//清屏子程序
voidCLS()
{
LCD=0X01;
WR_COMM();
}
//
//复位函数
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(10);
x=DQ;//稍做延时后如果x=0则初始化成功x则初始化失败
delay(5);
}
//
unsignedcharReadOneChar(void)//数据先低位进入,读完一个位就延时一下
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号//读前总线保持为低
dat>>=1;
DQ=1;//给脉冲信号//开始读总线释放
if(DQ)//DQ为读入的位,要么是0,要么是1
dat|=0x80;
delay(5);
}
return(dat);
}
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;//总线低位,开始写入
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
//
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xcc);//跳过读序号列号的操作//写入
WriteOneChar(0x44);//启动温度转换//写入
delay(200);
Init_DS18B20();//准备读温度之前先复位
WriteOneChar(0xcc);//路过读序列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低八位
b=ReadOneChar();//高八位
b<<=8;
t=a+b;
return(t);
}
//闹钟显示
voiddisplay3()
{
LCD=0xcb;WR_COMM();
LCD=TAB[hh/10];WR_DATA();
LCD=TAB[hh%10];WR_DATA();
LCD=0x3a;WR_DATA();
LCD=TAB[mm/10];WR_DATA();
LCD=TAB[mm%10];WR_DATA();
if(sigh4==0)
delay20ms(50);
}
//
//倒计时显示
voiddisplay4()
{
LCD=0xcb;WR_COMM();
LCD=TAB[sm/10];WR_DATA();
LCD=TAB[sm%10];WR_DATA();
LCD=0x3a;WR_DATA();
LCD=TAB[ss/10];WR_DATA();
LCD=TAB[ss%10];WR_DATA();
if(sigh5==1)
delay20ms(50);
}
//
//温度显示
voiddisplay5()
{
temp=ReadTemperature();
Temph=temp>>4;//把小数去掉,小数占据低四位
Templ=temp&0x0f;
Templ=Templ*6/10;//小数近似处理
LCD=0xcb;WR_COMM();
LCD=TAB[(Temph%100)/10];WR_DATA();//十位温度
LCD=TAB[(Temph%100)%10];WR_DATA();//个位温度,带小数点
LCD=0x2e;WR_DATA();
LCD=TAB[Templ];WR_DATA();
LCD=0x43;WR_DATA();
delay20ms(50);
if((Temph%100)%10>=2&&(Temph%100)/10>=3)
{
while(k1==1&&(Temph%100)%10>=8&&(Temph%100)/10>=3)
{
LED4=1;delay20ms(25);
temp=ReadTemperature();
Temph=temp>>4;//把小数去掉,小数占据低四位
LED4=0;delay20ms(25);
}
}
LED4=1;
}
//
//闹钟设置时间
voidsettimer3()
{
hh=12;
mm=30;
while(k2!
=0)
{
if(k1==0){debouncer();if(k1==1){sigh4++;if(sigh4==3)sigh4=0;LED=0xff;display3();}}
if(sigh4!
=0)
switch(sigh4)
{
case1:
LED=0xfe;
if(k3==0){debouncer();if(k3==1){hh++;if(hh==24)hh=0;display3();}}
if(k4==0){debouncer();if(k4==1){hh--;if(hh==0)hh=23;display3();}}
break;
case2:
LED=0xfd;
if(k3==0){debouncer();if(k3==1){mm++;if(mm==60)mm=0;display3();}}
if(k4==0){debouncer();if(k4==1){mm--;if(mm==0)mm=59;display3();}}
break;
}
}
LED=0xff;
sigh4=0;
}
//
//设置倒计时
voidsettimer4()
{
sm=30;
ss=1;
display4();
while(k3!
=0)
{
if(k4==0){debouncer();if(k4==1){sigh4++;if(sigh4==3)sigh4=0;LED=0xff;display4();}}
if(sigh4!
=0)
switch(sigh4)
{
case1:
LED=0xfe;
if(k1==0){debouncer();if(k1==1){sm++;if(sm==61)sm=0;display4();}}
if(k2==0){debouncer();if(k2==1){sm--;if(sm==0)sm=60;display4();}}
break;
case2:
LED=0xfd;
if(k1==0){debouncer();if(k1==1){ss++;if(ss==60)ss=0;display4();}}
if(k2==0){debouncer();if(k2==1){ss--;if(ss==0)ss=59;display4();}}
break;
}
}
LED=0xff;
sigh4=0;
}
//
//响铃
voidbz()
{
while(k3==1)
{
LED1=0;
delay20ms(25);
LED1=1;
delay20ms(25);
}
P1=0xff;
sigh3=0;
sigh5=0;
LED2=1;
LED3=1;
}
//
//中断子程序
voidT0timrt(void)interrupt1
{
TH0=(8192-4990)/32;
TL0=(8192-4990)%32;
num++;
if(num==200){sec++;num=0;}
if(sec==60){min++;sec=0;}
if(min==60){hour++;min=0;}
if(hour==24){day++;weekday++;hour=0;min=0;sec=0;}
if(weekday==8)weekday=1;
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
if(day==32){month++;day=1;}break;
case4:
case6:
case9:
case11:
if(day==31){month++;day=1;}break;
case2:
if(sigh1==1||sigh2==1){if(day==30){month++;day=1;}}
else{if(day==29){month++;day=1;}}
}
if(month==13){yearl++;month=0;}
if(yearl==99){yearh++;yearl=0;}
}
//
//时分秒显示
voiddisplay1()
{
LCD=0xc0;WR_COMM();
LCD=TAB[hour/10];WR_DATA();
LCD=TAB[hour%10];WR_DATA();
LCD=0x3a;WR_DATA();
LCD=TAB[min/10];WR_DATA();
LCD=TAB[min%10];WR_DATA();
LCD=0x3a;WR_DATA();
LCD=TAB[sec/10];WR_DATA();
LCD=TAB[sec%10];WR_DATA();
if(sigh3==1)display3();
if(sigh5==1)display4();
}
//
//年月日显示
voiddisplay2()
{
inti;
LCD=0x80;WR_COMM();
LCD=TAB[yearh/10];WR_DATA();
LCD=TAB[yearh%10];WR_DATA();
LCD=TAB[yearl/10];WR_DATA();
LCD=TAB[yearl%10];WR_DATA();
LCD=0x2d;WR_DATA();
LCD=TAB[month/10];WR_DATA();
LCD=TAB[month%10];WR_DATA();
LCD=0x2d;WR_DATA();
LCD=TAB[day/10];WR_DATA();
LCD=TAB[day%10];WR_DATA();
LCD=0x8d;
WR_COMM();
for(i=0;i<3;i++)
{LCD=TABb[3*(weekday-1)+i];WR_DATA();}
}
//
//延时程序
voiddelay20ms(intx)
{
inti,j;
for(i=0;ifor(j=0;j<2400;j++);
}
//
voiddaojishi()
{
if(sec!
=sn)
{sn=sec;ss--;}
if(ss<=0&&sm!
=0){ss=59;sm--;}
if(sm==0&&ss==0)bz();
}
//
voidledb()
{
inti;
for(i=0;i<2;i++)
{
P1=0xf0;
delay20ms(50);
P1=0x0f;
delay20ms(50);
}
P1=0xff;
}
//
main()
{
ledb();
P3=0x0f;
sett0();
INTI_LCD();
while
(1)
{
sigh1=0;sigh2=0;
if(yearl==0&&yearh%4==0)sigh1=1;
if(yearl!
=0&&yearl%4==0)si