万年历程序.docx

上传人:b****8 文档编号:11342154 上传时间:2023-02-28 格式:DOCX 页数:22 大小:19.19KB
下载 相关 举报
万年历程序.docx_第1页
第1页 / 共22页
万年历程序.docx_第2页
第2页 / 共22页
万年历程序.docx_第3页
第3页 / 共22页
万年历程序.docx_第4页
第4页 / 共22页
万年历程序.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

万年历程序.docx

《万年历程序.docx》由会员分享,可在线阅读,更多相关《万年历程序.docx(22页珍藏版)》请在冰豆网上搜索。

万年历程序.docx

万年历程序

//*******万年历*********

//****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;i

for(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1